PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RC5-Signal auswerten!?



bnitram
28.11.2010, 14:23
Hallo Forum,
Ich möchte gerne meinen PRO-BOT128 über eine Fernbedienung steuern.
Es bietet sich ja an über den RC5 code zu arbeiten.
Hier (http://www.c-control-pro.de/documentation/index.html?rc5) habe ich den Befehl RC5_READ() gefunden. Wenn ich jetzt mit meinem Programm( geschrieben in C-Compact) das auslesen will bekomme ich nur Dezimalzahlen. Ich möchte aber die Binären Code.
Weiß jemand wie das geht??
Hier mein Programm:

void main(void)
{
PRO_BOT128_INIT();
RC5_Init(26);

while(true){
Msg_WriteWord(RC5_Read());
Msg_WriteChar(13);
Msg_WriteChar(10);
AbsDelay(10);
}
}


Wie gesagt, es funktioniert, aber ich möchte den Binären Code haben.

Mfg
bnitram

oberallgeier
28.11.2010, 17:08
... es funktioniert, aber ich möchte den Binären Code haben ...Du möchtest das Ergebnis als Binärzahl darstellen? Oder was? Ich verstehe die Frage nicht ganz.
Bekommst Du den Wert, der die gesamten 14 Bit repräsentiert und willst vielleicht Adresse und Befehl trennen? Das liegt dann an der (fertigen) Routine. Ich habe mir meine Routine selbst geschrieben und bekomme sowohl das Adress- als auch das Befehlsbyte getrennt.

bnitram
28.11.2010, 17:13
Ja,
genau.
Ich möchte die Werte später trennen, da ich dem Start und Toggle-Bit nicht brauche.
Ich möchte nur den Adress und Commando-Bit als ausgabe haben.

Mfg
bnitram

PS:
Schonmal Danke für deine Antwort.

oberallgeier
28.11.2010, 17:21
Dann musst Du entweder Deinen 2-Byte-Wert auseinanderklabüseln (das ist eine entsprechende Bitschieberei) und auf 2 8bittige Werte verteilen oder gleich eine eigene Routine schreiben. Ich hatte eben den zweiten Weg gewählt (jetzt verstehe ich auch besser, was dahinter steckt).

............http://www.sbprojects.com/knowledge/ir/rc5train.gif

bnitram
28.11.2010, 17:33
Weiß du denn wie ich mir einfach den Binären-Code anzeigen lassen kann??

oberallgeier
28.11.2010, 19:06
Weiß du denn wie ich mir einfach den Binären-Code anzeigen lassen kann??Ja. (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=523501#523501)

bnitram
29.11.2010, 14:56
Danke,
habe es jetzt geschafft.

Mfg
bnitram

oberallgeier
29.11.2010, 15:44
Danke, habe es jetzt geschafft ...Schön, es gibt ja nix Befriedigenderes als wenns endlich läuft!

Die beiden Bytes - Adresse und Kommando - hatte ich mir am Terminal anzeigen lassen. Das Adressbyte eher zur Kontrolle, ob nicht mal ein Lesefehler auftrat. Danach habe ich meine IR-Fernsteuerung auf den Kopierer gelegt und eine Fotokopie gemacht. Dann Knopf für Knopf gedrückt und die zugehörigen Kommandobytes auf die Kopie geschrieben. Hilft beim Programmieren der Kommandoauswertung ungemein. Aber so eine Lösung ist Dir vielleicht schon in ähnlicher Weise eingefallen.

radbruch
29.11.2010, 16:04
Hallo

Schön, dass es nun funktioniert. Es wäre prima, wenn du uns noch deine Lösung zeigen würdest.

Übrigens gibt es für das C-Control einen eigenen Bereich im RN-Forum:
https://www.roboternetz.de/phpBB2/index.php?c=5

Denn der C-Dialekt von Conrad unterscheidet sich deutlich vom GCC.

Solange wir noch keine eigene Rubrik für den probot haben, sollte im Titel eines Threads möglichst das Wort "probot" vorkommen. Ganz toll wäre es dann noch, wenn die Beiträge zum probot auch in der "Sonstige Modelle"-Rubrik gepostet werden. Da habe ich nämlich Mod-Rechte und kann dann am Tag X alle Beiträge in die neu geschaffenen Unterrubriken verschieben (oder versehentlich löschen...). Das gilt natürlich auch für nibos, CATs, RAs usw...

https://www.roboternetz.de/phpBB2/viewforum.php?f=25

Gruß

mic

bnitram
29.11.2010, 18:42
Solange wir noch keine eigene Rubrik für den probot haben, sollte im Titel eines Threads möglichst das Wort "probot" vorkommen. Ganz toll wäre es dann noch, wenn die Beiträge zum probot auch in der "Sonstige Modelle"-Rubrik gepostet werden. Da habe ich nämlich Mod-Rechte und kann dann am Tag X alle Beiträge in die neu geschaffenen Unterrubriken verschieben (oder versehentlich löschen...). Das gilt natürlich auch für nibos, CATs, RAs usw...
Ja werde ich demnächst beachten.

Ich habe aus einem Beispielscode den ich durch zufall gefunden habe dann diese Version gemacht:


word RC5_Command;
word RC5_ExtCommand;

void main(void)
{
PRO_BOT128_INIT();
RC5_Init(26);

while(true){
RC5_Command = RC5_Read() &0x3F;
RC5_ExtCommand = RC5_Command | ((RC5_Read() &0x1000) >> 6);

Msg_WriteWord(RC5_Command);
Msg_WriteText(":");
Msg_WriteWord(RC5_ExtCommand);
Msg_WriteChar(13);
}
}
So erhält man dann den Commando Bit und einen zweiten wo ich nicht ganz weiß welcher der ist.Auf jeden Fall braucht man ihn :)
(Sonst wären tausend befehle gleich!)

Mfg
bnitram

radbruch
29.11.2010, 21:09
Hallo

http://www.sbprojects.com/knowledge/ir/rc5train.gif

Das Bild dient echt der Verwirrung, aber trotz gründlicher Suche habe ich leider kein besseres gefunden. Was mich daran stört, und Einsteiger sicher verwirrt, ist die Zählung der Bits. Hier ist die Reihenfolge dargestellt, in der die Bits gesendet werden, es ist ein klassisches MSB zuerst. Der Aufbau der RC5-Daten sieht aber so aus:


// Aufbau der RC5-Daten:
// Bitnummer: 1111110000000000
// 5432109876543210
// Funktion: --sstaaaaacccccc


RC5_Command = RC5_Read() & 0x3F;

Wer die Darstellung von Werten in verschiedenen Zahlensystemen schon kennt, kann diesen Abschnitt überspringen. Für alle anderen ein ganz kurzer Ausflug in die Welt der Hex-Darstellung: Neben einigen anderen Vorteilen ist die Hex-Schreibweise sehr einfach in binäre Schreibweise umwandelbar. Jede Stelle in Hex steht für 4 Bits, die je Stelle mit 1,2,4 oder 8 angesprochen werden. 0x02 ist 0b0000 0010, 0x40 ist 0b0100 0000 und 0xF0 ist entsprechend 0b1111 0000. 0x3f ist deshalb einfach gleich 0b0011 1111.

Durch den &-Operator werden die Bits 15 bis 6 ausgeblendet (=gelöscht!), übrig bleiben die 6 Kommandobits in Bit0 bis 5.

RC5_ExtCommand = RC5_Command | ((RC5_Read() & 0x1000) >> 6);

0x1000 ist 0b0001 0000 0000 0000 und zeigt damit auf das zweite Startbit RC5-Bit12. Dieses kennzeichnet den erweiterten RC5-Code. (blöderweise fällt mir aber grad nicht ein, wie es das macht ;) Das Ergebniss-Bit nach dem UND wird noch um 6 Stellen nach rechts geschoben und mit RC5_Command verODERt, somit enthält RC5_ExtCommand ebenfalls die 6 Kommandobits und zusätzlich in Bit6 das ExtendetRC5-Bit. Die RC5-Adresse fällt völlig under den Tisch.

In RC5-Bit11 ist übrigends das Togglebit:

RC5_ToggleBit = RC5_Read() & 0x0800; // 0b0000 1000 0000 0000

Das ToggleBit wechselt, wenn die selbe Taste erneut gedrückt wurde:

(btw: Den nächsten Satz hatte ich bisher überlesen: "The toggle bit will retain the same logical level during all of these repeated messages." Bedeutet also, nur toggeln, wenn Taste erneut gedrückt wurde. Das ist dann oben bei meinem letzten Vorschlag nicht richtig)

Wann wird eigentlich das Signal eingelesen? Funktioniert das im Hintergrund oder ist RC5_Read() blockierend und wartet bis zu nächsten RC5-Zeichen? Wäre das nicht sicherer:


word RC5_Empfang;
word RC5_ToggleBit;
word RC5_Command;
word RC5_ExtCommand;

void main(void)
{
PRO_BOT128_INIT();
RC5_Init(26);

while(true){
RC5_Empfang = RC5_Read();
RC5_ToggleBit = (RC5_Empfang & 0x0800) >> 11; // EDIT!
RC5_Command = RC5_Empfang & 0x3F;
RC5_ExtCommand = RC5_Command | ((RC5_Empfang & 0x1000) >> 6);

Msg_WriteWord(RC5_Command);
Msg_WriteText(":");
Msg_WriteWord(RC5_ExtCommand);
Msg_WriteText(":");
Msg_WriteWord(RC5_ToggleBit);
Msg_WriteChar(13);
}
}

Scheint mir sinnvoll bei der Beschreibung von RC5_Read():
http://www.c-control-pro.de/documentation/rc5_read.htm

Gruß

mic

oberallgeier
29.11.2010, 21:18
... erhält man ... Commando Bit und einen zweiten wo ich nicht ganz weiß welcher der ist ...Das ist vermutlich das erweiterte Kommandobit. Die sechs Bit Breite - entsprechend 64 Befehlen - wurden durch komplexere Steueraufgaben zu wenig. Also ersetzte man das zweite Startbit durch ein invertiertes 7. Kommandobit - und - simsalabim - waren es schon 128 unterscheidbare Befehle. Sicherlich läuft Dein Code auf diese Erweiterung hinaus.

bnitram
30.11.2010, 14:29
Hallo Nohmal,
Also den Oben geposteten Code, der funktioniert.
RC5_Read() ist schon die omplette auslesefunktion.
Hier noch ein Porgramm was auch funzt, wo ich mit dem fünf Tasten (oben,unten,rechts,links und OK) den Bot fahren lassen kann:


word RC5_Command;
word RC5_ExtCommand;

void main(void)
{
PRO_BOT128_INIT();
RC5_Init(26);
DRIVE_ON();


while(true){
RC5_Command = RC5_Read() &0x3F;
RC5_ExtCommand = RC5_Command | ((RC5_Read() &0x1000) >> 6);

if((RC5_Command == 40) && (RC5_ExtCommand == 104)){
DRIVE(128,128);
}
if((RC5_Command == 28) && (RC5_ExtCommand == 92)){
DRIVE(255,255);
}
else{
if((RC5_Command == 27) && (RC5_ExtCommand == 91))
DRIVE(1,1);
}
if((RC5_Command == 37) && (RC5_ExtCommand == 101)){
DRIVE(50,205);
}
else{
if((RC5_Command == 36) && (RC5_ExtCommand == 100))
DRIVE(205,50);
}
}
}

Mfg
bnitram