oberallgeier, ich plane voraussichtlich eine Philips mit RC5 zu benutzen![]()
oberallgeier, ich plane voraussichtlich eine Philips mit RC5 zu benutzen![]()
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:
(Aus https://www.roboternetz.de/community...l=1#post264230)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; }
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:
In temp steht dann der RC5-Wert, in daten[] der dazugehörige ascii-String zur Ausgabe an einem Terminal.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
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Mein Code dafür hat keine echte Fernsteuerung, sondern nur eine Abfolge von Operation nach eintreffen von Signalen einer Fernsehfernbedienung:Ich hoffe der Code erschlägt dich nicht.Code:#include "asuro.h" void start(void){ unsigned char los[12]; StatusLED(YELLOW); SerRead(los, 12, 0); SerWrite("Fahre Los!\n\r", 13); StatusLED(GREEN); MotorDir(FWD,FWD); MotorSpeed(245,255); BackLED(OFF,OFF); } void stop(void){ unsigned char pause[15]; SerRead(pause, 15, 0); SerWrite("Halte an!\n\r", 12); MotorDir(BREAK,BREAK); StatusLED(YELLOW); BackLED(OFF,OFF); } void restart(void){ unsigned char bwd[12]; SerRead(bwd, 12, 0); SerWrite("Fahre zurück!\n\r",16); MotorDir(RWD,RWD); MotorSpeed(245,255); StatusLED(RED); BackLED(OFF,OFF); } void left(void){ unsigned char leftcommand[12]; SerRead(leftcommand, 12, 0); SerWrite("Fahre nach links!\n\r",20); MotorDir(FWD,FWD); MotorSpeed(190,255); StatusLED(GREEN); BackLED(ON,OFF); } void right(void){ unsigned char rightcommand[12]; SerRead(rightcommand, 12, 0); SerWrite("Fahre nach rechts!\n\r", 21); MotorDir(FWD,FWD); MotorSpeed(255,200); StatusLED(GREEN); BackLED(OFF,ON); } void leftb(void){ unsigned char leftbcommand[12]; SerRead(leftb, 12, 0); SerWrite("Fahre rückwerts nach links!\n\r",30); MotorDir(RWD,RWD); MotorSpeed(190,255); StatusLED(RED); BackLED(ON,OFF); } void rightb(void){ unsigned char rightbcommand[12]; SerRead(rightbcommand, 12, 0); SerWrite("Fahre rückwerts nach rechts!\n\r",31); MotorDir(RWD,RWD); MotorSpeed(255,200); StatusLED(RED); BackLED(OFF,ON); } void end(void){ unsigned char endcommand[15]; SerRead(endcommand, 15, 0); SerWrite("Schlafe!\n\r",11); MotorDir(BREAK,BREAK); StatusLED(OFF); BackLED(OFF,OFF); Sleep(255); Sleep(255); } int main(void) { Init(); while(1){ start(); stop(); stop(); left(); stop(); stop(); right(); stop(); stop(); restart(); stop(); stop(); leftb(); stop(); stop(); rightb(); stop(); stop(); end(); end(); } return 0; }
LG
Spacy Bar
Lesezeichen