Hallo
Nachdem ich mich nun etwas durch das Datenblatt und die Lib gekämpft habe, erscheint die Lösung unglaubwürdig einfach:
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.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; }
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







Zitieren

Lesezeichen