{"id":392,"date":"2018-03-26T18:44:56","date_gmt":"2018-03-26T18:44:56","guid":{"rendered":"http:\/\/hayperek.pl\/?p=392"},"modified":"2018-03-26T18:52:32","modified_gmt":"2018-03-26T18:52:32","slug":"obsluga-manetki-cz-1","status":"publish","type":"post","link":"https:\/\/hayperek.pl\/en\/2018\/03\/26\/obsluga-manetki-cz-1\/","title":{"rendered":"Obs\u0142uga manetki &#8211; cz.1"},"content":{"rendered":"<p>Obs\u0142uga przycisk\u00f3w jest cz\u0119sto jednym z pierwszych wyzwa\u0144, jakich podejmuj\u0105 si\u0119 pocz\u0105tkuj\u0105cy adepci programowania uk\u0142ad\u00f3w wbudowanych. I bardzo cz\u0119sto zderzaj\u0105 si\u0119 w\u00f3wczas z &#8222;magicznym&#8221; zachowaniem \ud83d\ude42 W naszym projekcie r\u00f3wnie\u017c musimy sobie z tym poradzi\u0107 &#8211; a wi\u0119c do dzie\u0142a!<\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce przycisk chwilowy jest pod\u0142\u0105czony do portu mikrokontrolera w nast\u0119puj\u0105cy spos\u00f3b:<br \/>\n<a href=\"http:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_0.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_0.png\" alt=\"\" width=\"413\" height=\"412\" class=\"aligncenter size-full wp-image-454\" srcset=\"https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_0.png 413w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_0-300x300.png 300w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_0-100x100.png 100w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_0-150x150.png 150w\" sizes=\"auto, (max-width: 413px) 100vw, 413px\" \/><\/a><br \/>\nGdyby zarejestrowa\u0107 przebieg jaki pojawia si\u0119 na wej\u015bciu cyfrowym mikrokontrolera w momencie naciskania i puszczania przycisku, zobaczyliby\u015bmy co\u015b nast\u0119puj\u0105cego:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-393\" src=\"http:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_1.jpg\" alt=\"\" width=\"826\" height=\"363\" srcset=\"https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_1.jpg 826w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_1-600x264.jpg 600w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_1-300x132.jpg 300w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_1-768x338.jpg 768w\" sizes=\"auto, (max-width: 826px) 100vw, 826px\" \/><br \/>\nZar\u00f3wno przy naciskaniu jak i zwalnianiu pojawia si\u0119 seria szybkich prze\u0142\u0105cze\u0144 stanu logicznego. Zazwyczaj przypisywana jest zjawisku &#8222;drgania styk\u00f3w&#8221;. W rzeczywisto\u015bci w momencie zwierania oraz rozwierania styku rezystancja gwa\u0142townie zmienia si\u0119 nie tylko ze wzgl\u0119d\u00f3w czysto mechanicznych. Powierzchnia obu kontakt\u00f3w jest bowiem zawsze pokryta cienk\u0105 warstw\u0105 utlenionego metalu, kurzu, soli i innych zanieczyszcze\u0144, kt\u00f3rych przemieszczanie si\u0119 pod wp\u0142ywem nacisku powoduje gwa\u0142towne wahanie si\u0119 rezystancji po\u0142\u0105czenia przez kilka-kilkana\u015bcie milisekund.<\/p>\n<blockquote><p>Jak to wp\u0142ynie na zachowanie naszego uk\u0142adu?<\/p><\/blockquote>\n<p>W ka\u017cdym niemal\u017ce kursie programowania mikrokontroler\u00f3w przedstawia si\u0119 metod\u0119 wykrywania naci\u015bni\u0119cia przycisku za pomoc\u0105 przerwania, reaguj\u0105cego na zbocze opadaj\u0105ce i narastaj\u0105ce. Wspomniane &#8222;drgania styk\u00f3w&#8221; spowoduj\u0105, \u017ce zostanie wygenerowana ca\u0142a seria nast\u0119puj\u0105cych po sobie przerwa\u0144 (czerwone strza\u0142eczki).<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-394 size-full\" src=\"http:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_2.jpg\" alt=\"\" width=\"826\" height=\"394\" srcset=\"https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_2.jpg 826w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_2-600x286.jpg 600w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_2-300x143.jpg 300w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_2-768x366.jpg 768w\" sizes=\"auto, (max-width: 826px) 100vw, 826px\" \/><br \/>\nNale\u017cy pami\u0119ta\u0107, i\u017c ka\u017cde przerwanie wyw\u0142aszcza procesor na czas obs\u0142ugi, przerywaj\u0105c aktualnie wykonywane zadanie o ni\u017cszym priorytecie. W przypadku wydajnego procesora nie ma to wi\u0119kszego wp\u0142ywu na dzia\u0142anie uk\u0142adu, jednak jest rozwi\u0105zaniem ma\u0142o eleganckim. Dlatego wprowadza si\u0119 tzw. stref\u0119 nieczu\u0142o\u015bci lub stref\u0119 zakazan\u0105, w kt\u00f3rej sprawdzanie stanu wej\u015bcia jest zablokowane. Pozwala to ograniczy\u0107 liczb\u0119 generowanych przerwa\u0144. Najcz\u0119\u015bciej do odmierzania czasu jej trwania stosuje si\u0119 dedykowany, sprz\u0119towy licznik. Generuje on w\u0142asne przerwanie, na kt\u00f3rym ponownie sprawdzany jest stan portu. Je\u015bli pokrywa si\u0119 ze zboczem, kt\u00f3re wymusi\u0142o pierwsze przerwanie, mo\u017cemy za\u0142o\u017cy\u0107, \u017ce stan przycisku jest stabilny. Pewnym rozszerzeniem tej metody jest cykliczne sprawdzanie stanu wej\u015bcia w czasie trwania strefy nieczu\u0142o\u015bci.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-395 size-full\" src=\"http:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_3.jpg\" alt=\"\" width=\"826\" height=\"448\" srcset=\"https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_3.jpg 826w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_3-600x325.jpg 600w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_3-300x163.jpg 300w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_3-768x417.jpg 768w\" sizes=\"auto, (max-width: 826px) 100vw, 826px\" \/><\/p>\n<p>Czas jednak zada\u0107 sobie kardynalne pytanie &#8211; czy na prawd\u0119 potrzebujemy a\u017c przerwania? Warto zauwa\u017cy\u0107, \u017ce wi\u0119kszo\u015b\u0107 procesor\u00f3w ma mocno ograniczon\u0105 liczb\u0119 zewn\u0119trznych wej\u015b\u0107, kt\u00f3re s\u0105 w stanie je generowa\u0107. Marnowanie ich mo\u017cliwo\u015bci na obs\u0142ug\u0119 przycisk\u00f3w nie jest najlepszym pomys\u0142em. Dodatkowo s\u0105 one cz\u0119sto przypisane &#8222;sztywno&#8221; do okre\u015blonych pin\u00f3w uk\u0142adu, co utrudnia p\u00f3\u017aniejsze projektowanie p\u0142ytki drukowanej.<\/p>\n<blockquote><p>Czy zatem stosowanie przerwania do obs\u0142ugi przycisku ma w og\u00f3le sens?<\/p><\/blockquote>\n<p>Tak. Je\u015bli korzystamy z tryb\u00f3w u\u015bpienia, przerwanie mo\u017ce zosta\u0107 wykorzystane do &#8222;obudzenia&#8221; procesora. Po obs\u0142u\u017ceniu \u017c\u0105dania, ponownie przejdzie on w tryb zmniejszonego poboru mocy i b\u0119dzie oczekiwa\u0142 na kolejne naci\u015bni\u0119cie przycisku.<\/p>\n<p>Ta sytuacja nie dotyczy jednak omawianego urz\u0105dzenia. Zastan\u00f3wmy si\u0119 wi\u0119c nad alternatyw\u0105. <\/p>\n<blockquote><p>A co je\u015bli periodycznie sprawdzaliby\u015bmy wej\u015bcie i w przypadku ustabilizowania si\u0119 jego stanu po kilku-kilkunastu odczytach, zatrzaskiwali jego warto\u015b\u0107?<\/p><\/blockquote>\n<p>Brzmi sensownie. Z pomoc\u0105 przychodzi nam tu <a href=\"http:\/\/hayperek.pl\/en\/2018\/03\/25\/czas-to-podstawa\/\">podstawa czasu<\/a>, kt\u00f3r\u0105 zbudowali\u015bmy nieco wcze\u015bniej. Praktyka pokazuje, \u017ce cz\u0142owiek nie jest w stanie prze\u0142\u0105cza\u0107 przycisku szybciej, ni\u017c co oko\u0142o 50ms. Nie warto wi\u0119c sprawdza\u0107 stanu przycisku cz\u0119\u015bciej, ni\u017c co 10ms (\u017c\u00f3\u0142te strza\u0142ki). Stan nieustalony na wej\u015bciu b\u0119dzie trwa\u0142 maksymalnie kilkana\u015bcie milisekund, w przypadku mocno zu\u017cytych styk\u00f3w. Mo\u017cna wi\u0119c \u015bmia\u0142o za\u0142o\u017cy\u0107, \u017ce je\u015bli przy trzech kolejnych odczytach (pogrubione strza\u0142ki) stan portu si\u0119 nie zmienia, pozycja przycisku jest stabilna.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-396 size-full\" src=\"http:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_4.jpg\" alt=\"\" width=\"826\" height=\"445\" srcset=\"https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_4.jpg 826w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_4-600x323.jpg 600w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_4-300x162.jpg 300w, https:\/\/hayperek.pl\/wp-content\/uploads\/2018\/03\/keys_4-768x414.jpg 768w\" sizes=\"auto, (max-width: 826px) 100vw, 826px\" \/><\/p>\n<p>Zaproponowana metoda jest niezwykle prosta i skuteczna. Nie wymaga przy tym stosowania przerwa\u0144 i dedykowanych licznik\u00f3w\/timer\u00f3w. Mamy wi\u0119c informacj\u0119 kiedy kierowca naci\u015bnie jeden z przycisk\u00f3w na manetce, co jednak zrobi\u0107, \u017ceby prze\u0142o\u017cy\u0107 to na przyk\u0142ad na zmian\u0119 pozycji menu? Trzeba zastanowi\u0107 si\u0119 nad rozs\u0105dnym interfejsem, ale o tym w nast\u0119pnym odcinku.<\/p>","protected":false},"excerpt":{"rendered":"<p>Obs\u0142uga przycisk\u00f3w jest cz\u0119sto jednym z pierwszych wyzwa\u0144, jakich podejmuj\u0105 si\u0119 pocz\u0105tkuj\u0105cy adepci programowania uk\u0142ad\u00f3w wbudowanych. I bardzo cz\u0119sto zderzaj\u0105 si\u0119 w\u00f3wczas z &#8222;magicznym&#8221; zachowaniem \ud83d\ude42 W naszym projekcie r\u00f3wnie\u017c musimy sobie z tym poradzi\u0107 &#8211; a wi\u0119c do dzie\u0142a! Za\u0142\u00f3\u017cmy, \u017ce przycisk chwilowy jest pod\u0142\u0105czony do portu mikrokontrolera w nast\u0119puj\u0105cy spos\u00f3b: Gdyby zarejestrowa\u0107 przebieg [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":456,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":{"0":"post-392","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-stodni","9":"post-with-thumbnail","10":"post-with-thumbnail-large"},"_links":{"self":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/392","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/comments?post=392"}],"version-history":[{"count":8,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/392\/revisions"}],"predecessor-version":[{"id":455,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/392\/revisions\/455"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/media\/456"}],"wp:attachment":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/media?parent=392"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/categories?post=392"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/tags?post=392"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}