{"id":3086,"date":"2021-09-01T13:47:47","date_gmt":"2021-09-01T13:47:47","guid":{"rendered":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?page_id=3086"},"modified":"2021-09-16T18:29:31","modified_gmt":"2021-09-16T18:29:31","slug":"joy-radio-2-3-2-2-2","status":"publish","type":"page","link":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?page_id=3086","title":{"rendered":"Jak szybkie s\u0105 porty cyfrowe Arduino?"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"379\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-34-1024x379.png\" alt=\"\" class=\"wp-image-3094\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-34-1024x379.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-34-300x111.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-34-768x285.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-34.png 1220w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Sprawdzanie czas\u00f3w generowania sygna\u0142\u00f3w.analizator\u00f3w Saleae.<\/figcaption><\/figure>\n\n\n<p>Autorzy: KG + ?<br>Zaawansowanie: badania trwaj\u0105, s\u0105 ju\u017c wst\u0119pne wyniki<br>Cel: wiedza, wiedza, wiedza &#8211; potem prze\u0142o\u017cona na praktyk\u0119<\/p>\n<h2>Motywacja<\/h2>\n<p><span style=\"color: inherit;\">Mikrokontroler ATmega 328P znajduj\u0105cy si\u0119 w platformie Arduino UNO (i innych, ale ta jest najbardziej popularna) dysponuje 14-toma wej\u015bciami\/wyj\u015bciami cyfrowymi (skupiam si\u0119 jedynie na portach cyfrowych, pomijam analogowe). Porty te zgrupowane s\u0105 w trzech bankach (B,C,D) i mamy do nich dost\u0119p za pomoc\u0105 funkcji digitalWrite() lub bezpo\u015brednio &#8211; przez manipulacj\u0119 rejestrami. Powstaje pytanie, jak szybko mo\u017cemy zmienia\u0107 stan wysoki na niski w danym porcie? Jak si\u0119 to ma wykorzystuj\u0105c dedykowan\u0105 funkcj\u0119 z Arduino IDE a jak programuj\u0105c rejstry? Kolejne pytanie, to jak szybko mo\u017cemy odczytywa\u0107 zmiany napi\u0119\u0107 (np. funkcjami obs\u0142ugi przerwa\u0144). Jedno z drugim jest zwi\u0105zane i cz\u0119sto potrzebne, np. w przypadku obs\u0142ugi enkoder\u00f3w do silnik\u00f3w. Takie enkodery mog\u0105 generowa\u0107 64 impulsy na obr\u00f3t (co jest bezproblemowe do wy\u0142apania przez Arduino), ale cz\u0119sto silniki maj\u0105 przek\u0142adni\u0119 (np. Pollolu 37Dx70L ma przek\u0142adni\u0119 70:1) i liczba impuls\u00f3w na sekund\u0119 wynosi ju\u017c 4480. Czy Arduino odczyta wszystie te impulsy?<\/span><\/p>\n<p><span style=\"color: inherit; font-size: 1.95em; font-weight: 600;\">Sprawdzamy czasy wyj\u015bcia.<\/span><\/p>\n<p>Pierwszy program to prawie kopia popularnego Blink-a, jednak tym razem zmieniam stan pinu numer 7 (zdefiniowanego 1 pierwszej linijce kodu pod nazw\u0105 PIN) i robi\u0119 to bardzo szybko &#8211; co 1 ms. Celowo nic nie wypisuj\u0119 na port szeregowy, aby nie powodowa\u0107 niepotrzebnych op\u00f3\u017anie\u0144.<\/p>\n<div id=\"attachment_3090\" style=\"width: 530px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3090\" class=\"wp-image-3090 size-full\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-06-06.png\" alt=\"\" width=\"520\" height=\"576\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-06-06.png 520w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-06-06-271x300.png 271w\" sizes=\"auto, (max-width: 520px) 100vw, 520px\" \/><p id=\"caption-attachment-3090\" class=\"wp-caption-text\">Program 1: program testowy w dialekcie C\/C++ Arduino.<\/p><\/div>\n<p>Oczywi\u015bcie zmian napi\u0119\u0107 na porcie 7 nie wida\u0107, nawet gdyby\u015bmy pod\u0142\u0105czyli multimetr &#8211; ten powinien wskaza\u0107 oko\u0142o 2.5V (gdy\u017c podczas trwania mierzenia warto\u015bci napi\u0119cia na multimetrze czas trwania napi\u0119cia 5V = czasowi trwania napi\u0119cia 0V, co \u015brednio daje w\u0142a\u015bnie 2.5V). Najlepiej pod\u0142\u0105czy\u0107 <strong>dobry<\/strong> oscyloskop, ale niewiele os\u00f3b takowy posiada (to wydatek przynajmniej 2000 z\u0142). Tanie &#8222;chi\u0144skie&#8221; mini-oscyloskopy (za ~200z\u0142) jeszcze z tym sobie poradz\u0105, ale za chwil\u0119 przyspieszymy prze\u0142\u0105czanie pin\u00f3w i takie sprz\u0119ty b\u0119d\u0105 bezu\u017cyteczne. Dlatego w tym wpisie skupi\u0119 si\u0119 na analizatorze stan\u00f3w logicznych Saleae, a dok\u0142adniej ich klon\u00f3w (ze wzgl\u0119du na cen\u0119, ale do orygina\u0142\u00f3w jeszcze wr\u00f3c\u0119). Poni\u017cej aukcja w popularnym serwisie pokazuj\u0105ca o czym mowa.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3092 size-full\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/salae-allegro.png\" alt=\"\" width=\"655\" height=\"181\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/salae-allegro.png 655w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/salae-allegro-300x83.png 300w\" sizes=\"auto, (max-width: 655px) 100vw, 655px\" \/><\/p>\n<p>Pod\u0142\u0105czamy wi\u0119c GND i CH1 analizatora Saleae do Arduino z uruchomionym pierwszym programem i sprawdzamy, co si\u0119 dzieje (ja ustawi\u0142em czas pr\u00f3bkowania na 0.01 s, aby pomiar by\u0142 szybki).<\/p>\n<div id=\"attachment_3087\" style=\"width: 730px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3087\" class=\"wp-image-3087 size-large\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-09-08-1024x379.png\" alt=\"\" width=\"720\" height=\"266\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-09-08-1024x379.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-09-08-300x111.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-09-08-768x285.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-09-08.png 1220w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3087\" class=\"wp-caption-text\">Wykres 1 &#8211; Wynik Programu 1: sprawdzenie poprawno\u015bci odczyt\u00f3w pierwszego programu.<\/p><\/div>\n<p>Widzimy prostok\u0105tny przebieg w cz\u0119\u015bci&nbsp;<em>Channel 0<\/em> (cho\u0107 na tanim klonie analizatora Saleae naklejka m\u00f3wi, \u017ce jest to port pierwszy &#8211; czyli Channel 1). Mysz\u0105 sprawdzamy jakie s\u0105 faktyczne czasy trwania sygna\u0142u HIGH i LOW. Na powy\u017cszym zdj\u0119ciu czas sygna\u0142u LOW to 1.008292 ms, czyli bardzo, bardzo zbli\u017cone do 1 ms. Dok\u0142adniejsze sprawdzanie kolejnych sygna\u0142\u00f3w mo\u017ce pokaza\u0107, \u017ce inne sygna\u0142y LOW r\u00f3\u017cni\u0105 si\u0119 niewiele &#8211; nie s\u0105 identyczne. C\u00f3\u017c, tak w\u0142a\u015bnie dzia\u0142a elektronika (nieidealnie). Przy okazji widzimy, \u017ce sygna\u0142 jest periodyczny z cz\u0119stotliwo\u015bci\u0105 496 Hz (napis Freq z lewej strony).<\/p>\n<p>Zmieniamy program wyrzucaj\u0105c funkcje op\u00f3\u017aniaj\u0105ce i sprawdzamy, ile mo\u017cemy maksymalnie &#8222;wycisn\u0105\u0107&#8221; z Arduino.<\/p>\n<div id=\"attachment_3095\" style=\"width: 530px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3095\" class=\"wp-image-3095 size-full\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-09-36.png\" alt=\"\" width=\"520\" height=\"576\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-09-36.png 520w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-09-36-271x300.png 271w\" sizes=\"auto, (max-width: 520px) 100vw, 520px\" \/><p id=\"caption-attachment-3095\" class=\"wp-caption-text\">Program 2: Wyciskamy maksimum z Arduino (program w dialekcie C\/C++ Arduino).<\/p><\/div>\n<p>Pozbyli\u015bmy si\u0119 wi\u0119c op\u00f3\u017anie\u0144 i testujemy z wykorzystaniem analizatora Saleae. Po powi\u0119kszeniu skali (k\u00f3\u0142ko myszki) widzimy co\u015b takiego:<\/p>\n<div id=\"attachment_3096\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3096\" class=\"wp-image-3096 size-large\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-10-33-1024x379.png\" alt=\"\" width=\"720\" height=\"266\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-10-33-1024x379.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-10-33-300x111.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-10-33-768x285.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-10-33.png 1220w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3096\" class=\"wp-caption-text\">Wykres 2 &#8211; Wynik Programu 2.<\/p><\/div>\n<p>Czyli bez funkcji delay(1) sygna\u0142 HIGH trwa 3.208 us, natomiast sygna\u0142 LOW jakby troch\u0119 d\u0142u\u017cej (6.75 us &#8211; 3.208 us = 3.542 us). Potwierdzaj\u0105 to kolejne fragmenty wykresu (znowu nie s\u0105 identyczne, ale bardzo zbli\u017cone). <strong>R\u00f3\u017cnica tych czas\u00f3w (oko\u0142o 0.300 us) zostanie wyja\u015bniona w dalszej cz\u0119\u015bci wpisu<\/strong> (a mo\u017ce sam si\u0119 ju\u017c domy\u015blasz, sk\u0105d si\u0119 bierze?). Zauwa\u017camy, \u017ce cz\u0119stotliwo\u015b\u0107 wzros\u0142a i wynosi 148.148 kHz, czyli 148148 Hz. Czy to ju\u017c maksymalna warto\u015b\u0107?<\/p>\n<h2>Programujemy rejestry<\/h2>\n<p>Dialekt C\/C++ Arduino jest fajny, prosty i posiada u\u017cyteczne funkcje, jak pinMode() czy digitalWrite(). Ale nie musimy ich stosowa\u0107, aby &#8222;dobra\u0107&#8221; si\u0119 do port\u00f3w Arduino. Poni\u017cszy schemat przedstawia piny cyfrowe I\/O w nazewnictwie Arduino UNO (kolor niebieski: ARDUINO PIN) oraz prawdziwe nazwy mikrokontrolera ATmega328 (kolor zielony: PORT PIN). Widzimy wi\u0119c, \u017ce popularny Arduino pin 13, do kt\u00f3rego standartowo pod\u0142\u0105czony jest LED to faktycznie pin PB5. Ja z kolei u\u017cy\u0142em Arduino pin 7 w pierwszych programach, czyli PD7. Sprawd\u017a, czy umiesz to odczyta\u0107 z poni\u017cszego obrazka i nie przejmuj si\u0119, \u017ce z jakiego\u015b powodu piny nie s\u0105 w kolejno\u015bci, a czasami &#8222;skacz\u0105&#8221; z jednej strony uk\u0142adu na drug\u0105 (dodatkowo: czy zauwa\u017cy\u0142e\u015b, \u017ce s\u0105 &#8222;nowe&#8221; piny 20 i 21 &#8211; do kt\u00f3rych nie masz dost\u0119pu z Arduino IDE?).<\/p>\n<div id=\"attachment_3088\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3088\" class=\"wp-image-3088 size-large\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/atmega328-pinout-1024x648.jpeg\" alt=\"\" width=\"720\" height=\"456\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/atmega328-pinout-1024x648.jpeg 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/atmega328-pinout-300x190.jpeg 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/atmega328-pinout-768x486.jpeg 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/atmega328-pinout-1536x972.jpeg 1536w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/atmega328-pinout-2048x1296.jpeg 2048w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3088\" class=\"wp-caption-text\">Nazewnictwo port\u00f3w dla ATmegi 328 &#8211; patrz kolor niebieski i zielony.<\/p><\/div>\n<p><span style=\"color: inherit;\">Programowanie rejstr\u00f3w polega na odwo\u0142ywaniu si\u0119 do konkretnych kom\u00f3rek pami\u0119ci w mikrokontrolerze. Na og\u00f3\u0142 zmieniamy jeden bit, kt\u00f3re odpowiada za dany pin. Ale mo\u017cna od razu zmienia\u0107 ca\u0142y bajt &#8211; czyli 8 port\u00f3w na raz! W naszym przypadku najpierw trzeba ustali\u0107 rol\u0119 pinu &#8211; wej\u015bcie czy wyj\u015bcie &#8211; za to odpowiada rejestr DataDirectionRegisterX kt\u00f3ry pe\u0142ni rol\u0119 wywo\u0142ania funkcji pinMode(), a potem w\u0142\u0105czy\u0107 lub wy\u0142\u0105czy\u0107 dany bit (ponownie: funkcja digitalWrite() w dialekcie Arduino, a w rejestrach to PORTX). X na ko\u0144cu nazw rejestr\u00f3w to w\u0142a\u015bnie banki port\u00f3w, u nas B,C lub D.<br><\/span><\/p>\n<p><span style=\"color: inherit;\">Programujemy wyj\u015bcie cyfrowe PD7 (czyli Arduino pin 7) bez funkcji z Arduino IDE &#8211; patrz poni\u017cszy program. Linijka 2 to odpowiednik instrukcji pinMode(), tym razem dzia\u0142aj\u0105ca dla ca\u0142ego &#8222;banku D&#8221; pin\u00f3w (czyli od razu dla wszystkich o\u015bmiu pin\u00f3w Arduino 0,1,2,3,4,5,6,7). Ka\u017cdy bit w rejestrze DDRD (Data Direction RegisterD) odpowiada jednemu portowi, ja tu wpisa\u0142em 255 czyli B11111111 (same jedynki). Jedynka oznacza OUTPUT, natomiast zero oznacza INPUT (\u0142atwiej by\u0142o by to zapami\u0119ta\u0107, gdyby 1=INPUT, a 0=OUTPUT &#8211; ale tutaj jest <strong>na odwr\u00f3t<\/strong>, czyli 1=OUTPUT, 0=INPUT). Ca\u0142a linijka 2 programu odpowiada wi\u0119c o\u015bmiu instrukcjom pinMode(0, OUTPUT), pinMode(1, OUTPUT), &#8230;,pinMode(7, OUTPUT). Tylko jedna instrukcja przypisania pojedynczego bajta do rejestru DDRD zast\u0119puje nam wywo\u0142anie o\u015bmiu funkcji pinMode()! Wiem wiem, poniewa\u017c pracuj\u0119 tylko z jednym portem PD7 powinienem wykona\u0107 DDRD=B10000000; czyli OUTPUT tylko na nim, a reszta port\u00f3w w tym pinie jako INPUT &#8211; ale tak mi si\u0119 jako\u015b ca\u0142y bank ustawi\u0142o na OUTPUT i tego si\u0119 b\u0119d\u0119 dalej trzyma\u0107.<br><\/span><\/p>\n<div id=\"attachment_3100\" style=\"width: 530px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3100\" class=\"wp-image-3100 size-full\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-25-01.png\" alt=\"\" width=\"520\" height=\"576\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-25-01.png 520w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-25-01-271x300.png 271w\" sizes=\"auto, (max-width: 520px) 100vw, 520px\" \/><p id=\"caption-attachment-3100\" class=\"wp-caption-text\">Program 3: test programowania port\u00f3w.<\/p><\/div>\n<p>Linijka 6 to w\u0142\u0105czenie w stan HIGH portu PD7, inne porty w tym banku pozostaj\u0105 bez zmian. Robi\u0119 to z wykorzystaniem instrukcji sumy bitowej tego, co jest aktualnie w rejestrze D (rejestr nazywa si\u0119 PORTD) z bajtem B10000000. Odpowiada to wywo\u0142aniu funkcji digitalWrite(7, HIGH). Podobnie jak w linijce 2 mog\u0142em zaprogramowa\u0107 ca\u0142y bank D w jednej instrukcji przypisania, tak i tutaj mog\u0142em (np. PORTD=B00001111 to w\u0142\u0105czenie w stan HIGH port\u00f3w PD0, PD1, PD2 oraz PD3 jednocze\u015bnie w\u0142\u0105czaj\u0105c w stan LOW port\u00f3w PD4, PD5, PD6 i PD7. Ja nie chcia\u0142em zmienia\u0107 innch port\u00f3w, tylko PD7, dlatego u\u017cy\u0142em instrukcji sumy bitowej). Nast\u0119pnie czekam 1 ms. Linia 8 to prze\u0142\u0105czenie PD7 w stan LOW, jednocze\u015bnie pozostawiaj\u0105c bez zmiany porty PD1..PD7 (zastosowa\u0142em iloczyn bitowy). Kompiluj\u0119 i wgrywam. Sprawdzam na analizatorze &#8211; wynik poni\u017cej:<\/p>\n<div id=\"attachment_3103\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3103\" class=\"wp-image-3103 size-large\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-09-12-1024x379.png\" alt=\"\" width=\"720\" height=\"266\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-09-12-1024x379.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-09-12-300x111.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-09-12-768x285.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-09-12.png 1220w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3103\" class=\"wp-caption-text\">Wykres 3 &#8211; Wynik Programu 3.<\/p><\/div>\n<p>OK, wszystko dzia\u0142a jak powinno: mamy cz\u0119stotliwo\u015b\u0107 Freq=495.97 Hz i sygna\u0142y HIGH i LOW trwaj\u0105ce 1 ms (z malutkim ogonkiem). Programowanie rejestr\u00f3w nie jest takie trudne, prawda? \ud83d\ude09 Mo\u017cna wi\u0119c pozby\u0107 si\u0119 p\u0119tli op\u00f3\u017aniaj\u0105cych (linijki 7 i 8) i zobaczy\u0107, jak teraz b\u0119dzie dzia\u0142a\u0107 prze\u0142\u0105czanie port\u00f3w.<\/p>\n<div id=\"attachment_3104\" style=\"width: 530px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3104\" class=\"wp-image-3104 size-full\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-25-14.png\" alt=\"\" width=\"520\" height=\"576\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-25-14.png 520w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-25-14-271x300.png 271w\" sizes=\"auto, (max-width: 520px) 100vw, 520px\" \/><p id=\"caption-attachment-3104\" class=\"wp-caption-text\">Program 4: programowanie port\u00f3w.<\/p><\/div>\n<p>Wynik powy\u017cszego programu w analizatorze Saleae:<\/p>\n<div id=\"attachment_3105\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3105\" class=\"wp-image-3105 size-large\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-25-46-1024x379.png\" alt=\"\" width=\"720\" height=\"266\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-25-46-1024x379.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-25-46-300x111.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-25-46-768x285.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-25-46.png 1220w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3105\" class=\"wp-caption-text\">Wykres 4 &#8211; Wynik Programu 4.<\/p><\/div>\n<p>Zaczynaj\u0105 si\u0119 dzia\u0107 ciekawe rzeczy \ud83d\ude09 Stan HIGH trwa 125 ns (nano sekund! a w Programie 2 by\u0142o to 3.208 us = 3208 ns, czyli ponad 25x wi\u0119cej!). Ale dziwne, bo stan LOW nie trwa tyle samo co stan wyoski, a jedynie 500ns-125ns = 375 ns. Sk\u0105d ten brak symetrii? Zreszt\u0105, <strong>r\u00f3\u017cnica czas\u00f3w trwania stan\u00f3w HIGH\/LOW pojawi\u0142a si\u0119 ju\u017c wcze\u015bniej<\/strong> &#8211; podczas omawiania wynik\u00f3w dzia\u0142ania Programu 2 (patrz dyskusja pod Wykresem 2) i wynosi\u0142a w\u0142a\u015bnie ~0.3 us czyli ~300 ns. Dlaczego w\u0142\u0105czenie HIGH trwa kr\u00f3cej ni\u017c LOW? Tak by\u0107 nie mo\u017ce, tu chodzi o co\u015b innego&#8230; <strong>Moje przepuszczenie (robocza teza)<\/strong>: po wywo\u0142aniu dw\u00f3ch instrukcji w funkcji loop() Proramu 4 ponownie wywo\u0142uje si\u0119 funkcja loop() &#8211; czyli mamy dodatkowe instrukcje skoku (dodatkowe op\u00f3\u017anienie). Aby to sprawdzi\u0107, rozbudowuj\u0119 funkcj\u0119 loop() o kolejne dwa cykle w\u0142\u0105czenia\/wy\u0142\u0105czenia tego samego pinu &#8211; w\u00f3wczas loop() wywo\u0142a si\u0119 po trzech prze\u0142\u0105czeniach portu PD7. Oto i program:<\/p>\n<div id=\"attachment_3163\" style=\"width: 604px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3163\" class=\"wp-image-3163 size-full\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-02-09-16-09.png\" alt=\"\" width=\"594\" height=\"609\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-02-09-16-09.png 594w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-02-09-16-09-293x300.png 293w\" sizes=\"auto, (max-width: 594px) 100vw, 594px\" \/><p id=\"caption-attachment-3163\" class=\"wp-caption-text\">Program 5: trzykrotne prze\u0142\u0105czenie PD7 w jednej funkcji loop().<\/p><\/div>\n<p>Jak to dzia\u0142a? Poni\u017cej obraz z Saleae:<\/p>\n<div id=\"attachment_3109\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3109\" class=\"wp-image-3109 size-large\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-37-1024x379.png\" alt=\"\" width=\"720\" height=\"266\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-37-1024x379.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-37-300x111.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-37-768x285.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-37.png 1220w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3109\" class=\"wp-caption-text\">Wykres 5 &#8211; Wynik Programu 5.<\/p><\/div>\n<p>Bingo! Faktycznie, teraz wida\u0107, \u017ce mamy trzy cykle w\u0142\u0105czenia\/wy\u0142\u0105czenia stanu na porcie, a potem d\u0142u\u017csz\u0105 pauz\u0119, czyli stan LOW si\u0119 wyd\u0142u\u017cy\u0142. Wida\u0107 te\u017c, \u017ce po pierwszym w\u0142\u0105czeniu PD7 na HIGH nast\u0119puje stan LOW trwaj\u0105cy dok\u0142adnie tyle samo co poprzednio stan HIGH &#8211; czyli 125 ns. Patrz rysunek poni\u017cej.<\/p>\n<div id=\"attachment_3112\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3112\" class=\"wp-image-3112 size-large\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-40-1024x379.png\" alt=\"\" width=\"720\" height=\"266\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-40-1024x379.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-40-300x111.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-40-768x285.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-40.png 1220w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3112\" class=\"wp-caption-text\">Wykres 6a &#8211; Wynik Programu 5 &#8211; pomiar czasu trwania stanu LOW.<\/p><\/div>\n<p>&nbsp;<\/p>\n<div id=\"attachment_3113\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3113\" class=\"wp-image-3113 size-large\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-44-1024x379.png\" alt=\"\" width=\"720\" height=\"266\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-44-1024x379.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-44-300x111.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-44-768x285.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-26-44.png 1220w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3113\" class=\"wp-caption-text\">Wykres 6b &#8211; Wynik programu 5 &#8211; pomiar czasu trwania stanu HIGH.<\/p><\/div>\n<p>Co z tego wynika? Wykresy 6a i 6b wskazuj\u0105, \u017ce <strong>cz\u0119stotliwo\u015b\u0107 sygna\u0142\u00f3w HIGH\/LOW wynosi 4 MHz<\/strong> (ponad 27x szybciej ni\u017c maksimum, jakie &#8222;wycisn\u0105\u0142em&#8221; programuj\u0105c w dialekcie C\/C++ Arduino, patrz Wykres 2). Czas trwania tych sygna\u0142\u00f3w to 125 ns. Uzyska\u0142em niez\u0142e przyspieszenie programuj\u0105c porty i nie korzystaj\u0105c z funkcji digitalWrite().<\/p>\n<h2>Cz\u0119stotliwo\u015b\u0107 pracy ATmegi 328<\/h2>\n<p>Arduino UNO bazuje na ATmedze 328p, dzia\u0142aj\u0105cym z kwarcem 16 MHz.Oznacza to, \u017ce zegar &#8222;klika&#8221; co 1\/16000000 s = 62.5 ns. Czas wykonania ka\u017cdej instrukcji mo\u017cna znale\u017a\u0107 w specyfikacji mikrokontrolera gdzie wida\u0107, \u017ce operacje sumy\/iloczynu logicznego zajmuj\u0105 dwa cykle zegarowe (dwa &#8222;kliki&#8221;), a przypisanie warto\u015bci tylko jeden &#8222;klik&#8221;. Jak na razie widzimy, \u017ce prze\u0142\u0105czenie port\u00f3w trwa 125 ns, czyli faktycznie dwa cykle (manipulacje na banku rejestr PORTD wymagaj\u0105 u\u017cycia instrukcji asemblera SEI\/CLI trwaj\u0105cej 2 &#8222;kliki&#8221;, por\u00f3wnaj tabela 31. Instruction Set Summary ze<a href=\"https:\/\/ww1.microchip.com\/downloads\/en\/DeviceDoc\/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf\" target=\"_blank\" rel=\"noopener\"> specyfikacji ATmegi 328p<\/a>). Dlatego rozs\u0105dnie jest zmodyfikowa\u0107 program na okoliczno\u015b\u0107 moich test\u00f3w tak, \u017ce zmieniam wszystkie 8 port\u00f3w (cho\u0107 i tak zale\u017cy mi na jednym) co zajmie jeden cykl (instrukcja OUT w Tabeli 31). Nowy program wygl\u0105da tak:<\/p>\n<div id=\"attachment_3108\" style=\"width: 530px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3108\" class=\"wp-image-3108 size-full\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-38-25.png\" alt=\"\" width=\"520\" height=\"576\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-38-25.png 520w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-08-38-25-271x300.png 271w\" sizes=\"auto, (max-width: 520px) 100vw, 520px\" \/><p id=\"caption-attachment-3108\" class=\"wp-caption-text\">Program 6: trzykrotne prze\u0142\u0105czenie PD7 w jednej funkcji loop(). Program bez operacji sumy\/iloczynu bit\u00f3w.<\/p><\/div>\n<p>Po zmianie na Program 6 widz\u0119 poni\u017cszy wykres:<\/p>\n<div id=\"attachment_3121\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3121\" class=\"size-large wp-image-3121\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-20-59-17-1024x379.png\" alt=\"\" width=\"720\" height=\"266\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-20-59-17-1024x379.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-20-59-17-300x111.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-20-59-17-768x285.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-20-59-17.png 1220w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3121\" class=\"wp-caption-text\">Wykres 8a: wynik dzia\u0142ania Programu 6.&nbsp;<\/p><\/div>\n<p>&nbsp;<\/p>\n<div id=\"attachment_3120\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3120\" class=\"size-large wp-image-3120\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-20-55-56-1024x379.png\" alt=\"\" width=\"720\" height=\"266\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-20-55-56-1024x379.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-20-55-56-300x111.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-20-55-56-768x285.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-20-55-56.png 1220w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3120\" class=\"wp-caption-text\">Wykres 8b: wynik dzia\u0142ania Programu 6.&nbsp;<\/p><\/div>\n<p>Wida\u0107 charakterystyczne trzy prze\u0142\u0105czenia i wyd\u0142u\u017cony stan LOW na ponowne wykonanie p\u0119tli loop(). Ale stany HIGH trwa 83 ns, podczas gdy stan LOW jakby po\u0142ow\u0119 tego czasu, czyli 42 ns! Ponownie uruchamiam zbieranie danych (no dobra, kilka razy a\u017c trafiam to, co chc\u0119 poni\u017cej przedstawi\u0107):<\/p>\n<div id=\"attachment_3119\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3119\" class=\"wp-image-3119 size-large\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-20-40-23-1024x379.png\" alt=\"\" width=\"720\" height=\"266\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-20-40-23-1024x379.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-20-40-23-300x111.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-20-40-23-768x285.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-20-40-23.png 1220w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3119\" class=\"wp-caption-text\">Wykres 9a: wynik dzia\u0142ania Programu 6. Ponowne uruchomienie.<\/p><\/div>\n<p>&nbsp;<\/p>\n<div id=\"attachment_3123\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3123\" class=\"wp-image-3123 size-large\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-21-01-48-1024x379.png\" alt=\"\" width=\"720\" height=\"266\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-21-01-48-1024x379.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-21-01-48-300x111.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-21-01-48-768x285.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Zrzut-ekranu-z-2021-09-01-21-01-48.png 1220w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3123\" class=\"wp-caption-text\">Wykres 9b: wynik dzia\u0142ania Programu 6. Ponowne uruchomienie.<\/p><\/div>\n<p>Wykresy 9a i 9b wskazuj\u0105, \u017ce teraz czasy si\u0119 &#8222;odwr\u00f3ci\u0142y&#8221;! HIGH trwa 42 ns, a LOW trwa 83 ns. Jaka\u015b pomy\u0142ka? Nie, bo takie Arduino UNO dzia\u0142a z zegarem 16 MHz, czyli zegar &#8222;klika&#8221; co 1\/16000000 s = 62.5 ns. Programowanie PORD=ile\u015b_tam odbywa si\u0119 w jednej instrukcji asemblera <strong>OUT PORD, ile\u015b_tram<\/strong>, co zgodnie ze<a href=\"https:\/\/ww1.microchip.com\/downloads\/en\/DeviceDoc\/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf\" target=\"_blank\" rel=\"noopener\"> specyfikacj\u0105 ATmegi 328p<\/a> (Tabela 31. Instruction Set Summary) zajmuje w\u0142a\u015bnie 1 CYKL (jeden &#8222;klik&#8221;). Z kolei Saleae pr\u00f3bkuje z cz\u0119sto\u015bci\u0105 24 MHz, czyli w \u0142apie sygna\u0142y w oknach po 1\/24000000 = 42 ns. Sygna\u0142y z Aruino o d\u0142ugo\u015bci 62.5 ns wchodz\u0105 nie do jednego okna, ale do &#8222;jednego i p\u00f3\u0142&#8221; \ud83d\ude09<\/p>\n<p>Wida\u0107, \u017ce zwi\u0119kszyli\u015bmy szybko\u015b\u0107 generowania impuls\u00f3w HIGH\/LOW i teraz pokazuje si\u0119 <strong>Freq = 8 MHz<\/strong> (czyli 2x wi\u0119cej ni\u017c w Programie 5, oraz ponad 50x szybciej ni\u017c Program 2).<\/p>\n<p>My\u015bl\u0119, \u017ce sprawa 42\/83 ns jest ju\u017c to jasne &#8211; ze wzgl\u0119du na brak synchronizacji pracy Saleae i pracy Arduino UNO (no bo sk\u0105d mia\u0142a by by\u0107 taka synchronizacja) analizator raz interpretuje sygna\u0142 jako stan HIGH, a raz jako LOW. Arduino zmienia sygna\u0142y co 63 ns, a pr\u00f3bkowanie odbywa si\u0119 co 42 ns &#8211; schematyczny rysunek powinien to jeszcze raz zobrazowa\u0107:<\/p>\n<div id=\"attachment_3182\" style=\"width: 510px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3182\" class=\"wp-image-3182\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/szkic2-283x300.png\" alt=\"\" width=\"500\" height=\"530\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/szkic2-283x300.png 283w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/szkic2-768x815.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/szkic2.png 775w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><p id=\"caption-attachment-3182\" class=\"wp-caption-text\">Szkic 1: pr\u00f3bkowanie sygna\u0142u z Arduino analizatorem stan\u00f3w logicznych.<\/p><\/div>\n<p>Dodatkowe wyja\u015bnienie Szkicu 1: a) krzywa zielona to sygna\u0142 z Arduino (dzia\u0142a Program 6) &#8211; rzeczywisty (bo trwa 62.5 ns) ale troch\u0119 wyidealizowany (prostok\u0105ty s\u0105 ostre! a dobrej klasy oscyloskop poka\u017ce, \u017ce na zboczach narastaj\u0105cych i opadaj\u0105cych pojawiaj\u0105 si\u0119 oscylacje); b) okno&nbsp; pr\u00f3bkowania analizatorem trwa 42 ns i nie musi trafi\u0107 w pocz\u0105tek\/koniec sygna\u0142u z Arduino &#8211; jest gdziekolwiek; analizator sprawdza, kt\u00f3ry ze stan\u00f3w przewa\u017ca w oknie pr\u00f3bkowania &#8211; stan HIGH czy stan LOW &#8211; i na tej podstawie przypisuje odpowiednio 1 lub 0 (oczywi\u015bcie w omawianym przypadku b) b\u0119dzie to 1, bo przez ca\u0142e okno mamy stan HIGH); c) kilka nast\u0119puj\u0105cych po sobie pr\u00f3bkowa\u0144 &#8211; aby rysunek by\u0142 wyra\u017aniejszy, zmieniam kolor okna pr\u00f3bkowania na ja\u015bniejszy (co drugie pr\u00f3bkowanie); widzimy, \u017ce drugie pr\u00f3bkowanie da\u0142o wynik 0 (przewa\u017ca\u0142 stan LOW), kolejne da\u0142o 1 (stan LOW by\u0142 oko\u0142o 1\/3 czasu, przewa\u017ca\u0142 stan HIGH) a ostatnie pr\u00f3bkowanie ponownie da\u0142o warto\u015b\u0107 1 (znowu przewa\u017ca\u0142 stan HIGH). Ten przyk\u0142ad przedstawia sytuacj\u0119, gdzie odczyt analizatorem pokaza\u0142 by stan wysoki z czasem trwania 42 ns, potem czas niski z tym samym czasem 42 ns, a potem stan wysoki trwaj\u0105cy 84 ns. Takie sytuacje wyst\u0119puj\u0105 podczas eksperyment\u00f3w z Programem 6. \u0141atwo sobie te\u017c wyobrazi\u0107 inny moment startu pr\u00f3bkowania i sytuacj\u0119, gdzie zawsze trafiamy naprzemiennie 84 ns dla jednego stanu i 42 ns dla stanu przeciwnego &#8211; patrz Szkic 2 poni\u017cej.<\/p>\n<div id=\"attachment_3188\" style=\"width: 510px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3188\" class=\"wp-image-3188\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/szkic3-300x128.png\" alt=\"\" width=\"500\" height=\"214\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/szkic3-300x128.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/szkic3.png 762w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><p id=\"caption-attachment-3188\" class=\"wp-caption-text\">Szkic 2: Wyja\u015bnienie dwukrotnie d\u0142u\u017cszego stanu HIGH w stosunku do czasu stanu LOW.<\/p><\/div>\n<p>W powy\u017cszym obrazku wystarczy lekko przesun\u0105\u0107 czas rozpocz\u0119cia pr\u00f3bkowania aby mie\u0107 sytuacj\u0119 odwrotn\u0105 &#8211; czas trwania sygna\u0142u LOW b\u0119dzie 2x d\u0142u\u017cszy od czasu trwania sygna\u0142u HIGH.<\/p>\n<h2>Prawdziwe analizatory Saleae<\/h2>\n<p>Ja u\u017cywam taniego klona, ale oryginalne maj\u0105 nie tylko analizatory cyfrowe, ale i wej\u015bcia analogowe &#8211; to ju\u017c s\u0105 ma\u0142e oscyloskopy! Wyst\u0119puj\u0105 w trzech rodzajach a poni\u017cej tabelka z por\u00f3wnaniem parametr\u00f3w (ze strony Kamami &#8211; kliknij w tabelk\u0119 aby przeskoczy\u0107 do ich sklepu):<\/p>\n<div id=\"attachment_3132\" style=\"width: 641px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kamami.pl\/content\/22-porownanie-cech-analizatorow-logicznych-firmy-saleae\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3132\" class=\"wp-image-3132 size-full\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Saleae-porownanie.png\" alt=\"\" width=\"631\" height=\"477\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Saleae-porownanie.png 631w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Saleae-porownanie-300x227.png 300w\" sizes=\"auto, (max-width: 631px) 100vw, 631px\" \/><\/a><p id=\"caption-attachment-3132\" class=\"wp-caption-text\">Por\u00f3wnanie specyfikacji analizator\u00f3w Saleae.<\/p><\/div>\n<p>Super urz\u0105dzenia, ale na os\u0142odz\u0119 zapa\u0142 naiwnego czytelnika <a href=\"https:\/\/kamami.pl\/15245-analizatory-logiczne-saleae\" target=\"_blank\" rel=\"noopener\">ich cenami:<\/a> zaczynaj\u0105 si\u0119 od nieca\u0142ych 2000 z\u0142 a ko\u0144cz\u0105 na 5500 z\u0142. Mo\u017ce te klony za 30 z\u0142 nie takie z\u0142e? \ud83d\ude09<\/p>\n<h2>BitScope<\/h2>\n<p>To bardzo fajny, hobbystyczny oscyloskop + 8-mio kana\u0142ow analzator stan\u00f3w logicznych za kwot\u0119 ~300 z\u0142. Do jego pracy potrzebny jest komputer z ekranem, a poda\u0142\u0105cza si\u0119 go przez USB. Najlepsze, \u017ce dzia\u0142a on pod Linuxem, Maciem i Windowsem (podre\u015bl\u0119 &#8211; <strong>dzia\u0142a pod Linuxem<\/strong>, wi\u0119c w sieci jest sporo projekt\u00f3w BitScope + Raspberry Pi). Ciekaw\u0105 ofert\u0119 na niego ma <a href=\"https:\/\/botland.store\/oscilloscopes\/5436-bitscope-micro-m5-oscilloscope-usb-logic-states-analyzer-9349078000019.html\" target=\"_blank\" rel=\"noopener\">sklep Botland<\/a>.<\/p>\n<div id=\"attachment_3137\" style=\"width: 569px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3137\" class=\"wp-image-3137 size-full\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/bitscope.png\" alt=\"\" width=\"559\" height=\"495\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/bitscope.png 559w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/bitscope-300x266.png 300w\" sizes=\"auto, (max-width: 559px) 100vw, 559px\" \/><p id=\"caption-attachment-3137\" class=\"wp-caption-text\">Oscyloskop cyfrowy BitScope &#8211; ma\u0142y, ale dzik! \ud83d\ude09<\/p><\/div>\n<p>Parametry tego urz\u0105dzenia s\u0105 bardzo przyzwoite jak na cele hobbystyczne (do nauki elektroniki, analizy uk\u0142ad\u00f3w LRC czy innych) i wynosz\u0105: <strong>pr\u00f3bkowanie 20 MHz z 40Msps<\/strong>. Jednak to nie wystarcza, aby poprawnie zinterpretowa\u0107 wynik Programu 5:<\/p>\n<div id=\"attachment_3138\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3138\" class=\"wp-image-3138 size-large\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/1-1024x638.png\" alt=\"\" width=\"720\" height=\"449\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/1-1024x638.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/1-300x187.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/1-768x479.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/1-436x272.png 436w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/1.png 1149w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3138\" class=\"wp-caption-text\">Wynik Programu 5 na BitScopie.<\/p><\/div>\n<p>Dzia\u0142am tutaj na maksymalnej cz\u0119sto\u015bci 20MHz (podzia\u0142a czasowa 1 us) i cho\u0107 wida\u0107 tr\u00f3jki pik\u00f3w &#8211; to s\u0142abo z precyzyjnym odczytaniem ich czas\u00f3w. Prze\u0142\u0105czenie BitScopa w tryb analizatora stan\u00f3w logicznych pomaga &#8211; cho\u0107 i tak jest s\u0142abszy ni\u017c omawiany klon Saleae ze wzgl\u0119du na pr\u00f3bkowanie jedynie 20 MHz (przypominam: Saleae ma 24 MHz).<\/p>\n<h2>RIGOL 1204B<\/h2>\n<p>Skoro testuj\u0119 r\u00f3\u017cne sprz\u0119ty, to przedstawi\u0119 profesjonalny oscyloskop stacjonarny za kwot\u0119 oko\u0142o ~5000 z\u0142 (cho\u0107 tak wysoka cena wynika z posiadania a\u017c czterech kana\u0142\u00f3w &#8211; podczas gdy typowo mamy dwa kana\u0142y analogowe; odpowiedni model z dwoma kana\u0142ami to ju\u017c wydatek jedynie ~3500 z\u0142). Ju\u017c na obudowie mo\u017cna odczyta\u0107, \u017ce oscyloskop ten <strong>pracuje z 200 MHz i 2 Gsps<\/strong>.<\/p>\n<div id=\"attachment_3167\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3167\" class=\"wp-image-3167 size-large\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2255-1024x576.jpg\" alt=\"\" width=\"720\" height=\"405\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2255-1024x576.jpg 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2255-300x169.jpg 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2255-768x432.jpg 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2255-1536x864.jpg 1536w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2255.jpg 1800w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3167\" class=\"wp-caption-text\">Program 6 na oscyloskopie. Wida\u0107 brak idealnych prostok\u0105t\u00f3w w rogach sygna\u0142\u00f3w.<\/p><\/div>\n<p>Nie b\u0119d\u0119 robi\u0107 telefonem screen-shot\u00f3w tylko wykorzystam funkcj\u0119 USB i zapisu przebiegu z oscyloskopu bezpo\u015brednio na pendrv (mog\u0119 do CSV, jaki\u015b innych format\u00f3w lub obrazka PNG &#8211; jednak jest to zrzut ekranu graficznego dzia\u0142aj\u0105cego w trybie 320&#215;240 pikseli &#8211; i dlatego rozdzielczo\u015b\u0107 plik\u00f3w PNG nie powala).<\/p>\n<div id=\"attachment_3169\" style=\"width: 330px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3169\" class=\"wp-image-3169 size-full\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/PNG_20219272841.png\" alt=\"\" width=\"320\" height=\"240\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/PNG_20219272841.png 320w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/PNG_20219272841-300x225.png 300w\" sizes=\"auto, (max-width: 320px) 100vw, 320px\" \/><p id=\"caption-attachment-3169\" class=\"wp-caption-text\">Tak zapisuje RIGOL swoje screenshoty do formatu PNG (szkoda, \u017ce takie to ma\u0142e!). S\u0105 inne formaty (CSV, WAVEFORM).<\/p><\/div>\n<p>&nbsp;<\/p>\n<div id=\"attachment_3176\" style=\"width: 330px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3176\" class=\"wp-image-3176 size-full\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/PNG_20219273016.png\" alt=\"\" width=\"320\" height=\"240\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/PNG_20219273016.png 320w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/PNG_20219273016-300x225.png 300w\" sizes=\"auto, (max-width: 320px) 100vw, 320px\" \/><p id=\"caption-attachment-3176\" class=\"wp-caption-text\">Powi\u0119kszenie na pojedynczy pik (skala x=20 ns) &#8211; pomiar d\u0142ugo\u015bci trwania (tak ustawi\u0142em kurosry, \u017ce mi wysz\u0142o 69.6 ns).<\/p><\/div>\n<p>&nbsp;<\/p>\n<div id=\"attachment_3179\" style=\"width: 330px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3179\" class=\"wp-image-3179 size-full\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/PNG_20219273135.png\" alt=\"\" width=\"320\" height=\"240\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/PNG_20219273135.png 320w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/PNG_20219273135-300x225.png 300w\" sizes=\"auto, (max-width: 320px) 100vw, 320px\" \/><p id=\"caption-attachment-3179\" class=\"wp-caption-text\">Pomiar ponownego wywo\u0142ania funkcji loop() &#8211; wychodzi mi 296 ns.<\/p><\/div>\n<h2>A tani chi\u0144czyk? DSO188<\/h2>\n<p>Ten miniaturowy oscyloskopik &#8222;zabawka&#8221; ma kolorowy ekranik LCD 1.8 cala (nie potrzebuje wi\u0119c komputera!) oraz wbudowan\u0105 bateri\u0119, czyli dzia\u0142a &#8222;w terenie&#8221; \ud83d\ude09 Jego parametry <strong>pr\u00f3bkowania to 1 MHz oraz 5 Msps<\/strong> co od razu wskazuje, \u017ce du\u017co tutaj nie zdzia\u0142a (dodam jeszcze: to oscyloskop <strong>jednokana\u0142owy<\/strong> bez analizatora stan\u00f3w). Jednak za kwot\u0119 oko\u0142o ~200 z\u0142 mamy fajn\u0105 zabawk\u0119 do przyg\u00f3d z Arduino &#8211; i nie musimy go pod\u0142\u0105cz\u0105\u0107 do przewod\u00f3w zasilaj\u0105cych!<\/p>\n<div id=\"attachment_3171\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3171\" class=\"wp-image-3171 size-large\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2256-e1630568279498-1024x576.jpg\" alt=\"\" width=\"720\" height=\"405\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2256-e1630568279498-1024x576.jpg 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2256-e1630568279498-300x169.jpg 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2256-e1630568279498-768x432.jpg 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2256-e1630568279498-1536x864.jpg 1536w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2256-e1630568279498.jpg 1800w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3171\" class=\"wp-caption-text\">DSO 188 z programem 5. Tiaaaa&#8230;<\/p><\/div>\n<p>Cho\u0107 nie poradzi\u0142 sobie, to jednak go polecam! Oczywi\u015bcie po chwili zastanowienia, bo BitScope jest zdecydowanie lepszy, ale musi by\u0107 pod\u0142\u0105czony do komputera. Ten dzia\u0142a niezale\u017cnie (szybko i na baterii). Poni\u017cej zdj\u0119cie z Programem 3:<\/p>\n<div id=\"attachment_3172\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3172\" class=\"wp-image-3172 size-large\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2250-e1630568323327-1024x576.jpg\" alt=\"\" width=\"720\" height=\"405\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2250-e1630568323327-1024x576.jpg 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2250-e1630568323327-300x169.jpg 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2250-e1630568323327-768x432.jpg 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2250-e1630568323327-1536x864.jpg 1536w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/DSC_2250-e1630568323327.jpg 1800w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3172\" class=\"wp-caption-text\">DSO188 z Programem 3 &#8211; jest dobrze!<\/p><\/div>\n<p>Jak wida\u0107 wyra\u017anie odczytujemy sygna\u0142y zmieniaj\u0105ce si\u0119 co 1 ms, o czasie trwania 1ms (podzia\u0142ka 500 us, a na wykresie mamy bia\u0142\u0105 krzyw\u0105 pokrywaj\u0105c\u0105 dwie podzia\u0142ki &#8211; czyli 1000 us = 1ms w\u0142a\u015bnie). Gdzie go kupi\u0107? Polecam <a href=\"https:\/\/www.gotronik.pl\/dso188-mini-oscyloskop-przenosny-1mhz-jednokanalowy-p-5083.html\" target=\"_blank\" rel=\"noopener\">gotronika<\/a> (ma te\u017c filmy z wideo-recenzjami) i aukcje w popularnych serwisach.<\/p>\n<h2>Minikombaj AVR<\/h2>\n<p>No to jeszcze jeden, ostatni (ale nie najs\u0142abszy). Jest to <strong>dwukana\u0142owy<\/strong> oscyloskop dzia\u0142aj\u0105cy na bateriach, z monochromatycznym ekranikiem i <strong>pr\u00f3bkowaniem 0,3 MHz. <\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3160\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/large_AVT2999.jpg\" alt=\"\" width=\"395\" height=\"460\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/large_AVT2999.jpg 395w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/large_AVT2999-258x300.jpg 258w\" sizes=\"auto, (max-width: 395px) 100vw, 395px\" \/><\/p>\n<p>Jest to sprz\u0119t sprzedawany przez <a href=\"https:\/\/sklep.avt.pl\/avt2999.html\" target=\"_blank\" rel=\"noopener\">firm\u0119 AVR jako kit 2999<\/a>. To nie tylko oscyloskopik ale i generator fal, widma&#8230;<\/p>\n<p><span style=\"color: inherit; font-size: 1.95em; font-weight: 600;\">Ile trwa wywo\u0142anie funkcji loop()?<\/span><\/p>\n<p>Wychodzi na to, \u017ce ponowne wywo\u0142anie loop()-a trwa 300 ns (plus jeszcze epsilon). Z czego to wynika? Na t\u0105 chwil\u0119 powiem, \u017ce trzeba wywo\u0142a\u0107 instrukcj\u0119 skoku do funkcji &#8211; a tych jest kilka rodzaj\u00f3w. Poni\u017cej <strong>poka\u017c\u0119, \u017ce da si\u0119 skr\u00f3ci\u0107 to 300 ns o 1\/3<\/strong>! Poni\u017cszy fragment tylko dla zuchwa\u0142ych \ud83d\ude09<\/p>\n<p><span style=\"color: inherit; font-size: 1.95em; font-weight: 600;\">Tylko dla twardzieli &#8211; programujemy w asemblerze<\/span><\/p>\n<p>Nie b\u0119dzie to czysty asembler, a wstawka asemblera w j\u0119zyk Arduino. Dlaczego taka hybryda? Aby upro\u015bci\u0107 i nie zniech\u0119ci\u0107 zwyk\u0142ego cz\u0142owieka \ud83d\ude09<\/p>\n<div id=\"attachment_3234\" style=\"width: 605px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3234\" class=\"wp-image-3234 size-full\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm1.png\" alt=\"\" width=\"595\" height=\"479\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm1.png 595w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm1-300x242.png 300w\" sizes=\"auto, (max-width: 595px) 100vw, 595px\" \/><p id=\"caption-attachment-3234\" class=\"wp-caption-text\">Program 7: programowanie ze wstrzykni\u0119ciem kodu w asemblerze.<\/p><\/div>\n<p>Funkcja setup() jest taka sama jak w Programie 6, czyli ustawiamy rejestr DDRD na OUTPUT. Robi\u0119 to bez asemblera, jak poprzednio. Wstawka w asemblerze pojawia si\u0119 dopiero w funkcji loop() &#8211; po makrze __asm__(&nbsp;<em>instrukcje<\/em> ); Jednak nie wida\u0107 odwo\u0142a\u0144 do rejestru PORTD. Nazwa tego rejestru dla wstrzykni\u0119tego kodu asemblera nie jest rozpoznawalna (mo\u017cna to obej\u015b\u0107, zdefiniowa\u0107, ale nie chcia\u0142em zaciemnia\u0107 programu). Dlatego pojawia si\u0119 adres 0x0B, czyli w\u0142a\u015bnie PORTD (sprawd\u017a w specyfikacji ATmegi328p, a dla leniwych podpowiem: przyjrzyj si\u0119 punktowi 13.4.8). Wstawka w asemblerze to para instrukcji:<\/p>\n<pre>sbi 0x0B,7<br>cbi 0x0B,7<\/pre>\n<p>Instrukcje te w kodzie Arduino zako\u0144czone s\u0105 przej\u015bciem do nowej linii (mog\u0142a by\u0107 spacja, lub tabulator&#8230; pojawia si\u0119 dodatkowe <em>\\n<\/em> na koniec ka\u017cdej linii). SBI to instrukcja &#8222;Set Bit in I\/O regiter&#8221;, po kt\u00f3rej podajemy kt\u00f3ry bit ma by\u0107 ustawiony na 1 (u mnie: ma to by\u0107 7-my bit w rejestrze 0x0B czyli PD7). Potem nast\u0119puje czyszczenie tego bitu, czyli CBI &#8211; &#8222;Clear Bit in I\/O register&#8221; (u mnie: czyszcz\u0119 na zero bit 7, czyli w\u0142a\u015bnie PD7). Ka\u017cda z tych instrukcji wymaga 2 cykl\u00f3w, wi\u0119c dzia\u0142anie Programu 7 widoczne jest na wykresach poni\u017cej:<\/p>\n<div id=\"attachment_3235\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3235\" class=\"wp-image-3235 size-large\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm2-w-1024x368.png\" alt=\"\" width=\"720\" height=\"259\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm2-w-1024x368.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm2-w-300x108.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm2-w-768x276.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm2-w.png 1236w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3235\" class=\"wp-caption-text\">Wykres 10: wynik programu 7.<\/p><\/div>\n<p>Sygna\u0142 HIGH trwa 2&#215;62.5 ns czyli 125 ns, tyle samo trwa sygna\u0142 LOW, a ponowne uruchomienie loop()-a to 300 ns &#8211; razem 500 ns, co zgadza si\u0119 z powy\u017cszym rysunkiem. Lekko zmodyfikujmy kod, aby jak poprzednio generowane by\u0142y 3 prze\u0142\u0105czenia:<\/p>\n<div id=\"attachment_3236\" style=\"width: 605px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3236\" class=\"size-full wp-image-3236\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm3.png\" alt=\"\" width=\"595\" height=\"539\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm3.png 595w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm3-300x272.png 300w\" sizes=\"auto, (max-width: 595px) 100vw, 595px\" \/><p id=\"caption-attachment-3236\" class=\"wp-caption-text\">Program 7a: trzykrotne prze\u0142\u0105czenie pinu 7 w Arduino, kod w asemblerze.<\/p><\/div>\n<p>Wynik jest \u0142atwy do przewidzenia, poni\u017cej obraz:<\/p>\n<div id=\"attachment_3237\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3237\" class=\"size-large wp-image-3237\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm3-w-1024x368.png\" alt=\"\" width=\"720\" height=\"259\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm3-w-1024x368.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm3-w-300x108.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm3-w-768x276.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm3-w.png 1236w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3237\" class=\"wp-caption-text\">Wykres 10a: wynik programy 7a.<\/p><\/div>\n<p>Zwr\u00f3\u0107 uwag\u0119, \u017ce wida\u0107 trzy r\u00f3wne sygna\u0142y HIGH (ka\u017cdy po 125 ns), rozdzielone doma przerwami (tak\u017ce po 125 ns &#8211; a trzecia przerwa, ostatnia d\u0142u\u017csza &#8211; o kolejne 300 ns). Ale ale, poprzednio powiedzieli\u015bmy sobie, \u017ce operacje bitowe (SBI, CLI) trwaj\u0105 &#8222;a\u017c&#8221; 2 cykle, i aby to przyspieszy\u0107, mo\u017cna zast\u0105pi\u0107 to bezpo\u015brednim zmienieniem ca\u0142ego rejestru (nadpisaniem). W asemblerze robi si\u0119 to przez instrukcj\u0119 OUT a kod powinien wygl\u0105da\u0107 tak:<\/p>\n<p>OUT 0x0B, 0x80<\/p>\n<p>Czyli chcemy zapisa\u0107 bajt B1000000 (przypominam: 7 bit 1, reszta 0) do rejestru PORTD (0x0B). W asemblerze nie mog\u0119 u\u017cy\u0107 Arduiinowego B10000000 wi\u0119c powinienem wpisa\u0107 warto\u015b\u0107 128 (dziesi\u0119tnie), czyli 0x80 (szesnastkowo). Jednak&#8230; instrukcja OUT tego nie przyjmie. Ona \u0142aduje do rejestru 0x0B nie konkretn\u0105 warto\u015b\u0107, ale warto\u015b\u0107 innego rejestru. Trzeba wi\u0119c najpierw zapisa\u0107 sobie warto\u015b\u0107 0x80 do wolnego, roboczego rejestru (ja to zrobi\u0119 do rejestru r16) a nast\u0119pnie tak go wykorzystam:<\/p>\n<p>OUT 0x0B, r16<\/p>\n<p>Ca\u0142o\u015b\u0107 wygl\u0105da tak:<\/p>\n<div id=\"attachment_3241\" style=\"width: 605px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3241\" class=\"wp-image-3241 size-full\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm4.png\" alt=\"\" width=\"595\" height=\"539\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm4.png 595w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm4-300x272.png 300w\" sizes=\"auto, (max-width: 595px) 100vw, 595px\" \/><p id=\"caption-attachment-3241\" class=\"wp-caption-text\">Program 8a: nadpisanie ca\u0142ego rejestru PORTD bez instrukcji SBI\/CBI.<\/p><\/div>\n<p>&nbsp;<\/p>\n<div id=\"attachment_3243\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3243\" class=\"size-large wp-image-3243\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm4-w-1024x368.png\" alt=\"\" width=\"720\" height=\"259\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm4-w-1024x368.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm4-w-300x108.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm4-w-768x276.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm4-w.png 1236w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3243\" class=\"wp-caption-text\">Wykres 11a: wynik dzia\u0142ania Proramu 8a. Stan HIGH trwa kr\u00f3tko (w rzeczywisto\u015bci 62ns, ale dla analizatora to 42 ns).<\/p><\/div>\n<p>Oczywi\u015bcie w kodzie pojawi\u0142 si\u0119 te\u017c roboczy rejestr r17, kt\u00f3ry przechowuje warto\u015b\u0107 zero. No i kolejna drobnostka: jeden raz, na pocz\u0105tku w setup()-ie, \u0142aduj\u0119 odpowiednie warto\u015bci do rejestr\u00f3w r16 i r17 (nie chc\u0119 tego robi\u0107 za ka\u017cdym razem, bo bym traci\u0142 kolejne cykle na wywo\u0142anie instrukcji LDI). Minimalna modyfikacja kodu o generowanie trzech prze\u0142\u0105cze\u0144:<\/p>\n<div id=\"attachment_3244\" style=\"width: 605px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3244\" class=\"wp-image-3244 size-full\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5.png\" alt=\"\" width=\"595\" height=\"622\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5.png 595w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5-287x300.png 287w\" sizes=\"auto, (max-width: 595px) 100vw, 595px\" \/><p id=\"caption-attachment-3244\" class=\"wp-caption-text\">Program 8b: trzy prze\u0142\u0105czenia!<\/p><\/div>\n<p>Wynik dzia\u0142ania poni\u017cej (dwie wersje, bo raz analizator informuje o 42 ns, a raz o 82 ns &#8211; mam nadziej\u0119, \u017ce wiesz, dlaczego):<\/p>\n<div id=\"attachment_3245\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3245\" class=\"size-large wp-image-3245\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5-w2-1024x368.png\" alt=\"\" width=\"720\" height=\"259\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5-w2-1024x368.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5-w2-300x108.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5-w2-768x276.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5-w2.png 1236w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3245\" class=\"wp-caption-text\">Wykres 12a: wynik programu 8b. Pomiar d\u0142ugo\u015bci sygna\u0142u HIGHT.<\/p><\/div>\n<p>&nbsp;<\/p>\n<div id=\"attachment_3247\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3247\" class=\"size-large wp-image-3247\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5-w3-1024x368.png\" alt=\"\" width=\"720\" height=\"259\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5-w3-1024x368.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5-w3-300x108.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5-w3-768x276.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5-w3.png 1236w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3247\" class=\"wp-caption-text\">Wykres 12b: wynik programu 8b. Pomiar d\u0142ugo\u015bci przerwy loop(), czyli 333 ns (minus jeden OUT).<\/p><\/div>\n<p>&nbsp;<\/p>\n<div id=\"attachment_3246\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3246\" class=\"size-large wp-image-3246\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5-w-1024x368.png\" alt=\"\" width=\"720\" height=\"259\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5-w-1024x368.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5-w-300x108.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5-w-768x276.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm5-w.png 1236w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3246\" class=\"wp-caption-text\">Wykres 12c: wynik programu 8b &#8211; kolejne uruchomienie, zamiana czas\u00f3w HIGH\/LOW.<\/p><\/div>\n<p>Ponownie widzimy mega-szybkie prze\u0142\u0105czanie pin\u00f3w (8 MHz), a czas trwania przerwy pomi\u0119dzy tr\u00f3jkami pik\u00f3w wynosi 333 ns. <strong>Ale 333 ns mo\u017cna jeszcze ulepszy\u0107!<\/strong> Czyli skr\u00f3ci\u0107 przerw\u0119 pomi\u0119dzy kolejnymi wywo\u0142aniami funkcji loop() &#8211; a w\u0142a\u015bciwie zrobi\u0107 tak, aby loop() wywo\u0142a\u0142a si\u0119 tylko jeden raz, a wewn\u0105trz niej bezwarunkowo odbywa\u0142 si\u0119 skok do zdefiniowanego miejsca w kodzie.<\/p>\n<div id=\"attachment_3248\" style=\"width: 605px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3248\" class=\"size-full wp-image-3248\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm6.png\" alt=\"\" width=\"595\" height=\"622\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm6.png 595w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm6-287x300.png 287w\" sizes=\"auto, (max-width: 595px) 100vw, 595px\" \/><p id=\"caption-attachment-3248\" class=\"wp-caption-text\">Program 9: skok wewn\u0105trz kodu asemblera.<\/p><\/div>\n<p>W tej wersji wstrzykni\u0119tego kodu asemblera definiuj\u0119 (linia 10) adres kodu jako Loop a nast\u0119pnie, po wykonaniu trzech prze\u0142\u0105cze\u0144 (jak poprzednio, w Programie 8) wykonuj\u0119 bezwarunkowy skok do tego miejsca programu (instrukcja RJMP, kt\u00f3ra trwa 2 cykle zegara &#8211; i st\u0105d to przyspieszenie!). W takiej wersji programu funkcja loop() wykonuje si\u0119 tylko jeden raz, a ponowne skoki do prze\u0142\u0105cze\u0144 &#8211; wewn\u0105trz niej. <strong>Szybciej si\u0119 nie da!<\/strong> Wynik poni\u017cej.<\/p>\n<div id=\"attachment_3249\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3249\" class=\"size-large wp-image-3249\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm6-w1-1024x368.png\" alt=\"\" width=\"720\" height=\"259\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm6-w1-1024x368.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm6-w1-300x108.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm6-w1-768x276.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm6-w1.png 1236w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3249\" class=\"wp-caption-text\">Wykres 13a: wynik programu 9 &#8211; tr\u00f3jki stan\u00f3w HIGH\/LOW, super szybkie&#8230;<\/p><\/div>\n<p>&nbsp;<\/p>\n<div id=\"attachment_3250\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3250\" class=\"size-large wp-image-3250\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm6-w2-1024x368.png\" alt=\"\" width=\"720\" height=\"259\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm6-w2-1024x368.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm6-w2-300x108.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm6-w2-768x276.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm6-w2.png 1236w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3250\" class=\"wp-caption-text\">Wykres 13b: wynik programu 9 &#8211; najkr\u00f3tsze op\u00f3\u017anienie pomi\u0119dzy skokiem programu!<\/p><\/div>\n<p>Na koniec co\u015b dla zakochanych w asemblerze &#8211; ka\u017cdy <em>asemblerowiec<\/em> zna instrukcj\u0119 NOP (no operation &#8211; pusty przebieg jednego cyklu, czyli nic-nie-robienie). Wbrew pozorom instrukcja NOP jest super u\u017cyteczna, np. w celu wprowadzenia pauzy (op\u00f3\u017anienia). Z tabeli 31 wiemy, \u017ce NOP trwa 1 cykl zegara, czyli wywo\u0142anie tej instrukcji to przerwa na 62.5 ns. Mo\u017cna zdefiniowa\u0107 p\u0119tl\u0119 takich instrukcji, aby mie\u0107 funkcj\u0119 czekaj\u0105c\u0105 np. 10 us itd. Poni\u017cej jednak ogranicz\u0119 si\u0119 do pojedynczego spowalniania kodu:<\/p>\n<div id=\"attachment_3251\" style=\"width: 605px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3251\" class=\"size-full wp-image-3251\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm7.png\" alt=\"\" width=\"595\" height=\"708\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm7.png 595w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm7-252x300.png 252w\" sizes=\"auto, (max-width: 595px) 100vw, 595px\" \/><p id=\"caption-attachment-3251\" class=\"wp-caption-text\">Program 10: kod w asemblerze z instrukcj\u0105 NOP (no operation).<\/p><\/div>\n<p>Jak mo\u017cna si\u0119 spodziewa\u0107 &#8211; sygna\u0142 HIGH trwa 2 cykle (bo jeden to NOP, a drugie to dzias\u0142anie OUT-a), a ponim pojawia si\u0119 sygna\u0142 LOW rozdzielony 1 cyklem (analizator wska\u017ce czasami 42 ns, czasmi 84 ns).<\/p>\n<div id=\"attachment_3252\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3252\" class=\"size-large wp-image-3252\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm7-w1-1024x368.png\" alt=\"\" width=\"720\" height=\"259\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm7-w1-1024x368.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm7-w1-300x108.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm7-w1-768x276.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/asm7-w1.png 1236w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3252\" class=\"wp-caption-text\">Wykres 14: wynik dzia\u0142ania programu 10.<\/p><\/div>\n<h2>Podsumowanie<\/h2>\n<p>Wykorzystuj\u0105c analizator stan\u00f3w logicznych Saleae uda\u0142o si\u0119 sprawdzi\u0107, \u017ce porty Arduino mo\u017cemy prze\u0142\u0105cza\u0107 z cz\u0119stotliwo\u015bci\u0105 150 kHz gdy programujemy w dialekcie Arduino (z wykorzystaniem funkcji digitalWrite(), por\u00f3wnaj Program 2), albo nawet 8 MHz (<strong>czyli ponad 50x szybciej!<\/strong>) gdy programujemy bezpo\u015brednio rejestry ATmegi (PORTD, por\u00f3wnaj Program 6). My\u015bl\u0119, \u017ce pos\u0142ugiwanie si\u0119 portami nie jest trudne, cho\u0107 wymaga wykorzystania operacji logicznych na bitach (ale mo\u017cna zyska\u0107 nawet 50x przyspieszenie!). Okazuje si\u0119 tak\u017ce, \u017ce ponowne wywo\u0142anie funkcji loop() nie jest &#8222;za darmo&#8221; &#8211; to te\u017c przerwa ~300 ns (lub 200 ns, je\u015bli chcemy si\u0119 bawi\u0107 w asembler). Mam nadziej\u0119, \u017ce prezentacja r\u00f3\u017cnych oscyloskop\u00f3w by\u0142a ciekawa.<\/p>\n<p>O tym, \u017ce programuj\u0105c bezpo\u015brednio rejestry port\u00f3w zyskujemy bardzo du\u017co &#8211; niech przem\u00f3wi\u0105 poni\u017csze przyk\u0142ady zbudowania 8-bitowego wyj\u015bcia analogowego dla Arduino i wygenerowanie przebiegu pi\u0142okszta\u0142tnego i sinusa (wiadomo, jestem fizykiem, st\u0105d tak ma\u0142o wyszukane przyk\u0142ady&#8230;). Jest to temat z jednego z wyk\u0142ad\u00f3w, a tutaj przedstawi\u0119 tylko kilka wynik\u00f3w:<\/p>\n<div id=\"attachment_3261\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3261\" class=\"size-large wp-image-3261\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Arduino_analogOUT-1024x576.png\" alt=\"\" width=\"720\" height=\"405\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Arduino_analogOUT-1024x576.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Arduino_analogOUT-300x169.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Arduino_analogOUT-768x432.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Arduino_analogOUT-1536x864.png 1536w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Arduino_analogOUT.png 1800w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3261\" class=\"wp-caption-text\">Arduino z 8-bitowym analogowym wyj\u015bciem (drabinka R2R). Uk\u0142ad z wyk\u0142adu dla student\u00f3w z fizyki.<\/p><\/div>\n<p>&nbsp;<\/p>\n<div id=\"attachment_3260\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3260\" class=\"size-large wp-image-3260\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Arduino_OUT-1024x493.png\" alt=\"\" width=\"720\" height=\"347\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Arduino_OUT-1024x493.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Arduino_OUT-300x144.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Arduino_OUT-768x370.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Arduino_OUT.png 1353w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3260\" class=\"wp-caption-text\">Wykres 15: por\u00f3wnanie cz\u0119stotliwo\u015bci generowanych sygna\u0142\u00f3w analogowych: (lewa strona) programowanie w dialekcie Arduino, (prawa strona) programowanie port\u00f3w. Przyspieszenie 25x. Dodatkowo: lewy obraz mocno zaszumiony. Wykorzystano BitScope.<\/p><\/div>\n<p>&nbsp;<\/p>\n<div id=\"attachment_3262\" style=\"width: 730px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3262\" class=\"size-large wp-image-3262\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Arduin_OUTsin-1024x491.png\" alt=\"\" width=\"720\" height=\"345\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Arduin_OUTsin-1024x491.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Arduin_OUTsin-300x144.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Arduin_OUTsin-768x368.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2021\/09\/Arduin_OUTsin.png 1417w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><p id=\"caption-attachment-3262\" class=\"wp-caption-text\">Wykres 16: por\u00f3wnanie cz\u0119stotliwo\u015bci generowanych sygna\u0142\u00f3w analogowych: (lewa strona) programowanie w dialekcie Arduino, (prawa strona) programowanie port\u00f3w. Przyspieszenie 20x. Dodatkowo: szumy dla pierwszego przypadku. Wykorzystano BitScope.<\/p><\/div>\n<h2>Odczytywanie sygna\u0142\u00f3w &#8211; przerwania<\/h2>\n<p>Niebawem&#8230;..<\/p>\n<pre>&nbsp;<\/pre>\n<pre>void setup() {<br> &nbsp; Serial.begin(9600);<br>}<\/pre>\n<pre>int licz=0;<br>void loop() {<br>   Serial.print(millis());<br>   Serial.print(\" \");<br>   licz++;<br>}<\/pre>\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Autorzy: KG + ?Zaawansowanie: badania trwaj\u0105, s\u0105 ju\u017c wst\u0119pne wynikiCel: wiedza, wiedza, wiedza &#8211; potem prze\u0142o\u017cona na praktyk\u0119 Motywacja Mikrokontroler ATmega 328P znajduj\u0105cy si\u0119 w platformie Arduino UNO (i innych, ale ta jest najbardziej popularna) dysponuje 14-toma wej\u015bciami\/wyj\u015bciami cyfrowymi (skupiam si\u0119 jedynie na portach cyfrowych, pomijam analogowe). Porty te zgrupowane s\u0105 w trzech bankach (B,C,D) [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":3094,"parent":1715,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ngg_post_thumbnail":0,"footnotes":""},"class_list":["post-3086","page","type-page","status-publish","has-post-thumbnail","hentry","post","post-with-thumbnail","post-with-thumbnail-large"],"_links":{"self":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/pages\/3086","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3086"}],"version-history":[{"count":66,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/pages\/3086\/revisions"}],"predecessor-version":[{"id":3371,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/pages\/3086\/revisions\/3371"}],"up":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/pages\/1715"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/media\/3094"}],"wp:attachment":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3086"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}