Autor: Dondu
Większość projektów opartych o mikrokontrolery zawiera, co najmniej jeden przycisk. Przyciski są urządzeniami mechanicznymi, ze wszystkimi z tego wynikającymi wadami, z których najważniejszą są drgania styków w czasie jego przyciskania i puszczania.
Problem ten jest w szczególności istotny w przypadku impulsatorów (enkoderów) stykowych.
Rozwiązania zadania:
Skutki drgań styków eliminować sprzętowo lub za pomocą programu (ang. deboucing).- Eliminacja drgań styków by omicronNs
- Eliminacja drgań styków by ky3orr
- Eliminacja drgań styków by xxx-xxx001
- ... czekamy na inne propozycje.
Najprostszym programowym sposobem jest sprawdzanie stanu przycisku, a w przypadku wykrycia jego naciśnięcia odczekanie kilku- lub kilkunastu milisekund i ponowne sprawdzenie, czy jest nadal naciśnięty.
Przykładowy pseudo kod:
if(czy_przycisk_przycisniety){ //tak przyciśnięty czekaj_10_milisekund; if(czy_przycisk_przycisniety){ //tak nadal przyciśnięty ..... wykryto przyciśnięcie .... } }
Takie rozwiązanie jest poprawne, ale nieefektywne z powodu blokowania mikrokontrolera (CPU) w pętli opóźnienia (w przykładzie, aż na 10 milisekund). Ale gdy chcemy to opóźnienie zmniejszyć do np. 1ms, algorytm ten nie zapewnia 100% poprawności wykrycia faktu przyciśnięcia, ponieważ po 1 ms przycisk może nadal drgać.
Jak więc powinien wyglądać kod pozwalający eliminować skutki drgań styków?
I to jest właśnie następne zadanie z cyklu Efektywne Planowanie Projektu.
Cel:
Opracować dowolny algorytm eliminacji skutków drgań styków.
Warunki:
- tylko program, bez wykorzystania dodatkowych elementów elektronicznych,
- możesz wykorzystać dowolny "bebech" znajdujący się w mikrokontrolerze,
- obsługa 4 przycisków (na pinach PB0-PB3) zwierających do GND,
- zmienna globalna stan_przyciskow ma zawierać na czterech najmłodszych bitach aktualny stan każdego z przycisków (stan pewny, czyli po eliminacji skutków drgań),
- pozostałe określone dla całego cyklu EPP: Efektywne Planowanie Projektu
Termin:
Termin nadsyłania rozwiązań do:
Termin już upłynął, ale możesz przesłać swoje rozwiązanie, jeżeli jest ono inne niż opublikowane.
Chcę przesłać swoje rozwiązanie!
Wszelkie zasady znajdziesz tutaj: EPP: Zasady uczestnictwa i publikacji
Pytania
Jeżeli masz pytania dot. tego zadania, zadawaj je w tym temacie w formie komentarza, w ten sposób wszyscy będą mogli przeczytać pytanie i moją odpowiedź.
Dotychczasowi autorzy rozwiązań z cyklu EPP:
Listę autorów, którzy nadesłali swoje rozwiązania do któregoś z artykułów z cyklu EPP, możesz znaleźć tutaj: Autorzy rozwiązań
Pytania
Jeżeli masz pytania dot. tego zadania, zadawaj je w tym temacie w formie komentarza, w ten sposób wszyscy będą mogli przeczytać pytanie i moją odpowiedź.
Dotychczasowi autorzy rozwiązań z cyklu EPP:
Listę autorów, którzy nadesłali swoje rozwiązania do któregoś z artykułów z cyklu EPP, możesz znaleźć tutaj: Autorzy rozwiązań
Uważam ten sposób na przeczekiwanie drgań styków za mało elegancji. Nie zabezpiecza on przed przytrzymaniem klawisza, lepszym rozwiązaniem jest:
OdpowiedzUsuńif(czy_przycisk_przycisniety)
{
/* opóżnienie aż drgania na stykach ustaną */
_delay_ms(80);
/* oczekiwanie na zwolnienie przycisku */
while(czy_przycisk_przycisniety) {}
/* opóżnienie aż drgania na stykach ustaną */
_delay_ms(80);
}
Problem drgań styków można rozwiązać na wiele sposobów. Twój sposób jest poprawny, ale powoduje zatrzymanie programu w pętli while() aż do momentu zwolnienia przycisku. Zależnie od projektu, można sobie na to pozwolić lub nie.
OdpowiedzUsuńDlatego warto popatrzeć na rozwiązania zaproponowane przez osoby które je nadesłały, a które umieszczone są na początku tego tematu.
a co myślisz o prostym zastosowaniu kondensatora?
OdpowiedzUsuńMetoda sprzętowej eliminacji za pomocą filtru RC (rezystor pull-up i kondensator) jest bardzo skuteczną metodą. Jednakże trzeba być świadomym zjawisk jakie są generowane w trakcie zwierania kondensatora przyciskiem. Jeśli są one istotne dla projektu, należy im przeciwdziałać. Pisałem o tym w tym artykule.
OdpowiedzUsuńCześć, Mam pytanie. Jak w podanych rozwiązaniach sprawdzić stan konkretnego przycisku?
OdpowiedzUsuń