Problem mit FB und RC 5

#3147731
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
#3148624
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
Gast #3149320
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
Gast #3149379
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.
Gast #3149398
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
#3149410
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
Gast #3149414
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
#3149421
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.
#3149432
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.
Moderator Persönliche Seite #3149467
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
#3149501
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.
Gast #3149514
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
Moderator Persönliche Seite #3149516
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.
#3149541
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren