
 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