Hallo

Bild hier  

Das Bild dient echt der Verwirrung, aber trotz gründlicher Suche habe ich leider kein besseres gefunden. Was mich daran stört, und Einsteiger sicher verwirrt, ist die Zählung der Bits. Hier ist die Reihenfolge dargestellt, in der die Bits gesendet werden, es ist ein klassisches MSB zuerst. Der Aufbau der RC5-Daten sieht aber so aus:

Code:
   // Aufbau der RC5-Daten:
   // Bitnummer: 1111110000000000
   //            5432109876543210
   // Funktion:  --sstaaaaacccccc
RC5_Command = RC5_Read() & 0x3F;

Wer die Darstellung von Werten in verschiedenen Zahlensystemen schon kennt, kann diesen Abschnitt überspringen. Für alle anderen ein ganz kurzer Ausflug in die Welt der Hex-Darstellung: Neben einigen anderen Vorteilen ist die Hex-Schreibweise sehr einfach in binäre Schreibweise umwandelbar. Jede Stelle in Hex steht für 4 Bits, die je Stelle mit 1,2,4 oder 8 angesprochen werden. 0x02 ist 0b0000 0010, 0x40 ist 0b0100 0000 und 0xF0 ist entsprechend 0b1111 0000. 0x3f ist deshalb einfach gleich 0b0011 1111.

Durch den &-Operator werden die Bits 15 bis 6 ausgeblendet (=gelöscht!), übrig bleiben die 6 Kommandobits in Bit0 bis 5.

RC5_ExtCommand = RC5_Command | ((RC5_Read() & 0x1000) >> 6);

0x1000 ist 0b0001 0000 0000 0000 und zeigt damit auf das zweite Startbit RC5-Bit12. Dieses kennzeichnet den erweiterten RC5-Code. (blöderweise fällt mir aber grad nicht ein, wie es das macht ;) Das Ergebniss-Bit nach dem UND wird noch um 6 Stellen nach rechts geschoben und mit RC5_Command verODERt, somit enthält RC5_ExtCommand ebenfalls die 6 Kommandobits und zusätzlich in Bit6 das ExtendetRC5-Bit. Die RC5-Adresse fällt völlig under den Tisch.

In RC5-Bit11 ist übrigends das Togglebit:

RC5_ToggleBit = RC5_Read() & 0x0800; // 0b0000 1000 0000 0000

Das ToggleBit wechselt, wenn die selbe Taste erneut gedrückt wurde:
(btw: Den nächsten Satz hatte ich bisher überlesen: "The toggle bit will retain the same logical level during all of these repeated messages." Bedeutet also, nur toggeln, wenn Taste erneut gedrückt wurde. Das ist dann oben bei meinem letzten Vorschlag nicht richtig)
Wann wird eigentlich das Signal eingelesen? Funktioniert das im Hintergrund oder ist RC5_Read() blockierend und wartet bis zu nächsten RC5-Zeichen? Wäre das nicht sicherer:

Code:
word RC5_Empfang;
word RC5_ToggleBit;
word RC5_Command;
word RC5_ExtCommand;

void main(void)
{
    PRO_BOT128_INIT();
    RC5_Init(26);

    while(true){
        RC5_Empfang = RC5_Read();
        RC5_ToggleBit = (RC5_Empfang & 0x0800) >> 11;  // EDIT!
		  RC5_Command =  RC5_Empfang & 0x3F;
        RC5_ExtCommand = RC5_Command | ((RC5_Empfang & 0x1000) >> 6);

        Msg_WriteWord(RC5_Command);
        Msg_WriteText(":");
        Msg_WriteWord(RC5_ExtCommand);
        Msg_WriteText(":");
        Msg_WriteWord(RC5_ToggleBit);
        Msg_WriteChar(13);
    }
}
Scheint mir sinnvoll bei der Beschreibung von RC5_Read():
http://www.c-control-pro.de/documentation/rc5_read.htm

Gruß

mic