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
Lesezeichen