PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfängerproblem Tastenauswertung



Thomas U.
08.06.2004, 05:38
Hallo,

ich will eine Byte-Variable per Tastendruck um jeweils 1 erhöhen. Also muss ich, um den Wert um 100 zu erhöhen 100 mal den Taster drücken – das will ich aber nicht.

Nun möchte ich zusätzlich, dass, wenn der Taster länger als z.B. 3 sec gedrückt bleibt, sich die Variable in z.B. 10er-Schritten erhöht. Mein Problem liegt in der Auswertung des 3 sec – Tastendruck.

Da ich den einfachen Tastendruck mit Debounce auswerte, werde ich die 3 sec-Auswertung
wohl innerhalb der Debounce-Sub machen müssen. Nur wie mache ich die Anweisung, daß Port.x für min. 3 sec auf low sein soll, um in 10er Schritten zu erhöhen.


Gruss, Thomas

x-ryder
08.06.2004, 12:53
Hi



$regfile = "4433def.dat"
$crystal = 7372800

const inter1=1
const inter2=10

Dim Intervall As Word , Temp As Byte

Do
intervall=inter1
gosub buttons
While Button = 1
gosub buttons
Incr Temp
If Temp > 3 Then Intervall = Inter2
for i = 1 to intervall
incr bytevariable
next
Waitms 1000
Wend
Loop

butan:
Button=1
return

butaus:
Button=0
return

buttons:
Debounce M , 0 , butan , Sub
Debounce M , 1 , butaus , Sub
Return


Inter1=Konstante, mit der du die Schritte bis zum umschalten auf zwei einstellen kannst (in deinem Beipiel 1 Schritt pro Sek.)

Inter2=Konstante, mit der du die Schritte nach dem umschalten einstellen kannst (in deinem Beipiel 10 Schritte pro Sek.)


Ich hoffe dir konnte das helfen...
Habs zwar nicht getestet, müsste aber funktionieren 8-[

MfG
Martin

Roberto
11.12.2004, 20:02
Hallo

Falls es jemand interessiert ;-)

Habe obigen Code ausprobiert.
Funktioniert aber nicht so ganz .
Habe mich damit ein bisschen gespielt und das ist jetzt rausgekommen:
Eine Taste zaehlt mit Debounce rauf und beim länger halten, ab einen Wert von 10* Einer, zaehlt er dann die Zehner statt die Einer rauf..
(Ausgabe auf einem LCD)


'-------- Debounce und Zählen mit verschiedenen Längen --------------
'-------- zaehlt bei zweiter Stelle schneller --------------


$regfile = "m8def.dat"
$crystal = 8000000

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4
Config Lcdmode = Port

Config Pind.7 = Input
Config Pind.6 = Input
Portd = 255 ' Port d auf High
Config Debounce = 30 ' Tastenentbrellung mit 30ms


Dim Zaehler As Word
Dim Taste As Byte
Dim Zaehlweite As Byte
Dim Mitzaehlen As Byte
Dim I As Byte

Const Normalzaehlen = 1
Const Schnellerzaehlen = 10
Const Nochschnellerzaehlen = 100
Zaehlweite = Normalzaehlen
Zaehler = 0
Mitzaehlen = 0
Cls


Do

Gosub Lesen
While Taste = 1
Incr Mitzaehlen 'Mitzaehler +1
If Mitzaehlen > 10 Then Zaehlweite = Zaehlweite + 10
For I = 1 To Zaehlweite
Incr Zaehler
Next
Waitms 200
Cls
Locate 1 , 1
Lcd Zaehler
Gosub Lesen
Wend
Mitzaehlen = 0
Zaehlweite = Normalzaehlen
Locate 1 , 1
Lcd Zaehler

Loop

End

Ein:
Taste = 1
Return

Aus:
Taste = 0
Return

Lesen:
Debounce Pind.7 , 0 , Ein , Sub
Debounce Pind.7 , 1 , Aus , Sub
Return



und hier eine Verison, wo er die Zaehner und dann die Hunderter schneller zaehlt.



'-------- Debounce und Zählen mit verschiedenen Längen --------------
'-------- zaehlt 2 und dann 3 Stellen schneller. --------------

$regfile = "m8def.dat"
$crystal = 8000000

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4
Config Lcdmode = Port

Config Pind.7 = Input
Config Pind.6 = Input
Portd = 255 ' Port d auf High
Config Debounce = 30 ' Tastenentbrellung mit 30ms


Dim Zaehler As Word
Dim Taste As Byte
Dim Zaehlweite As Byte
Dim Mitzaehlen As Byte
Dim I As Byte

Const Normalzaehlen = 1
Const Schnellerzaehlen = 10
Const Nochschnellerzaehlen = 100
Zaehlweite = Normalzaehlen
Zaehler = 0
Mitzaehlen = 0
Cls


Do

Gosub Lesen
While Taste = 1
Incr Mitzaehlen 'Mitzaehler +1
If Mitzaehlen > 10 And Mitzaehlen < 101 Then
Zaehlweite = Schnellerzaehlen
Mitzaehlen = Mitzaehlen + 10
End If

If Mitzaehlen > 100 Then Zaehlweite = Nochschnellerzaehlen

For I = 1 To Zaehlweite
Incr Zaehler
Next
Waitms 200
Cls
Locate 1 , 1
Lcd Zaehler
Gosub Lesen
Wend
Mitzaehlen = 0
Zaehlweite = Normalzaehlen
Locate 1 , 1
Lcd Zaehler

Loop

End

Ein:
Taste = 1
Return

Aus:
Taste = 0
Return

Lesen:
Debounce Pind.7 , 0 , Ein , Sub
Debounce Pind.7 , 1 , Aus , Sub
Return

albundy
12.12.2004, 11:43
Ich will mich nicht einmischen, aber in der Hilfe zu Debounce steht:

"When DEBOUNCE is executed again, the state of the switch must have gone back in the original position before it can perform another branch. So if you are waiting for a pin to go low, and the pin goes low, the pin must change to high, before a new low level will result in another branch."

Somit scheidet ein längeres betätigen der Taste mit Debounce wohl aus.

x-ryder
12.12.2004, 11:52
die position wird in meinem proggi ja gespeichert und ab dem sprung ins hauptprogramm ist es erstmal egal was für eine stellung der switch hat BIS DER SCHALTER WIEDER LOSGELASSEN WIRD (siehe butaus)

im übrigen funktioniert mein code eigentlich wunderbar

Martin

Roberto
12.12.2004, 15:15
Hallo albundy
Ja, so dachte ich zuerst auch, bis ich den Code von x-ryder probiert habe :-)
Aber in der Hilfe steht auch, dass Debounce das Programm nicht anhält..

@x-ryder
Sorry, wollte dich nicht blosstellen ;-)

Ohne deinen Code hätte ich es nicht gekonnt..

Bei dir sind aber die Variablen nicht alle definiert (dim...
und darum funktionierte auch dein Code bei mir nicht richtig.

und bei mir habe ich nach WEND die Variable wieder zurückgesetzt, damit man wieder mit Einer zählen kann.
Erst beim länger drücken, zählt er dann wieder mit den Zehner.