Hier wäre ein Beispiel ohne verwendung von Input Capture oder Externe Interrupts. Also wie du gemeint hast.
Code:
// für 8 Mhz, Timer1(16bit), Prescaler 8, Takt von 1us, Überlauf nach 65535us oder 65,535ms
#include <avr/io.h>
#include <avr/delay.h>
// Das mit PD1 auf PORTD ist nur ein Beispiel, jeder beliebige Pin kann gewält werden
#define MESS_PORT PORTD
#define MESS_PORT_RICHTUNG DDRD
#define MESS_PIN PIND
#define MESS_BIT PD1 // Echo-Trigger Eingang oder einfach Messeingang
#define US_PORT PORTD
#define US_PORT_RICHTUNG DDRD
#define US_BIT PD2 // Der Pin kommt zum Trigger-Puls Eingang
unsigned int zeit_messung_us(void)
{
unsigned int wert_us; // Wert in
US_PORT_RICHTUNG|=(1<<US_PIN); // US_PIN auf Ausgang
US_PORT|=(1<<US_PIN); // Trigger-Puls auf high
_delay_us(15); // Laut Datenblatt Trigger-Puls min 10us auf high
US_PORT&=~(1<<US_PIN); // Trigger-Puls Eingang wieder auf low
// Wenn keine srf04 Messung dann einfach ab hier
TCNT1=0; // Timerregister auf 0
TCCR1B|= (1<<CS11);; // Timer starten
while ( MESS_PIN & (1<<MESS_BIT)); // Warten bis Echo/Mess Eingang auf low
wert=TCNT1;
TCCR1B&= ~(1<<CS11); // Timer wieder aus
return wert;
}
Gruß Muraad
Lesezeichen