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

Stan klawisza w przerwaniu, usuwanie drgań styków

maly_elektronik 25 Maj 2012 20:49 4195 5
REKLAMA
  • #1 10934036
    maly_elektronik
    Poziom 23  
    Witam,

    pytanie brzy bardzo amatorsko a jest stosunkowo trudnym zagadnieniem do poprawnej jego realizacji.
    W różnych realizowanych przeze mnie projektach nie było potrzeby do sprawdzania stanów klawiszy z dość dużą dokładnością jednak teraz nadszedł ten moment i prawdę mówiąc mam trudny orzech do zgryzienia bo nie mogę sobie z nim w prosty sposób poradzić. Prosiłbym o jakieś sugestie nt. rozwiązania tegoż prblemu ;)

    Układem niech będzie zwykły przycisk podłączony do INT0. Chcę w przerwaniu (w ISR(INT0_vect) sprawdzić stan tego przycisku w celu przewijania menu (i w nim też to przewijanie realizować). Jak usunąć drganie styków nie stosując śmiesznego delay'a :?:
  • REKLAMA
  • #2 10934058
    tmf
    VIP Zasłużony dla elektroda
    Jeśli absolutnie nie chcesz stosować delay, ani dać zewnętrznego filtra RC to wykorzystaj przerwania, ale timera lub np. port USART. USART może działać jako rejestr przesuwny, co wykorzystasz do samplowania stanu przycisku. Po czasie określonym przz UBRR będziesz miał przerwanie od odbiornika USART, a z UDR sobie odczytasz stan przycisku (kolejne bity będą zawierały jego stan co czas określony przez UBRR. Inna możliwość to timer i przerwania np. co 4ms. Jeśli w kolejnych dwóch przerwaniach stan przycisku jest taki sam to uznajesz go za stabilny.
  • REKLAMA
  • #3 10934140
    gaskoin
    Poziom 38  
    maly_elektronik napisał:
    Układem niech będzie zwykły przycisk podłączony do INT0. Chcę w przerwaniu (w ISR(INT0_vect) sprawdzić stan tego przycisku w celu przewijania menu (i w nim też to przewijanie realizować). Jak usunąć drganie styków nie stosując śmiesznego delay'a :?:


    Jeśli chcesz używać przerwania INT to tylko z filtrem RC/przerzutnikiem schmitta/układem z przerzutnikiem RS/ czymkolwiek sprzętowym co wyeliminuje drgania. W przeciwnym wypadku zostaje Ci to, co napisał kolega wyżej.
  • REKLAMA
  • #4 10934434
    mirekk36
    Poziom 42  
    Pomyśl sobie, a jakbyś chciał obsługiwać nie jeden klawisz w ten sposób ale 3,4,5 albo 10 - to skąd byś wziął tyle tych przerwań ? po jednym dla obsługi każdego itp ? Do obsługi przycisków i eliminacji drgań styków w ogóle można sobie darować z powodzeniem wszelkiego typu przerwania zewnętrzne, aż skoda ich marnować ;) przydadzą się do czego innego. Obsługę nie tylko jednego przycisku ale nawet kilku możesz spokojnie zrobić w tzw "poolingu" czyli w pętli głównej a z wykorzystaniem tylko jednego przerwania od jakiegoś timera, które będzie służyć do odmierzania czasów zamiast tego delay'a ;) ... Ba! przy okazji to samo przerwanie timera sprzętowego można jeszcze wykorzystać jednocześnie do innych celów np obsługi multipleksowania jeśli akurat potrzebujesz albo dowolnego innego celu.

    Reasumując takie cykliczne przerwanie timera sprzętowego może ci wyznaczać jakąś podstawę czasu na której oprzesz swoje oczekiwania w pętli głównej w funkcjach badających stan nawet wielu klawiszy, to jedno z najprostszych i najskuteczniejszych rozwiązań.
  • REKLAMA
  • #6 10935270
    maly_elektronik
    Poziom 23  
    W taki też sposób mirekk36 to robię :)
    Myślałem o jakimś innowacyjnym sposobie :) ale dziękuje za odpowiedzi :)
REKLAMA