Męczę się żeby wykonać jak najprostszą obsługę z eliminacją drgań zestyków 5 przycisków. Robię to w ten sposób:
1. Do każdego przycisku mam przydzielone 3 flagi i 1 zmienną(załóżmy że przycisk nazywa się "UP":
- F_UP_POM - flaga pomocnicza do eliminacji drgań
- F_UP - flaga właściwa przycisku (gdy F_UP=1 to przycisk wciśnięty)
- F_UP_HOLD - gdy=1 to znaczy, że przycisk jest przytrzymywany lub został już obsłużony
- Licznik_UP - zmienna 1B
2. Odczyt stanu przycisków odbywa się w przerwaniu Timera (co 32,768ms):
- jeśli przycisk wciśnięty to:
- przy pierwszym przerwaniu ustawiam tylko F_UP_POM
- przy drugim ustawiam F_UP - czyli dopiero teraz jest informacja
dla programu, że przycisk wciśnięty (dzięki temu wyeliminowane
są drgania zestyków bo trzymany min 32,768ms)
- przy trzecim przerwaniu ustawiam F_UP_HOLD co oznacza, że
przycisk jest przytrzymywany
- przy czwartym i kolejnych zwiększam Licznik_UP o 1. Gdy osiągnie
on wartość załóżmy 10 (czyli po 327ms) to kasuje F_UP_HOLD i
licznik
- jeśli przycisk puszczony to kasuje wszystkie flagi i Licznik_UP
3. Reagowanie na stan przycisków (czyli ich flag) jest zrobione w pętli głównej programu:
- jeśli F_UP_HOLD=1 to nie reaguj
- w przeciwnym razie:
- jeśli F_UP=1 to np. zwiększ wartość "czegoś tam" o 1 i ustaw
flagę F_UP_HOLD by wartość "czegoś tam nie zwiększała się
w kółko (jeśli przycisk przytrzymywany to po upływie 327ms
F_UP_HOLD wyzeruje się i znów wartość "czegoś tam"
zwiększy się o 1
Taka obsługa niby działa w porządku, ale raz na dłuższy czas przy przytrzymywaniu przycisku wartość "czegoś tam" zwiększy się o 1 i zaraz szybko znów o 1 (a powinno po upływie 327ms). Możecie podzielić się swoimi metodami obsługi przycisków lub skorygować mój algorytm jeśli zauważyliście błąd?
1. Do każdego przycisku mam przydzielone 3 flagi i 1 zmienną(załóżmy że przycisk nazywa się "UP":
- F_UP_POM - flaga pomocnicza do eliminacji drgań
- F_UP - flaga właściwa przycisku (gdy F_UP=1 to przycisk wciśnięty)
- F_UP_HOLD - gdy=1 to znaczy, że przycisk jest przytrzymywany lub został już obsłużony
- Licznik_UP - zmienna 1B
2. Odczyt stanu przycisków odbywa się w przerwaniu Timera (co 32,768ms):
- jeśli przycisk wciśnięty to:
- przy pierwszym przerwaniu ustawiam tylko F_UP_POM
- przy drugim ustawiam F_UP - czyli dopiero teraz jest informacja
dla programu, że przycisk wciśnięty (dzięki temu wyeliminowane
są drgania zestyków bo trzymany min 32,768ms)
- przy trzecim przerwaniu ustawiam F_UP_HOLD co oznacza, że
przycisk jest przytrzymywany
- przy czwartym i kolejnych zwiększam Licznik_UP o 1. Gdy osiągnie
on wartość załóżmy 10 (czyli po 327ms) to kasuje F_UP_HOLD i
licznik
- jeśli przycisk puszczony to kasuje wszystkie flagi i Licznik_UP
3. Reagowanie na stan przycisków (czyli ich flag) jest zrobione w pętli głównej programu:
- jeśli F_UP_HOLD=1 to nie reaguj
- w przeciwnym razie:
- jeśli F_UP=1 to np. zwiększ wartość "czegoś tam" o 1 i ustaw
flagę F_UP_HOLD by wartość "czegoś tam nie zwiększała się
w kółko (jeśli przycisk przytrzymywany to po upływie 327ms
F_UP_HOLD wyzeruje się i znów wartość "czegoś tam"
zwiększy się o 1
Taka obsługa niby działa w porządku, ale raz na dłuższy czas przy przytrzymywaniu przycisku wartość "czegoś tam" zwiększy się o 1 i zaraz szybko znów o 1 (a powinno po upływie 327ms). Możecie podzielić się swoimi metodami obsługi przycisków lub skorygować mój algorytm jeśli zauważyliście błąd?