Strony

sobota, 6 października 2012

Drgania styków ? - to BAJKI ! więc jak to jest naprawdę?

Pod pozorem tego nieco przewrotnego tytułu chciałbym zwrócić wam uwagę na to, jaką krzywdę początkującym wyrządzają popularne ostatnio w internecie poradniki wszelkiego rodzaju, próbujące nieudolnie wyjaśnić może nie sam fakt istnienia drgań styków, bo takie zjawisko na pewno istnieje, ale tłumaczące w pokrętny i całkowicie zły sposób jak sobie z tym radzić w mikrokontrolerze, oraz czego one są przyczyną. Mamy tu do czynienia z totalną mistyfikacją w 80% przypadków ;)




Na początek pierwszy i wielki MIT:

Proszę rzucić okiem na film video na youtube, który przedstawia rzekome zjawisko/efekt drgań styków:



filmik pod tytułem: „Przycisk wymaga debouncingu (eliminacji drgań styków)”. 
Pod filmem mamy takie oto „cudowne” objaśnienie:

There s a simple piece of code running on the mbed that samples the button, regularly, and does edge detection y looking for a change in state. You'll see that the button is being pressed regularly, and the LED should toggle with each press. Because of swich bounce, sometime the LED toggles more than once, leaving its state unchanged, although multiple edges have been detected.

Co w wolnym tłumaczeniu może brzmieć tak:

Mamy tutaj przykład kodu uruchomionego na mikrokontrolerze, który regularnie sprawdza stan klawisza i reaguje na zbocze sprawdzając zmianę poziomu logicznego na wejściu. Jak widać klawisz jest regularnie wciskany a dioda LED powinna zmieniać swój stan za każdym wciśnięciem. Ponieważ jednak występują drgania styków, czasami dioda LED zmienia swój stan więcej niż jeden raz, i pozostaje w niezmienionym stanie. Powodem jest wykrycie wielu zboczy podczas drgania styków.

Może czas na przedstawienie prostego kodu, który najczęściej bez głębszego wyjaśnienia jest przedstawiany jako przyczyna tego zjawiska:


Każdy chyba widzi co się tutaj dzieje. W pętli głównej jeden prosty warunek IF, który sprawdza czy na pinie klawisza jest stan niski, a jeśli jest to następuje zmiana stanu diody LED na przeciwny. W założeniach „PIĘKNIE”. W praktyce gorzej ponieważ jak widać na tym filmie ale także na moim filmie poniżej, mamy do czynienia z IDENTYCZNYM efektem.



Dioda LED zachowuje się dokładnie tak samo, tyle że prawie wszyscy dookoła tłumaczą początkującym, że efekt ten zawdzięczamy drganiom styków, które są przy okazji określane jako groźne zjawiska, piekło początkujących a niektórzy już nawet przechodzą samych siebie wymyślając kosmiczne wręcz opinie na temat rzekomego „ognia piekielnego” ;) który może doprowadzić do wypalania się styków w takich przełącznikach/klawiszach, przy okazji dodania do układu kondensatora ceramicznego 100nF (pełniącego rolę sprzętowej eliminacji drgań)

Spróbujmy najpierw popatrzeć …. jak tłumaczą niektórzy i jak przedstawiają drgania styków i to jeszcze w postaci widoku rzekomo z oscyloskopu.



Co ten rysunek, hmmm ja powiedziałbym ta „LAURKA” ma oznaczać ? drgania styków ? Ktoś próbuje posłużyć się takim widokiem rodem z oscyloskopu prezentując tu (w zasadzie można powiedzieć rysunek stworzony w Photoshopie) ;) … nie ma żadnych parametrów w postaci podanej czułości, poziomu wyzwalania ale co najważniejsze, podstawy czasu, czy też poziomu napięć. Taki rysunek ma w zasadzie przestraszyć początkującego i wmówić mu już na samym początku, że tak groźne chociaż dziwne na pierwszy rzut oka zjawisko następuje podczas ….. no właśnie podczas czego? Pytam!

Podczas WCIŚNIĘCIA czy może podczas ZWOLNIENIA przycisku ??? a to dosyć istotne, bo jak zaraz się przekonamy na prawdziwych oscylogramach będzie się to znaczenie różnić w rzeczywistości i odgrywać różne skutki a także wymagać różnej reakcji z naszej strony.

Ja zrozumiałbym, gdyby ktoś symbolicznie próbował przedstawić i omówić samo zjawisko drgania styków, bo dopiero takie schematyczne przedstawienie dobrze ilustruje to co nazywamy DRGANIEM STYKÓW ale podkreślam (zapamiętaj) nie ma to NIC WSPÓLNEGO z rzekomym efektem drgania styków odnośnie tego filmu na początku i prób zapalania i gaszenia tej nieszczęsnej diody LED. Wracając zatem do drgań, schematycznie można je przedstawić tak:



Taka ilustracja bardzo dobrze tłumaczy w teorii to co się dzieje podczas drgań styków w przeróżnych mikro przełącznikach, klawisza itp. To chyba każdy może zrozumieć, że zarówno podczas wciśnięcia przycisku jak również gdy go zwalniamy, może nastąpić w bardzo krótkim czasie seria zmian stanów logicznych. Ale zastanówmy się teraz tak naprawdę w jakim przypadku mogłoby to mieć uboczne skutki, gdybyśmy zechcieli zbudować urządzenie do gaszenia i zapalania pojedynczej diody LED. Proszę bardzo spójrzmy na układ prostego przerzutnika RS, zrealizowanego na najzwyklejszych bramkach logicznych typu NOR (żaden mikrokontroler!) (przy okazji jeśli chciałbyś zobaczyć i zrozumieć jak działa przerzutnik RS zajrzyj tutaj: http://symulator.majsterkowicza.pl/pokaz/77 )


Załóżmy że ustawiamy wejście S w stan wysoki, do wyjścia Q podłączamy naszą diodę LED a do wejścia R podłączamy klawisz. Zatem na wejściu R będziemy mieli do czynienia z drganiami styków:


Spójrzmy jaka będzie reakcja przerzutnika na wyjściu Q. Gdyby nie drgania styków to mielibyśmy pięknie przełączaną diodę na wyjściu Q w stan przeciwny. Jeśli zaś wystąpią drgania styków to okaże się, że ta dioda po jednokrotnym wciśnięciu i zwolnieniu klawisza może się zapalić i zgasić dziesiątki razy, a na końcu przybierze przypadkowy stan. Ilustruje to poniższa animacja:



Widać że klikanie i zmiana stanu na wejściu R ładnie zmienia stan na wyjściu Q, jednak symulacja szybkich zmian (szybkie klikanie) powoduje że wyjście Q tak samo szybko zmienia swój stan na przeciwny. W takim przypadku efekt drgań styków byłby bardzo przykry trudno byłoby jednoznacznie zapalić lub zgasić diodę LED po każdorazowym wciśnięciu i zwolnieniu przycisku. Uzyskamy efekt DOKŁADNIE taki sam jak na filmie prezentowanym na początku. Pamiętaj jednak że na razie mówimy tylko o bramkach logicznych i nie ma to nic wspólnego z mikrokontrolerem. Ale spokojnie, również w takich warunkach już dawno wymyślono rozwiązania czysto sprzętowe, które potrafią skutecznie wyeliminować taki przykry efekt drgań. Wystarczy użyć do tego celu także wspomnianego wyżej przerzutnika RS tyle że w nieco innej konfiguracji i definitywnie raz na zawsze pozbywamy się przykrego efektu podczas przełączania klawiszem diody LED:


Proszę bardzo takim sposobem w prosty sposób moglibyśmy eliminować opisany wyżej efekt drgań styków jeśli chodzi o rozwiązania czysto sprzętowe bez udziału mikrokontrolera. Ktoś może powiedzieć, że takie rozwiązanie w dzisiejszych czasach nie ma racji bytu i sensu, ponieważ mamy mikrokontrolery i nikt nie będzie dokładał do obsługi klawisza dodatkowych układów scalonych z bramkami logicznymi. Zgadza się ;) prawda, chociaż z drugiej strony chciałbym zwrócić twoją uwagę na to, że niektóre firmy jak np. MAXIM produkują bardzo fajne i zaawansowane specjalizowane układy scalone do tego celu, które także muszą sprzętowo pięknie rozwiązać przykry efekt drgań styków, ale po tych wyjaśnieniach wyżej widzisz sam na jakiej zasadzie działa taki mechanizm w układach scalonych z linku poniżej (np. MAX6818) – naprawdę bardzo ciekawe układy i godne polecenia:


Przy okazji w linku tym można zobaczyć już lepszą nieco prezentację drgań styków mającą tym razem więcej wspólnego z rzeczywistym przebiegiem na oscyloskopie niż przedstawiony na początku rysunek:



Drgania styków, w różnych wersjach klawiszy mogą trwać teoretycznie nawet aż do 20 ms! To z punktu widzenia mikrokontrolera prawie wieczność, przeraźliwie długi czas. W rzeczywistości jednak nie jest tak źle a szczególnie jeśli chodzi o popularne mikro-switche. Żeby to udowodnić pokusiłem się o przygotowanie w tym celu kilku rzeczywistych przebiegów na wysokiej klasy oscyloskopie cyfrowym, podając przy okazji szczegóły. Spójrz sam, poniżej kilka przykładów złapanych w pułapkę czasu ;) w oscyloskopie rodzajów drgań styków:


Przyjrzyjmy się chwilę ale uważnie tym obrazom, dla lepszej czytelności dodałem na fioletowo ile czasu przypada na jedną działkę, jak widzisz w 3 przypadkach tylko 1 us a w jednym 50 us. W pełnym rozmiarze wygląda to tak:


Spójrzmy jeszcze na oscylogram na którym zarejestrowane jest stosunkowo szybkie klikanie w klawisz:


Zwróć proszę uwagę, na to, że ani razu nie udało się tutaj zarejestrować drgań, którymi tak wszyscy straszą, które miałby trwać kilkanaście do kilkudziesięciu ms. Byłyby tutaj bardzo widoczne, tymczasem widzimy bardzo strome zbocza (TO WAŻNE) zarówno przy wciskaniu jak i zwalnianiu przycisku, natomiast te przedłużające się pionowe kreski to efekt zmian stanów logicznych związany z drganiami jednak w BARDZO krótkim, jak widać pomijalnym z naszego punktu widzenia czasie.

Uwierz mi, że dla mikro przycisków, które widać na moim filmie, zamontowanych standardowo w zestawach uruchomieniowych ATB, musiałem wykonać naprawdę mnóstwo pomiarów i poświęcić dużo czasu aby spośród setek prób podczas wciskania klawiszy wyłapać takie drgania. Zwykle trwają one jeszcze krócej. Nie oznacza to, że tak będą zachowywać się wszystkie rodzaje klawiszy, przycisków itp. …. Jednak w zdecydowanej większości przypadków, o wiele częściej gdy będziesz spotykał się z poprawnym działaniem i drgania styków a tym bardziej tak długie 20 ms będą rzadkością. Nie mniej jednak są i pod tym względem to nie jest żadna jeszcze bajka. Przyjrzyjmy się jednak jak wygląda efekt zwalniania klawisza, gdyż zaznaczałem że to też będzie miało dla naszych rozważań znaczenie.


Tutaj raczej zdecydowanie o wiele rzadziej udaje się złapać drgania styków, podczas zwalniania klawisza, widać jednak, że przede wszystkim mamy do czynienia z mniej stromym zboczem. Biorąc jednak pod uwagę, że na jedną działkę przypada tylko 1 us, to czas narastania można określi na jakieś max 3 us. Zatem to również ma się nijak do wspominanych z przerażeniem w wielu poradnikach efektem częstej zmiany w zakresach kilkunastu chociażby ms. Fakt, że ja cały czas badam tu i przedstawiam mikro przyciski i to tylko jeden tym, w związku z tym należy brać poprawkę na to co piszę i mieć świadomość, że w przypadku innych klawiszy mogą się zdarzyć nieco gorsze warunki ale też nie ma co przesadzać i lamentować.

Jeśli chodzi o eliminację drgań styków to bardzo często wspomina się o rozwiązaniu hardware’owym polegającym na dodaniu kondensatora ceramicznego 100 nF równolegle do klawisza, który to ma wygładzić owe drgania. Innymi słowy mówiąc zapobiec częstym szybkim zmianom. Jak to się ma do rzeczywistości ? sprawdźmy na oscyloskopie, będzie niemałe zdziwienie. Dodajemy zatem kondensator:


Następnie sprawdzamy co się dzieje na oscyloskopie gdy szybko klikamy klawisz:


Czy zauważyłeś co się stało w porównaniu do poprzedniego oscylogramu gdy szybko kilkałem klawisz ale nie było podłączonego kondensatora ? Okazało się, że te wąskie szpileczki drgań przy opadającym zboczu zniknęły albo się zminimalizowały, ale za to podczas zwalniania przycisku strasznie pogorszyło nam się zbocze narastające. Jak widać trwa ono teraz nie ok. 3 us ale aż kilkanaście – ok. 15 ms !!! Nie mniej jednak na pewno dodanie kondensatora wpływa na eliminację drgań podczas wciskania gdy stan zmienia się z JEDEN na ZERO. Zaś długotrwałe i łagodne przejście przez 15ms może spowodować, że gdy napięcie na tym łuku będzie mieściło się pomiędzy wyraźnymi poziomami napięć bez użycia przerzutnika shmitta na wejściu, to znowu pojawić się mogą szybkie i przypadkowe zmiany stanów aż napięcie nie dotrze na zboczu do poziomu np. 3,3V, który już będzie wyraźnie traktowany jako wysoki. Ilustruje to taki rysunek:


Spróbujmy się jednak przyjrzeć z bliska. Spójrzmy na moment gdy następuje zbocze opadające kolejno w wersji bez kondensatora i z kondensatorem:


Przy wybranym poziomie 2V na działkę, widać w dużym zbliżeniu teraz te szpileczki wąskie, o których pisałem wyżej. Napięcie potrafi zmieniać się kilkakrotnie i to aż o prawie 2 V w dół a samo zbocze opadające też w takiej rozdzielczości czasowej widać, że ma teraz inny charakter. Ale warto widzieć, że w tym momencie jest to obraz gdy na jedną działkę przypada zaledwie 20 ns !!! Przeraźliwie krótki czas z punktu widzenia mikrokontrolera czyli naszych programistycznych rozważań. Łącznie czas ustabilizowania się stanu niskiego to ok. 40ns. Tymczasem właśnie niektóre osoby chcąc niejako postraszyć początkujących – nie wspomną o tym jak jest ustawiona podziałka czasowa na oscyloskopie i przedstawiają taki wykres jakby to miało trwać rzekomo kilkanaście ms.  Dobrze a teraz zobaczmy czy w takim wypadku pomógł coś kondensator 100nF :


Owszem pomógł ale w takim sensie, że zmniejszyła się amplituda zmian stanu, szczególnie tej szpilki poniżej zera, jednakże jak widać nieco się wydłużył czas dojścia do stabilnego stanu niskiego, chociaż ostre przejścia zamieniły się w delikatne fale sinusoidy. Tak działa kondensator. Czas na jedną działkę jak widać w tym przypadku to 100 ns. Więc ustabilizowanie stanu niskiego trwa łącznie powiedzmy teraz ok. 300 ns, co i tak jest nadal praktycznie do pominięcia z punktu rozważań drgań styków.

Naturalnie należy mieć na uwadze, że poziom tych zboczy, ich wygładzanie po dodaniu kondensatora zależy także od wartości rezystora podciągającego, i mogą one różne wyglądać dla innych klawiszy, które potrafią wygenerować jednak nieco dłuższe drgania podczas normalnej pracy, to jednak mam nadzieję iż udało mi się jak na razie wyjaśnić rolę sprzętowego sposobu eliminacji drgań styków jakim jest dołożenie kondensatora 100nF.

Niestety w tym przypadku muszę zwrócić uwagę, że na niektórych forach i blogach, pewne osoby stawiają sprawę w tym miejscu prawie na głowie czyli do góry nogami jeśli chodzi o to jakie należy przedsięwziąć kroki gdy zechce ktoś dodać kondensator ceramiczny ;) Proponują bowiem dodawanie szeregowo do przycisku rezystora rzędu 100R – 330R, który ma zabezpieczyć styki przed wypalaniem za pomocą prądu rozładowania kondensatora 100nF. Podając jako powód fakt, że ścieżki na PCB posiadają pewną indukcyjność przez co wraz z kondensatorem, powodują indukowanie się sporych impulsów napięciowych, co z kolei ma rzekomo doprowadzać do przepływu na tyle dużego prądu, który może zagrozić żywotności przycisków. Dlatego też ostatnio na naszych forach zaczęło się pojawiać sporo schematów początkujących, którzy dając się nabrać na takie opowieści zaczynają konstruować coraz to bardziej monstrualne konstrukcje dla kilku że tak powiem „głupich” klawiszy w układzie:


Dla pełni ścisłości dodam, że o ile z samą teorią głoszoną przez wyznawców palenia się styków ogniem piekielnym, trudno się nie zgodzić ;) bo tak jest w rzeczywistości, czyli naprawdę ścieżki PCB mogą mieć i mają pewną indukcyjność, na pewno w takich sytuacjach indukują się pewne napięcia i przepięcia a w związku z tym prądy (bo prawa Ohma nie da się obejść) …. To jednak ktoś tam zapomina o tzw czasie ;), który w tym przypadku jest najważniejszy. Są to bowiem tak krótkie impulsy prądowe (mówiąc w dużym uproszczeniu), że nie są w stanie doprowadzić do zniszczenia najmniejszego nawet przycisku SMD, przez okres jego całego życia albo życia całego urządzenia. Prędzej urządzenie trafi jako zabytek do muzeum za 100 lat, albo sam klawisz zniszczy fizycznie użytkownik wciskając go niemiłosiernie mocno ;) niż by miał go wypalić nazywany przeze mnie tutaj „ogień piekielny” spowodowany drganiami styków.

Nadmienię w tym przypadku, że rozwiązanie z użyciem pojedynczego kondensatora ceramicznego 100 nF jest stare jak świat (tak można powiedzieć) i stosowały to rozwiązanie, ale także nadal stosują np. takie firmy jak chociażby OKI w popularnych drukarkach ale również wiele innych. Nikt nigdy w takich przypadkach nie obawiał się wyssanego z palca efektu WYPALANIA STYKÓW. I to muszę niestety określić wręcz jako bzdurę. Zresztą nie jest to tylko moje zdanie ;)

Dopiero teraz – po tak szczegółowych wyjaśnieniach możemy przystąpić do dalszych rozważań odnośnie zagadnień związanych ze sposobami eliminacji drgań styków metodą programową w mikrokontrolerach. Jak widzisz sporo czasu i słów musiałem poświęcić aby odkręcić w głowach wielu początkujących to co im wkręcili inni.

Zatem rozważmy czy w przypadku gdy naszym celem jest zapalenie diody LED po wciśnięciu jednego przycisku oznaczonego jako S1 a następnie zgaszeniu tej samej diody po wciśnięciu drugiego przycisku S2, konieczna jest w ogóle eliminacja drgań styków ???? To bardzo ważne pytanie !!!

Napiszmy w tym celu prosty program, nie przestrzegając ŻADNYCH zasad eliminacji drgań styków i sprawdzimy czy to będzie działać ;)


Proszę bardzo, no niech mi ktoś powie, że ten najprostszy w świecie program nie działa prawidłowo! A przecież w ogóle, nawet w najmniejszym stopniu nie wykorzystaliśmy tutaj znanych ci dotąd prostych metod programowej eliminacji drgań styków, czyli jakiegoś tam czasu oczekiwania aż one się zakończą.

No więc o co chodzi ?

To jak to jest? Trzeba programowo eliminować te drgania styków czy nie? I ważniejsze pytanie w związku z filmem przedstawionym na początku tego artykułu. Co było w takim razie powodem takiego dziwnego zachowania diody LED gdy stosowaliśmy jeden klawisz także bez programowej eliminacji drgań styków. Tym bardziej, że nie pomagała wtedy nawet sprzętowa niby eliminacja drgań za pomocą kondensatora jak pamiętasz ;) …. Więc w czym rzecz?

To właśnie z tym wiąże się tytuł tego artykułu – że drgania styków to bajki. A dokładniej mówiąc chcę wyjaśnić, że tak szeroko w internecie prezentowane podejście, że takie zachowanie się diody to efekt braku eliminacji drgań styków, jest NIEPRAWDZIWE !!!

Przyczyną tego zjawiska iż nie możemy zapalić lub zgasić diody LED jest TYLKO I WYŁĄCZNIE błędna konstrukcja programu !!! To tak jakbyś zabrał się za projektowanie układu wzmacniacza audio, zastosował tranzystory zbyt małej mocy a potem dziwiłbyś się dlaczego ulegają uszkodzeniu gdy za głośno słuchasz muzyki ;)

Na początek przypomnę wbijaną tobie do głowy przez setki miejsc w internecie najprostszą formę eliminacji drgań styków.  Poniżej kod:



Proszę bardzo ten sam kod dla dwóch klawiszy tyle że z popularną programową eliminacją drgań, która polega po prostu na sprawdzeniu czy na pinie klawisza jest stan niski. Jeśli tak to czekamy np. 20ms aby być pewnym, że ustały drgania styków, i jeszcze raz sprawdzamy czy nadal jest stan niski czyli klawisz wciśnięty.  Dopiero teraz jeśli nadal jest stan niski (kolejny warunek IF) to włączamy lub wyłączamy diodę LED.

Jeśli więc ten sposób ma wyeliminować zjawisko o którym mowa na początku artykułu, które przedstawione jest na filmie jako efekt drgań styków, spróbujmy zastosować ten „cudowny” sposób do pierwszego przykładu, gdzie mamy TYLKO JEDEN klawisz, jedną diodę a celem jest zmiana stanu diody po każdorazowym wciśnięciu klawisza.


Zmodyfikujmy zatem także pierwszy przedstawiony kod aby zawierał niby prawidłową programową eliminację drgań styków:



Ja ciebie przepraszam, już nawet nie będę kręcił kolejnego filmu aby pokazać czy to zda egzamin czy nie …. Sprawdź sam. Ja powiem tylko że sromotnie się zdziwisz ponieważ nie sprawdzi się to, i nadal będziesz miał kolosalne kłopoty aby doprowadzić do przejrzystego zmiany stanu diody LED na przeciwny! :( Efekt od tego na pierwszym filmie będzie się teraz różnił tylko tym, że może częściej uda ci się tego dokonać ale przecież nie chodzi o to żeby było troszkę lepiej tylko aby całkowicie wyeliminować ten EFEKT. ALE CO TO ZA EFEKT ????? SKORO NIE ZWIĄZANY Z DRGANIAMI STYKÓW??? Teraz już chyba widzisz wyraźnie że to BAJKA iż ktoś wmawia ci że takie są właśnie efekty drgań styków ;) w programie. Przy okazji sprawdź co będzie się działo gdy teraz wciśniesz na stałe klawisz. Okaże się że dioda nie przygasa jak na pierwszym filmie tylko szybko migocze. Wbrew pozorom to dokładnie ten sam efekt. W jednym i drugim przypadku gdy wdusisz klawisz na dłużej pętla główna dokonuje wiele razy swój pełny obieg i klawisz zmienia stan na przeciwny zgodnie z częstotliwością obiegów pętli głównej. Gdy nie ma tej „pseudo” eliminacji drgań styków – jak się spodziewasz częstotliwość obiegu (ilość wykonywania się pętli na sekundę jest tak duża) że nasze oko nie dostrzega migotania tylko mamy efekt jakby PWM’a ;) … dioda świeci z 50% wypełnieniem z dużą częstotliwością. Natomiast gdy dodamy oczekiwanie 20ms czy 50ms czy nawet 100ms albo i więcej to nadal będzie ten sam efekt tylko że nasze oko będzie widziało coraz wolniejsze migotanie. A niestety im dłuższy czas zastosujesz tym gorzej będzie z obsługą klawisza. Najpierw przy krótkim czasie trudno było go odpowiedni szybko kliknąć a przy dłuższych czasach trzeba z kolei wduszać go na dłużej i okazuje się że jak przytrzymamy palucha za długo – to dioda też zgaśnie. I tak źle i tak niedobrze ;)

Zbliżamy się do końca tego artykułu. Wyjaśniłem ci dokładnie że:

  1. opisany na początku problem to w żadnym wypadku efekt drgań styków ponad wszelką wątpliwość
  2. dodanie sprzętowej eliminacji drgań za pomocą kondensatora także nie zniweluje opisanego na początku efektu
  3. Bzdurą jest dołączanie rezystora w szereg z mikro-przełącznikiem ;)
  4. W KOŃCU – jest to WINA BŁĘDNEGO PODEJŚCIA programisty do obsługi klawisza jako takiego bez względu na drgania styków. Że to jest WINA programu.

A przyznasz, że fora internetowe najeżone są wręcz pytaniami tego typu (przeczytaj uważnie!):

  •     Jak za pomocą jednego klawisza gasić i zapalać diodę albo włączać i wyłączać urządzenie ?
  •     Jak zrobić żeby krótkie kliknięcie spowodowało jedną akcję w programie ale długie kliknięcie np. 2-3 sekundy spowodowało całkiem inną akcję ?

Wbrew pozorom, gdy ktoś ma w prosty sposób używać jednego klawisza do opcji WŁĄCZ a innego do WYŁĄCZ to nawet totalnie początkująca osoba nie zdająca sobie sprawy z istnienia efektu drgań styków rozwiąże to za pomocą kodu jaki pokazałem wyżej przy okazji omawiania dwóch klawiszy S1 oraz S2 i to bez żadnej programowej eliminacji drgań styków ;) chyba się ze mną zgodzisz.

Ale gdy ta sama osoba stawia sobie pierwszy ciut bardziej skomplikowany cel jakim jest opcja WŁĄCZ/WYŁĄCZ za pomocą tego samego klawisza to już zaczynają się schody  i pierwsze na co wpada gdy w internecie poszukuje informacji jak sobie z tym poradzić jest co ? ano „cudowne” porady i podpowiedzi typu:

„zrób programową eliminację drgań styków – to będzie dobrze”

;) hehehehe setki są takich również podpowiedzi na forach i teraz widzisz sam jak błędnych. A jeszcze gorzej jest gdy początkujący chce właśnie mieć dodatkową funkcjonalność w postaci możliwości oprogramowania krótkiego i dłuższego wciśnięcia klawisza z dwoma różnymi akcjami.

TAK – przede wszystkim trzeba zacząć od tego aby umieć nazwać dokładnie i opisać co się chce uzyskać. Wziąć wręcz ołówek w rękę i rozrysować sobie oraz rozpisać co i w jakim czasie wciskania klawisza chcę uzyskać ????

A wcześniej czy później każdy zmierzy się z kolejnym problemem – czyli jak zrobić aby następowało powtarzanie jakiejś akcji co równe odcinki czasu gdy trzymamy klawisz wciśnięty.

Co gorsze – bardzo szybko KAŻDY czy chce czy nie chce zauważy, że próba majstrowania przy takich celach z użyciem sławnych funkcji _delay_ms() w języku C czy Waitms w Bascomie prowadzi w ślepy zaułek i prowadzi często do zniechęcenia …..

Piszę o tym, wszystkim w odpowiedzi na setki już pytań jakie otrzymuję nie tylko w mailach ale też na forach – w tym ostatnio na naszym forum:


gdzie w krótkim czasie pojawiło się wręcz kilka podobnych wątków i każdy się w nich męczy z wyimaginowaną obsługą drgań styków a nie tędy droga. Wprawdzie, trzeba to zagadnienie wziąć pod uwagę i to bezwzględnie ale zacząć trzeba od czegoś innego !!!

Trzeba zacząć od poznania podstaw obsługi programowej „głupiego” klawisza. Specjalnie piszę głupiego bo każdemu wydaje się że to nic nie znaczące zagadnienie i nie ma o czym mówić – tymczasem już tyle napisałem na ten temat i pokazałem jak wielkie jest niezrozumienie tego wszystkiego.

Trzeba się w końcu raz a dobrze przyjrzeć etapom pracy klawisza i znając z pierwszej książki wydawnictwa Atnel „Mikrokontrolery AVR Język C Podstawyprogramowania” podstawowe zasady korzystania z timerów programowych napisać w końcu porządne kody do obsługi wcale nie głupiego klawisza. To zagadnienie omówię już w kolejnym artykule bo ten się i tak rozciągnął już jak guma arabska. Pokażę tylko na koniec – jak należy sobie ołówkiem rozpisać etapy pracy pojedynczego klawisza jeśli chcemy napisać dobrą jego obsługę i to najlepiej uniwersalną obsługę:



Ja tak to sobie rozrysowałem i opisałem dalej na kartce, co każdy element oznacza i co ma się dziać w programie na każdym z tych odcinków czasowych, wtedy wszystko zacznie wychodzić ;)

Zapraszam więc do kolejnego artykułu: ………….

http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-drgania-stykow-cd2.html

Z tego artykułu dowiesz się jak sobie radzić z takimi zadaniami obsługi klawisza ;) i będzie to uzupełnienie tego co napisane jest w wyżej wymienionej książce.

część I

część II


.


74 komentarze:

  1. "Napiszmy w tym celu prosty program, nie przestrzegając ŻADNYCH zasad eliminacji drgań styków i sprawdzimy czy to będzie działać ;)"

    Tam w kodzie wkradł się błąd. Oba przyciski kiedy są wciśnięte wystawiają stan wysoki. Mało znaczący błąd, pewnie z nadmiaru pracy, warto jednak poprawić. :P

    OdpowiedzUsuń
    Odpowiedzi
    1. "Na początek przypomnę wbijaną tobie do głowy przez setki miejsc w internecie najprostszą formę eliminacji drgań styków. Poniżej kod:" tam tez ta drobnostka.

      Usuń
  2. ok postarałem się poprawić - ale mi się miesza już w oczach ;)

    OdpowiedzUsuń
  3. A tak w ogóle dziękuję za poradnik w swoim imieniu. I czekam na kolejną część która bardzo mnie interesuje.
    No i zainspirował mnie Pan do własnych testów. Zobaczymy co z tego wyjdzie. Porównam swoje wypociny z kodami z następnego artykułu. :)

    OdpowiedzUsuń
  4. //KLAWISZ UP
    #define kl_up (1<<PF7) //ustawienie pinu do którego podłączony jest switch
    #define w_up !(PINF & kl_up) //makro testujące czy jest stan niski
    volatile uint8_t l_up; // blokada powielania kliknięcia klawisza



    //POTEM W PROCEDURCE CZYTAJACEJ CYKLICZNIE KLAWISZ

    //KASOWANIE BLOKADY WCIŚNIĘTEGO KLAWISZA
    if (w_up==0) l_up=0;

    //NASTĘPNIE:

    if ( l_up==0 && w_up){
    l_up=1; //ZABLOKOWUJĘ KLAWISZ

    //i coś tu sobie robię nie wstrzymujac pracy programu.
    //mogę dodać sobie sprawdzanie czasu wciśniecia klawisza i inne bajery
    }

    OdpowiedzUsuń
    Odpowiedzi
    1. Zapomniałem dodać że absolutnie nie opóźnia to programu ani ma żadnych drgań styków i innych dziwolągów. Proste i bezawaryjne!

      Usuń
  5. I właśnie chodzi o takie przeróżne pomysły - jest ich mnóstwo - tylko trzeba umieć przynajmniej zrozumieć fakt aby rozróżniać key_press i key_up ;) ...

    OdpowiedzUsuń
  6. Bardzo pożyteczny i treściwy artykuł. Czekam z niecierpliwością na kolejną część. :)

    OdpowiedzUsuń
  7. Dziękuję Mistrzu :)

    OdpowiedzUsuń
  8. Mirek Rulez !! A co to za Oscyloskop ?? Rigol 1102E??

    OdpowiedzUsuń
    Odpowiedzi
    1. Dzięki Mirku za Info . Dla mnie JESZCZE za drogi ... ale zastanawiam się nad Rigolkiem 1102E - jakiś opinii szukam. Pozdrawiam

      Usuń
    2. Te okna z oscyloskopu to zrzuty ekranu robione w oscyloskopie czy w jakims programie na komputerze ?

      Usuń
    3. Oscyloskop który posiadam ma możliwość zrzutu swojego ekranu do pliku BMP na kartę pamięci - więc to są oryginalne widoki wprost z oscyla.

      Usuń
    4. Pytam, bo mam DS1052E a Twoje przy moich wyglądają o kilka klas lepiej. Wiem, że są programy komputerowe (np ultrascope) i można nimi robić różne rzeczy, myślałem że masz jakiś fajny, bo niestety rigolowski jest tylko po to żeby był.

      Usuń
    5. No ale ja właśnie mam RIGOL'a jak widzisz na obrazkach, to jest dokładnie DS4024. I myślę, że chyba w miarę dobrze widać ?

      Usuń
    6. Miałem właśnie na myśli to, że twoje zrzuty są duże i wyraźne a u mnie małe (na ekranie oscyloskopu ładnie wyglądają ale BMP na kopmpie już niekoniecznie).
      Mogę też zobaczyć wykres na kompie w UltraScope ale sam program jest kiepski jak również i jego możliwości wizualizacji.

      Usuń
  9. Anonimowy wyżej z godziny 10:46, pochwal się wiedzą skoro Mirek miernie to zrobił, skorzystają na tym początkujący no i styki. :) ... a i przedstaw się bo wiedzę masz pewnie ale kultury chyba nie .

    OdpowiedzUsuń
  10. Normalnie kasuję wypowiedzi takich malkontentów z bloga ;) ale że już mu Panowie odpowiedzieliście to zostawię ....

    OdpowiedzUsuń
  11. Czyli jednak dobrze pamiętałem kolegę ze studiów rolniczych :-)
    Czyżby to nie pasowało koledze, do aktualnego image?
    Pozdrawiam definitywnie :D :D :D

    OdpowiedzUsuń
    Odpowiedzi
    1. Aaaa my Cię już znamy :)
      Może się przedstawisz i pokażesz co osiągnąłeś?

      Usuń
  12. Mirku, coś mi tu nie pasuje. Przedstawiony kod programu (tuż pod schematem z jednym przyciskiem) nie działa prawidłowo i to jest zrozumiałe, ale?
    W Twojej książce „Mikrokontrolery AVR Język C Podstawy programowania” na stronie 179 jest analogiczny kod programu (tak mi się wydaje), który oczywiście także nie działa poprawnie. Dlaczego jest przedstawiony jako poprawny przykład?
    Proszę o wyjaśnienie
    P.S Książka świetna.

    OdpowiedzUsuń
    Odpowiedzi
    1. Bardzo dobre pytanie i przyznam szczerze, że długo na nie czekałem. Już tłumaczę - praktycznie ten kod o którym wspominasz (tu na blogu), a także w książce - jest moim zdaniem dobrym wprowadzeniem do zagadnienia drgań styków dla osoby, która nigdy w życiu się z tym nie spotkała, dla osoby, która w końcu praktycznie nie ma żadnego doświadczenia elektronicznego. Zwykle dla takich początkujących - zjawisko drgania styków jest czymś absolutnie nowym i każdy się dziwi, że coś takiego występuje. Więc rozumiem, gdy ktoś (nie tylko ja) tłumaczy w taki uproszczony sposób to zjawisko z jakimś tam rysunkiem schematycznym - jak owe drgania widoczne mogą być na oscylogramie. ALE .....

      .... ale niestety jak przejrzałem NET wzdłuż i w szerz, i to nie tylko polskie strony, praktycznie WSZYSCY na tym poprzestają jeśli chodzi o podejście programistyczne do tego zagadnienia. Ja w swojej książce uczciwie (niech mi ktoś powie, że nie) ... rozwijam ten temat dalej po to aby pokazać w jaki sposób podejść do tak niby błahego problemu jak "drgania styków" poprzez opisanie i przygotowanie takiej tam sobie funkcji "SuperDebounce()" ... nie wiem czy już doszedłeś do tego rozdziału w tej książce. Dopiero tam przedstawiam - ALE UWAGA! właściwe podejście do tego zagadnienia - a nie jakąś SUPER najlepszą funkcję na świecie - jak mi niektórzy zarzucają. Jak do tej pory każdy kto wgłębił się w jej opis i działanie i udało się to - to zawsze się okazało że raz na zawsze zrozumiał o co chodzi z drganiami styków. Więc jestem w książce konsekwentny w wyjaśnieniach - nie pozostawiam czytelnika z wyjaśnieniem, że wystarczy dodać _delay_ms(40) i jeszcze raz sprawdzić stan klawisza - a to wyeliminuje drgania styków - których objawem jest takie zapalanie się przypadkowe diody jak na tym FILMIKU. I TYLKO tego faktu - dotyczy ten mój przewrotny tytuł artykułu, że drgania styków to bajki! .... Bo już w pierwszych zdaniach wyjaśniam, że to przewrotne określenie ma pozwolić mi na zwrócenie uwagi na pewien powtarzany i przeklepywany błąd w internecie na setkach stron. Niektórzy nawet preparują do tego celu rysunki - jak pokazałem wyżej .... No i to jest wg mnie bzdura. Jedyne z czym się nie zgadzam to fakt, iż to przypadkowe włączanie/wyłączanie diody WCALE NIE POWSTAJE w wyniku drgań styków - a tylko i wyłącznie w wyniku błędnego podejścia w oprogramowaniu tego.

      Zdając sobie jednak sprawę (po mailach od czytelników, po pytaniach na www.forum.atnel.pl) , że zaproponowana przeze mnie funckja SuperDebounce(), jest dość trudna do zrozumienia .... postanowiłem przedstawić to nieco inaczej i jakby w KOLEJNYCH KROKACH jak się dochodzi do stworzenia, budowania sobie takich funkcji. Proszę poczytać nasze forum, jak fajnie to pomogło wielu ludziom .... A ja sam osobiście już tak wiele razy czy to w mailach ale także na żywo (mikrofon i słuchawki) tłumaczyłem czytelnikom, którzy się zwracali właśnie z pytaniem - że o co chodzi z tym drganiem styków - bo jak zrobią ten pierwszy przykład i trzymają klawisz wciśnięty - to dioda sobie ładnie MIGA, zamiast się włączyć. Więc zajmowały mi te prywatne tłumaczenia coraz więcej czasu - dlatego w końcu napisałem artykuł na blogu. Proszę dokładnie poczytać te 3 części. I zobaczyć też jakie równie proste przykłady podaję jak sobie z tym radzić a dodatkowo w sposób CAŁKOWICIE nieblokujący !!! TO JEST NAJWAŻNIEJSZE, bez żadnego _delay'a ....

      Usuń
    2. Poza tym zapraszam na nasze forum, bo tam nieco łatwiej się dyskutuje na te tematy - i można zobaczyć jak fajnie wielu ludzi sobie zaczyna dawać z tym radę ....

      Za to tu na mój blog włazi wielu malkontentów, którzy przeczytają sam tytuł - a poza tym ani jednego zdania dalej i zarzucają mi że ja herezje opowiadam itp itd itp ;) zresztą widać wyżej ;)

      jeszcze raz - zapraszam na

      www.forum.atnel.pl

      ja staram się uczyć programowania - a nie tego jak posługiwać się słowami kluczowymi jakiegoś języka.

      Usuń
    3. Ten komentarz został usunięty przez administratora bloga.

      Usuń
  13. 1.
    Kondensator przy tanim przycisku jest niezbędny właśnie z powodu tego 'ognia piekielnego' który wypala zanieczyszczenia ze styków.
    Wiele elementów ma podane parametry (prąd, napięcie) maksymalne, jednak niewiele osób wie że istnieją też parametry minimalne!
    W przypadku przycisku styki nie zawsze są powlekane złotem, więc jeśli zaśniedzieją, przestają stykać i po zabawie. Dodanie kondensatora powoduje przepływ większego prądu, który wypali zanieczyszczenia i dłużej utrzyma styki w czystości.

    2.
    Przykład z dwoma przyciskami i absolutnym brakiem eliminowania drgań styków jest jak najbardziej prawdziwy, do czasu gdy przełączniki są dobrej jakości i urządzenie nie jest narażone na wstrząsy.
    Bez kondensatora na pinach lub eliminacji impulsów krótszych od około 1ms układ staje się wrażliwy na przypadkowe przełączenia.
    Może brzmi to jak bzdura, ale sprawdziłem w praktyce.

    OdpowiedzUsuń
  14. 1. racja - aczkolwiek w prostych amatorskich urządzeniach i jak wspominasz, tanich micro-switchach, kondensator nie jest niezbędny. Jeśli taki klawisz jest kiepskiej jakości, najtańszy z chińskich - to żaden kondensator mu nie pomoże, po prostu będzie trzeba go wymienić na nowy, po stosunkowo krótkim czasie użytkowania z uwagi na zużycie mechaniczne. Patrz przeróżne piloty radiowe itp. Owszem kondensator można zastosować, ale częściej przyda on się w tych przyciskach które są przeznaczone do pracy ze znacznie większymi prądami niż takie micro-przełączniki. Ale co by nie mówić - to chyba w ogóle nie zrozumiałeś tego co pisałem o "ogniu piekielnym" .... Chodziło mi o fakt, że są osoby, które dodając taki kondensator 100nF równolegle do przełącznika zalecają (o zgrozo) dodawanie jeszcze dodatkowego rezystora - szeregowo z przyciskiem - i po co? .... ano właśnie po to żeby go nie spalił OGIEŃ PIEKELNY, który ty tutaj uznajesz wręcz jako potrzebne zjawisko (słusznie zresztą wg mnie). Ale źle odczytałeś moje intencje.

    2. Ja jeszcze raz powtórzę i podtrzymam swoje zdanie, że absolutnie w większości przypadków można się obejść TYLKO programowo z eliminacją drgań styków. A określenie z tytułu tego artykuł - przepraszam ALE BARDZO JASNO napisałem i to w pierwszych zdaniach - że użyłem tego określenia przewrotnie i dotyczy ono tego efektu opisanego niżej. Więc nigdy się nie wypowiedziałem - że nie ma drgań styków - wręcz przeciwnie. Tylko że są osoby, które albo nie mogą albo nie chcą tego zauważyć.

    Piszesz że układ był wrażliwy bez kondensatora dla impulsów krótszych niż 1ms ?????? Drgania zdecydowanie dłuższe, dopiero takie powyżej 1ms hmmmmm powyżej 5ms !!! to dopiero mogą powodować kłopoty. A poniżej 1ms to można pominąć. Gdy korzystam z przycisków na większe prądy i wiem że drgania mogą być o wiele dłuższe niż 1ms - to wtedy zawsze stosuję taki kondensator 100nF

    OdpowiedzUsuń
  15. Nie za bardzo rozumiem przykład przerzutnika rs. Zawsze mi się wydawało, ze jest on odporny na drgania styków, a tutaj proszę :) Może ma to coś wspólnego z tym, że na naszym pacjencie notorycznie wymuszany jest stan zabroniony? Więc nic dziwnego, że zachowuje się tak, jak się zachowuje...
    Pozdrawiam.
    Tarrin

    OdpowiedzUsuń
  16. No dokładnie widać, że na drugim wejściu jest stan zabroniony - chciałem tylko zobrazować pewien proces na tym rysunku. Przy wymuszonym stanie zabronionym byłoby dokładnie widać - jak działają drgania styków.

    I dlatego następny rysunek to już prezentacja prawidłowej konfiguracji przerzutnika, przy której właśnie można się ich pozbyć. Drogą elektroniczną a nie programową.

    OdpowiedzUsuń
    Odpowiedzi
    1. Zbuduj sobie taki układ RS na płytce stykowej. NOR lub NAND - dowolnie. Jeśli uchwycisz na filmie chociaż raz, że po puszczeniu przycisku dioda dłużej niż sekundę pozostanie w stanie innym niż spodziewany to wyślę Ci dobrą czekoladę ;)

      Usuń
  17. Mirku w pierwszym przykładzie z przerzutnikiem błędnie założyłeś, że po ustąpieniu drgań przycisku na wejściu R stan będzie losowy - a przecież przycisk zawsze będzie pod koniec rozwarty po puszczeniu (no chyba że "bardzo chiński"). No i żeby nie mieszać początkującym adeptom mogłeś konsekwentnie trzymać się jednej realizacji przerzutnika RS, a nie zmieniać pomiędzy NOR a NAND, które to działają w końcu odrobinkę inaczej ;)
    Tak w ogóle to RS po wyjściu ze stanu zabronionego zawsze powróci do jednego ze stanów R lub S. Nawet jeśli ma zwarte wejścia (nieszczęsne zjawiska hazardu). A w podanym przykładzie zawsze ustawi się na S, bo wejście S jest aktywne.

    Na pierwszy przykład niemal idealnie nadawałby się przerzutnik T z jedynką na wejściu i przyciskiem na wejściu zegarowym ;) Szczególnie, że odwzorowuje zachowanie włącz/wyłącz jednym przyciskiem i nie wymusza stanu zabronionego.


    OdpowiedzUsuń
  18. Panie Mariusz źle mnie zrozumiałeś z tym przykładem przerzutnika albo może zgubiłeś się trochę w tym moim długawym przyznaję tekście. Zwróć więc uwagę że podahę tam przykład gdy na jednym z wejść występuje stan zabroniony. To może ci rozjaśni moją koncepcję tłumaczenia bo jest ok. W przeciwnym wypadku pewnym wypadku pewnie że przegrałbym twój zakład.

    OdpowiedzUsuń
    Odpowiedzi
    1. Jak nie wierzysz to spróbuj - a nie wierzysz :P Jeśli na S masz wymuszenie cały czas, to po ustąpieniu stanu zabronionego przerzutnik ustawi się zawsze w stan Q. Co z resztą widać na Twoim gifie z symulacji.

      P.S. stan zabroniony występuje na wejściach, a nie na jednym z nich ;)

      Usuń
    2. Wiesz co ? hmmm sprawdzę to co pisałem , sprawdzę to co mówisz ale daj mi troszkę czasu - bo może się zapędziłem z tym przykładem przerzutnika i stanami zabronionymi - ale mówiłem o tych stanach na wejściach ... no dobra - sprawdzę i dam znać. Jeśli masz rację to oczywiście przepraszam i postaram się to opisać, poprawić a tobie dziękuję za zwrócenie uwagi. Ale merytorycznej w końcu a nie czepalskiej jak to inni robią.

      Usuń
    3. Co prawda nie czytałem wszystkich artykułów od deski do deski, ale naprawdę fajnie prowadzisz bloga, kurs Eagle tez bardzo przyjemny (nie wszędzie się zgadzam - ale sam lepiej bym nie wytłumaczył na pewno, za to dowiedziałem się paru nowości). To, do czego się przyczepiłem to tak naprawdę jedyny zgrzyt, jaki mi się rzucił w oczy. Zauważ, że programowa obsługa wyłączania jednym przyciskiem przypomina przerzutnik T, a dwoma przyciskami - jak przerzutnik RS. A jak już wspominałeś w dalszej części serii obsługa dwóch przycisków nie wymaga "debouncingu".

      Pozdrawiam i życzę wielu kolejnych sukcesów w nowym roku!

      Usuń
    4. Widzisz jeśli chodzi o istotę - to nawet nie mówię o tym że obsługa przycisków wymaga czy nie wymaga debouncingu. Zwykle wymaga - tylko nie z takim podejściem programowym z jakim polemizuję ostro w swoich artykułach. Jeszcze raz podpowiem co było istotą powstania tych artykułów - otóż to, że kod jak niżej:

      if( PINB & (1<<PB1) ) {
      _delay_ms(40);
      if( PINB & (1<<PB1) ) { ....

      nie jest żadnym rozwiązaniem które można uznać za debouncing, który odpowiada za wyeliminowanie tego efektu pokazanego na pierwszym filmiku z youtube.

      Dlatego w drugim odcinku - pokazałem jak można do tego podchodzić w nieco uproszczony sposób w porównaniu też do sposobu jaki przedstawiłem w książce

      http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

      w funkcji SuperDebounce().

      ale jeszcze raz dziękuję za taką merytoryczną dyskusję i być może złapanie mnie na tym przerzutniku .... piszę "być może" bo jak posprawdzam sobie na spokojnie to wtedy z chęcią się odezwę ok?

      i również życzę DO SIEGO roku ;)

      Usuń
  19. Oj... Bardzo to pomotane i takie... Jak ktoś nie ma oscyloskopu to jak to sprawdzi? Ano proponowałbym zamiast badania jakiejś dziwnej symulacji kawałek kodu:

    #include

    void main()
    {
    DDRB |= _BV(6) | _BV(0);
    DDRB &= ~_BV(7);
    PORTB |= _BV(7) | _BV(6);

    uint8_t nacisniete = 0;
    uint8_t ile = 0;

    for(;;)
    {
    if(!nacisniete && !(PINB & _BV(7)))
    {
    nacisniete = 1;
    PORTB ^= _BV(6);

    if(++ile > 16)
    {
    ile = 0;
    PORTB ^= _BV(0);
    }
    }
    else if(nacisniete && (PINB & _BV(7)))
    {
    nacisniete = 0;
    }
    }
    }

    Co on robi? Jak przycisk nie był naciśnięty (nacisniete == 0) i właśnie został (!(PINB & _BV(7))), to:
    1. zmień stan diody
    2. zapamiętaj, że przycisk został naciśnięty
    3. dodaj do licznika 1
    4. sprawdź, czy wyszło więcej niż 16

    Jak przycisk nie jest naciśnięty, a był, to popraw wartość zmiennej naciśnięte.

    Za każdym zboczem opadającym (jak leci z 1 na 0), dioda zmienia stan i leci licznik. Co 17 zboczy (0..16) zapala się druga dioda.

    No i co? Trzeba sprawdzić! Jeżeli dioda zapala się po ok. 17 naciśnięciach - drgań nie ma. Jeśli szybciej (np. po 3), to to oznacza, że na 3 naciśnięcia jest 17 zboczy opadających, czyli przycisk drga.

    Uważam, że tak jest lepiej podejść do tematu. Zestaw do tego doświadczenia kosztuje prawie nic, a prawdopodobnie każdy ma jakąś płytkę, kawałek rezystora, diodę i uKontroler. Popatrzy sobie, dotknie i sam się przekona obiektywnym doświadczeniem. A czytać jak człowiek obala jedne rysunki drugimi rysunkami? Ja w to nie wierzę! A skąd mam pewność, że to też nie falsyfikat?

    OdpowiedzUsuń
    Odpowiedzi
    1. Najpierw to trzeba dokładnie przeczytać to co napisałem i to na samym początku! Bo już na początku napisałem że tytuł jest prowokujący a wcale nie zaprzeczam istnieniu drgań styków tylko temu jak wiele osób pokrętnie tłumaczy ich eliminację. To co kolega tu napisał jest w drugiej części artykułu:

      http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-drgania-stykow-cd2.html

      tylko że napisane o wiele bardziej przejrzyście (mam na myśli ten kod kolegi) ....

      Więc jeśli jeszcze raz kolega przeczyta i zobacz o co chodzi to przestanie tu udowadniać że drgania styków są ... bo SĄ i ja to wyraźnie opisuję. A że ktoś nie rozumie jak się je eliminuje to już nie moja sprawa. Ci którzy chcą się czegoś dowiedzieć to czytają całość i ze zrozumieniem. Ci którzy lubią pomarudzić o tym jakie ja tu obrazki wklejam to marudzą ....

      koniec

      Usuń
  20. Mam takie pytanko
    Po co w tym symulatorze przerzutnika rs:
    http://symulator.majsterkowicza.pl/pokaz/77
    są rezystory 10k? Czy zmieniają one w jakikolwiek sposób działanie układu?

    OdpowiedzUsuń
  21. mam pytanie z racji tego, że Pańskie pomiary były wykonywane oscyloskopem cyfrowym, to czy drgania te mogły zostać niezauważone z racji zbyt wolnego czasu próbkowania?

    OdpowiedzUsuń
    Odpowiedzi
    1. A ja mam pytania z racji tego pytania - czy ja gdzieś w tym artykule napisałem że nie istnieją drgania styków ?

      to po pierwsze (więc proszę mi pokazać takie miejsce gdzie rzekomo piszę w tekście wyżej że nie ma drgań styków)

      a jeśli chodzi o oscyloskop - to co to oznacza "z racji zbyt wolnego próbkowania" ? może kolega to rozwinąć ?

      Usuń
  22. Dlaczego w takim razie w układach TTL drgania styków mają znaczenie, a przy mikrokontrolerach nagle przestają mieć wpływ na cokolwiek? Tutaj pokazuję drgania styków w zapaleniu i gaszeniu diody za pomocą przerzutnika typu T: http://youtu.be/lYsDu9myrNg .

    OdpowiedzUsuń
    Odpowiedzi
    1. A gdzie kolega wyczytał że w mikrokontrolerach nie mają znaczenia ? może na innej stronie ? .... może warto przeczytać artykuł a nie tylko sam tytuł ? - to potem możemy porozmawiać. ;)

      Usuń
  23. Panie Mirku a ja mam pytanie natury czysto technicznej. Oglądałem Pański kurs eagla i tu narodziło się moje pytanie. Ten kondensator i rezystor zabezpieczający przed drganiami styków to na PCB umieścić bliżej przycisku czy bliżej pinu procesora? Czy może w tym przypadku nie ma to takiego znaczenia? Pozdrawiam

    OdpowiedzUsuń
    Odpowiedzi
    1. To zależy co i jak robimy. Jeśli to jakiś prosty projekt to po co w ogóle rezystor ? o jakim rezystorze piszesz ? zewnętrznym PullUp ? nie wystarczy ci ten załączany programowo w procku ?

      Tak samo kondensator .... czy jest w ogóle konieczny ? .... po to ten cały artykuł aby pokazać, że w wielu przypadkach te zabiegi sprzętowe nie są w ogóle potrzebne .... chyba że układ ma pracować naprawdę w jakimś silnie zakłóconym środowisku - wtedy rzeczywiście można dodać zewnętrzny mniejszy rezystor Pullup czy też kondensator 100nF. Raczej bliżej procka ... ale w takich sytuacjach warto rozważyć w ogóle np optoizolację wejść procka.

      Usuń
    2. Chodzi mi o zwykły przycisk do resetu. Gdzieś wyczytałem, że warto dać kondensator 100nF równolegle do przycisku Reset

      Usuń
  24. Tak sobie czytam i testuje na stykówce i przy okazji poznaje Eclipsa bo dopiero dzisiaj go zainstalowałem za Twoją namową ... i naprawdę Eclipse to rewelacja wielkie dzięki... ale dobra wracając do tematu. Mam pytanie co do drugiego kodu z dwoma przyciskami. Czy aby to nie jest "programowa wersja" przerzutnika RS? I przez to drgania styków nie dają osobie znać?
    Pierwszy program wiadomo, że jest skopany i we to każdy kto tak samo jak ja zaczynał od BASCOM'a i porządnie wykonał trzecie ćwiczenie z mikroprocesorowej oślej łączki.

    OdpowiedzUsuń
  25. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  26. Mirku, mam oscyloskop analogowy (pożyczony) i podłączyłem sobie do niego przycisk z płytki atb. Nie pokazuje mi w ogóle drgań, tylko jak przycisnę to 5 Voltów, jak zwolnię go to 0V. Dlaczego? Potrzebny mi jest generator? Proszę o wytłumaczenie, ja jestem w tym sprawach początkującym.

    OdpowiedzUsuń
    Odpowiedzi
    1. Na oscyloskopie analogowym, bez pamięci trudno będzie ci zauważyć to co pokazałem przecież wyżej w artykule na zrzutach z oscyloskopu.

      Żadnego generatora nie potrzebujesz - na pewno jakieś tam drgania są ... bywają różne w zależności od rodzaju klawisza ...

      Usuń
    2. Dzięki za szybką odpowiedź! Czyli na oscyloskopie cyfrowym mogę te drgania zobaczyć? Taki do 100MHz starczy?

      Usuń
  27. Chciałbym się spytać o taką kwestię , a mianowicie: mam układzik który pobiera 50 mA, podpiąłem sobie GND do jednej z nózek uC, a VCC układu do VCC płytki. Zrobiłem tak, aby po naciśnięciu przycisku układ się włączał, i tak się dzieje ,i układ ma te 40mA.

    Natomiast, co by się stało, gdy VCC podłączyłbym do jakiejś nóżki uC, a gnd układu do GND? Czy nie popłynie przez uC zbyt duży prąd? CzyuC działa tak samo jako sink i source? Bo zauważyłem, że ty na swojej płytce stosujesz raczej 1 metodę, np. do diod, które są sterowane poziomem niskim, dlaczego takie rozwiązanie wybrałeś? Pozdrawiam

    OdpowiedzUsuń
    Odpowiedzi
    1. Ja z przyzwyczajenia najczęściej podłączam diody LED katodą do procka ale czasem także odwrotnie. W przypadku procków AVR nie ma to żadnego znaczenia ponieważ mogą dostarczyć odpowiedni prąd zarówno w stanie wysokim jak i niskim.

      Usuń
    2. Dzięki bardzo za odpowiedź, czekam na 2-ą wersje greenboka.

      Usuń
  28. Czy przycisk wersji u Pana na atb jest podłączony w ten sposób: VCC___/ .___RESET?

    OdpowiedzUsuń
    Odpowiedzi
    1. Sorry ale nie mam pojęcia o czym mówisz ? co oznaczają te kreseczki i kropeczki ..... A poza tym na stronie atnel.pl masz schemat ATB więc co stoi na przeszkodzie abyś tam zajrzał ?

      Usuń
    2. okej, miałem na myśli to:http://www.plcs.net.pl/images/stories/symbole/no_przycisk.jpg
      zerknąłem na schemat, ale tam nie ma rezystora na resecie, dlaczego?

      Usuń
    3. Jest jest - spójrz przy złączu programatora KANDA ;)

      Usuń
    4. a no tak, dziękuje :D

      Usuń
  29. nie wystarczy sprawdzać czy pojedynczy klawisz jest naciśnięty, trzeba też sprawdzać czy jest puszczony

    OdpowiedzUsuń
    Odpowiedzi
    1. Może przeczytaj dokładnie i do końca a później pisz ;) bo wygląda jakbyś napisał coś nie w tym wątku

      Usuń
  30. Od kiedy to diody sie zapalaja i gasza? To sa jakies swieczki czy znicze? ^^

    OdpowiedzUsuń
  31. Czy komentarze w przykładzie z pierwszym włączeniem i wyłączeniem LED nie powinny być odwrotnie napisane? Jeśli dioda jest podłączona katodą do atmegi, to włączamy ją stanem niskim, natomiast kod PORTC |= LED; sugeruje odwrotnie. No chyba, że się mylę...

    OdpowiedzUsuń
  32. To jak dioda LED ma być podłączona wynika wprost z kodu programu, rzeczywiście akurat nie zgadza się to ze schematem powyżej. Racja ....

    OdpowiedzUsuń
  33. Reasumując drgania styków występują tylko po prostu są niegroźne dla uC.
    Jeśli przyciskamy przycisk pętla zmienia się bardzo szybko to jak wciśniemy przycisk to dla 1 pętli jest zmiana natomiast dla kolejnych pętli nie ma zmiany aż do puszczenia przycisku?
    Drgania styku widać np. w szybkich licznikach w plc. Jedno przełączenie np. może dać 100 impulsów.

    OdpowiedzUsuń
    Odpowiedzi
    1. Oczywiście, że drgania styków występują ;) Widać w tytule artykułu znak zapytania - prawda ? ;) Tytuł jest nieco przewrotny aby pokazać jak to w ogóle działa i o co chodzi - zamiast bez opamiętania robić coś na ślepo ... jak to opisują na niektórych blogach

      Usuń
    2. Całość tkwi w szybko zmieniającej się petli?

      Usuń
    3. Ale teraz to ja nie za bardzo wiem o jakiej pętli ty mówisz ? o którym kodzie źródłowym ? z tej części artykułu ? .... jeśli z tej - to lepiej sobie przeczytaj część drugą - tam zobacz kody i wtedy zadaj pytanie ok ?

      Usuń
    4. pętla główna

      Usuń
    5. Jeszcze raz mówię zajrzyj do drugiej części tego artykułu

      Usuń
  34. Koleszko, dołączanie kondensatorów oraz rezystorów szeregowo z przyciskami ma sens, jeśli te przyciski są wyprowadzone daleko poza płytkę drukowaną, albo jeszcze odłączane poprzez jakieś złącze na zewnątrz maszyny. Wtedy jest to połączenie "debouncingu" z ochroną przed zakłóceniami i przepięciami.

    OdpowiedzUsuń
    Odpowiedzi
    1. Koleś naucz czytać się ze zrozumieniem a nie powtarzać to samo co ja napisałem ;)

      Usuń