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:
A przyznasz, że fora internetowe najeżone są wręcz pytaniami tego typu (przeczytaj uważnie!):
- opisany na początku problem to w żadnym wypadku efekt drgań styków ponad wszelką wątpliwość
- dodanie sprzętowej eliminacji drgań za pomocą kondensatora także nie zniweluje opisanego na początku efektu
- Bzdurą jest dołączanie rezystora w szereg z mikro-przełącznikiem ;)
- 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.
.
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.
.
"Napiszmy w tym celu prosty program, nie przestrzegając ŻADNYCH zasad eliminacji drgań styków i sprawdzimy czy to będzie działać ;)"
OdpowiedzUsuń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
"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ńok postarałem się poprawić - ale mi się miesza już w oczach ;)
OdpowiedzUsuńA tak w ogóle dziękuję za poradnik w swoim imieniu. I czekam na kolejną część która bardzo mnie interesuje.
OdpowiedzUsuń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. :)
//KLAWISZ UP
OdpowiedzUsuń#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
}
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ń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ńBardzo pożyteczny i treściwy artykuł. Czekam z niecierpliwością na kolejną część. :)
OdpowiedzUsuńDziękuję Mistrzu :)
OdpowiedzUsuńMirek Rulez !! A co to za Oscyloskop ?? Rigol 1102E??
OdpowiedzUsuńaaa to rigolek DS4024.
UsuńDzięki Mirku za Info . Dla mnie JESZCZE za drogi ... ale zastanawiam się nad Rigolkiem 1102E - jakiś opinii szukam. Pozdrawiam
UsuńTe okna z oscyloskopu to zrzuty ekranu robione w oscyloskopie czy w jakims programie na komputerze ?
Usuń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ń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ń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ń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).
UsuńMogę też zobaczyć wykres na kompie w UltraScope ale sam program jest kiepski jak również i jego możliwości wizualizacji.
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ńNormalnie kasuję wypowiedzi takich malkontentów z bloga ;) ale że już mu Panowie odpowiedzieliście to zostawię ....
OdpowiedzUsuńCzyli jednak dobrze pamiętałem kolegę ze studiów rolniczych :-)
OdpowiedzUsuńCzyżby to nie pasowało koledze, do aktualnego image?
Pozdrawiam definitywnie :D :D :D
Aaaa my Cię już znamy :)
UsuńMoże się przedstawisz i pokażesz co osiągnąłeś?
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?
OdpowiedzUsuń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.
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 .....
Usuń.... 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 ....
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ę ....
Usuń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.
Ten komentarz został usunięty przez administratora bloga.
Usuń1.
OdpowiedzUsuń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.
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.
OdpowiedzUsuń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
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...
OdpowiedzUsuńPozdrawiam.
Tarrin
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.
OdpowiedzUsuń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ą.
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ń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 ;)
OdpowiedzUsuń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.
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ń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.
UsuńP.S. stan zabroniony występuje na wejściach, a nie na jednym z nich ;)
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ń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".
UsuńPozdrawiam i życzę wielu kolejnych sukcesów w nowym roku!
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:
Usuń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 ;)
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:
OdpowiedzUsuń#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?
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:
Usuń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
Mam takie pytanko
OdpowiedzUsuń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?
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ńA ja mam pytania z racji tego pytania - czy ja gdzieś w tym artykule napisałem że nie istnieją drgania styków ?
Usuń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ąć ?
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ń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ń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ń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 ?
Usuń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.
Chodzi mi o zwykły przycisk do resetu. Gdzieś wyczytałem, że warto dać kondensator 100nF równolegle do przycisku Reset
Usuń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ć?
OdpowiedzUsuń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.
Ten komentarz został usunięty przez autora.
OdpowiedzUsuń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ń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.
UsuńŻadnego generatora nie potrzebujesz - na pewno jakieś tam drgania są ... bywają różne w zależności od rodzaju klawisza ...
Dzięki za szybką odpowiedź! Czyli na oscyloskopie cyfrowym mogę te drgania zobaczyć? Taki do 100MHz starczy?
Usuńspokojnie ;)
Usuń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.
OdpowiedzUsuń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
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ńDzięki bardzo za odpowiedź, czekam na 2-ą wersje greenboka.
UsuńCzy przycisk wersji u Pana na atb jest podłączony w ten sposób: VCC___/ .___RESET?
OdpowiedzUsuń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ńokej, miałem na myśli to:http://www.plcs.net.pl/images/stories/symbole/no_przycisk.jpg
Usuńzerknąłem na schemat, ale tam nie ma rezystora na resecie, dlaczego?
Jest jest - spójrz przy złączu programatora KANDA ;)
Usuńa no tak, dziękuje :D
Usuńnie wystarczy sprawdzać czy pojedynczy klawisz jest naciśnięty, trzeba też sprawdzać czy jest puszczony
OdpowiedzUsuń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ńOd kiedy to diody sie zapalaja i gasza? To sa jakies swieczki czy znicze? ^^
OdpowiedzUsuńZgaduję - świeczki ? ;) ....
Usuń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ń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ńReasumując drgania styków występują tylko po prostu są niegroźne dla uC.
OdpowiedzUsuń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.
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ńCałość tkwi w szybko zmieniającej się petli?
Usuń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ńpętla główna
UsuńJeszcze raz mówię zajrzyj do drugiej części tego artykułu
Usuń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ńKoleś naucz czytać się ze zrozumieniem a nie powtarzać to samo co ja napisałem ;)
Usuń