Antystatyczny napisał(a):
Zastanówmy się, co się dzieje, gdy wciskamy przycisk, który początkowo ma pull up do VCC. w momencie odłaczenia się od VCC stan styku odbiorczego bryka sobie swawolnie w stanie HI-Z, prawda? To trwa tylko chwilkę, ale...
No własnie, to drobne ALE. W tym czasie proc może setki razy sprawdzic stan tego pinu i odczytac głupotę!
.
Anty SUPER że zadałeś to pytanie jako fachowiec od elektroniki i na pewno 100x lepszy fachowiec ode mnie w dziedzinie elektroniki analogowej. Bardzo chętnie o tym podyskutuję, szczególnie o tym momencie i czekałem wręcz na tak precyzyjne pytanie. Troszkę się rozpiszę - ale muszę
do rzeczy:
1. w trakcie gdy klawisza nie ruszamy na linii jest cały czas VCC -
drgania styków się samoistnie nie pojawią - zgadza się?
2. nadlatuje nasz paluch i mizia przycisk klawisza zwalniając linię od VCC, i w tym momencie jak słusznie zauważyłeś "bryka sobie swawolnie stan Hi-Z , ale nie tylko bo przy większych prądach (jakieś styczniki) nawet wystąpić jakieś iskrzenia, przepięcia, mechaniczne drgania czyli zwieranie do GND i VCC ... no generalnie dzieje się burza - oczywiście jakość tej burzy zależna jest od rodzaju klawisza i prądów - zgadzamy się prawda ?
3. i teraz HEREZJA, która wciskana jest przez setki tysięcy blogów, wpisów na przeróżnych stronach a nawet książkach .... bo wszystkie one podają zgodnie zresztą z tym co ty powiedziałeś - że "
W tym czasie proc może setki razy sprawdzic stan tego pinu i odczytac głupotę!"
- najpierw zastanówmy się co to dokładnie oznacza - że proc może odczytać głupotę ? hmm? - może to wygląda jakbym się czepiał słówek ale uwierz nie o to mi tu chodzi - tylko o precyzyjne wyjaśnienie tego co chciałem przekazać na blogu. A więc - moim zdaniem "proc sam nic nie zrobi, proc sam nic nie odczyta - proc sam nic nie zdziała" - to nasz program .... na prawdę nie chodzi mi o czepianie się słówek - ale to ważne. No i teraz .... zakładając nawet, że te drgania to będzie przykładowy ciąg stanów wysokich i niskich jak jest w niebieskiej książce .... to ile ten ciąg może trwać ??? no załóżmy że nawet niech będzie 5ms (co uważam za ogromną przesadę dla typowych microswitchów i pokazałem te czasy na oscylu - że są o wiele krótsze a wachania stanów bardzo niewielkie. No ale ok - zgadzam się że nawet rodzajów microswitchów mogą być tysiące i niech sobie to występuje te całe 5ms
KULMINACJA! .... gdyby napisać obsługę klawisza tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
to powiedz mi - jesteś w stanie odróżnić ile razy ta dioda LED się przełączy od tych drgań styków a ILE RAZY dioda LED zmieni stan z uwagi na to że w pętli głównej ten warunek będzie wykonywany setki tysięcy razy na sekundę. Zgodzisz się chyba, że nawet gdyby na świecie nie było drgań styków - hipotetycznie - to powyższy kod i tak byłby TOTO - lotkiem zgadza się ????? czy może przypadkiem nie jest tak, że jak ktoś na jakimś forum zobaczy taki kod to krzyczy wyeliminuj drgania bo dioda będzie migać i nieregularnie się zapali. Więc widzisz tu pewną nieścisłość chyba albo niejednoznaczność takiej sytuacji ale PROGRAMISTYCZNEJ.
więc teraz dwa inne kody:
KOD nr.1język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
KOD nr.2język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
porównaj je teraz. Kod nr.1 ma rzekomą obsługę drgań styków natomiast kod nr.2 jej nie ma - za to dałem sobie po zmianie stanu diody delay'a
i co ?
nie okaże się, że nadal obydwa będą REAGOWAĆ IDENTYCZNIE ???? jeśli chodzi o oko człowieka i obserwację efektu końcowego czyli przypadkowego zapalania się bądź gaszenia diody LED. A przecież TAKI WSPANIAŁY najprostszy przepis podają setki tysięcy ludzi - że wystarczy zrobić to co mamy w KODzie nr.1 i jesteśmy URATOWANI. Więc pokazuję że KISZKA, ZONK, MASAKRA - NIEPRAWDA - i chyba na tym etapie się też zgodzisz ze mną ? czy nie ? ale to nie koniec.
no to teraz taki kod:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
TO BARDZO WAŻNE. BARDZO !!! .... w tym kodzie wyżej NIE MA RZEKOMEJ HEREZJAŃSKIEJ OBSŁUGI DRGAŃ STYKÓW - ale co ? jak wciśniesz klawisz to dioda nie zmieni PRECYZYJNIE STANU na przeciwny ???? pomimo to, że po wciśnięciu klawisza - nastąpiło przez całe 5ms niech ci będzie że nawet przez 20ms stado drgań, burza styków, brykające stany Hi-Z .... a jednak jak to nie prawda co było na początku powiedziane, "
że procek odczyta jakąś głupotę" zgadza się ????
OWSZEM obsługa klawisza jest daleka od idealnej - no bo stosujemy tragiczny algorytm, ale to inna sprawa. Chodzi mi o to, że z punktu widzenia CZASU procesu, który jest wywoływany nawet w dobrze napisanej obsłudze klawisza - i tak nawet bez tego delaya(1000) upłynie chociaż byś nie chciał KUPA CZASU. Nawet przy kwarcu 20MHz i założeniu że ów proces zużyje na swoje wykonanie tylko 100 cykli zegarowych - to już upłynie 5us !!! (a to też dużo w porównaniu do przebiegów na oscylu jakie pokazywałem z typowych microswitchy. Ale ok czochra nas to na razie.
MY JAKO PROGRAMIŚCI MUSIMY stworzyć taki algorytm aby móc zareagować TYLKO na wciśnięcie klawisza i to niezależnie w którym miejscu drgań styków pierwszy raz zadziała ten IF() !!! I teraz biorąc pod uwagę powyższe kody, gdzie czas potrzebny na realizację PROCESU odpalonego przez wciśnięcie klawisza (w tym przypadku zmiana stanu diody LED) .... jest bardzo bardzo krótki, można powiedzieć, że na IF'a i zmianę stanu diody zmarnują się co najwyżej ze 4 do 6-10 cykli zegarowych .... to przy kwarcu 20MHz będzie to powiedzmy 0,2 - 0,5us - rzeczywiście niewiele, ale z uwagi na o wiele dłuższe / pochyłe zbocze narastające przy zwalnianiu klawisza - wg mnie musimy odczekać trochę czasu, dlatego to w przypadku TAK KRÓTKICH procesów - zapewni nam i tak prawidłową reakcję.
Tylko zauważ że teraz rozpatrujemy prawie skrajne warunki jak dla procków AVR przynajmniej - taktowanie 20MHz, kto tyle używa na co dzień ? ja powiedziałbym, że średnio używane taktowanie jeśli tak można powiedzieć to ok 10MHz więc te czasy podane wyżej wydłużą się co najmniej dwukrotnie. Tak samo jak czasy potrzebne na realizację zwykle prawdziwych i o wiele dłuższych PROCESÓW niż TYLKO zmiana stanu diody na przeciwny - np skok do jakiejś funkcji i wykonanie szeregu operacji .... tu już czasy się drastycznie wydłużą. Ktoś mógłby powiedzieć, że przecież klawisz poza zmianą stanu diody LED wykorzystamy np często tylko do zmiany stanu jakiejś tam flagi więc też nie stracimy dużo czasu na obsługę procesu .... ale znowu - ZWYKLE gdy obsługujemy klawisze w POOLINGU - ja to uważam za prawie jedynie słuszną metodę w każdej sytuacji - i zresztą zwykle o tym jest mowa przy tych drganiach - to więcej uwagi powinniśmy poświęcić jak już drganiom styków przy zwolnieniu klawisza. Dlaczego ? ano dlatego że właśnie gdy trzymamy go paluchem to czasem ten paluch się trzęsie, a gdy jeszcze styki są zaśniedziałe - to sam przyznasz że nie tylko przy chęci zwolnienia ale i w trakcie trzymania można dostać serią drgań
więc TAK CZY TAK na końcu MUSIMY UWZGLĘDNIĆ jakiś czas BYLE NIE BLOKUJĄCY na tą obsługą drgań przy zwolnieniu klawisza.
Nieco inaczej jest też jak się pisze już taką bardziej zaawansowaną obsługę jak SuperDebounce - a przecież wiem że kto jak kto ale Ty rozgryzłeś to sam dla siebie i swoim kodem od najmniejszych podstaw - więc wiesz - że TAM rzeczywiście trzeba zwrócić uwagę nawet na te początkowe drgania styków. I ja się z tym zgadzam i to samo zrobiłem i robię w SuperDebounce
REASUMUJĄC - artykułem tym nie chciałem zaprzeczyć że NIE MA ZJAWISKA DRGAŃ styków - a raczej pobudzić do takiego przemyślenia i rozważenia jak już budowania przemyślanych procedur obsługi klawisza - gdzie mamy oprogramowane:
1. reakcję na przyciśnięcie
2. reakcję na zwolnienie (minimum)
3. ale też może od razu AutoRepeat
itp
bo dopiero wtedy możemy mówić dobrze i myśleć kiedy są te drgania ważne a nie (JESZCZE RAZ PODKREŚLAM) w tak DURNYM przykładzie podawanym na populistycznych stronach dla początkujących
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
BO TO Z TYM starałem się walczyć - NIE ŻE NIE MA DRGAŃ, tylko że przypadkowe miganie tej diody JEST tu spowodowane BZDURNYM algorytmem obsługi klawisza i jak udowodniłem (mam nadzieję) nawet gdyby drgań styków nie było na świecie to i tak ten przykład nadal powodowałby to samo z tą diodą LED. I przez to w wielu pytaniach na forach, blogach - biedni początkujący - którzy posłuchali powyższej "SUPER" porady - za chwilę piszą kolejne pytanie"
Cytuj:
No zrobiłem obsługę drgań styków a i tak klawisz mi dziwnie reaguje i dioda dziwnie się zapala
- jak dobrać te czasy delaya ?? może tu coś źle robię ? POMÓŻCIE ....."
albo inne super częste pytanie z tym związane
Cytuj:
a jak zrobić żeby mi klawisz zadziałał na krótki i długi klik ????
i dopiero tu jak się początkujący zaweźmie to zaczyna odkrywać - że po prostu w końcu trzeba się wziąć na prawdę za porządną procedurę i uniwersalną do obsługi swoich klawiszy a nie w kółko bawić się z tym durnym kodem wyżej i rzekomą eliminacją drgań styków.
--------------
I jeszcze JEDNO. Taki jeden upierdliwiec na blogu, którego posty kasowałem i skasowałem wszystkie bo po chamsku pisał - napisał mi tak.
Cytuj:
"Piszesz że nie ma drgań styków - widzę że nie znasz się na elektronice jesteś taki i owaki .... a wystarczy że sobie zrobisz prosty test - podłącz klawisz pod przerwanie INT0 i wtedy zobacz czy przerwanie nie zostanie wywołane setki razy"
No ale jak widzisz on ani na chwilę nie pochylił się nad problemem który staram się wyjaśnić, chociaż wielu zarzuca mi że tak błahy problem jak obsługa klawisza nie wymaga wyjaśnień i apiać od nowa - że wystarczy zrobić prostą eleiminację jak wyżej ....
no dobra - a w odpowiedzi na to przerwanie
...... TOŻ tylko tytuł artykułu jest przewrotny i piszę to w pierwszych słowach - nigdy nie twierdzę że nie ma drgań styków, wręcz przecież je pokazuję na oscylu. A i tak - gdyby zamiast po chamsku próbować dyskutować - chciał tą dyskusję przeprowadzić tak jak Ty teraz ze mną - to chętnie bym mu pokazał jak się obsługuje klawisze ba! nawet całe klawiatury matrycowe na przerwaniach - żeby poradzić sobie z drganiami styków. Powiedziałbym nawet że na przerwaniach jest to prostsze niż w POOLINGU, tyle że z uporem maniaka będę twierdził że obsługę pojedynczych klawiszy lepiej robić w POOLINGU a do przerwań sięgać albo w przypadku np klawiatur matrycowych albo jakichś innych nietypowych przypadkach.
Antystatyczny napisał(a):
A teraz sprawa najwazniejsza, która chciałbym "obgadać" z Mirkiem. Faza puszczania przycisku tez jest obarczona czasem, w którym pin procka będzie w HI-Z. W niebieskiej ksiązce jest elegancka funkcja obsługująca klawisz, ale.... (już wiadomo, co mnie niepokoi)
Mirku, chętnie porozmawiam o tym, bo mam wrażenie, że którys z nas cos pominął... albo czegoś np. nie rozumiem. Jesli się myle, bardzo proszę o jakieś wytłumaczenie. Pozdrawiam
No to sobie porozmawialiśmy co ???
tzn na razie ja napisałem hmmm rozpisałem się (sorki) ale ciekaw jestem teraz twojego zdania na ten cały kontrowersyjnie zatytułowany artykuł
(przy okazji jeszcze raz dzięki za te wszystkie wpisy i na blogu i na youtube)