Forum: Compiler & IDEs Problem mit FB und RC 5


von Achim S. (achims)


Lesenswert?

Hallo
ich verwende bei einer FB den folgenden Code

1
if (copro_rc5_cmd == 0x3020|copro_rc5_cmd == 0x3820)      // Fahre frei vor
2
   {
3
   gfx_move(15, 40);                      // Angabe Ort
4
   gfx_print_text("--> frei vor     ");            // Ausgabe Text
5
   copro_setSpeed(29, 29);                  // fahre vor
6
                    // stop
7
   }

da bei dieser FB der code zweimal verschiedden z.B. 3020 oder 3820, 
gesendet wird klappt es nicht so wie ich das gern hätte. Es soll beim 
betätigen der taste eine Bewegung erfolgen z.B. Motor an, sobald ich die 
taste loslasse soll der Moror stoppen. Bisher ist es so, das beim ersten 
drücken der Motor läuft und beim zweiten drücken der taste der Motor 
stop. Wie kann ich das am besten lösen. In dem Beispiel lese ich beide 
Codes aus.
achim

von Achim S. (achims)


Lesenswert?

Hat keiner eine Idee wie ich das lösen kann?
Durch Copro_update erfolgt ständig das auslesen des Codes. Wenn ich die 
taste nur loslasse, bleibt im speicher der alte Code drin. Wie kann ich 
das ändern?
achim

von troll (Gast)


Lesenswert?

Achim Seeger schrieb:
> if (copro_rc5_cmd == 0x3020|copro_rc5_cmd == 0x3820)
Das muss schon mal || heissen. Aus dem Rest werde ich nicht klug, aber 
google mal nach IRMP...

von Achim S. (achims)


Lesenswert?

Hast recht, der Strich ist beim Kopieren verloren gegangen.
Problem noch mal. Ich drücke eine Taste auf der FB. Es wird ein Code 
ausgesandt. Lasse einen Motor laufen. Nach dem loslassen der Taste soll 
der Motor stoppen. Es ist aber der Code noch gespeichert und wird wieder 
ausgelesen. Motor läuft weiter. Wie kann ich das in C ändern.
Diese seite mit der Erklärung zum Senden und Aufbau kenne ich schon und 
andere. Es hilft leider nicht weiter bei der Ansteuerung des Motors.
achim

von Oliver (Gast)


Lesenswert?

Achim Seeger schrieb:
> Wie kann ich das in C ändern.

Das hat mit C nur mittelbar was zu tun.

Die copro_xxx- Bezeichern(und auch die Art deiner Frage) deuten auf eine 
fertige lib hin, die du da verwendest. Also frag den, der die Software 
geschrieben hat, wie die zu verwenden sind, oder lies die Doku zu den 
RC5-Routinen.

Oliver

von PittyJ (Gast)


Lesenswert?

Sendet die FB denn einen Code, wenn die Taste losgelassen wird?
Ich dachte immer, die sendet nur, wenn man die Taste herunter drückt. 
Und wenn man sie länger hält, dann wird eine Art Repeat-Code gesendet?

Ich würde also erst einmal schauen, was die FB wirklich macht.

von Oliver (Gast)


Lesenswert?

PittyJ schrieb:
> Ich dachte immer, die sendet nur, wenn man die Taste herunter drückt.
> Und wenn man sie länger hält, dann wird eine Art Repeat-Code gesendet?

Das wird auch so sein.
Das Problem dürfte eher sein, daß in der Variablen copro_rc5_cmd der 
letzte Befehl gespeichert bleibt. Weshalb, wieso, warum, und wie man 
feststellen kann, daß die FB nichts mehr sendet, sollte derjenige 
wissen, der die Software geschrieben hat.

Oliver

von Achim S. (achims)


Lesenswert?

Es ist so, solange ich die Taste gedrückt halte, wird immer der gleiche 
Code ausgesandt. Drücke ich erneut, kommt der andere. Nach dem loslassen 
der Taste bleibt der Code in der Variable copro_rc5_cmd gespeichert. 
Dadurch wiederholt sich der Ablauf des Programmes immer wieder. Damit 
die Taste beim ersten mal reagiert habe ich beide möglichen Code auf 
Funktion programmiert. Es spielt also keine Rolle welcher der beiden 
Codes kommt.
Es soll sich aber nicht wiederholen. Es soll nach dem loslassen des 
Tasters auch der Ablauf des Programmes stoppen. Beispiel: Ich drücke 
eine Taste, Motor läuft los, lasse Taste los, Motor läuft weiter, ich 
muss erst eine Stop Taste drücken. Das kann dazu führen, das ich die 
Taste falsch bediene oder eine falsche nehme. Das kann an einem Rand zum 
Absturz führen.
Kann man so was durch setzen eines flag machen?
achim

von Oliver (Gast)


Lesenswert?

Achim Seeger schrieb:
> Kann man so was durch setzen eines flag machen?

ja. Nein. Vielleicht, oder auch nicht...
42

Du stellst die falschen Fragen.

Dein Problem ist, daß du versuchst, eine Software zu verwenden, ohne zu 
wissen, was die eigentlich macht. Ratespiele im Forum bringen dich da 
nicht weiter.

Schau dir den Sourcecode an, lies die Doku, frag den, der die Software 
geschrieben hat. Da gibt es bestimmt irgendwo eine Funktion, mit der du 
abfragen kannst, ob aktuell was von der FB gesendet wird.

Hier weiß kein Mensch, wie dieses Stück Software funktioniert. Das musst 
du schon selber rausfinden.

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Wenn du mal sagen würdest, welchen Code du benutzt, dann könnte man auch 
mal nachsehen, ob der Autor die restlichen Flags und Bits aus der RC5 
Übertragung extern zur Verfügung stellt.

Denn: Eine RC5-Fernbedienung sendet keine Codes für Taste betätigt oder 
Taste losgelassen, sondern Kommandos die den Wunsch des Bedieners 
wiederspiegeln. Bleibt der Benutzer auf der Taste drauf (wie zb beim 
Fernseher die Lautstärke), dann wiederholt die FB das letzte Kommando 
wieder und immer wieder. Man kann das am Toggle-Bit in der RC5-Nachricht 
erkennen, mit der man unterscheiden kann, ob da jetzt 2 getrennte 
Kommandos hintereinander kommen, oder ob der Benutzer auf der Taste 
eingeschlafen ist

Deine einzige Chance ist es daher, dass dein Motor grundsätzlich nach 
Erkennen des Kommandos eine bestimmte Zeitdauer maximal läuft - zb ein 
paar Millisekunden - und danach automatisch stoppt. Es sei denn, in der 
Zwischenzeit trifft von der Fernbedienung eine neue Meldung ein, dass 
die Taste immer noch gedrückt ist, wodurch die Zeitsteuerung von ein 
paar Millisekunden bis zur Motorabschaltung von vorne beginnt. D.h. 
deine Motorabschaltung erfolgt nicht, weil der Benutzer die Taste 
losgelassen hat, sondern sie erfolgt, weil von der FB in der geforderten 
Zeit nicht die Nachricht eingetroffen ist, dass die Taste immer noch 
gedrückt ist.

Das ist der Weg den du gehen musst. Und alles was du dafür brauchst ist 
im RC5 grundsätzlich enthalten. Ob dein Lib-Autor dir das auch 
zugänglich macht und wie genau er das macht, ist eine andere Frage.
Vielleicht reicht ja auch schon ein gezieltes 0_setzen der (anscheinend) 
globalen Variable copro_rc5_cmd? Du setzt sie 0, und wenn von der FB 
wieder was kommt, dann schreibt dein RC5-C-Code da den nächsten Code 
rein.

von Karl H. (kbuchegg)


Lesenswert?

ha!

> copro_rc5_cmd == 0x3020|copro_rc5_cmd == 0x3820

Kann es sein, dass genau dieser 1-Bit Unterschied das Toggle-Bit aus der 
RC5-Nachricht ist?


Im Ernst: du musst dich schon auch ein bischen damit beschäftigen, was 
die Dinge bedeuten, die du da benutzt!
RC5 ist ja jetzt nicht gerade geheime Raketentechnik - das ist alles 
ausreichend im Web dokumentiert.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:

>> copro_rc5_cmd == 0x3020|copro_rc5_cmd == 0x3820
>
> Kann es sein, dass genau dieser 1-Bit Unterschied das Toggle-Bit aus der
> RC5-Nachricht ist?

Ja, so ist es. Dieses Bit sollte der TO schon mal direkt mittels

   copro_rc5_cmd &= ~0x800;

rauswerfen. Dann vereinfacht sich die nachfolgende Abfrage auf

   if (copro_rc5_cmd == 0x3020)

Und Du hast vollkommen recht, dass er selbst nur über eine 
Timeout-Behandlung herausfinden kann, ob der User die Taste mittlerweile 
losgelassen hat oder nicht.

Gruß,

Frank

von Karl H. (kbuchegg)


Lesenswert?

Frank M. schrieb:

> Und Du hast vollkommen recht, dass er selbst nur über eine
> Timeout-Behandlung herausfinden kann, ob der User die Taste mittlerweile
> losgelassen hat oder nicht.

Wie zb so mancher Fernseher, der zwar die Lautstärke-Einstellung bei 
Druck auf '+' oder '-' einblendet, diese aber erst nach einiger Zeit 
automatisch verschwinden lässt, bzw. mit jedem neuen Tastendruck (bzw. 
Draufbleiben auf der Taste) diese Ablaufzeit automatisch verzögert.

Es lohnt sich, wenn man in seiner Umgebung die Augen aufmacht und mal 
ein wenig beobachtet, wie die Dinge aus unserem Alltag funktionieren. Da 
steckt oft ein Grund dahinter, den man sogar rausfinden kann, wenn man 
sich die zugrundeliegende Technik (wie hier das RC5 Protokoll) mal 
genauer ansieht.

von Oliver (Gast)


Lesenswert?

Frank M. schrieb:
> Und Du hast vollkommen recht, dass er selbst nur über eine
> Timeout-Behandlung herausfinden kann, ob der User die Taste mittlerweile
> losgelassen hat oder nicht.

Nun ja, wenn die verwendete lib auch nur ansatzweise ernsthaft gemeint 
ist, sollte solch eine Funktion vorhanden sein. Man muß sie nur finden 
und richtig nutzen.

Oliver

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Frank M. schrieb:

> Es lohnt sich, wenn man in seiner Umgebung die Augen aufmacht und mal
> ein wenig beobachtet, wie die Dinge aus unserem Alltag funktionieren. Da
> steckt oft ein Grund dahinter, den man sogar rausfinden kann, wenn man
> sich die zugrundeliegende Technik (wie hier das RC5 Protokoll) mal
> genauer ansieht.

Prinzipiell ja. Meistens klappt das "Beobachten der Umwelt". Aber ich 
als Entwickler des IRMP musste auch dazulernen:

Es gibt durchaus IR-Fernbedienungsprotokolle, wo noch ein weiterer Frame 
rausgeschickt wird, wenn eine Taste wieder losgelassen wird. Beispiele 
sind das ORTEK- und das NETBOX-Protokoll. Über 95% der üblichen 
FB-Protokolle machen das aber nicht.

Von daher geht es wirklich nur über einen Timeout. Ich glaube 
allerdings, dass der TO mit dieser Aufgabenstellung überfordert ist.

von Achim S. (achims)


Lesenswert?

Danke euch schon mal für die Antworten. Das Protokoll von der RC 5 FB 
habe ich mir angeschaut. Hatte die Bitfolge dabei gesucht, die meine FB 
abgibt. Leider habe ich dazu die LIB nicht verglichen bzw. angeschaut. 
Es ist wohl dabei eine Sache dieser LIB was nach dem loslassen der Taste 
passiert. Denn Weg über Time werde ich mal ausprobieren, ist nur die 
Frage, ob es sich lohnt, so viel Aufwand oder ob ich versuche eine 
direkte Umschaltung mache ohne über aus. Das werden jetzt aber mehr die 
Versuche zeigen.
Hatte angenommen, das es vielleicht eine fertige Routine dazu gibt. 
Schade
Danke noch mal.
achim

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Achim Seeger schrieb:
> Hatte angenommen, das es vielleicht eine fertige Routine dazu gibt.

Vielleicht gibt es die fertige Routine.

Du solltest deshalb hier mal die bereits mehrfach gestellte Frage 
beantworten, welche Lib Du da überhaupt verwendest. IRMP ist es 
jedenfalls nicht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.