PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variable nimmt irgendwelche Werte an



Jedi
04.12.2004, 15:53
Hallo!

Voller freude über meinen RP5 wollte ich gleich mal einige Ideen für den Fahrenden stromfresser realisieren. Leider scheitere ich schon bei meiner 1. Idee, mittels Doppel-Berührung auf den Touchsensor eine Reaktion hervorzurufen.
Eine Variable, die ich zur Verwaltung von Doppel-Berührungen brauche und die im Code immer zwischen 0 und 1 geswitcht wird, nimmt interessanter Weise Werte wie 40, etc. an.


Wie ist das möglich?


Hier der Code - TOUCH_EVAL ist die problematische Variable


'--------------------------------------------
' Vars
'--------------------------------------------
define TEMP_TOUCH byte
define TOUCH1 byte ' 1. Druck
define TOUCH2 byte ' 2. Druck
define TOUCH_EVAL byte ' Soll Druck evaluiert werden (Verhindern von mehrfachzählen des Gleichen)
define TOUCH_COUNTER word ' Abbruch von Auswertung nach längerer Inaktivität

define MAKE_EXIT byte ' Soll am Ende des Durchlaufes abgebrochen werden?
define MAKE_RUNNINGLEDS byte ' Lauflicht machen

'--------------------------------------------
' Parametric Vars
'--------------------------------------------
define LEDVALUE byte

'--------------------------------------------
' Init
'--------------------------------------------
TOUCH1 = 0
TOUCH2 = 0
TOUCH_EVAL = 1

MAKE_EXIT = 0
MAKE_RUNNINGLEDS = 0

'--------------------------------------------
' Human Interface
'--------------------------------------------
#hi
TEMP_TOUCH = TOUCH ' buffering
IF TEMP_TOUCH < 10 THEN TEMP_TOUCH = 0 ' tolerance
TOUCH_COUNTER = TOUCH_COUNTER + 1

IF TOUCH_COUNTER > 99 THEN goto SET_TOUCH_COMMAND
IF TEMP_TOUCH = 0 THEN TOUCH_EVAL = 1
IF TEMP_TOUCH > 0 AND TOUCH1 = 0 AND TOUCH_EVAL > 0 THEN goto SET_TOUCH1
IF TEMP_TOUCH > 0 AND TOUCH1 > 0 AND TOUCH2 = 0 AND TOUCH_EVAL > 0 THEN goto SET_TOUCH2
GOTO END_TOUCH_DEFS
#SET_TOUCH1
TOUCH1 = 1
TOUCH_EVAL = 0
TOUCH_COUNTER = 0
GOTO END_TOUCH_DEFS
#SET_TOUCH2
TOUCH2 = 1
TOUCH_EVAL = 0
TOUCH_COUNTER = 0
GOTO END_TOUCH_DEFS
#SET_TOUCH_COMMAND
IF TOUCH1 = 1 AND TOUCH2 = 1 THEN MAKE_EXIT = 1
IF TOUCH1 = 1 AND TOUCH2 = 0 THEN MAKE_RUNNINGLEDS = 1
TOUCH_COUNTER = 0 : TOUCH1 = 0 : TOUCH2 = 0 ' reset vars
goto ei
#END_TOUCH_DEFS

LEDVALUE = TOUCH1 + TOUCH2 * 2

if TOUCH >= 200 THEN MAKE_EXIT = 1

print touch, touch_eval, touch1, touch2, touch_counter, temp_touch

'--------------------------------------------
' Environment Interface
'--------------------------------------------
#ei

'--------------------------------------------
' Reaction
'--------------------------------------------
#re
IF MAKE_EXIT = 1 THEN GOTO EXIT
IF MAKE_RUNNINGLEDS = 1 THEN GOSUB RUNNINGLEDS

MAKE_RUNNINGLEDS = 0 : MAKE_EXIT = 0 ' reset reactions

'--------------------------------------------
' Output
'--------------------------------------------
#out
pause 5
GOSUB SETLEDS

' RETURN TO BEGINNING
GOTO hi

'--------------------------------------------
' EXIT
'--------------------------------------------
#EXIT
GOSUB LEDSOFF
beep 600,5,0
print "ENDE"
END


Wie schon erwähnt - ich switch TOUCH_EVAL zwischen 0 und 1 und trotzdem kommen auch andere Werte vor, die mir natürlich alles zusammen haun.

Ich wär euch sehr dankbar für Tips. Ich habs nach etnlichen Stunden Fehlersuchen aufgegeben.

Ciao

pebisoft
05.12.2004, 10:14
du nimmst eine einfache if-schleife mit 2 bedingungen. wenn zahl=0 und berührung =40 then bedingung ist 1. dann , wenn zahl=1 und berührung =40 then zahl=0. mit deinem langen programm für die sensorberührung hast du schon deinen robby schon fast vollständig beschäftigt.
setze den robby auf räder (ketten entfernen), dann fährt er ca 50%länger und viel, viel leiser.
mfg pebisoft

thille
05.12.2004, 11:59
Ja, Pebisoft hat Recht, für eine Variable, die nur die Werte 0 und 1 annehmen kann, sollte man auch keine Bytevariable verschwenden, da langt eine Bitvariable. Da die C-Control Wordvariablen immer an einer geraden Bytegrenze anfangen läßt, sollte man diese ganz an den Anfang des Programmes setzen und die Bytevariablen nummerieren. Es kann sein, daß durch die fehlende Nummerierung immer das erste Byte verwendet wird, wenn auch unter verschiedenen Namen.

Gruß

Torsten

Jedi
05.12.2004, 13:03
Danke für die Antworten.

@Pebisoft: Das kann so leider nicht gehn - schön wärs :(
Ich will sozusagen doppelklicks ermitteln und ich brauche dazu eine Variable die sagt, wann eine Berührung gewertet werden darf, und wann nicht.
Wenn ich es so machen würde, wie du sagst, würde eine Berüherung die länger als einen Schleifendruchlauf dauert, automatisch als 2 Berühurngen gewertet - das ist nicht so gut.

Das mit der "Kette" entfernen lass ich lieber bleiben ;)


@thille: ich wusste nicht, dass es einen Datentyp für BIT gibt, ich hab bis jetzt nur die Tutorials durchgemacht und bin bis jetzt noch nicht auf diesen Datentyp gestoßen


ich probier grad einen Workaround aus, der die Variable auf 0 setzt, wenn sie größer als 1 ist. total crapy, aber was solls :/


ps: if-schleifen gibt es nicht ;)

pebisoft
05.12.2004, 14:00
was du jetzt schilderst (doppleklicks)kannst du mit dem robby-touchfeld nicht machen es ist zu träge (schlechte reaktionszeiten). nimm eine fernbedienung, dann bist du besser bedient. dieses "touchfeld" ist eine spielerei und kann technisch für eine vernünftige steuerungen nicht genutzt werden.

Jedi
05.12.2004, 19:02
bei meinem Algorithmus ist Trägheit egal. Dazu brauch ich ja die Variable TOUCH_EVAL .... ;)

aber danke für den Tip mit der Fernbedienung. Werd ich ausprobiern, sobald ich eine find :)