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

[C AVR] - Programowe pozbycie się drgań styków na przerwaniu

kmineo 22 Lis 2013 19:12 3768 16
REKLAMA
  • #1 12981117
    kmineo
    Poziom 9  
    Posty: 26
    Ocena: 2
    W przerwaniu zewnętrznym chcę użyć przycisku (mikroswitcha), jednak by tego dokonać muszę wyeliminować drganie styków. Jak to zrobić w przerwaniu?
    Z góry dzięki za pomoc.
  • REKLAMA
  • #2 12981242
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2206
    Wywal przerwanie od przycisku, wykorzystaj timer w tym celu. Wtedy eliminacja drgań jest banalna. Na stronie http://mikrokontrolery.blogspot.com/ znajdziesz przykłady gotowców.
  • #3 12981371
    excray
    Poziom 41  
    Posty: 5502
    Pomógł: 739
    Ocena: 657
    Jak wyżej. Jeśli już koniecznie musisz bo na przykład w ten sposób wybudzasz uC to po pierwsze sprzętowa eliminacja drgań styków a po drugie można zaprząc do tego dodatkowo jakiś timer który ustawioną w przerwaniu flagę "przycisk wduszono" po jakimś czasie (np. 0,1s) wyzeruje, a sama obsługa w przerwaniu uwarunkowana będzie od stanu tej flagi.
  • REKLAMA
  • REKLAMA
  • #5 12983049
    kmineo
    Poziom 9  
    Posty: 26
    Ocena: 2
    Chodzi o zatrzymywanie stopera. I właśnie tak się zastanawiam czy robić to przerwaniem czy jednak mimo wszystko przyciskiem na zwykłym pinie i wtedy od wyniku odjąć kilkadziesiąt ms na czas drgania styków. Chyba jednak zdecyduję się na funkcję wciśniętego przycisku.
  • #6 12983058
    excray
    Poziom 41  
    Posty: 5502
    Pomógł: 739
    Ocena: 657
    kmineo napisał:
    od wyniku odjąć kilkadziesiąt ms na czas drgania styków

    Po co?! Zatrzymujesz stoper w momencie pierwszego zarejestrowanego kontaktu styku i dopiero później eliminujesz kolejne drgania.
  • #7 12983080
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    Zadając pytanie tak właśnie przypuszczałem, że INT jest Ci potrzebny, a drgania należy po prostu przeczekać po zatrzymaniu timera jak napisał excray.

    To jest właśnie jeden z nielicznych przypadków, w których należy INT wykorzystać do obsługi przycisków.
  • REKLAMA
  • #8 12983114
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2206
    Niekoniecznie trzeba. Jeśli to stoper, to ma np. rozdzielczość 10 ms? Góra 1 ms, wystarczy wiec, aby przerwanie timera w którym robimy debouncing było odpowiednio częściej. Nie zmienia to oczywiście faktu, że każdy problem można rozwiązać na wiele sposobów...
  • #10 12983156
    kmineo
    Poziom 9  
    Posty: 26
    Ocena: 2
    Akurat na sprzętowe eliminowanie raczej się nie zdecyduję. Pozostaje ewentualnie programowe.
  • #11 12983165
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    kmineo napisał:
    Akurat na sprzętowe eliminowanie raczej się nie zdecyduję. Pozostaje ewentualnie programowe.

    Co rozumiesz przez sprzętowe, a co przez programowe?
    Podaj jakie parametry dokładności zatrzymania pomiaru czasu oczekujesz.
  • #12 12983172
    kmineo
    Poziom 9  
    Posty: 26
    Ocena: 2
    Pomiar jest realizowany z dokładnością do 1ms. Sprzętowe, no to wiadomo realizowane przez podzespoły. Na to się raczej nie zdecyduję, głównie na to, że naprawdę muszę ograniczać miejsce. Programowe to wyeliminowanie drgania w kodzie programu. I to już prędzej mi podchodzi.
  • #13 12983188
    excray
    Poziom 41  
    Posty: 5502
    Pomógł: 739
    Ocena: 657
    Chyba już wszystko zostało napisane. Jeśli dalej potrzebujesz pomocy to powinieneś pokazać jakiś kod.
  • #14 12983288
    kmineo
    Poziom 9  
    Posty: 26
    Ocena: 2
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Tak wygląda funkcja do zatrzymywania stopera na przycisku, bez użycia przerwania zewnętrznego INT0. Jak to zrobić na przerwaniu tego za bardzo nie rozumiem.
  • #16 12983294
    excray
    Poziom 41  
    Posty: 5502
    Pomógł: 739
    Ocena: 657
    Możesz dołączyć więcej kodu? Szczególnie ten obszar gdzie zatrzymujesz timer oraz tam gdzie liczysz czas. Najlepiej wrzuć cały kod.
  • #17 12983310
    kmineo
    Poziom 9  
    Posty: 26
    Ocena: 2
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Chwilowo jest niechlujstwo w kodzie jeśli chodzi o nazwy zmiennych, ale na razie wszystko do testów. W każdym razie miałem kod z przerwaniem zewnętrznym, ale nie liczy poprawnie przez brak eliminacji drgań styków, na razie jest więc kod jak powyżej i on liczy w porządku (nie ma jeszcze odjęcia 80ms na drgania).

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem eliminacji drgań styków w mikroswitchu używanym do przerwania zewnętrznego w projekcie zatrzymywania stopera. Uczestnicy sugerują różne podejścia, w tym wykorzystanie timerów do programowego debouncingu oraz zastosowanie flagi do zarządzania stanem przycisku. Wskazano, że można zrealizować eliminację drgań w kodzie, co jest korzystne w przypadku ograniczonej przestrzeni na komponenty. Uczestnicy podkreślają, że przerwanie INT0 może być użyteczne, ale w niektórych przypadkach wystarczy po prostu przeczekać drgania po zatrzymaniu timera. Autor projektu preferuje rozwiązania programowe, aby uniknąć sprzętowych modyfikacji.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA