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