Thomas E.
22.09.2012, 16:33
Hallo!
Nach langer Recherche im Internet fand ich keine fertige Lösung, den Highlevel-Befehl Debounce mit gleichzeitiger Erkennung von langen und kurzen Tastendrücken zu kombinieren. Also stellte ich kurzerhand selbst Versuche in diese Richtung an. Das ist das Ergebnis:
'#########
'## EDT ##
'#########
'---------
'Debouncetimer
'V1.0.0
'22.09.2012
'BASCOM 2.0.7.5
'---------
'-
'---------
'Tasterentprellung mit Debounce-Befehl und Zeitauswertung
'Bei Erkennung eines Tastendruckes wird 5ms gewartet, bleibt der Taster gedrückt
'wird D0_active angesprungen. Dort wird ein Flag gesetzt und wieder zur Hauptschleife
'zurückgekehrt. Der Timer0 erzeugt ca. alle 10ms einen Interrupt; wenn das Flag
'gesetzt ist wird die Variable Count hochgezählt. Wird der Taster losgelassen
'und Count hat den Wert 51 noch nicht erreicht, wird ein kurzer Tastendruck gezählt.
'Erreicht Count den Wert 51 wird ein langer Tastendruck gezählt.
'Kurzer Tastendruck: <500ms
'Langer Tastendruck: 510ms
'---------
$regfile = "m32def.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 8
$framesize = 32
'KONFIGURATION PORTS
Config Pind.0 = Input
Portd.0 = 1
'KONFIGURATION TIMER0 (10ms)
Config Timer0 = Timer , Prescale = 64
On Timer0 Isr_timer0
Timer0 = 100
Enable Timer0
Start Timer0
'KONFIGURATION DEBOUNCE
Config Debounce = 5 '5ms Auswertedauer des Tasters
'VARIABLEN
Dim Flag As Bit
Dim Count As Byte
Dim Pressed_short As Byte 'Zähler für kurze Tastendrücke
Dim Pressed_long As Byte 'Zähler für lange Tastendrücke
Enable Interrupts
'### HAUPTSCHLEIFE ###
Do
Debounce Pind.0 , 0 , D0_active , Sub
If Flag = 1 Then
If Pind.0 = 1 And Count < 50 Then 'Auswertung des kurzen Tastendrucks
Pressed_short = Pressed_short + 1 'Zählen des kurzen Tastendrucks
Flag = 0
Count = 0
End If
If Count > 50 Then 'Auswertung des langen Tastendrucks
Pressed_long = Pressed_long + 1 'Zählen des langen Tastendrucks
Flag = 0
Count = 0
End If
End If
Loop
'### ISR ###
Isr_timer0:
Timer0 = 100
If Flag = 1 Then Count = Count + 1
Return
'### SUB ###
D0_active:
Set Flag
Return
End
Der Quelltext sollte selbsterklärend sein. Vielleicht sucht ja jemand nach genau dieser Funktion und kann meine Routine verwenden.
Nach langer Recherche im Internet fand ich keine fertige Lösung, den Highlevel-Befehl Debounce mit gleichzeitiger Erkennung von langen und kurzen Tastendrücken zu kombinieren. Also stellte ich kurzerhand selbst Versuche in diese Richtung an. Das ist das Ergebnis:
'#########
'## EDT ##
'#########
'---------
'Debouncetimer
'V1.0.0
'22.09.2012
'BASCOM 2.0.7.5
'---------
'-
'---------
'Tasterentprellung mit Debounce-Befehl und Zeitauswertung
'Bei Erkennung eines Tastendruckes wird 5ms gewartet, bleibt der Taster gedrückt
'wird D0_active angesprungen. Dort wird ein Flag gesetzt und wieder zur Hauptschleife
'zurückgekehrt. Der Timer0 erzeugt ca. alle 10ms einen Interrupt; wenn das Flag
'gesetzt ist wird die Variable Count hochgezählt. Wird der Taster losgelassen
'und Count hat den Wert 51 noch nicht erreicht, wird ein kurzer Tastendruck gezählt.
'Erreicht Count den Wert 51 wird ein langer Tastendruck gezählt.
'Kurzer Tastendruck: <500ms
'Langer Tastendruck: 510ms
'---------
$regfile = "m32def.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 8
$framesize = 32
'KONFIGURATION PORTS
Config Pind.0 = Input
Portd.0 = 1
'KONFIGURATION TIMER0 (10ms)
Config Timer0 = Timer , Prescale = 64
On Timer0 Isr_timer0
Timer0 = 100
Enable Timer0
Start Timer0
'KONFIGURATION DEBOUNCE
Config Debounce = 5 '5ms Auswertedauer des Tasters
'VARIABLEN
Dim Flag As Bit
Dim Count As Byte
Dim Pressed_short As Byte 'Zähler für kurze Tastendrücke
Dim Pressed_long As Byte 'Zähler für lange Tastendrücke
Enable Interrupts
'### HAUPTSCHLEIFE ###
Do
Debounce Pind.0 , 0 , D0_active , Sub
If Flag = 1 Then
If Pind.0 = 1 And Count < 50 Then 'Auswertung des kurzen Tastendrucks
Pressed_short = Pressed_short + 1 'Zählen des kurzen Tastendrucks
Flag = 0
Count = 0
End If
If Count > 50 Then 'Auswertung des langen Tastendrucks
Pressed_long = Pressed_long + 1 'Zählen des langen Tastendrucks
Flag = 0
Count = 0
End If
End If
Loop
'### ISR ###
Isr_timer0:
Timer0 = 100
If Flag = 1 Then Count = Count + 1
Return
'### SUB ###
D0_active:
Set Flag
Return
End
Der Quelltext sollte selbsterklärend sein. Vielleicht sucht ja jemand nach genau dieser Funktion und kann meine Routine verwenden.