ATNEL tech-forum
https://forum.atnel.pl/

Błąd w SuperDebounce
https://forum.atnel.pl/topic11223.html
Strona 1 z 1

Autor:  haloon [ 29 mar 2015, o 23:09 ]
Tytuł:  Błąd w SuperDebounce

Witam,

Prawdopodobnie znalazłem pewien drobny błąd. Oczywiście bawię się zaktualizowaną wersją ze strony - o poprawionym błędzie z pierwszego wydania wiem.

Konkretnie chodzi o ten kawałek funkcji SuperDebounce:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Po wciśnięciu klawisza zmienia się stan na "debounce" i zaczynamy odliczać czas aby wyeliminować ewentualne drgania styków. Po tym czasie następuje spełnienie warunku z 7 linii. Lecz co się stanie gdy podczas tego odliczania odpuścimy klawisz? Stan zostanie nadal ten sam, czyli "debounce", warunek z 7 linii nie zostanie spełniony, ani żaden inny do końca tej funkcji. Warunek z linii 7 zostanie spełniony natychmiast po ponownym naciśnięciu klawisza, bez "debouncigu" tego kolejnego wciśnięcia.

Efekt: podwójne kliknięcie, przy czym pierwsze o czasie trwania poniżej wynikającego z 4 linii powoduje jednokrotne wykonanie callbacku do push_proc() lub rep_proc() (w zależności od czasu drugiego kliknięcia). Pewnym rozwiązaniem może być zmniejszenie czasu oczekiwania na ustabilizowanie się styków, lecz po próbach na stole bezproblemowo udawało się wcisnąć i odpuścić microswitch w czasie poniżej 30ms, a w wersji hardcorowej przy kątowym atakowaniu słicza z dużą szybkością, nawet poniżej 10ms. O ile kojarzę niektórzy producenci podają czas drgania styków do 20ms. Więc drastyczne zmniejszenie wartości z linii 4 nie jest satysfakcjonującym mnie rozwiązaniem.

W celu eliminacji tego zjawiska wstawiłem na szybko sprawdzanie po drodze jeszcze jednego warunku, linie 7, 8 i 9:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


W tym momencie do funkcji dodano 8 rozkazów maszynowych. Być może jest jakiś bardziej elegancki sposób aby wyeliminować to zjawisko?

Pozdrawiam

Autor:  mirekk36 [ 29 mar 2015, o 23:27 ]
Tytuł:  Re: Błąd w SuperDebounce

haloon napisał(a):
Lecz co się stanie gdy podczas tego odliczania odpuścimy klawisz? Stan zostanie nadal ten sam, czyli "debounce", warunek z 7 linii nie zostanie spełniony, ani żaden inny do końca tej funkcji. Warunek z linii 7 zostanie spełniony natychmiast po ponownym naciśnięciu klawisza, bez "debouncigu" tego kolejnego wciśnięcia.

Nie jest mi prosto po pięciu latach analizować kod ;) ale chyba masz rację ;) ... zaraz dopiszę coś jeszcze - chwilka

Autor:  haloon [ 29 mar 2015, o 23:28 ]
Tytuł:  Re: Błąd w SuperDebounce

Dziękuje :) dopiero zaczynam, i nie odpuszczam dopóki czegoś nie zrozumiem; zabawę z Bluebookiem przeprowadzam na ATtiny2313 więc jest dodatkowa, pozytywna zabawa z dopasowywaniem rejestrów.

Odpowiadając: warunek z linii nr.2 nie zostanie spełniony ponieważ key_state zostało z wartością 1.

Autor:  mirekk36 [ 29 mar 2015, o 23:39 ]
Tytuł:  Re: Błąd w SuperDebounce

haloon napisał(a):
Odpowiadając: warunek z linii nr.2 nie zostanie spełniony ponieważ key_state zostało z wartością 1.

tak tak - dlatego skasowałem wcześniejszą wypowiedź zanim napisałeś swoją ... teraz jeszcze patrzę na to i za chwilę napiszę kilka słów

------------------------ [ Dodano po: 13 minutach ]

Po pierwsze to ogromna radość, że TAK głęboko wszedłeś w tę funkcję ... to mnie bardzo cieszy.

Po drugie - rzeczywiście w pewnych sytuacjach może dojść do tego co mówisz - chociaż ja tu założyłem właśnie możliwości REGULACJI tym doborem czasu na różnych etapach .... Nie mniej jednak biorąc pod uwagę aż takie coś:

haloon napisał(a):
a w wersji hardcorowej przy kątowym atakowaniu słicza z dużą szybkością, nawet poniżej 10ms.

No to rzeczywiście .... jak się "postarać" to można.

Ja bym może dodał nieco krótszy ten warunek .... bo nie musimy czekać aż Timer1 będzie równy 0, tylko od razu i ZAWSZE gdy klawisz zwolniony a stan jest = debounce to .... zrobiłbym to tak

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


------------------------ [ Dodano po: 18 minutach ]

Generalnie - to powiem tak - CELEM albo inaczej GŁÓWNE CELE jakie mi przyświecały pisząc tę funkcję to:

1. Pokazać czytelnikowi jak działają timery programowe
2. pokazać jak należałoby próbować podchodzić do obsługi klawisza (szczególnie chodzi o repetycję)
3. pokazać jak korzystać w prosty sposób ze wskaźników na funkcje przekazywanych do innej funkcji - czyli pierwsze zetknięcie z TAK WAŻNYMI z mojego punktu widzenia CALLBACKAMI (czyli mechanizmem funkcji zwrotnych)
4. pokazać jak pisać funkcje nieblokujące z nieco rozbudowaną tzw maszyną stanów
5. Na pewno nie miała to być NAJLEPSZA FUNKCJA na świecie do obsługi klawiszy i nawet pomimo tej poprawki nadal wg mnie nie będzie pretendować do tego tytułu .... bo obsługuje wciskanie tylko pojedynczych klawiszy (dwóch naraz nie da się wykryć) ;) a też np by się przydało w wielu sytuacjach

Jak dla mnie punkty od 1 do 4 kolega zaliczył na piątkę ! ... dlatego piszę, że to miło słyszeć - że się przydało to co napisałem ;)

------------------------ [ Dodano po: 22 minutach ]

O! nawet jeszcze inaczej nieco bym to zrobił - tego IF'a zabezpieczającego umieściłbym na końcu łańcuszka - aby nie tracić cennego czasu funkcji nieblokującej!

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/