Hallo

Naja, Sinn würde das schon machen:
Code:
// Nibobee ACS mit Pinselbee                                          12.1.2010 mic

#include <nibobee/iodefs.h>
#include <nibobee/led.h>
#include <nibobee/sens.h>

volatile uint8_t count36kHz;
volatile uint8_t acs=0;

void Sleep(uint8_t pause);
void Msleep(uint16_t pause);

void ACSData(uint16_t *data)
{
   OCR2=253;
   PORTA |= (1<<PA1); // ACS LED left on
   while((PINA & (1<<PA2)) && (OCR2 > 151))
   {
      acs=15; //15 Impulse senden, acs wird in OVF-ISR runtergezählt
      while(acs);
      OCR2--;
   }
   PORTA &= ~(1<<PA1); // ACS LED left off
   data[0]=OCR2;
   while(!(PINA & (1<<PA2))); // warten bis keine Echo mehr

   OCR2=253;
   PORTA|= (1<<PA0); // ACS LED right on
   while((PINA & (1<<PA2)) && (OCR2 > 151))
   {
      acs=15;
      while(acs);
      OCR2--;
   }
   PORTA &= ~(1<<PA0); // ACS LED right off                            6
   data[1]=OCR2;
   while(!(PINA & (1<<PA2)));
}

int main(void)
{
	uint16_t data[2]; // Speicher für ACS-Werte

	led_init();
  	sens_init();

	// Setup Timer2
	TCCR2 = (1 << WGM20)|(1 << CS20); // PhaseCorrect-PWM, no prescaling, no OC2-Pin!
	TCNT2  = 96; // (512-416) 36kHz @15MHz
	OCR2 = 151; // (255-(208/2)) 151 ist 50:50 Compare Match für symetrische Halbwellen
	TIMSK |= (1 << OCIE2)|(1 << TOIE2); // Comp und OVF-ISR enable, Overflow bei Bottum!
	enable_interrupts();

  	led_set(0,1);
	Msleep(2000); // wait4programmer

	DDRA |= (1<<PA3)|(1<<PA1)|(1<<PA0);
	PORTA &= ~((1<<PA3)|(1<<PA1)|(1<<PA0));
	//DDRB |= (1<<PB4); // Test mit LineLEDs
	//PORTB &= ~(1<<PB4);
	
	while(!sens_getLeft() & !sens_getRight()) // solange keine Taste gedrückt wird
		{Msleep(200); PORTB ^= (1<<PB0);} // hektisches Blinken mit LED0

	while(1)
	{
	   ACSData(data);
		PORTB &= ~15; // alle Leds aus
		if(data[0] > 250) led_set(1,1);
		   else if(data[0] > 230) led_set(0,1);
		if(data[1] > 250) led_set(2,1);
		   else if(data[1] > 230) led_set(3,1);
	   Msleep(100);
	}
	return(0);
}
ISR (TIMER2_COMP_vect)
{
	PORTA ^= (1<<PA3); // IR-LEDs togglen
	//PORTB ^= (1<<PB4); // Test mit LineLEDs
}
// Frequenzkorrektur 512-416 plus 3 Takte fürs Laden von TCNT2?
ISR (TIMER2_OVF_vect)
{
	TCNT2  = 99;
	if(count36kHz) count36kHz--;
   if(acs) acs--;
}

void Sleep(uint8_t pause) // 1/36000 Pause blockierend
{
	count36kHz=pause;
	while(count36kHz);
}
void Msleep(uint16_t pause) // 1/1000 Pause blockierend
{
	while(pause--) Sleep(36);
}
Der ACS-Code stammt von hier:
https://www.roboternetz.de/phpBB2/ze...=459661#459661

ACSData() liefert Werte von 151(kein Echo) bis 253(vor der Nase) und funktioniert wie LineData() oder Odometriedata() beim asuro. Ich hab's mit einer Brücke zwischen X2:1 (PA2) und X2:3 (GND) getestet....

Gruß

mic

[Edit]
Tilde entfernt s.u.