Hallo

RC5 ist halt recht gut dokumentiert und die Bitlängen lassen sich von der Trägerfrequenz des IR-Signals ableiten. Da beim asuro auch sleep() vom Timer des Trägersignals abgeleitet ist, kann man RC5 mit dem asuro auch ohne aktuelle Library recht einfach einlesen:

Code:
#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
/*
lt. 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 für Ausgabe an Terminal
	   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;
}
(Aus https://www.roboternetz.de/community...l=1#post264230)

Aufgedröselt wird der Code dann hier: https://www.roboternetz.de/community...l=1#post406385

Das Prinzip: Man wartet auf die Flanke des Startbits und liest die folgenden 14 Datenbits in dem Moment ein, wenn die manchestercodierten Bits den richtigen Pegel haben:

Code:
	temp=0;
	while (PIND & (1 << PD0)); //warten auf die Flanke des Startbits
	StatusLED(RED); // Alarmstufe ROT: ein Zeichen ist im Anflug

	for (count=0; count<14; count++) { // wir warten auf 14 Bits

	Sleep(48); // Information einlesen nach 3/4 der Bitlaenge
	   ir_status=(PIND & (1 << PD0)); // Pegel einlesen
	   if (ir_status) daten[count]='1'; else daten[count]='0'; // und merken für Ausgabe an Terminal
	   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
In temp steht dann der RC5-Wert, in daten[] der dazugehörige ascii-String zur Ausgabe an einem Terminal.

Gruß

mic