Hallo

Da mich das Kabelgewurschtel nervt, Suche ich nach einer einfachen Möglichkeit, vorerst nur Daten mit IR vom RP6 zum PC zu senden. Später auch zurück, aber immer schön einen Schritt nach dem anderen. Ziel ist dann eine Erweiterung für die Lib, aber das wird wohl noch etwas dauern. Hier mein erster kleiner Versuch in dieser Richtung:

Code:
// Sendet einzelne Zeichen mit 2400 Baud über die IR-Dioden.
// Das ist noch eine frühe Beta-Version zur allgemeinen Erheiterung ;)

// Leider funktioniert das so bei mir nur im Ultranahbereich.
// (Empfänger liegt auf der Diode!). Um die nervige Nabelschnur
// loszuwerden muss ich wohl noch ein bisschen tüfteln.           mic 22.7.07

#include "RP6RobotBaseLib.h"

#define BAUD_2400 		2400  //IR speed - 2400 Baud
//#define UBRR_BAUD_2400	((F_CPU/(16*BAUD_2400))-1) // ergibt einen Fehler?
#define UBRR_BAUD_2400	(((F_CPU/16)/BAUD_2400)-1)

uint8_t i;

void IRwriteChar(uint8_t zeichen)
{
	UBRRH = UBRR_BAUD_2400 >> 8;	   	// Setup UART: Baudrate ist 2400
	UBRRL = (uint8_t) UBRR_BAUD_2400;
	cli();										// Bitte nicht stören!
	PORTD &= ~IRCOMM;                	// IR-LEDs D3+D4 ausschalten
	if (UCSRA & (1<<TXC)) UCSRA=1<<TXC; // Flag löschen falls gesetzt
   while (!(UCSRA & (1<<UDRE)));       // Warten bis Register leer (mit cli()!)
   UDR = (uint8_t)zeichen;             // Zeichen reinschreiben

	while (!(UCSRA & (1<<TXC)))         // Solange noch nicht alle Bits
	{                                   // rausgeschoben sind, erkenntlich
		statusLEDs.LED2=1;               // an LED2, lauschen wir, was an
      if ((PIND & (1<<PD1)) && 1)      // TX rausgeht und steuern damit
      {
         statusLEDs.LED1=0;            // die LED1 und
         PORTD &= ~IRCOMM;             // die IR-LEDs D3+D4 ;)
		}
		else
		{
         statusLEDs.LED1=1;
         PORTD ^= IRCOMM;
		}
		updateStatusLEDs();
	}
	sei(); // Enable Global Interrupts  // wir haben fertig
	sleep(10);
// ACHTUNG! TXC-Flag schreiben bedeutet löschen!
// Und zwar mit = weil so ohne Wirkung auf andere Flags
// Normales Setzen mit | würde andere Flags mitlöschen!
	UCSRA=1<<TXC;
	statusLEDs.LED2=0;                  // und das zeigen wir auch
	updateStatusLEDs();
	UBRRH = UBRR_BAUD_LOW >> 8;         // Loaderterminalbaudrate setzen
	UBRRL = (uint8_t) UBRR_BAUD_LOW;    // Setup UART: Baudrate is Low Speed
}
int main(void)
{
	initRobotBase();
	setLEDs(0b111111);
	mSleep(100);
	setLEDs(0);
	powerON();

	while(true)
	{
		for (i='a'; i<='z'; i++)
		{
			IRwriteChar(i);
		}
		IRwriteChar('\n');
		IRwriteChar('\r');
		mSleep(200);
	}
	return 0;
}
Das ist aber noch eine Vorbetaversion und soll nur zeigen, wie es im Ansatz funktionieren könnte.

Gruß

mic

[Edit]
Nun ist mir auch klar, warum das nicht richtig funktioniert: Es fehlt noch die 36kHz-Trägerfrequenz!

[Edit2]
Thread-Titel geändert