Hallo

Nachdem ich mich nun etwas durch das Datenblatt und die Lib gekämpft habe, erscheint die Lösung unglaubwürdig einfach:

Code:
// Die Funktion IRwriteChar() sendet ein Zeichen über die IRCOMM-LEDs zum PC.

// Die Baudrate wird zum Senden auf 2400 Baud eingestellt. Das Zeichen wird dann
// mit dem UART ausgegeben. Dabei "lauscht" die Funktion am TX-Pin des ATMega32
// und schaltet den IRCOMM-Pin. Da die TX-Pegel invertiert sind, werden bei TX==1
// die IRCOMM-LEDs ausgeschaltet, bei TX==0 wird ein mit 36kHz moduliertes Signal an
// denn LEDs erzeugt. Da der Timer2 schon im CTC-Mode läuft und weil der IRCOMM-Pin
// zufällig auch der OC2-Pin ist, wird dazu einfach der Timer2-Ausgang aktiviert und
// auf togglen eingestellt.

// Mit dem asuro/yeti IR-Transceiver können die gesendeten Zeichen nun über
// mehrere Meter Entfernung empfangen werden.                            mic 30.7.07

#include "RP6RobotBaseLib.h"

#define BAUD_2400 		2400					//IR speed - 2400 Baud
#define UBRR_BAUD_2400	(((F_CPU/16)/BAUD_2400)-1)

uint8_t i;                                // Hilfsvariable

void IRwriteChar(uint8_t zeichen)
{
	PORTD &= ~IRCOMM;                      // IRCOMM-LEDs ausschalten
  	UBRRH = UBRR_BAUD_2400 >> 8;           // Baudrate auf 2400 setzen
	UBRRL = (uint8_t) UBRR_BAUD_2400;
   UDR = (uint8_t)zeichen;                // Zeichen ins Senderegister des UARTs
	while (!(UCSRA & (1<<TXC)))            // Solange das Schieberegister nicht leer
	{
      if (PIND & TX)								// ist, lauschen wir am TX-Pin
      {
         TCCR2 &= ~(1 << COM20);          // und schalten OC2 und IRCOMM-LEDs aus
         PORTD &= ~IRCOMM;
		}
		else
		{
         TCCR2 |= (1 << COM20);           // oder togglen mit 36kHz ;)
		}
	}
	UCSRA=1<<TXC;                          // TXC-Flag setzen bedeutet löschen!!!
	PORTD &= ~IRCOMM;                      // IRCOMM-LEDs ausschalten
	UBRRH = UBRR_BAUD_LOW >> 8;            // RP6Loaderbaudrate setzen
	UBRRL = (uint8_t) UBRR_BAUD_LOW;
}

int main(void)
{
	initRobotBase();
	setLEDs(0b111111);
	mSleep(100);
	setLEDs(0);
	powerON();

	while(true)                            // endlos das Alphabet senden
	{
		for (i='a'; i<='z'; i++)
		{
			IRwriteChar(i);
		}
		IRwriteChar('\n');
		IRwriteChar('\r');
		mSleep(200);
	}
	return 0;
}
Das könnte man nun z.b. in der writeChar()-Funktion einbinden und dann wahlweise normal oder Infrarot senden. Vorteil wäre, dass man dann alle writexxx()-Funktionen der Standart-Library verwenden könnte. Aber das muss ich noch überdenken, denn im Moment ist es noch eine blockierende Funktion die vielleicht das Task-System stören könnte.

Der nächste Schritt ist nun aber das Lesen und damit die bidirektionale IR-Kommunikation. Wenn alles fertig ist, können die Roboter auch untereinander funken. Oder der RP6 mit dem asuro oder was weis ich noch alles.

Gruß

mic