Hallo

Bisher war es noch keine Mühe *kicher*

Hier habe ich gezeigt, wie man die 36kHz (ich nehme mal an, dies ist auch die Frequenz deines SFH) auf die LineLEDs bringt:
https://www.roboternetz.de/phpBB2/vi...=470683#470683

Davon brauchst du eigentlich nur das Timersetup:
Code:
   TCCR2 = (1 << WGM21) | (1 << CS20); // CTC-Mode, no prescaling, no OC2-PIN!
   OCR2  = 208; // 36kHz @15MHz
   TIMSK |= (1 << OCIE2);
Zwei Halbwellen mit 72kHz, (15000000/72000)-1 sind ca. 208

Und eine angepasste ISR bei der PA3 mit 72kHz getoggelt wird:
Code:
ISR (TIMER2_COMP_vect)
{
   static uint8_t status=0;
   if(status)
   {
      led_set(LED_R_YE, 1);
      PORTA |= (1<<PA3);
      status=0;
   }
   else
   {
      led_set(LED_R_YE, 0);
      PORTA &= ~(1<<PA3);
      status=1;
   }
}
Zusammen sollte das dann ungefähr so funktionieren:
Code:
// nibobee IR-LEDs an PA0 und PA1 im Wechsel mit 36kHz ansteuern        10.1.2010 mic

// https://www.roboternetz.de/phpBB2/vi...=479870#479870

// Die Anoden der rechten IR-LEDs hängen mit Vorwiderstand an PA0 (X1-AN0)
// Die Anoden der linken IR-LEDs hängen mit Vorwiderstand an PA1 (X1-AN1)
// Die Kathoden beider IR-LEDs sind mit PA3 (X3-AN3) verbunden
// Der Empfänger SFH5110 ist mit PA2 (X2-AN2) verbunden

#include <nibobee/iodefs.h>
#include <nibobee/delay.h>
#include <nibobee/led.h>
#include <stdlib.h>

#define FALSE 	(1==0)
#define TRUE 	(1==1)

int main(void)
{
   led_init();
   delay(2000); // wait4programmer

	// Timer2-Setup für 72kHz
	TCCR2 = (1 << WGM21) | (1 << CS20); // CTC-Mode, no prescaling, no OC2-PIN!
   OCR2  = 208; // 36kHz @15MHz

   DDRA |= (1<<PA1) | (1<<PA0); // Anoden der LEDs mit Vorwiderstand (??? Ohm) an PA0/1
   PORTA &= ~((1<<PA1) | (1<<PA0)); // low = LEDs aus
   DDRA &= ~(1<<PA3); // keine 72kHz-Ansteuerung
   PORTA &= ~(1<<PA3); // deshalb Kathoden-Pin auf Ausgang ohne PullUp
   
   if(TRUE) led_set(0,1); // true-Test ;)
   sei(); // und los

   while(1)
	{
	   DDRA |= (1<<PA3); 		// Trägerfrequenz an Kathoden einschalten
	   TIMSK |= (1 << OCIE2);  // ISR aktivieren

		led_set(2,1);
		PORTA |= (1<<PA0); 		// rechte IR-LEDs einschalten
	   delay(1000);            // zwei Sekunden mit 36kHz blinken
	   PORTA &= ~(1<<PA0);     // IR-Leds wieder ausschalten
	   led_set(2,0);

		led_set(1,1);
		PORTA |= (1<<PA1); 		// dito für linke IR-LEDs
	   delay(1000);
	   PORTA &= ~(1<<PA1);
	   led_set(1,0);
	   
	   TIMSK &= ~(1 << OCIE2);	// ISR ausklinken
		DDRA &= ~(1<<PA3);      // keine Trägerfrequenz an Kathoden
	   PORTA &= ~(1<<PA3);     // bedeutet alle IR-LEDS aus
	   led_set(LED_R_YE, 0);   // Kontroll-LED aus
	   delay(2000);            // zwei Sekunden dunkel
	}
}

ISR (TIMER2_COMP_vect)
{
   static uint8_t status=0;
   if(status)
   {
      led_set(LED_R_YE, 1); // Kontroll-LED
      PORTA |= (1<<PA3);
      status=0;
   }
   else
   {
      led_set(LED_R_YE, 0);
      PORTA &= ~(1<<PA3);
      status=1;
   }
}
Kontrolle mit Digicam, ich kann es natürlich nicht selbst testen. Ein asuro oder RP6 müßte das Signal auch erkennen.

Das war jetzt etwas Mühe ;)

btw. ist delay() echter Schrott! Mit dieser ISR könnte man auch die Sleep()-Funktion ala asuro nachbilden.

Gruß

mic