Hier jetzt nochmal nur die Funktion start_messung() mit deinen Verbesserungen:
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;
}
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?
Gruß Muraad
Lesezeichen