Hier jetzt nochmal nur die Funktion start_messung() mit deinen Verbesserungen:
Also Danke dir nochmal Dino Dieter. Und stimmt die _delay_us() Funktion jetzt, da du erst gemeint hast man muss sie zweimal aufrufen um auf 192us zu kommen?Code:#include <avr/io.h> #include <avr/delay.h> // F_CPU definiert als 8Mhz #include <stdint.h> #define US_PORT PORTD #define US_PORT_RICHTUNG DDRD #define US_PIN PD7 // Der Pin kommt zum Trigger-Puls Eingang // PD6 ist Input Capture Pin beim ATMega8, hier kommt der Echo-Pulse Ausgang hin uint16_t start_messung(void) { uint16_t wert = 0 ; //wert_in_cm; //Timer vorbereiten TCCR1B &=~(1<<ICES1); // Fallende Flanke für Input Capture TCNT1 = 0; // Timer1 löschen US_PORT|=(1<<US_PIN); // Trigger-Puls auf high _delay_us(11); // Laut Datenblatt Trigger-Puls min 10us auf high US_PORT &=~(1<<US_PIN); // Trigger-Puls Eingang wieder auf low while ( !(PIND & (1<<PD6))); //warten bis der Echo Impuls anfängt TCCR1B |= (1<<CS11); // Prescaler 8, damit dauert ein Tackt 1 micro Sekunde, Timer startet while ( !(TIFR & (1<<ICF1))); // Warten bis Input Capture Flag gesetzt ---> Echo-Eingang ist low if(ICR1 < 20000) // gültiger Bereich (max 18 ms + Reserve ) wert= (unsigned int) (ICR1 / 58); //umrechnen in cm (laut Datenblatt ) TCCR1B &= ~(1<<CS11); // Timer wieder aus TIFR |= (1<<ICF1); // ICF1 Bit wieder löschen durch schreiben einer logischen 1 return wert; }
Gruß Muraad







Zitieren

Lesezeichen