Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Wcisniecie przycisku.. opoznienie

Ravender 22 Jun 2006 15:17 1641 9
  • #1
    Ravender
    Level 20  
    Dopiero zaczynam zabawe z ukontrolerami. Aktualnie jestem w fazie budowy "bazy do testow". Przygotowujac sie jednak teoretycznie natknalem sie na jeden problem (byc moze tylko teoretyczny). O co chodzi.. przykladowy program

    
    do
    if p1.1 = 0 then INSTRUKCJA
    loop
    


    czlowiek wciska przycisk i wykonuje sie intrukcja. Jednak mam pewne obawy. Jesli przycisk bedzie wcisniety zbyt dlugo, to intrukcja wykona sie iles tam razy. Jak to zlikwidowac?

    Czy mozliwe jest zastosowanie czegos takiego?
    
    do
    if p1.1 = then
     INSTRUKCJA
     setb p1.1
     end if
    loop
    

    Ustawiam na p1.1 jedynke, ale mam caly czas wcisniety przycisk, ktory zwiera ta koncowke do masy. Jak to ugryzc?
  • Helpful post
    #2
    JollyRoger
    Level 21  
    Zrob tak:
    
    Dim blokada as bit
    
    
    do
    if p1.1=0 then
    if blokada=0 then
    blokada=1
    instrukcja
    end if
    else
    blokada=0
    end if
    loop


    Generalnie chodzi o to aby sprawdzic cy przycisk został wciśniety i puszczony a nie jest trzymany cały czas :)
  • Helpful post
    #3
    1004kw
    Level 15  
    Witam... Można to zrobic na wiele sposobow. Sa bardziej lub mniej prymitywne. W zaleznosci od potrzeb stosuje sie rozne metody "detekcji", "programowych blokad" itp
    Ja zrobilbym to np tak:

    ------------------------------------------------------------------------------------
    'Blokada zadeklarowana jako zmienna bitowa


    If P1.1 = 0 Then Goto Instrukcja
    blokada = 1
    End

    Instrukcja:
    ' tu moze nastapic kilka instrukcji, ale bez skokow do
    podprogramow

    If Blokada = 1 then goto Blokuj
    Blokuj:
    If P1.1 = 0 Then Waitms 20
    Goto Blokuj
    End
    Blokada = 0
    End

    ------------------------------------------------------------------------------------Nastepuje sprawdzenie stanu P1.1 i ewentualne wykonanie instrukcji, nastepnie do momentu zmiany stanu P1.1 program jest zablokowany...
    Oczywiscie mozna to zrobic inaczej. Warto sprawdzic ile zasobow mikrokontrolera zajmuje dana metoda. Bascom jest pod tym wzgledem beznadziejny... Pozdrawiam.
  • #4
    ufolek
    Level 12  
    Jeszcze najprostsze rozwiazanie, czyli dodanie opóżnienia 100-200ms
    bezposrednio po wykonaniu instrukcji.

     
    
    if p1.1=0 then 
     instrukcja 
     Waitms 150 
    end if 
    
    
  • #5
    sp3fhi
    Level 12  
    A pamiętaj, że niektóre przyciski generują kilka zwarć (drgania na stykach). Jak już wykryjesz, że użytkownik puścił przycisk to warto dać chwilę zwłoki (rzędu 50-100mS) aby na skutek drgań nie wykryć po chwili "ponownego wciśnięcia".
  • #6
    1004kw
    Level 15  
    witam... moim zdaniem wystarcza 20-30 ms do programowej eliminacji drgan stykow (zostalo to ujete w moim przykladzie powyzej)
  • Helpful post
    #7
    zumek
    Level 39  
    Ravender wrote:
    ...czlowiek wciska przycisk i wykonuje sie intrukcja. Jednak mam pewne obawy. Jesli przycisk bedzie wcisniety zbyt dlugo, to intrukcja wykona sie iles tam razy. Jak to zlikwidowac?

    Użyj - stworzonej do tego - instrukcji Debounce .

    Piotrek
  • #8
    hammett89
    Level 11  
    Witam
    Widzę, że temat jest dość stary, jednak sam borykałem się z tym problemem i rozwiązałem go w następujący sposób:

    
    'Konfiguracja portów:
    Config pinb.0 = Input    'Port przycisku
    Config pind.0 = Output  'Port np. diody led
    
    'Podciągnięcia portów:
    Portb.0 = 1                   
    Portd.0 = 1
    
    'Typ zmiennej:
    Dim A As Byte
    
    'Stan początkowy zmiennej:
    A = 1
    
    'Główna pętla programu:
    Do
    
    If Pinb.0 = 0 Then
    waitms 25              'Program odczekuje 25ms, i ponownie sprawdza czy przycisk jest nadal wciśnięty (zastepuje funkcje Debounce - eliminacja drgań styków)
    If Pinb.0 = 0 Then
    If A = 1 Then
    Portd.0 = 0              'Zapala się dioda LED
    A = 2
    
    Do                         'Pętla bedzię się powtarzać do momentu zwolnienia przycisku, po zwolnienieu program opóści ją
    If Pinb.0 = 1 Then
    Exit Do
    End If
    Loop
    
    End If
    End If
    End If
    
    If Pinb.0 = 0 Then
    waitms 25              'Program odczekuje 25ms, i ponownie sprawdza czy przycisk jest nadal wciśnięty (zastepuje funkcje Debounce - eliminacja drgań styków)
    If Pinb.0 = 0 Then
    If A = 2 Then
    Portd.0 = 1              'Gaśnie dioda LED
    A = 1
    
    Do                         'Pętla bedzię się powtarzać do momentu zwolnienia przycisku, po zwolnienieu program opóści ją
    If Pinb.0 = 1 Then
    Exit Do
    End If
    Loop
    
    End If
    End If
    End If
    
    Loop
    End 'Koniec programu
    


    Tak więc mam nadzieje, że ten prosty program kiedyś pomoże komuś borykającemu się z takimi problemami jak ja czy kolega zakładający ten post.

    Pozdrawiam
    Piotrek
  • #10
    hammett89
    Level 11  
    Witam

    Hmm, jednak eliminacja drgań styków, a oczekiwanie programu na puszczenie przycisku to dwie różne rzeczy...

    Pozdrawiam
    Piotrek