PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tasterentprellung mit Debounce und langen Tastendrücken



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.

Bastelfuzzi
10.11.2021, 12:37
Hallo,
Beitrag ist schon etwas älter aber:

ich habe einen geschlossenen Taster und möchte folgendes auswerten:

Taster bis 5sek offen es soll nichts passieren
Taster 7sek oder länger offen soll ein Unterprogramm angesprungen werden

Hintergrund:

Wir sind eine museumsbahn , eine Schaltung in Bascom geschrieben erkennt eine Zugtrennung und läßt bei Trennung den Zug anhalten.
Die Wagen sind durch ein Kabel mit Steckvorrichtung verbunden.Bei erschütterungen nun kann der Kontakt mal kurz trennen.
Dieses erkennt die Schaltung nun als Zugtrennung.Deswegen die 5 sek Sicherheitszeit.

können Sie mir helfen ?
Gruß
Jürgen Schmahle
Juergen.Schmahle@T-Online.de

rolber
10.11.2021, 20:05
Hallo !

Das ist doch ziemlich Easy:
1. Du fragst den Taster an Eingang X ab
2. Du fragst einen Timer ab
3. Du erstellst eine Anweisung, etwa so : If Timer0 > 5 Sekunden And Taster=0 Then ---Unterprogramm--

Fertig

Frag jetzt bitte nicht nach fertigem Code.

MfG

Sauerbruch
15.12.2021, 10:45
Gibt´s denn schon Hardware dafür, d.h. einen konkreten Controller?
Und was muss der Controller tun, um den Zug anzuhaltn? Geht das über Relais oder ähnliches?
Dir Aufgabe mit den 5 Skunden wäre wirlich keine Hexerei; mit ein paar mehr Informationen ist das schnell gelöst!