PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 3 Sekunden Tastendruck auswerten



meldano
29.04.2007, 19:15
Hallo,

als Anfänger stelle ich mir die Frage wie ich auswerte ob ein Tastendruck 3 Sekunden lang stattgefunden hat.

Mit:


main:
do
If Taster = 0
then waitms 3000
if Taster = 0
then
goto schalten
end if
end if

schalten:
toggle led
goto main


funkioniert die Sache ja nicht sauber.

Dann habe ich mal in der Hilfe geschaut und debounce gefunden:



Config Debounce = 3000
Do
Debounce Taster , 0 , Schalten , Sub
Loop

Schalten:
toggle led
return

die 3000ms werden nicht angenommen. Der Taster wird nur sauber entprellt.


Meine (hoffentlich nicht nervende Anfänger-) Frage:
Wie löse ich so etwas, also eine 3S Tasterabfrage elegant?

Danke für eure Unterstützung!


Gruß
Daniel

Dnerb
29.04.2007, 20:41
Die Zeit bei Debounce ist quasi zum justieren. Debounce entprellt nur, das hat nichts mit dem zu tun was Du tun willst.

Du kannst es über Timer und Interrupts lösen.

Oder Du gehst her und machst ganz billig eine For...next-Schleife, die läßt Du, sagen wir mal 30 mal durchlaufen und jedesmal zwischen der Abfrage wartest Du 100ms.

sato
29.04.2007, 20:43
Hallo
So z.b.

main:

for temp = 1 to 3000
if taster = 1 then exit
waitms 1
next

toggle led

exit:goto main
end

xunwichtig
01.05.2007, 12:01
@sata ... da wartet die schleife aber immer, bei nicht gedrücktem taster 2 sek. anstat bei gedrücktem taster.

@meldano
Du kannst das eigentlich recht simpel machen. Du nutzt eien Schleife, um dein Programm ablaufen zu lassen. In dieser Schleife prüfst du ständig, ob die Taste gedrückt ist, oder nicht. Um nun heraus zu finden, wei lange sie gedrückt ist, reicht es einfach aus, wenn du eine Variable immer dannhoch zählt, wenn der Taster gedrückt ist, und die Variable imer dann auf 0 setzt, wenn der taster los gelassen wurde.

Du drückst die Taste. Jetzt wird die variable bei jedem durchlauf +1 gerechnet.
Du läst die Taste los. Jetzt must du prüfen, ob der Wert der Taste geteilt durch den ( Takt minus der Abarbeitungsschritte ) den Wert besitzt, welchen du wünschst zu warten. Wenn dem so ist, kannst du etwas tun, wenn dem nicht so ist, dann nicht.
Abschliessend setzt du die variable auf 0.

Dadurch musst du nicht warten, sondern kannst dein Programm standardmässig udn ohne zeitverlust, oder Probleme bei Zeitkritischen Dingen, weiter laufen lassen.


JimJim
XUN

strunz
15.05.2007, 09:32
@xunwichtig:

könntest du bitte mal einen beispielcode posten!?
Vielleicht wird es dann etwas klarer.

Danke.

Lordcyber
25.06.2007, 00:32
Also ich habe das auch per Variable gelößt.
Da es mir eher darum ging das der Schallter nicht zu lange gedrückt sein darf.



Dim T As Word




Main: 'Hauptprogramm
Do
'Anfang des Schwimmerschalter
If Pind.2 = 1 Then 'Wenn an Pin 2 von Port D ein high level anliegt..

Portd.5 = 1 '...setze Pin 5 von Port D auf High, Pumpe läuft
T = T + 1
Waitms 100 'Zeit wo die Pumpe an ist
Else
Portd.5 = 0 '...setze Pin 5 von Port D auf low, Pumpe aus
T = 0 'Zeit reset
End If 'Ende der Bedingung

If T > 100 Then
Gosub Error
Else
End If 'Ende der Bedingung

Loop 'zum Anfang der Schleife
End 'end program

Error: 'Untermenü "Error"
Do
Portd.6 = 1 'Error LED leuchtet
Portd.5 = 0 '...setze Pin 5 von Port D auf low, Pumpe aus 'setzt den Pin 7 von Port D auf low
Loop
Also alle 10ms zählt der Zähler T eins hoch wenn der über 100 ist geht er zum Sub.
Zeiten mu0t hallt umstellen.