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; }





Zitieren


Lesezeichen