logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Funkcja Debounce, czym ją zastąpić?

siewnik 10 Sty 2009 13:29 1551 5
REKLAMA
  • #1 5977217
    siewnik
    Poziom 15  
    Witam

    Mam problem. Napisałem program "11 kanałowy licznik", który zlicza i wysyła dane do komputera. Do wyzwalania każdego z liczników użyłem funkcji Debounce. I jest jeden problem. Jak się zdarzy, że przypadkowo w tym samym czasie 3 czujniki wychwycą "coś" to następuje przekłamanie. Czy jest jakiś prosty sposób, aby zastąpić tą funkcję czymś co nie będzie wprowadzało błędu?

    dziekuje z góry
    DAWID
    
    Do
    Debounce Pinb.1 , 1 , Z , Sub
    Debounce Pinb.2 , 1 , Z1 , Sub
    Debounce Pinb.3 , 1 , Z2 , Sub
    Debounce Pinb.4 , 1 , Z3 , Sub
    Debounce Pinb.5 , 1 , Z4 , Sub
    Debounce Pinc.0 , 1 , Z5 , Sub
    Debounce Pinc.1 , 1 , Z6 , Sub
    Debounce Pinc.2 , 1 , Z7 , Sub
    Debounce Pinc.3 , 1 , Z8 , Sub
    Debounce Pinc.4 , 1 , Z9 , Sub
    Debounce Pinc.5 , 1 , Z10 , Sub
    
    
    Loop
    End
    '----------------------------------------------licznik1
    Z:
    Incr J
    If J = 10 Then
       J = 0
       Incr D
       If D = 10 Then
          D = 0
          Incr S
          If S = 10 Then
             S = 0
             Incr T
             If T = 10 Then
             T = 0
                Incr Dt
                If Dt = 10 Then
                Dt = 0
               End If
             End If
          End If
       End If
    End If
    
    W = Dt * 10000
    W2 = T * 1000
    W = W + W2
    
       W2 = S * 100
       W3 = D * 10
       W2 = W2 + W3
    
          W = W + W2
          W = W + J
             Print "A" ; W
    Return
    '----------------------------------------------licznik2
    Z1:
    Incr J1
    If J1 = 10 Then
       J1 = 0
       Incr D1
       If D1 = 10 Then
          D1 = 0
          Incr S1
          If S1 = 10 Then
             S1 = 0
             Incr T1
             If T1 = 10 Then
             T1 = 0
                Incr Dt1
                If Dt1 = 10 Then
                Dt1 = 0
               End If
             End If
          End If
       End If
    End If
    
    W4 = Dt1 * 10000
    W5 = T1 * 1000
    W4 = W4 + W5
    
       W5 = S1 * 100
       W6 = D1 * 10
       W5 = W5 + W6
    
          W4 = W4 + W5
          W4 = W4 + J1
             Print "B" ; W4
    Return
    '----------------------------------------------licznik3
    Z2:
    Incr J2
    If J2 = 10 Then
       J2 = 0
       Incr D2
       If D2 = 10 Then
          D2 = 0
          Incr S2
          If S2 = 10 Then
             S2 = 0
             Incr T2
             If T2 = 10 Then
             T2 = 0
                Incr Dt2
                If Dt2 = 10 Then
                Dt2 = 0
               End If
             End If
          End If
       End If
    End If
    
    W7 = Dt2 * 10000
    W8 = T2 * 1000
    W7 = W7 + W8
    
       W8 = S2 * 100
       W9 = D2 * 10
       W8 = W8 + W9
    
          W7 = W7 + W8
          W7 = W7 + J2
             Print "C" ; W7
    Return
    

    '..............i tak dalej az do 11 licznika

    Proszę używać znaczników [code]
    [zumek]
  • REKLAMA
  • Pomocny post
    #2 5977300
    K_o_n_r_a_d
    Poziom 23  
    Użycie DEBOUNCE do tego celu jest złym rozwiązaniem a czym zastąpić... przede wszystkim co to są za impulsy, jaka maksymalna częstotliwość, jak szybkie itp?

    Dodano po 5 [minuty]:

    Jeśli jednak są to "wolne" impulsy to może spróbuj pokombinować ustawiając opóźnienie dla DEBOUNCE:
    Składnia:
    
    CONFIG  DEBOUNCE = czas
    
    gdzie:
    
    czas	opóźnienie w milisekundach, pomiędzy kolejnymi odczytami stanu portu.
    Opis:
    
    Standardowo opóźnienie to wynosi 25ms. Można je zmienić podając inny czas opóźnienia w instrukcji CONFIG DEBOUNCE.
    
    
    
    (c) Zbigniew Gibek, 2002-2005   (c) MCS Electronics, 1999-2005
  • REKLAMA
  • Pomocny post
    #3 5977537
    ShEvU_elektro
    Poziom 25  
    Zastąpić można np.

    If sw=0 then
            
                waitms 10
    
                if sw=0 then
                             Coś tam



    wyelimnuje to tzw. drgania styków, czyli zastąpienie DEBOUNCE
  • REKLAMA
  • #4 5978426
    siewnik
    Poziom 15  
    sa to impulsy z czujnikow przemyslowych, daja napiecie 24V ja to zmniejszam do 4,8V dzielnikiem rezystorowym a impulsy przychodza z czestotliwoscia 4 sztuk na 1 sekunde
  • REKLAMA
  • #5 5978597
    K_o_n_r_a_d
    Poziom 23  
    To kombinuj z DEBOUNCE i czasem opóźnienia poprzez CONFIG.

    Twój kod można bardzo zoptymalizować. Z tego co widzę w każdym z podprogramów masz wyliczenia takie same a dodatkowo to:
    W = Dt * 10000
    W2 = T * 1000
    W = W + W2
    
       W2 = S * 100
       W3 = D * 10
       W2 = W2 + W3
    
          W = W + W2
          W = W + J 
    wykonujesz po to aby mieć w jednej zmiennej licznik.
    Dokładnie to samo uzyskasz takim kodem:
    incr W
    if W=10000 then W=0
    Wykona się to zdecydowanie szybciej a wynik będzie ten sam.

    Jakbyś to wszystko jeszcze umiescił w tablicy to jeden podprogram wystarczyłby a nie 11x to samo.
  • #6 5978613
    siewnik
    Poziom 15  
    No tak tylko jak ja to robie tak jak piszesz to zlicza tylko do 255 bo taki ma wewnetrzny licznik i zaczyna od nowa.
REKLAMA