-         

Ergebnis 1 bis 8 von 8

Thema: Probleme mit Debounce

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    345

    Probleme mit Debounce

    Anzeige

    Hallo zusammen,

    ich versuche gerade ein Paar Taster softwareseitig zu Entprellen bzw. einzulesen (6 Taster). Und zwar alle nach folgendem Weg:

    Code:
    Do
    ' Eingang 1
       Debounce Eingang1 , 0 , On_eingang1 , Sub
       Debounce Eingang1 , 1 , On_eingang1 , Sub
    Loop
    
    ' EINGANG 1 ENTPRELLT
    On_eingang1:
    
       Eingang1_entprellt = Not Eingang1
    
    Return
    Zusätzlich wird in der Hauptschleife überprüft ob ein Zeichen mittels UART empfangen wurde. Ist dies der Fall, wird sofort etwas zurückgesendet.
    So dass mal vorneweg, jetzt zu dem Problem.

    Lese ich die Taster ohne Debounce ein (nicht entprellt), kann ich keine Verzögerung im Programmablauf bzw. beim Senden und dem Empfangen der Antwort über die UART feststellen. Verwende ich wie Oben den Debouncebefehl, wird das Programm sehr verzögert, obwohl keine Taste gedrückt wird. Das Empfangen einer Antwort mittels UART ist verzögert.

    Laut Bascom Hilfe dürfte doch der Debouncebefehl nicht zu einer Verzögerung führen wenn keine Zustandsänderung des Pins stattgefunden hat oder?

    Hat jemand eine Erklärung für das Verhalten?

    Vielen Dank für euere Hilfe

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.432
    Blog-Einträge
    104
    Zitat Zitat von demmy Beitrag anzeigen
    Code:
    ' Eingang 1
       Debounce Eingang1 , 0 , On_eingang1 , Sub
       Debounce Eingang1 , 1 , On_eingang1 , Sub
    ... wird das Programm sehr verzögert, obwohl keine Taste gedrückt wird...
    Hat jemand eine Erklärung für das Verhalten?
    Hängt damit zusammen, daß Du den gleichen Eingang einmal auf low (0) und dann auf high (1) testest. Warum machst Du das?

    Bei verschiedenen Eingängen oder Abfrage des gleichen Pegel gibt es keine Verzögerung (oder nur einmal zu Beginn des Programms) wenn kein Eingang geändert wurde.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    345
    Naja, ich hab das versucht so zu machen, um den Zustandswechsel in beide Richtungen mitzubekommen.

    Ich setze ja in dem entsprechenden Sub ein Bit, wenn der Eingang belegt wird. Wenn ich Ihn jetzt aber wieder frei mache, wie soll ich das dann erkennen? Ich möchte erreichen, das die Variable "Eingang1_entprellt" den in beide Richtungen entprellten Zustand enthällt? Also funktioniert das so nicht? Hat jemand eine andere Idee?

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.432
    Blog-Einträge
    104
    Hallo,
    so recht will mir keine Alternative einfallen. Dazu müsste man wissen, was an dem Eingang angeschlossen ist und welche Funktion sich dahinter verbirgt. Was soll in dem Unterprogramm dann bei high bzw low am Eingang gemacht werden? Erzähl ein bischen mehr über die Funktion, die du implementieren möchtest.

    Man könnte irgendwie mit Flags arbeiten - bei low im Unterprogramm ein Flag setzten und per IF im Hauptprogramm das Debounce, das auf low abfragt, überspringen - das Gleiche für high - als erste Idee...

    PS: Taster sind doch normalerweise nicht gedrückt. Debounce erkennt, ob er gedrückt ist und springt ins Unterprogramm. Die Funktion für die Taste wird ausgeführt und zurück ins Hauptprogramm. Mir ist nicht klar, warum da noch erkannt werden soll, daß die Taste wieder gelöst wurde .

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    345
    Also wie gesagt ich möchte einfach mehrere Eingänge an denen jeweils ein Taster hängt softwareseitig entprellen.
    Ich möchte aber nicht, wenn der Taster gedrückt wird und entprellt ist irgendeine Funktion oder Sub aufrufen sondern, eine Variable beschreiben. Diese hat dann immer den "sicheren" Zustand des Tasters. Mit dieser Variable arbeite ich dann in meinem Programm, nicht mit dem Eingang selber.

    Ich habe inzwischen eine Lösung gefunden. Und zwar habe ich mir eine Tasterentprellung selber Programmiert. Im Hauptprogramm wird mit einer Hilfsvariable die Zustandsänderung eines Eingangs Ermittelt. Hat sich der Zustand geändert wird mit der Hilfe eines Timers ein paar ms später geprüft ob der Eingang noch immer den selben Zustand hat. Ist das der Fall, wird eine "sichere" Variable mit dem aktuellen Zustand beschrieben. Das Funktioniert so beim Drücken und beim Loslassen des Tasters.

    Also so ähnlich wie Debounce, nur das mein Programm nicht langsammer wird.

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    Ich mache das auch immer so ähnlich. Nur ohne Timer.

    Code:
    $regfile = "m16def.dat"                                     'eingesetzter Mikrocontroller
    $crystal = 8000000                                          'eingestellte Taktfrequenz (8MHz)
    $hwstack = 100                                              'Standardwert
    $swstack = 100                                              'Standardwert
    $framesize = 100                                            'Standardwert
    $baud = 9600
    
    
    Config Base = 0
    
    Dim A As Byte
    
    Dim Tasteralt As Byte
    Dim Tasterw(8) As Byte
    Tastere Alias Pina
    Set Porta                                                   'Pullups
    
    
    Do
       Gosub Tasten
       If Tasterw(0) = 0 Then                                   'Eingang PinA.0 auf GND gezogen
          Print "Mach was"
       End If
    
    Loop
    End
    
    
    Tasten:
       For A = 0 To 7
          If Tastere.a <> Tasteralt.a Then
             Tasteralt.a = Tastere.a
             Tasterw(a) = 127
          Else
             If Tastere.a = 1 Then
                If Tasterw(a) < 254 Then
                   Incr Tasterw(a)
                End If
             Else
                If Tasterw(a) > 0 Then
                   Decr Tasterw(a)
                End If
             End If
          End If
       Next A
    Return
    Die Werte variieren von Fall zu Fall /Takt zu Takt.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.07.2011
    Beiträge
    345
    Das bedeutet aber, das deine Entprellzeit von deiner Zykluszeit deines Programmes abhängig ist!?
    Diese kann aber je nach Größe deines Programmes stark variieren!!??

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    Das ist korrekt. Bei "großen" Laufzeiten passe ich einfach die 127 an. Wird es schwerwiegender kann man zusätzlich die Sprünge erhöhen. Statt decr einfach wert=wert-4 und schon ist es viermal schneller. Darauf achten, dass der Prüfwert auch erreicht wird.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

Ähnliche Themen

  1. Tasterentprellung mit Debounce und langen Tastendrücken
    Von Thomas E. im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 22.09.2012, 16:33
  2. Probleme mit MIDI und debounce/interrupts/fallunterscheidung
    Von C2H6O im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 05.10.2009, 20:14
  3. Abfrage Pins mit Debounce merkwürdig
    Von autoguider im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 22.09.2007, 12:35
  4. Entprellen mit Debounce
    Von Micronoob im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 22.05.2007, 23:25
  5. ich bekomm das mit dem debounce ... erledigt danke!
    Von veit im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 14.02.2006, 21:48

Berechtigungen

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