- Labornetzteil AliExpress         
Ergebnis 1 bis 7 von 7

Thema: SRF05 auslesen liefert nur Ergebnis 0

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von Chypsylon
    Registriert seit
    02.02.2011
    Ort
    Graz/Österreich
    Beiträge
    256
    Ich hab mir deinen code jetzt nicht genauer angeschaut aber vielleicht hilft dir der code den ich mal für einen hc-sr04 (fake von srf04) geschrieben habe weiter. Die Trigger zeit musst du vermutlich ändern, der rest dürfte so funktionieren....

    Code:
    /******
    atmega32@16MHZ
    ******/
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include <stdlib.h>
    
     #include <lcd.h>  
    
    volatile uint16_t timestamp_last = 0;
    volatile uint16_t zeit = 0;
    
    /*Messung starten*/
    void trig(void)
    {
      PORTC |= (1<<PC5);//Trig high
      _delay_us(12);
      PORTC &= ~(1<<PC5);//TRIG auf low
    }
    
    
    
    ISR(TIMER1_CAPT_vect)
    {
      //Wenn steigende Flanke
      if(TCCR1B & (1<<ICES1))
      {
        //Flankenerkennung auf fallend
        TCCR1B ^= (1<<ICES1);
        //aktuelen timer-wert speichern
        timestamp_last = ICR1;
      }
      //fallende Flanke
      else
      {
        //Flankenerkennung auf steigend
        TCCR1B ^= (1<<ICES1);
        //Laufzeit = aktueller timerwert - vorheriger timerwert
        zeit = ICR1 - timestamp_last;
      }
      
    }
    
    
    int main(void)
    {
      DDRC |= (1 << PC5);//Trig als Ausgang
      PORTC &= ~(1<<PC5);//TRIG auf low
      
      DDRD &= ~(1<<PD6);//Echo als Eingang
      PORTD &= ~(1<<PD6);//ECHO pullup AUS
    
      lcd_init(LCD_DISP_ON);
      
      lcd_puts("US Test");
      lcd_gotoxy(0,1);
      
      //Timer konfigurieren
      TCCR1A = 0;                      // normal mode, keine PWM Ausgänge
      //Noise Canceler aktivieren, Flankenerkennung auf steigende, Prescaler auf 64
      TCCR1B |= (1<<ICNC1) |       (1<<ICES1) |                     (1<<CS11) |(1<<CS10);
      
      //ICP Interrupt aktivieren
      TIMSK |= (1<<TICIE1);
      
      //Globale Interrupts aktivieren
      sei();
    
      while(1)
      {
        //Entfernung aus Laufzeit berechnen
        zeit = (zeit*4)/58;
        
        lcd_puts("                 ");
        lcd_gotoxy(0,1);
        lcd_put_uint16(zeit);
        lcd_gotoxy(0,1);
    
        //Messung auslösen
        trig();
    
         _delay_ms(50); //mit dem start der nächsten messung warten bis signal zerstreut
      }
       
       return 0;
    }

  2. #2
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355
    Ich wollte zu Beginn auch die Input Capture Unit benutzen, habe aber irgendwie das mit der ICU nicht ganz verstanden.

    Mit welchem Systemtakt hast du gearbeitet, du stellst ja den Prescaler auf 64 ein.

    MfG

    Torrentula
    MfG Torrentula

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von Chypsylon
    Registriert seit
    02.02.2011
    Ort
    Graz/Österreich
    Beiträge
    256
    Zitat Zitat von Torrentula Beitrag anzeigen
    Mit welchem Systemtakt hast du gearbeitet, du stellst ja den Prescaler auf 64 ein.
    mit 16MHZ.

    Was ich vorher vergessen habe, damit du input capture benutzen kannst muss der Ausgang des US an den icp-pin angeschlossen sein. Beim atmega32 ist das PD6.
    Welchen Controller verwendest du?

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355
    Ich verwende den ATmega644 bei dem ist es auch der PD6, vielen Dank für den Hinweis!

    Der Code funzt prima danke!

    Warum klappt das bei anderen immer nur bei mir nicht...

    MfG

    Torrentula
    Geändert von Torrentula (28.12.2011 um 18:17 Uhr)
    MfG Torrentula

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Bei einem ersten Überfliegen deines Codes sehe ich diverse Probleme:

    1)
    Code:
    EICRA = (ISC01) | (1<<ISC00);
    Siehst du da nicht irgendwie einen entscheidenden Unterschied rechts und links vom Oder?

    2)
    Code:
    cli(); // alle interrupts sperren
    Unwirksam. An der Stelle sind die Interrupts eh gesperrt, und am Ende der ISR werden sie auf jeden Fall wieder zugelassen.

    3)
    Der Timer wird beim Neustart nicht auf Null gesetzt.

    4) (und möglicherweise der Hauptgrund für das immer 0)
    Du stellst den Timer auf 10 MILLIsekunden ein.
    MfG
    Stefan

  6. #6
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355
    Danke sternst! Manchmal sieht man den Wald vor lauter Bäumen nicht...

    Funktioniert jetzt prima.

    MfG

    Torrentula
    Geändert von Torrentula (28.12.2011 um 18:25 Uhr)
    MfG Torrentula

Ähnliche Themen

  1. SRF05: Abfrage, Berechnung; Ergebnis immer 0
    Von Jaecko im Forum C - Programmierung (GCC u.a.)
    Antworten: 15
    Letzter Beitrag: 24.09.2011, 16:40
  2. Division mit Nachkommastellen als Ergebnis???
    Von erik_wolfram im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 22.08.2011, 16:13
  3. ADC sendet Ergebnis nicht
    Von zappel76 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 11.09.2010, 12:53
  4. Ergebnis der AD-Wandlung mit Kommata angeben!
    Von patrick-rp6 im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 10.06.2010, 04:41
  5. ADC-Ergebnis in Variable weiter benutzen
    Von Cvecko im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 30.09.2005, 11:26

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress