Ich bin gerade beim verstehen des Programms:
Ich möchte es möglichst genau verstehen, deshalb sind dabei viele Fragen enstanden, da mir ein Großteil der Befehle vollkommen unbekannt sind:Code:/************************************************************/ /* */ /* Fernsteuern mittels IR-Fernbedienung (RC-5) */ /* */ /* 14.05.2009 */ /* */ /************************************************************/ #include "asuro.h" #define pow1 150 // Langsame Geschwindigkeit #define pow2 200 // Schnelle Geschwindigkeit #define taste (!(PINC & (1<<PC4))) // Tastenabfrage #define keine_taste (PINC & (1<<PC4)) unsigned int count, temp; // Zaehler, IR-Kommando unsigned char daten[14], ir_status; // IR-Datenspeicher, IR-Eingangspegel int main(void) { Init(); do { temp=0; while (PIND & (1 << PD0)) // warten auf die Flanke des Startbits { if keine_taste StatusLED(GREEN); else StatusLED(RED); // Tastenspielerei if taste BackLED(ON,ON); else BackLED(OFF,OFF); } StatusLED(RED); // Alarmstufe ROT: ein Zeichen ist im Anflug for (count=0; count<14; count++) // im Gesamten warten wir auf 14 Bits { /*******************************************************************/ /* laut Spettel-Diagramm betraegt die Bitlaenge 1,778 ms. */ /* Bei 36 Takten pro Millisekunde ergibt das 36*1,778 = 64 */ /*******************************************************************/ 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 StatusLED(YELLOW); // Daten gelesen //Msleep(2000); // Zeit um den IR-Transceifer ueber den asuro zu bringen SerWrite("\n\r",2); SerWrite(daten,14); // Bitmuster zum PC senden SerWrite("-",1); PrintInt(temp); // erkannte Daten zum PC senden /*******************************************************************************/ /* Asuro steuern: */ /* Mit dem 10er-Block der Fernbedienung kann der Asuro nun gesteuert werden; */ /* Alle anderen Tasten stoppen den Asuro */ /*******************************************************************************/ switch (temp) { case 1: MotorDir(FWD,FWD); MotorSpeed(pow1,pow2); break; case 2: MotorDir(FWD,FWD); MotorSpeed(pow2,pow2); break; case 3: MotorDir(FWD,FWD); MotorSpeed(pow2,pow1); break; case 4: MotorDir(BREAK,FWD); MotorSpeed(0,pow1); break; case 5: MotorDir(BREAK,BREAK); MotorSpeed(0,0); break; case 6: MotorDir(FWD,BREAK); MotorSpeed(pow1,0); break; case 7: MotorDir(RWD,BREAK); MotorSpeed(pow1,0); break; case 8: MotorDir(RWD,RWD); MotorSpeed(pow1,pow1); break; case 9: MotorDir(BREAK,RWD); MotorSpeed(0,pow1); break; default: MotorDir(BREAK,BREAK); MotorSpeed(0,0); break; } StatusLED(GREEN); //endlos //Msleep(1000); } while (1); return 0; }
"while (PIND & (1 << PD0))"
soll das heißen, solange noch nichts empfangen wird und deshalb die Spannung an den PINs noch 0 ist?
"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?
Allgemein verstehe ich diesen Kernabschnitt trotz der Kommentare nicht:
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.
Ansonsten bin ich schon öfters auf "SerWrite("\n\r",2);" gestoßen, was bedeutet der Klammerinhalt?
Wenn mir jemand diese Fragen beantworten könnte, wäre ich sehr sehr dankbar und könnte endlich das, was hinter dem Programm steckt, verstehen.![]()
Gruß
Seuche







Zitieren

Lesezeichen