{"id":989,"date":"2017-12-12T20:52:32","date_gmt":"2017-12-12T20:52:32","guid":{"rendered":"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=989"},"modified":"2017-12-14T20:58:23","modified_gmt":"2017-12-14T20:58:23","slug":"rejestr-przesuwny-74hc595","status":"publish","type":"post","link":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=989","title":{"rendered":"Rejestr przesuwny 74HC595"},"content":{"rendered":"<p>Na ostatnich zaj\u0119ciach nadal zajmowali\u015bmy si\u0119 programowaniem wy\u015bwietlaczy siedmiosegmentowych. W przypadku pod\u0142\u0105czania wy\u015bwietlacza bezpo\u015brednio do Arduino, zajmujemy a\u017c <strong>osiem pin\u00f3w cyfrowych<\/strong>. To sprawia, \u017ce p\u0142ytka Arduino UNO (wyposa\u017cona w 14 wej\u015b\u0107\/wyj\u015b\u0107 cyfrowych) mo\u017ce sterowa\u0107 tylko jednym wy\u015bwietlaczem. Mo\u017cna co prawda wykorzysta\u0107 piny analogowe (A0..A5) jako cyfrowe, ale to da mo\u017cliwo\u015b\u0107 pod\u0142\u0105czenia jedynie drugiego wy\u015bwietlacza. To ma\u0142o. Jest jednak spos\u00f3b, aby sterowa\u0107 <strong>wieloma<\/strong> wy\u015bwietlaczami bez straty wszystkich pin\u00f3w cyfrowych. Umo\u017cliwia nam to rejestr przesuwny 74HC595. Dzi\u0119ki temu ma\u0142emu uk\u0142adowi scalonemu mamy mo\u017cliwo\u015b\u0107 sterowania osmioma wyj\u015bciami za pomoc\u0105&nbsp;<strong>jedynie trzech pin\u00f3w<\/strong> cyfrowych z Arduino. Bardziej szczeg\u00f3\u0142owe informacje o tym uk\u0142adzie znajduj\u0105 si\u0119 w jego specyfikacji technicznej (ang. <a href=\"https:\/\/www.sparkfun.com\/datasheets\/IC\/SN74HC595.pdf\">datasheet)<\/a>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-993\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/rejestr-przesuwny-300x300.jpg\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/rejestr-przesuwny-300x300.jpg 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/rejestr-przesuwny-150x150.jpg 150w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/rejestr-przesuwny-768x768.jpg 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/rejestr-przesuwny.jpg 800w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<h1>Pod\u0142\u0105czanie rejestru przesuwnego<\/h1>\n<p>Rejestr przesuwny pod\u0142\u0105czamy u\u017cywaj\u0105c schematu pokazanego poni\u017cej. Nale\u017cy zwr\u00f3ci\u0107 uwag\u0119 na wy\u017c\u0142obienie po jednej stronie uk\u0142adu, kt\u00f3re oznacza g\u00f3rn\u0105 cz\u0119\u015b\u0107.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-994\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/piny-270x300.png\" alt=\"\" width=\"270\" height=\"300\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/piny-270x300.png 270w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/piny.png 312w\" sizes=\"auto, (max-width: 270px) 100vw, 270px\" \/><\/p>\n<p>Wyj\u015bcie <strong>8 (GND)<\/strong> pod\u0142\u0105czamy standardowo do pinu o tej samej nazwie na Arduino. Uk\u0142ad wymaga zasilania (to oczywiste) &#8211; kt\u00f3re pod\u0142\u0105czamy do pinu <strong>16 (VCC)<\/strong>. Rejstr akceptuje zasilanie z przedzia\u0142u od 2 do 6V &#8211; dlatego pin 16 \u015bmia\u0142o \u0142\u0105czymy z pinem 5V w Arduino UNO. Dodatkowo wyj\u015bcia 10 i 16 rejestru \u0142\u0105czymy ze sob\u0105 (10 to pin odpowiedzialny za czyszczenie stan\u00f3w rejestru &#8211; my to b\u0119dziemy robi\u0107 &#8222;r\u0119cznie&#8221;, wi\u0119c ustawiamy go w stan wysoki). Kluczowe s\u0105 wyj\u015bcie <strong>14, 12 i 11<\/strong>&nbsp;rejestru, kt\u00f3re steruj\u0105 jego prac\u0105 &#8211; \u0142\u0105czymy je z wybranymi pinami cyfrowymi Arduino (ja wybra\u0142am piny 8,9 i 10 na mojej p\u0142ytce Arduino). Osiem wyj\u015b\u0107 rejestru (<strong>QA..QH<\/strong>, czyli piny <strong>15, 1..7<\/strong>) pod\u0142\u0105czamy do kolejnych led\u00f3w na wy\u015bwietlaczu wed\u0142ug tego schematu:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-997\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/opis-diod-151x300.jpg\" alt=\"\" width=\"151\" height=\"300\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/opis-diod-151x300.jpg 151w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/opis-diod.jpg 226w\" sizes=\"auto, (max-width: 151px) 100vw, 151px\" \/><\/p>\n<p>Oczywi\u015bcie aby uk\u0142ad dzia\u0142a\u0142 prawid\u0142owo, do wy\u015bwietlacza siedmiosegmentowego r\u00f3wnie\u017c nale\u017cy pod\u0142\u0105czy\u0107 zasilanie i odpowiedni rezystor (poprzednie zaj\u0119cia).<\/p>\n<h1>Opis pin\u00f3w i spos\u00f3b dzia\u0142ania rejestru<\/h1>\n<p>Do pin\u00f3w cyfrowych Arduino pod\u0142\u0105czamy trzy wyj\u015bcia rejestru. S\u0105 one kluczowe we wzajemnej komunikacji.<\/p>\n<ul>\n<li>Pin <strong>11 SRCLK<\/strong> to pin przesuwaj\u0105cy wszystkie osiem stan\u00f3w rejestru &#8211; przesuwanie odbywa si\u0119 zawsze do przodu. Praca rejestru polega w\u0142a\u015bnie na cyklicznym przesuwania swoich stan\u00f3w. Aby wykona\u0107 przesuni\u0119cie ustawiamy SRCLK w stanie LOW, a potem w stanie HIGH &#8211; ta sekwencja to komenda &#8222;przesu\u0144 stany rejestru&#8221;.<\/li>\n<li>Pin <strong>14 SER<\/strong> to pin ustawiaj\u0105cy pierwszy rejest w stanie wysokim (gdy SER= HIGH) lub niskim (gdy SER=LOW).<\/li>\n<li>Pin <strong>12 RCLK<\/strong> (latch pin) &#8211; ustawienie go w stan niski (LOW) powoduje zablokowanie wyj\u015b\u0107 rejestru QA..QH, przez co nie wida\u0107 zmian na tych pinach a tym samym nie wida\u0107 etap\u00f3w przej\u015bciowych przesuwania (kt\u00f3re s\u0105 wymagane do uzyskania ko\u0144cowej konfigurajci o\u015bmiu pin\u00f3w). Ustawienie go w stan wysoki (HIGH) powoduje aktywacj\u0119 pin\u00f3w QA..QH i to, co jest do nich pod\u0142\u0105czone &#8211; dzia\u0142a tak, jak chcieli\u015bmy.&nbsp;<\/li>\n<\/ul>\n<p>Rejestr przesuwny dzia\u0142a w taki spos\u00f3b, \u017ce ustawia (b\u0105d\u017a pozostawia je w stanie zerowym) pierwsze wyj\u015bcie (SER), po czym stan wszystkich wej\u015b\u0107 przesuwa o jedno miejsce do przodu (SRCLK). Nast\u0119pnie powtarza te czynno\u015bci tyle razy ile tego zarz\u0105damy, a\u017c osi\u0105gniemy oczekiwany ci\u0105g zer i jedynek.&nbsp; Wynika z tego, \u017ce zapisuj\u0105c docelow\u0105 konfiguracj\u0119 wyj\u015b\u0107 QA..QH w tablicy (gdzie na pierwszym miejscu tablicy powinien znajdowa\u0107 si\u0119 pierwszy led itd) to odczyt takiej tablicy (i zwi\u0105zane z tym ustawianie pinu SER) powinien odbywa\u0107 si\u0119 &#8222;od ty\u0142u&#8221; &#8211; aby po o\u015bmiu przesuni\u0119ciach osi\u0105gn\u0105\u0107 nasz\u0105 konfiguracj\u0119.<\/p>\n<h1>Kod programu<\/h1>\n<p>Na pocz\u0105tku programu definiujemy dwie sta\u0142e (dyrektywy #define). Pierwsza sta\u0142a oznacza liczb\u0119&nbsp; rejestr\u00f3w przesuwnych (u nas na razie 1), natomiast druga ca\u0142kowit\u0105 liczb\u0119 pin\u00f3w pod\u0142\u0105czonych do wy\u015bwietlaczy ledowych (liczb\u0119 ileScalak\u00f3w mno\u017cymy razy osiem, poniewa\u017c ka\u017cdy wy\u015bwietlacz ma osiem led\u00f3w). Nast\u0119pnie deklarujemy trzy piny cyfrowe \u0142\u0105cz\u0105ce Arduino z rejestrem. Nale\u017cy zwr\u00f3ci\u0107 na to uwag\u0119, gdy\u017c w przypadku nieprawid\u0142owego pod\u0142\u0105czenia, nasz program mo\u017ce zachowywa\u0107 si\u0119 nieprzewidywalnie, b\u0105d\u017a nie dzia\u0142a\u0107. Tablica <strong>rejestr<\/strong> odnosi si\u0119 do wcze\u015bniejszej sta\u0142ej <strong>ilePinow<\/strong>, czyli oznacza ca\u0142kowit\u0105 liczb\u0119 pin\u00f3w, kt\u00f3rymi b\u0119dziemy sterowa\u0107.<\/p>\n<pre class=\"lang:arduino decode:true\" title=\"Deklarowanie zmiennych\">#define ileScalakow 1\r\n#define ilePinow ileScalakow * 8\r\nint SER=8; \r\nint RCLK=9;\r\nint SRCLK=10; \r\nint rejestr[ilePinow];<\/pre>\n<p>Funkcja <strong>void czyscRejestr()<\/strong> pozwala na wyczyszczenie tablicy <strong>rejestr<\/strong>, aby umo\u017cliwi\u0107 jej ponowne zape\u0142nienie. Robimy to u\u017cywaj\u0105c p\u0119tli for, ustawiaj\u0105c kolejno ka\u017cd\u0105 warto\u015b\u0107 na zqero (LOW).<\/p>\n<p>Funkcja <strong>void zapiszRejestr()<\/strong>&nbsp;to g\u0142\u00f3wna funkcja programuj\u0105ca rejest przesuwny &#8211; ustawia piny QA..QH w takich stanach, jakie ma tablica <strong>rejestr<\/strong> w pami\u0119ci Arduino. Ustawienie pinu RCLK na pozycj\u0119 LOW zamra\u017ca stany QA..QH &#8211; nie wida\u0107 prze\u0142\u0105czania (=przesuwania) stan\u00f3w rejestru. P\u0119tl\u0119 for wykonujemy od ko\u0144ca, od liczby pin\u00f3w odejmujemy 1, ze wzgl\u0119du na numerowanie tablic od 0. Dzi\u0119ki w\u0142\u0105czeniu pinu RCLK w stan HIGH zobaczymy dokonane zmiany.<\/p>\n<p>W funkcji <strong>void ustawPin(int <em>ktory<\/em>, int <em>wartosc<\/em>)<\/strong> zmieniamy tablic\u0119 <strong>rejestr<\/strong> na pozycji <em>ktory<\/em>, nadaj\u0105cj jej <em>warto\u015b\u0107<\/em>. Mo\u017cna si\u0119 jej pozby\u0107 &#8211; programuj\u0105c bezpo\u015brednio tablic\u0119 rejestr &#8211; ale funkcja ta powsta\u0142a aby \u0107wiczy\u0107 programowanie strukturalne.<\/p>\n<pre class=\"lang:arduino decode:true\" title=\"Program zapalaj\u0105cy i gasz\u0105cy kolejne ledy\">void setup(){\r\n  pinMode(SER, OUTPUT);\r\n  pinMode(RCLK, OUTPUT);\r\n  pinMode(SRCLK, OUTPUT);\r\n  czyscRejestr();\r\n  zapiszRejestr();\r\n}\r\nvoid czyscRejestr(){\r\n  for(int i=0; i&lt;ilePinow; i++)\r\n    rejestr[i]=LOW;\r\n}\r\nvoid zapiszRejestr(){\r\n  digitalWrite(RCLK, LOW); \r\n  for(int i=ilePinow-1; i&gt;=0; i--){\r\n    digitalWrite(SRCLK, LOW);\r\n    digitalWrite(SER, rejestr[i]);\r\n    digitalWrite(SRCLK, HIGH); \r\n  }\r\n  digitalWrite(RCLK, HIGH); \r\n}\r\nvoid ustawPin(int ktory, int wartosc){\r\n  rejestr[ktory]=wartosc;\r\n}<\/pre>\n<p>W funkcji g\u0142\u00f3wnej <strong>void loop()<\/strong> tworzymy p\u0119tl\u0119, kt\u00f3ra najpierw ustawi wszystkie piny w pozycj\u0119 low, aby\u015bmy mogli zobaczy\u0107 przysz\u0142e zmiany. Program ten najpierw zapali wszystkie ledy, poczeka p\u00f3\u0142 sekundy, po czym po kolei je zgasi i ponownie zapali po p\u00f3\u0142sekundowej przerwie.<\/p>\n<pre class=\"lang:arduino decode:true\" title=\"Funkcja g\u0142\u00f3wna\">void loop(){\r\n  int i;\r\n  for(i=0;i&lt;ilePinow;i++)\r\n    ustawPin(i, LOW);\r\n    zapiszRejestr();\r\n    delay(500);\r\n   for(i=0;i&lt;ilePinow;i++){\r\n    ustawPin(i, HIGH);\r\n    zapiszRejestr();\r\n    delay(500);\r\n}\r\n}<\/pre>\n<p>Nie jest to program wy\u015bwietlaj\u0105cy cyferki 0,1,2,&#8230;9 a jedynie <strong>program testuj\u0105cy<\/strong> dzia\u0142anie o\u015bmiu wyj\u015b\u0107 QA..QH rejestru &#8211; nasz\u0105 prac\u0105 domow\u0105 jest zamiana powy\u017cszego kodu aby wy\u015bwietla\u0142a cyferki.<\/p>\n<h1>Podsumowanie<\/h1>\n<p>W tym tygodniu poznali\u015bmy prosty spos\u00f3b na sterowanie wy\u015bwietlaczem siedmiosegmentowym za pomoc\u0105 <strong>jedynie trzech pin\u00f3w<\/strong> cyfrowych. Stwarza to du\u017ce mo\u017cliwo\u015bci, poniewa\u017c rejestry przesuwne mo\u017cna ze sob\u0105 \u0142\u0105czy\u0107 &#8211; a ci\u0105gle do ich sterowania b\u0119d\u0105 potrzebne tylko 3 piny cyfrowe&nbsp; z Arduino! Ale o tym za tydzie\u0144.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-988\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/DSC5024-300x168.jpg\" alt=\"\" width=\"300\" height=\"168\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/DSC5024-300x168.jpg 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/DSC5024-768x431.jpg 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/12\/DSC5024-1024x575.jpg 1024w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<h1>Praca domowa<\/h1>\n<p>Wykorzystuj\u0105c powy\u017cszy kod, wy\u015bwietli\u0107 cyfry na wy\u015bwietlaczu.<\/p>\n<p style=\"text-align: right;\">(c) Ewelina, 2017<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Na ostatnich zaj\u0119ciach nadal zajmowali\u015bmy si\u0119 programowaniem wy\u015bwietlaczy siedmiosegmentowych. W przypadku pod\u0142\u0105czania wy\u015bwietlacza bezpo\u015brednio do Arduino, zajmujemy a\u017c osiem pin\u00f3w cyfrowych. To sprawia, \u017ce p\u0142ytka Arduino UNO (wyposa\u017cona w 14 wej\u015b\u0107\/wyj\u015b\u0107 cyfrowych) mo\u017ce sterowa\u0107 tylko jednym wy\u015bwietlaczem. Mo\u017cna co prawda wykorzysta\u0107 piny analogowe (A0..A5) jako cyfrowe, ale to da mo\u017cliwo\u015b\u0107 pod\u0142\u0105czenia jedynie drugiego wy\u015bwietlacza. To [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":990,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[52],"tags":[191,192,99,190,193],"class_list":{"0":"post-989","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-fibot","8":"tag-74hc595","9":"tag-8digits","10":"tag-led","11":"tag-rejestr-przesuwny","12":"tag-wyswietlacz","14":"post-with-thumbnail","15":"post-with-thumbnail-large"},"_links":{"self":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/989","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=989"}],"version-history":[{"count":13,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/989\/revisions"}],"predecessor-version":[{"id":1012,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/989\/revisions\/1012"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/media\/990"}],"wp:attachment":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=989"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=989"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=989"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}