Hallo

Nun funktioniert meine IR-Kommunikation auch:
Code:
// Nibobee IR-Kommunikation mit den LineLEDs.                          16.11.09 mic

// Das Programm verwendet einen netten Effekt des USART: Bei aktivierten Transmitter
// und aktiven Senden kann man im Hintergrund den Pegel des TX-Pins einlesen ;)
// Diesen Effekt verwende ich hier um in der ISR des Timer2 die 36kHz-Impulse zu
// erzeugen und an den Linien-IR-Leds auszugeben. Terminaleinstellung: 2400,8,none,1

// Das funktioniert im Hintergrund mit allen Ausgaben die mit dem USART gesendet
// werden. Ich habe zum Testen drei kleine Funktionen angehängt:

// writeChar(char) sendet ein einzelnes Zeichen
// writeString(string) sendet einen String
// writeInteger(wert, basis) sendet Integerwerte in bin, hex und dec

// Das sollte auch mit der Nibobee USART-Lib funktionieren und hätte dann sogar
// einen Sendebuffer. Ich weiß nur noch nicht wie man die anwendet :)

// Die #defines in der iodefs_nibobee.h sind mir zu umständlich ;)
#define LineLEDs_on 		PORTB &=~(1<<PB4)
#define LineLEDs_off 	PORTB |= (1<<PB4)

#include <nibobee/iodefs.h>
#include <nibobee/delay.h>
#include <nibobee/led.h>
#include <nibobee/sens.h>
#include <stdlib.h>			// C standard functions (e.g. itoa...)

void writeChar(uint8_t data );
void writeString(char *string);
void writeInteger(int16_t number, uint8_t base);

int main(void) {
	uint8_t c;
	led_init();                      // IO-Ports der LEDs als Ausgänge konfigurieren
	sens_init();                     // und Fühler aktivieren

	#define UBRR_BAUD_2400 390       // Baudrate auf 2400 setzen
   UBRRH = UBRR_BAUD_2400 >> 8;
	UBRRL = (uint8_t) UBRR_BAUD_2400;

	UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0); // 8, none, 1
  	UCSRB |= (1<<TXEN); // Senden enablen

	TCCR2 = (1 << WGM21) | (1 << CS20); // CTC-Mode, no prescaling, no OC2-PIN!
	OCR2  = 208; // 36kHz @15MHz
	TIMSK |= (1 << OCIE2);
	
	DDRB |= (1<<PB4); // LineLED ist ein Ausgang
	LineLEDs_on; 		// LineLED schaltet gegen GND!
	DDRD |= 2;  	 	// TXD Ausgang und low
	PORTD &= ~2;
	sei();

	led_set(LED_L_YE, 1);
	while(!sens_getLeft() && !sens_getRight());  // warten auf Taste
	led_set(LED_L_YE, 0);

	writeString("\n\rIR-Kommunikation mit nibobee\n\r");
	writeString("Empfang über asuro/Yeti-IR-Transceiver\n\r");
	writeString("16.11.09 mic\n\n\r");
	while(1)
	{
		for(c='A'; c<='Z'; c++) writeChar(c);
		writeChar(10);
		writeChar(13);
		for(c='a'; c<='z'; c++) writeChar(c);
		writeChar(10);
		writeChar(13);
		for(c=0; c<16; c++)
		{
			writeInteger(c, 10);
			writeChar('-');
			writeInteger(c, 16);
			writeChar('-');
			writeInteger(c, 2);
			writeString("\n\r");
		}
		writeChar(10);
	   delay(500);
	}
	return 0;
}

// Die ISR erzeugt die 36kHz-Trägerfrequenz und "lauscht" gleichzeitig am TXD-Pin
// um die seriellen Daten auf die Trägerfrequenz zu mischen.

ISR (TIMER2_COMP_vect)
{
	static uint8_t status=0;

   if(PIND & 2) // Der TSOP invertiert die empfangenen Daten!
	{
	   led_set(LED_R_YE, 0); // Kontrollanzeige
	   LineLEDs_off;
	}
	else
   {
		if(status)
		{
			led_set(LED_R_YE, 1);
			LineLEDs_on;
			status=0;
		}
		else
		{
			led_set(LED_R_YE, 0);
			LineLEDs_off;
			status=1;
		}
	}
}
void writeChar(uint8_t data ) // Code aus ATMega16-Datenblatt
{
	while ( !( UCSRA & (1<<UDRE)) );
	UDR = data;
}
void writeString(char *string)
{
	while(*string)
		writeChar(*string++);
}
void writeInteger(int16_t number, uint8_t base)
{
	char buffer[17];
	itoa(number, &buffer[0], base);
	writeString(&buffer[0]);
}
Jetzt muss ich nur noch lernen wie man die USART-Funktionen der nibobee-Lib nutzt ;)

Gruß

mic

[Edit]
Timer-Setup ohne OC2-Pin eingefügt