
Zitat von
Codingboy
Also zeitkritisch ist es vorerst nicht.
Könnte aber irgendwann mal so eingesetzt werden. Wie soll das also mit TIMER gehen? Wäre nett wenn jemand 3 Zeilen Code schreibt oder link zu nem Beispiel.
Danke schon mal!!!
Bitte 
Auf drei Zeilen gehts sich zwar nicht ganz aus aber ich hab noch code für einen hc-sr04 (nachbau des SRF-04) herumfliegen gehabt. Das ganze ist für einen atmega32 mit 16MHz ausgelegt, wenn du einen andere Taktfrequenz hast musst du evt den Prescaler und die Rechnung anpassen...
Code:
/******
01082011
atmega32@16MHZ
******/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#include <lcd.h>
#include <lib_main.h>
#include <taster.h>
volatile uint16_t timestamp_last = 0;
volatile uint16_t zeit = 0;
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);
}
return 0;
}
Lesezeichen