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
Lesezeichen