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
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
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...
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
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
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.
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
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
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
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.
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.
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
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.
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
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.
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
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.