Pepisoft ich hab grad bisschen Code geschrieben, müsste eigentlich funktionieren kanns aber nicht testen, hab kein srf04.
Gruß MuraadCode:// Für ATMega8, benutzt wir Input Capture von Timer1, auf 8Mhz geändert #include <io.h> #include <avr/delay.h> #define US_PORT PORTD #define US_PORT_RICHTUNG DDRD #define US_PIN PD7 // Der Pin kommt zum Trigger-Puls Eingang unsigned char start_messung(void) { unsigned char wert,wert_in_cm; US_PORT|=(1<<US_PIN); // Trigger-Puls auf high // PD6 ist Input Capture Pin beim ATMega8, hier kommt der Echo-Pulse Ausgang hin TIMSK|= (1<<TICIE1); // Input Capture Interrupt enable TCCR1B|= (1<<CS11); // Prescaler 8, damit dauert ein Tackt 1 micro sekunden _delay_us(15); // Laut Datenblatt Trigger-Puls min 10us auf high US_PORT&=~(1<<US_PIN); // Trigger-Puls Eingang wieder auf low while ( !(TIFR & (1<<ICF1 )) ) ; // Warten bis Echo-Puls Ausgang auf low --> Messung beendet wert=172*ICR1/10000; // wert ist nun in cm TIFR|=(1<<ICF1); // ICF1 Bit wieder löschen durch schreiben einer logischen 1 TCCR1B&= ~(1<<CS12) & ~(1<<CS11) & ~(1<<CS10); // Timer wieder aus return wert; } void main (void) { unsigned char wert; US_PORT_RICHTUNG|=(1<<US_PIN); // US_PIN auf Ausgang wert=start_messung(); }
EDIT: Mir ist grad noch was aufgefallen. Wenn er garkein Echo empfängt also kein Objekt vor dem Sensor ist bleibt er durch die Zeile
while ( !(TIFR & (1<<ICF1 )) ) ; // Warten bis Echo-Puls
glaub ich in einer Endlosschleife. Besser währe es mit der Funktion nur die Messung zu starten, um auf das Input Capture Signal zu "warten" sollte man aber den Interrupt SIG_INPUT_CAPTURE1 verwenden.







Zitieren

Lesezeichen