74HC595 Posuvný register

Page

Stránky / Súčiastky ku Arduinu /

Posuvný register je integrovaný obvod, ktorý umožňuje previesť informáciu zo sériovej na paralelnú. 74HC595 umožňuje takto meniť 8 bitov. V praxi to znamená to, že namiesto ôsmich vodičov potrebujeme iba tri (plus dva na napájanie, ale tie by sa museli prirátať aj k pôvodným ôsmim).

Význam pinov

 Symbol Pin Popis 
 Q0-Q7  15, 1-7 Paralelný výstup.
 GND 8 Zem. 
 Q7' 9 Výstup sériových bitov z posuvného registra. Využíva sa to pri viac posuvných registroch, kde sa výstup z Q7' pripojí na vstup DS ďalšieho posuvného registra.
 MR 10 Master reset.
 SHCP 11  Shift register clock. Hodinové impulzy.
 STCP 12 Storage register clock. Keď máme posuvný register naplnený novými bitmi, pomocou tohto pinu ich zapneme na výstup. Tento pin zvykne bývať označený aj ako latch.
 OE 13  Output enable. Povolený výstup. Ak sa tu nachádza 0, je výstup povolený. Ak je tu 1, výstup je zakázaný.
 DS 14 Vstup sériových bitov. Tadeto sa postupne vkladajú jednotlivé bity do posuvného registra.
 VCC 16 Napájanie. Sem pripojíte +5V z Arduina.

Ako funguje algoritmus

Algoritmus naplnenia registra je jednoduchý:

  • SHCP=0
  • STCP=0
  • Opakuj 8x nasledovné príkazy
    • DS=1 alebo 0
    • SHCP=1
    • SHCP=0
  • STCP=1

Ak použijeme Arduino, na vnútorný cyklus je možné použiť pripravenú funkciu shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val), kde už nie treba premýšľať, ako vydolovať jednotlivé bity z premennej. bitOrder môže nadobúdať hodnoty:

  • MSBFIRST - Most Significant Bit First - Najprv sa posielajú významnejšie bity.
  • LSBFIRST - Least Significant Bit First - Najprv sa posielaju menej význmné bity.

Čo si pod tým treba predstaviť? Predvedieme si to na príklade.

 Decimálne
 Hexadecimálne 0x03 
 Binárne 00000011 
 Význam

Významnejšie bity sú tie vľavo. V tomto prípade máme číslo 3, ktoré v binárnom tvare predstavuje zapnuté dva najnižšie a takzvane najmenej významné bity. Takto bývajú čísla ukladané v počítačoch. Arduino je 8bitový mikrokontrolér a platí to aj pre neho.

Budeme teda predpokladať, že sme k Arduinu pripojili 74HC595 tak, že pin 7 je po našej ľavej ruke a pin 15 a 1 po našej pravej ruke. Ak teda budeme chcieť rozsvietiť LED diódy, ktoré sú k týmto pinom pripojené, musíme ich posielať zľava doprava. Iba v tomto prípade vojde do obvodu najskôr 6 núl, ktoré sa postupne posúvajú doľava a až na záver dve jednotky, ktoré ostanú nastavené na pinoch 15 a 1. Použili sme konštantu MSBFIRST.

Ovládanie jasu

Ak sú na register pripojené LED diódy, je možné ich jas pohodlne ovládať cez PWM. Konkrétna hodnota od 0 do 255 sa pošle na pin OE. Treba si len uvedomiť, že pin má obrátený význam a plný jas sa dosiahne hodnotou 0. Výsledok ale nie je dokonalý. Keď som to testoval, dosť to poblikávalo. Keď sa niekedy nájde čas, pripojím to na osciloskop a skontrolujem, ako vyzerajú priebehy signálov.

Schéma s LED diódami

Pôvodne som chcel nakresliť schému vo Fritzingu v podobne dvoch samostatných nepájavých polí. V takejto podobe sa s registrom pracuje omnoho pohodlnejšie, než na jednej, na ktorej vykúzlite nič nehovoriacu znes káblov. Našiel som našťastie hotovú schému, ktorú tam už presne v tejto podobe niekto nakreslil.

Pri schéme si treba dať pozor iba na to, že integrovaný obvod nie je všemocný a má svoje limity. Väčšina datasheetov sa zhoduje v tom, že cez napájací pin môže tiecť prúd maximálne 70 mA a cez dátový pin 25 mA. To znamená to, že ak máme 8 dátových pinov a na každý pripojíme LED, ktorá odoberá iba 10 mA, pri všetkých zapnutých pinoch sa dostaneme na 80 mA, čo už je nad limit.

Počítajme spolu červenú LED. (5 V - 2,1 V) / 0,008 A = 362,5 ohm To je minimálny rezistor, ktorý si môžeme dovoliť, ak bude odoberať 8x8=64 mA.

LED diódy, ktoré nezaťažujú obvod

Na obrázku som prekreslil aspoň jednu LED, aby som demonštroval, čo je potrebné urobiť, aby nebol obvod priamo zaťažovaný prúdom, potrebným pre svietenie LED. Výstupný signál sa pripojí do bázy tranzistora cez rezistor 4,7k, vďaka čomu bude teraz odoberať menej ako 1 mA. LED sa musí presunúť do kolektora a preto treba prehodiť aj nôžky na nej tak, aby bola anóda pripojená k +5 V.

Nejaké príklady na rozcvičenie

Dajme si na úvod niečo ľahké, čo ale dobre ukáže, čo sa dá s obvodom robiť. Pokračujme v príklade, kde sme pracovali s hexadecimálnymi číslami. V príklade bude použité rozpätie od 0 do 255, čo predstavuje binárne 00000000 a 11111111. Budeme postupne zvyšovať číslo a posielať ho do obvodu. Začiatok bude vyzerať približne takto a ukážka by mala stačiť na pochopenie, ako budú diódy napojené na obvod blikať.

 0 0x00  00000000 
 1 0x01  00000001 
 2 0x02  00000010 
 3 0x03  00000011 
 4 0x04  00000100 
 5 0x05  00000101 
 6 0x06  00000110 
 7 0x07  00000111 
 8 0x08  00001000 
 9 0x09  00001001 
 10 0x0a  00001010 
 11 0x0b  00001011 
 12 0x0c  00001100 
 13 0x0d  00001101 
 14 0x0e  00001110 
 15 0x0f  00001111 

Program je v súbore Arduino 74HC595 LED Counter. Pripojenie pinov nájdete priamo v programe. Ak máte poskladanú pomôcku na blikanie LED, budete mať na testovanie ničo také, ako vidno na obrázku. Ak nie, musíte všetko poskladať na skúšobnom poli a bude to vizuálne pôsobiť viac rozhárane, ale funkčnosť by mala byť rovnaká. Program odosiela údaje každých 50 ms, takže za sekundu uvidíte asi 20 zmien.

Rýchlosť

Čo vás asi hneď napadne je to, čo by sa stalo, keby sme z programu odstránili funkciu delay a posielali sme naplno. Výsledok asi bude vizuálne trošku sklamaním, ale treba si to skúsiť. To čo je ale zaujímavé, je odmeranie skutočnej rýchlosti posielania. Dozvieme sa takto odpoveď na otázku, koľko sme toho v reálnom živote schopní odoslať.

Na to nám poslúži drobná modifikácia programu, kde len zapneme odosielanie výsledkov na sériový port a nejaké výpočty. Program je v súbore Arduino 74HC595 LED Speed.

Program počíta čas v mikrosekundách po každej sérii 256 odoslaní. Na mojom Arduine to vypisuje hodnotu 33192, čo po predelení 33192/256=129 us na jedno odoslanie. Za sekundu to je 7751 odoslaní.

Výpočty boli robené v IDE 1.0.X. Keď som program otestoval v IDE 1.6.7, došlo ku miernemu spomaleniu programu. Pravdepodobne je to dôsledok nejakých úprav vo funkcii digitalWrite.

Väčšia rýchlosť

To ale nie je konečná hranica. V tejto podobe je algoritmus strašne neefektívny a zrýchliť ho môžeme viacerými spôsobmi. Nebudeme sa hrať po troške, pokúsime sa algoritmus prepísať do podoby, čo je interne podporovaná mikrokontrolérom. Použijeme SPI.

Pozor na to, že v tomto programe je zapojenie pinov iné. Je uvedené priamo v programe aj s popisom významu pre SPI. Program je v súbore Arduino 74HC595 LED SPI.

Program počíta čas v mikrosekundách po každej sérii 256 odoslaní. Na mojom Arduine to vypisuje hodnotu 3432, čo po predelení 3432/256=13 us na jedno odoslanie. Za sekundu to je 76923 odoslaní. To už je slušný výsledok. Dosiahli sme 10x vyššiu rýchlosť.

Drobné urýchlenie by sme ešte dosiahli pridaním riadku do funkcie setup. Skúste SPI.setClockDivider(SPI_CLOCK_DIV2);, čo ešte mierne zdvihne rýchlosť. Implicitná hodnota je SPI_CLOCK_DIV4.

Výpočty boli robené v IDE 1.0.X. Keď som program otestoval v IDE 1.6.7, došlo ku miernemu spomaleniu programu. Pravdepodobne je to dôsledok nejakých úprav vo funkcii digitalWrite.

Honba za najväčšou rýchlosťou

Existuje možnosť, ako ešte viac urýchliť rýchlosť. Tou možnosťou je nahradiť zapisovanie na digitálne výstupy (funkcia digitalWrite(pin,value);) za priame manipulácie portu. Program je v súbore Arduino 74HC595 LED SPI Speed.

Program počíta čas v mikrosekundách po každej sérii 256 odoslaní. Na mojom Arduine to vypisuje hodnotu 584, čo po predelení 584/256=2,28 us na jedno odoslanie. Za sekundu to je 438356 odoslaní. To už je slušný výsledok. Dosiahli sme 56x vyššiu rýchlosť.

Výpočty boli robené v IDE 1.0.X. Keď som program otestoval v IDE 1.6.7, došlo ku miernemu zrýchleniu programu. Pravdepodobne je to dôsledok lepšej optimalizácie kódu vďaka novšej verzii kompilátora.

Ďalšie príklady

S posuvným registrom 74HC595 môžete robiť aj ďalšie operácie:

Reťazenie registrov

Jednotlivé registre sa dajú spájať do dlhších reťazí. To je umožnené tak, že jeden z pinov poskytuje výstup z prvého registra, ktorý sa použije ako vstup do druhého registra. Zapojenie môžete nájsť v prehľadnej tabuľke.

Uľahčenie na skúšobnom poli

Na skúšobnom poli je zapojenie s 74HC595, LED diódami a rezistormi veľmi obľúbené. Kto to vyskúšal, pozná to klbko vodičov, ktoré sú na zapojenie potrebné. Všetko sa dá ale zľahčiť a pokiaľ si viete letovať SMD súčiastky, môžete využiť moje dve pomocné dosky, ktoré sú určené presne na tieto prípady:

  • SMD 74HC595 board - Na doske je preusporiadané rozloženie pinov tak, aby výstupy boli na jednej strane a vstupy na druhej strane.
  • SMD 8 LED board - Výstup z predchádzajúcej dosky sa dá priamo napojiť na vstup tejto dosky. Na nej sú dvojice LED a rezistor.

Ovládanie jasu každej diódy samostatne

Doteraz sme sa v podstate iba hrali so zapínaním diód. Skutočné umenie možno robiť vtedy, ak dokážeme ovládať každú diódu samostatne a to nielen čo sa týka jej zapnutia, ale aj ovládania jej jasu. Tomu sa ale budem venovať v samostatnom článku, kde si preberieme využitie knižnice ShiftPWM.



Download

74HC595 Reťazenie posuvných registrov ShiftPWM Animácie pomocou 74HC595 Využitie PWM na ovládanie jasu 74HC595

08.11.2015


Menu