Hallo
Na dann wollen wir das mal aufbröseln:
Zitat:
"while (PIND & (1 << PD0))"
soll das heißen, solange noch nichts empfangen wird und deshalb die Spannung an den PINs noch 0 ist?
Da der IR-Empfänger das Signal invertiert(!) wird hier solange gewartet bis der Eingang nicht mehr high ist.
Zitat:
"Sleep( 48 ); // Information einlesen nach 3/4 der Bitlaenge"
Warum wartet das Programm bis 3/4 der Bitlänge angekommen ist? Welcher Grund steckt dahinter?
Dahinter steckt die ungefähre Bitlänge von 64 Sleep()s und die Manchestercodierung des RC5-Signals. Nach dem Pegelwechsel nach halber Bitlänge sitzt der Eingang auf dem Pegel des Datenbits und kann zwischen Sleep(32) und Sleep(63) eingelesen werden. Um das ungenaue Timeing durch Sleep() auszugleichen wird quasi in der Mitte dieses Bereichs bei Sleep(48) eingelesen.
Zitat:
Allgemein verstehe ich diesen Kernabschnitt trotz der Kommentare nicht:
for (count=0; count<14; count++) // im Gesamten warten wir auf 14 Bits
{
Sleep( 48 ); // Information einlesen nach 3/4 der Bitlaenge
ir_status=(PIND & (1 << PD0)); // Pegel Speichern
if (ir_status) daten[count]='1'; else daten[count]='0'; // und merken
if (ir_status) temp |= (1 << (13-count)); // das MSB(=mostsuefikantbit) zuerst
while (ir_status == (PIND & (1 << PD0))); // Bit gelesen, warten auf naechste Flanke
}
temp=temp/2 & 0xf; // Die Info steht in den Bits 1-4
Ich hoffe die kann mir jemand in einer für mich verständlichen Sprache erklären.
Oje. Es werden 14 RC5-Bits in die Zeichenkette daten[] und die 16 bit-Variable temp eingelesen. Ablauf beim ersten Bit: Warten bis Übertragung startet, dann nach sleep(48) den Pegel nach ir_status einlesen. Abhängig von ir_status werden dann in daten[] eine '0' oder '1' eingetragen und das entsprechende Bit in temp gesetzt (MSB beachten!). Nun wird noch gewartet bis sich der Eingangspegel wieder ändert (!=ir_status), damit ist das erste Bit fertig.
Nun wird count erhöht und die Schleife steigt bei sleep(48) wieder ein um die restlichen Bits einzulesen.
Zitat:
Ansonsten bin ich schon öfters auf "SerWrite("\n\r",2);" gestoßen, was bedeutet der Klammerinhalt?
Die Steuerzeichen in der Zeichenkette bedeuten '\n'=newline (neue Zeile) und '\r'=carrige return (Wagenrücklauf) Das zwinkt das Treminalprogramm eine neue Zeile darzustellen und alles anzuzeigen was in der letzten Zeile gesendet wurde.
Zitat:
"PrintInt(temp); // erkannte Daten zum PC senden"
Was sind das für Daten? Das erkannte Bitmuster mit der dazugehörigen Befehlskennung wurden ja bereits an den Computer gesendet!
In temp stehen die 14 RC5-Bits rechtsbündig, das der Fernbedienungstaste zugeordnete Kommando in den Bis 1-4: "temp=temp/2 & 0xf;" bedeutet Bits eine Stelle nach rechts schieben und Bits 4-15 ausblenden. Dann enthält temp das Kommando.
Gruß
mic