-         

Ergebnis 1 bis 5 von 5

Thema: Debounce innerhalb einer Interrupt-Auswertung

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    01.08.2006
    Beiträge
    42

    Debounce innerhalb einer Interrupt-Auswertung

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,

    ich hab jetzt erstmal halbwegs verstanden, wie ich bei den Mega 48, 88 und 168 die "höheren" Interrrupts ansprechen und auswerten kann.

    Das, bzw. wohl MEIN Problem ist, daß ein Ereignis (hier Leveländerung) bei den "höheren" Interrupts ja wohl nur als kpl. Port gemeldet wird (hier mit "On Pcint0 Intdetect" abgefragt) und dann innerhalb des angesprungenen Labels erst ausgelesen werden kann, welche der 8 Ports (hier Port Bo bis Port B7) denn überhaupt den Interrupt ausgelöst hat.

    Wie es scheint, hab ich das hinbekommen.

    Nun hab ich versucht die Interrupt-Auswertung eines Tasters mit Debounce zu entprellen.
    Ich habe hin und her versucht, bekomme es aber nicht hin.

    Es reagiert immer nur die grüne LED an D6.
    Die Programmausführung wird dabei rel. auffällig behindert (die rote LED in der Programmsimulation setzt aus) und die Taste nicht wirklich entprellt.

    Ich habe mal mein Listing angehängt und den Debounce-Block grün markiert.

    Kann mir hier jemend helfen?

    Besten Dank!

    Wolfram

    Code:
    '---------------------------------------------------------------------------
    '                             PCint-Dummy.bas
    ' Testprogramm Interruptprogrammierung des Maga48
    ' Compiler: Bascom 1.11.8.3
    ' D5 an LED rot, D6 an LED grün, D7 an LED gelb
    ' Taster 1 an B0, Taster 2 an B1
    '---------------------------------------------------------------------------
    
    
    $regfile = "m48def.dat"                 'Definitionsdatei für den Mega48
    $crystal = 8000000                      'Quarzfrequenz 8,0MHz
    
    Portd = &B11100000                      'PullUp von Pin PD5, PD6 und PD7 aktivieren.
    Ddrd = &B11100000                       'Pin PD5, PD6, PD7 Ausgang, Rest Eingang.
    
    Config Portb = Input                    'Der ganze Port B als Input deklariert.
    Portb = &B11111111                      'Der ganze Port B PullUp eingeschaltet > pcint0-pcint7  (portb.0-portb.7).
    Enable Interrupts                       'Global Interrupts erlauben.
    Enable Pcint0                           'Enable Interrupt Pcint0 (pcint0-pcint7).
    On Pcint0 Intdetect                     'Wenn an Pin B0 bis Pin B7 das Level wechselt, Sprung zu Label Intdetect.
    Pcmsk0 = &B00001111                     'Enable pcint0-pcint3  (portb.0-portb.3).
    
    Do
    Portd.5 = Not Portd.5                   'LED blinkt als Programmsimulation.
    Waitms 20
    Loop
    
    Intdetect:                              'Label Intdetect, Sprungmarke für Pcint0-Interrupt.
    
    '######################################################################################
    'Nachfolgend der Versuch die Tasten mit Debounce zu entprellen - leider ging´s daneben.
    'Hierfür wurden natürlich die beiden Tastenabfragen hinter diesem REM-Block vorher mit Remarks versehen.
    
    'Debounce Pinb.0 , 0 , Pb0               'Entprelle Taster an Pin B0 und bei Masseschluß Sprung auf Label Pb0.
    'Debounce Pinb.1 , 0 , Pb1               'Entprelle Taster an Pin B1 und bei Masseschluß Sprung auf Label Pb1.
    
    'Pb0:                                        'Label für Debounce-Sprung Pin B0
    'Portd.6 = Not Portd.6             'Grüne LED (Pin PD6) an oder aus, wenn Taster 1 an Pin B0 gedrückt.
    'Return                                    'Return für Label Pb0:
    'Pb1:                                        'Label für Debounce-Sprung Pin B1
    'Portd.7 = Not Portd.7             'Gelbe LED (Pin PD7) an oder aus, wenn Tsster 2 an Pin B1 gedrückt.
    
    'Return                                     'Return für Label Pb1:
    '######################################################################################
    
    If Pinb.0 = 0 Then Portd.6 = Not Portd.6       'Grüne LED (Pin PD6) an oder aus, wenn Taster 1 an Pin B0 gedrückt.
    If Pinb.1 = 0 Then Portd.7 = Not Portd.7       'Gelbe LED (Pin PD7) an oder aus, wenn Taster 2 an Pin B1 gedrückt.
    
    Return                                  'Verläßt die On Interrupt-Funktion (On Pcint0 Intdetect)
    
    End                                     'Programmende
    +Code Tags (PicNick)

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.08.2006
    Beiträge
    183
    Nun hab ich versucht die Interrupt-Auswertung eines Tasters mit Debounce zu entprellen...

    Warum, ist hier nicht nötig.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    01.08.2006
    Beiträge
    42
    Hallo,

    ich denke schon daß es nötig ist.

    Der Taster prellt heftig, so daß es Glücksache ist ob die LED hier nun aus geht oder flackert und mehrfach während eines Tastendrucks hin und her geht.

    Abgesehen davon wüsste ich gerne wie man hier Debounce richtig anwendet.

    Wolfram

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.08.2006
    Beiträge
    183
    Sag mal , hast ein alten Langhubertaster.

    Von Winavr-c kann ich dir eine Routine geben.

    In diesm Forum wurde es schon mal ausgiebig behandelt :
    www.mikrocontroller.net/forum/list-1-1.html

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    01.08.2006
    Beiträge
    42
    Hi,

    ich habe ein nagelneues myAVR USB2-Board.
    Die darauf verbauten Taster sind halt handelsübliche Kurzhubtaster, die wie alle anderen auch wohl prellen.

    Ich schaue mal auf die von dir verlinkte Seite - besten Dank.

    Allerdings müsste es doch trotzdem einfach mit dem Bascom-Befehl Debounce gehen !?

    Wolfram

Berechtigungen

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