- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 4 von 4

Thema: Tasterentprellung mit Debounce und langen Tastendrücken

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638

    Tasterentprellung mit Debounce und langen Tastendrücken

    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:

    Code:
    '#########
    '## 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.
    Grüße
    Thomas

  2. #2
    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

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    30.12.2008
    Ort
    Essen
    Alter
    65
    Beiträge
    358
    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
    Robotik & Arduino Homepage
    http://www.ardumega.de

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    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!

Ähnliche Themen

  1. RC5 kurzen und langen Tastendruck unterscheiden
    Von TobiasBlome im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 13
    Letzter Beitrag: 09.01.2011, 19:30
  2. MIDI (bzw. RS232) Übertragunsfehler bei langen Kabeln
    Von Bääääär im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 28.10.2008, 20:37
  3. 1wire-Sensor mit 5m langen Kabel?
    Von dl1akp im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 03.10.2007, 20:36
  4. Störungen durch langen IIC-Bus ?
    Von Tido im Forum Elektronik
    Antworten: 19
    Letzter Beitrag: 25.01.2007, 19:15
  5. Frage u langen teilem
    Von joni8a im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 10
    Letzter Beitrag: 10.07.2006, 18:32

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test