Pepisoft ich hab grad bisschen Code geschrieben, müsste eigentlich funktionieren kanns aber nicht testen, hab kein srf04.
Code:
// 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();
}
Gruß Muraad
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.
Lesezeichen