Ich hab mir deinen code jetzt nicht genauer angeschaut aber vielleicht hilft dir der code den ich mal für einen hc-sr04 (fake von srf04) geschrieben habe weiter. Die Trigger zeit musst du vermutlich ändern, der rest dürfte so funktionieren....
Code:
/******
atmega32@16MHZ
******/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#include <lcd.h>
volatile uint16_t timestamp_last = 0;
volatile uint16_t zeit = 0;
/*Messung starten*/
void trig(void)
{
PORTC |= (1<<PC5);//Trig high
_delay_us(12);
PORTC &= ~(1<<PC5);//TRIG auf low
}
ISR(TIMER1_CAPT_vect)
{
//Wenn steigende Flanke
if(TCCR1B & (1<<ICES1))
{
//Flankenerkennung auf fallend
TCCR1B ^= (1<<ICES1);
//aktuelen timer-wert speichern
timestamp_last = ICR1;
}
//fallende Flanke
else
{
//Flankenerkennung auf steigend
TCCR1B ^= (1<<ICES1);
//Laufzeit = aktueller timerwert - vorheriger timerwert
zeit = ICR1 - timestamp_last;
}
}
int main(void)
{
DDRC |= (1 << PC5);//Trig als Ausgang
PORTC &= ~(1<<PC5);//TRIG auf low
DDRD &= ~(1<<PD6);//Echo als Eingang
PORTD &= ~(1<<PD6);//ECHO pullup AUS
lcd_init(LCD_DISP_ON);
lcd_puts("US Test");
lcd_gotoxy(0,1);
//Timer konfigurieren
TCCR1A = 0; // normal mode, keine PWM Ausgänge
//Noise Canceler aktivieren, Flankenerkennung auf steigende, Prescaler auf 64
TCCR1B |= (1<<ICNC1) | (1<<ICES1) | (1<<CS11) |(1<<CS10);
//ICP Interrupt aktivieren
TIMSK |= (1<<TICIE1);
//Globale Interrupts aktivieren
sei();
while(1)
{
//Entfernung aus Laufzeit berechnen
zeit = (zeit*4)/58;
lcd_puts(" ");
lcd_gotoxy(0,1);
lcd_put_uint16(zeit);
lcd_gotoxy(0,1);
//Messung auslösen
trig();
_delay_ms(50); //mit dem start der nächsten messung warten bis signal zerstreut
}
return 0;
}
Lesezeichen