Nie ma co usuwać
... jednak sam wciąż przymierzam się do stworzenia podobnego poradnika tyle że takiego zadającego niestety KŁAM - tym nieszczęsnym "drganiom styków"
wiem, wiem... ktoś zaraz powie, że przecież sam poświęciłem drganiom styków sporo miejsca w swojej pierwszej książce
ale już tłumaczę o co chodzi ... tzn o co mi teraz chodzi
Naturalnie "drgania styków" to nie jest żaden MIT. Ale ich rzekomy wpływ i to jeszcze tak tragiczny wpływ na działanie naszych programów to już jest MEGA MIT ....
A jak do tego dodać jeszcze tak durne pomysły jak prezentuje pewien gościu na swoim blogu, gdzie wciska początkującym chore pomysły iż jeśli stosujemy np kondensator 100nF jak na tych filmikach to jeszcze trzeba KONIECZNIE NIBY dodać rezystor w szereg ponieważ może dochodzić .... ba... na pewno dochodzi do WYPALANIA biednych styków
.... ogniem piekielnym to już tworzy się ballada o zabarwieniu folklorystycznym z dorzecza amazonki
(nie będę tu podawał linku do tego bloga - na elektrodzie można znaleźć go w co drugim poście
) ... żeby nie szerzyć tych bzdur
ale ok - przejdźmy do rzeczy bo jak widzę taki temat i takie filmiki to aż się prosi aby napisać poradnik o co tu chodzi
W zasadzie to ten człowiek na tych filmikach zrobił już kawał dobrej roboty w zasadzie udowadniając sam sobie - że drgania styków są w ogóle nie szkodliwe i to nie one przeszkadzają mu w tym programie
z tymi dwoma migającymi diodkami LED ..... dlaczego ?
Ano dlatego że zdecydowana większość ludzi w tego typu poradnikach szerzy niestety herezje
.....
1. Popatrzcie sobie na te kolejne klikania i rozpaczliwe próby zaobserwowania drgań styków
... ileż się facet musi naklikać żeby COŚ tam się pojawiło. A co się pojawia ? otóż pojawiają się takie przebiegi które w żaden sposób nie wpłynęłyby na te szybkie mignięcia diodami LED
2. facet programowo stara się udowadniać przez długi czas jak ciężko je wyeliminować żeby na końcu podać hmmm przepraszam ale koszmarny przykład jak je niby eliminować programowo. Bo hyhyhy najlepsze jest to że z użyciem kondensatora udowodnił tylko że zbocza się lekko wygładzają i rzeczywiście mniej tam troszkę tych zakłóceń
3. zakłócenia te są jednak w zdecydowanej większości przypadków (chociaż to też zależy od rodzaju przełączników) ... mizerne i nie mają wystarczających poziomów logicznych aby wyzwolić jakieś tam durne przełączanie diodek LED. Tym bardziej, że zwróćcie uwagę na podstawę czasu na końcu gdy poszerza ją na maxa (chyba są ze 2us) - co to ma do rzeczy ??? to wygląda tak jakby ktoś chciał nam wmówić że drgania styków pojawiają się same nawet gdy nie dotykamy klawiszy albo gdy je delikatnie muskamy palcem hahaha
sorki ale to bzdura .... takie nawet microswitche trzeba nieźle doginać żeby w ogóle wcisnąć - jak na takie maleństwa
...... no dobra - to gdzie jest problem ??? ktoś zapyta! ... przecież widać na filmiku że diodki LED czasem przekakują (zapalają się) niezgodnie z naszym oczekiwaniem
taaaaak oczywiście ale jeszcze raz podkreślam to nie WINA tych całych kocich drgań styków w zdecydowanej większości przypadków.
Przyczyną jest niezrozumienie (niestety) jak powinien działać klawisz w naszej aplikacji, jak zapewnić niezależne jego działanie od obsługi innych rzeczy w pętli głównej a także innych pojedynczych klawiszy.
podam prosty przykład na początek, który chyba każdy zna jako podstawę tej eliminacji drgań
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
No niech ktoś mi powie, że to nie wyeliminuje skutecznie drgań styków ?
.... no kto ? ktoś tak powie ??? (nie zważamy na razie że użyta jest tu funkcja _delay_ms() - nie w tym rzecz - skupmy się na istocie rzeczy)
więc proszę sobie ten kod wklepać - i spróbować kliknąć klawisz żeby dioda się zapaliła, potem kliknąć drugi raz żeby się zgasiła i tak dalej.....
a tu co ???? ZONK !!!
rzadko udaje się trafić żeby zapalić diodę albo ją zgasić - ona jak ta niesforna pchła wciąż się wymyka naszej kontroli. Gorzej
a co się stanie gdy wciśniemy paluch i go trzymamy wciąż ???? OOOO jej
.... dioda zaczyna migać jak porąbana i robi nam się nagle z obsługi klawisza ułomny PWM
no więc jak ??? jak to zrobić żeby jednokrotne naciśnięcie klawisza niezależnie jak długo czy krótko kliknę to żeby WYRAŹNIE zmieniło stan tej diody hmmm ??? no jak ?
oczywiście rzadko komu się chce dogłębnie przeanalizować zagadnienie obsługi klawisza - bo każdy zresztą szybko myśli "a co tu analizować w ogóle?" .....
i ciach - wzbogaca nasz program o dodatkową jedną linijkę:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
oooo
teraz jakby się coś poprawiło. Klikam krótko i ładnie dioda zmienia stan, klikam krótko drugi raz i znowu ładnie .... mniaaam
... po co dalej myśleć - to wystarczy no nie ?
a tu za chwilę znowu ZONK - bo przyszedł kolega, który ma duże paluchy i jest powolny i nie potrafi tak krótko jak my tego maleństwa kliknąć - więc gdy go wdusza do dioda znowu zachowuje się nieprzewidywalnie. Hmmm szybkim krakowskim targiem z uwagi na kolegę zwiększamy czas 250ms do np 500ms (pół sekundy) .... no i teraz koledze się udaje .... ale znowu nam to zaczyna przeszkadzać
Nie mówiąc o tym, że znowu gdy wciśniemy długo klawisz to miga dioda co pół sekundy czy tam co 250ms a nam nie o to chodziło!!! Przecież niezależnie ile czasu go wduszę tego niesfornego klawisza to powinien się TYLKO RAZ zmienić stan diody LED !!!!! kurka wodna !!!
cóż to ? czyżby aż taaaaaaaaaak długie drgania tych styków ???? NIE, NIE - zdecydowanie NIE ....
po prostu trzeba to jakoś dalej i inaczej oprogramować - ŻADEN kondensator tu nie pomoże
chyba zaczynacie to dostrzegać prawda ???? (nie wspominam już o tych nieszczęsnych _delayach
)
dlatego pierwsza podpowiedź.
1. trzeba nauczyć się programowo rozróżniać i to wyraźnie dwa stany: PRESS (wciśnięcie) oraz PUSH (zwolnienie klawisza) i reagować uwaga! TYLKO na jedno z tych zdarzeń !!!! zgadza się ???
przecież gdy zareagujemy na PRESS to gdy nadejdzie PUSH nie może się już powtarzać nasza akcja czyli miganie diody LED
I tak samo - jeśli zareagujemy na PUSH to reakcja nie może się powtórzyć podczas PRESS
i tu leży klucz do zrozumienia obsługi klawisza !!!! a nie tam durne drgania styków.
Na tych filmikach gościu pokazał pewien hmm dość standardowy sposób i to bez _delay'ów .... który DOKŁADNIUŚKO realizuje tę zasadę. A nieumiejętne początki pisania tej procedury przypisywał nadal z uporem maniaka drganiom styków.
proszę tu macie taki przykład:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Powołane są tu dwie zmienne Press oraz cnt, które tworzą taką mini maszynę stanów. Sprawdźcie to niby działa - ale też jeszcze nie tak do końca - czasem się zdarzy że jeszcze coś nie tak przeskoczy. Ale jeśli dodamy jeszcze jeden licznik i napiszemy to tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
to nagle okazuje się że zaczyna to już działać niby IDEALNIE. Tzn spróbujcie sami - zapraszam. W sumie niby proste prawda ? - sprawdźcie działa ślicznie teraz. I co więcej nie ma nawet żadnego _delay'a !!!!!! zauważyliście to ??? więc ogromny postęp jakby nie patrzeć. Ale ten dodatkowy licznik wcale nie został dodany w związku z rzekomymi drganiami styków
.... chodzi o to, żeby nasz ludzki ułomny paluch nie trafił akurat na moment gdy cnt jest już PRAWIE = 0 !!!! bo wtedy kilka us dłuższego wciśnięcia i CIACH znowu KLOPS stan diod się zmieni ....
żeby jednak nie było zbyt różowo - jak bym miał w swoim projekcie wykorzystywać TYLKO jeden klawisz to pewnie bym użył może i takiego sposobu.
Ale jeśli miałbym tych klawiszy np PIĘĆ !!!! albo SIEDEM ??? To SZOK - ile trzeba byłoby zmiennych powołać do każdego z nich!, ile IF'ów !!!!
a co gorsze spróbujcie to tzn ten sposób wyprowadzić do jakiejś funkcji
.... jak zaczniecie to robić to....
.... to wbrew pozorom będą dwa pozytywne skutki jeśli się nie poddacie. Bo jeśli stworzycie to:
1. satysfakcja że się udało we własnym zakresie
2. zdobycie sporego (skill'a) doświadczenia - bez wątpliwości
3. gdyby wam jeszcze przyszło dodanie obsługi krótkiego kliknięcia i dłuższego a nie daj co jeszcze opcji AUTOREPEAT (która wg mnie bardzo często jest potrzebna) .....
to na końcu zrozumiecie funkcję
SuperDebounce() opisaną w mojej pierwszej książce - a dalej to już będzie o tyle fajnie, że będziecie sobie radzić luzikiem w każdej takiej sytuacji nawet bez SuperDebounce() .... tylko sami lekką ręką będziecie pisać takie nieblokujące i własne funkcje
reasumując - zobaczcie ile można napisać o takim "głupim" małym klawiszu
------------------------ [ Dodano po: 2 minutach ]MichalXY napisał(a):
W ogóle ten facet fajne filmy ma, chociażby konstruowanie własnej maszyny CNC od podstaw... ;D
Tylko żeby mnie ktoś źle nie zrozumiał - i tak super że gościu pokazuje takie fajne poradniki bo jak pisze MichalXY na prawdę ma ich wiele i fajnych sam oglądałem
jedyne z czym się nie zgadzam - a to chyba drobiazg - to fakt, że nie tłumaczy on eliminacji drgań styków bo one w tym o czym opowiada odgrywają super marginalną rolę a omawia to jak powinno się podejść do obsługi durnego klawisza
i żeby zrozumieć podstawy to bardzo dobry przykład podaje - więc od strony dydaktycznej (jak zwał tak zwał) - przykład jest OK bo na pewno pozwoli wielu początkującym poradzić sobie w prostych swoich pierwszych programach z taką obsługą.