Ich bin gerade beim verstehen des Programms:
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;
}
Ich möchte es möglichst genau verstehen, deshalb sind dabei viele Fragen enstanden, da mir ein Großteil der Befehle vollkommen unbekannt sind:
"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
Lesezeichen