Es sollte eine Fernbedienung vom Fernsehr sein.(Philipps) Wie soll ich dann die ausgesendeten Bits ermitteln?
Es sollte eine Fernbedienung vom Fernsehr sein.(Philipps) Wie soll ich dann die ausgesendeten Bits ermitteln?
Ist es eine Fernbedienung von einem Philips-Fernseher oder soll es mal eine sein/werden? Und macht die RC5? Andernfalls könnte es etwas diffiziler werden.... Wie soll ich dann die ausgesendeten Bits ermitteln?
Für RC-5 hat ja valen schon die zwei Links genannt, die für Dich notwendig sind. In dem Beispielcode von Henk steht eine komplette Beschreibung mit Code. Getestet hatte ich dies nicht am asuro, aber Henks Programme laufen eigentlich immer ;.-.)
Ciao sagt der JoeamBerg
Ein Programm schreiben das RC5, oder welches ähnliches Protokol auch, interpretiert mit nur Anfänger Programier Verständnis wurde ich als eine ganz schwierige Sache beurteilen. Damit das richtig und Verlass-bar Funktionieren soll muss man den Timers und Interuptroutinen benutzen. Weil die Dauer von den Bits Zeit-kritisch sind. Muss du Alles selbst rausfinden, oder darfst du schon Fertige Code von andere Leute benutzen?
Die Erweiterte Code-bibliothek hat auch schon fertige RC5 Funktionen drin:
http://www.asurowiki.de/pmwiki/pub/html/main.html
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