Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 21 gru 2024, o 17:12


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 29 mar 2015, o 23:09 
Offline
Nowy

Dołączył(a): 28 mar 2015
Posty: 2
Pomógł: 0

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 mar 2015, o 23:27 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27319
Lokalizacja: Szczecin
Pomógł: 1041

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

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 mar 2015, o 23:28 
Offline
Nowy

Dołączył(a): 28 mar 2015
Posty: 2
Pomógł: 0

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 mar 2015, o 23:39 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27319
Lokalizacja: Szczecin
Pomógł: 1041

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.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO