Nuts and Bolts (3): 74HC595 IC Nastavljamo sa pričom o pomeračima (shift) registara iz prošlog broja. Tada smo pričali o PISO pomeračima, a sada će biti reči o SIPO (serial-in, parallel-out) integralnim kolima sa oznakom 74HC595. O ovim integralnim kolima je već bilo reči kada smo pisali o LE diodama (SK 6/2017) i tada smo rekli da su odličan izbor kada nam treba veći broj izlaza od onih koje ima naš mikrokontroler.Nećemo puno ponavljati kako ova integralna kola funkcionišu. Probaćemo da se usredsredimo samo na specifičnosti komada silicijuma iz naslova. 74HC595 je osmobitni pomerački registar iz 74HC porodice ovakvih kola. Kao i kod 74HC165 i ovde „HC” u oznaci govori da je u pitanju High Speed CMOS, dok se „595” odnosi na SIPO varijantu, sa tim da u našem slučaju dodatno „N” u oznaci govori da ovo kolo može da radi i u SISO režimu (serial-in, serial-out). U našim primerima mi ćemo govoriti o njegovoj upotrebi kao kola koje će našem mikrokontroleru dodati još osam izlaza. Kao i prethodna dva opisana integralna kola i 74HC595 ćemo koristiti u DIP16 varijanti, koja je pogodna za ubadanje u prototipske ploče ili DIP sokete. Komadi silicijuma u ovakvom formatu su pogodni za razvijanje projekta i mi ćemo se uglavnom držati njih, ali treba znati da ih ima i u SOIC16 i SOP16 pakovanjima koja su pogodna za razrađene projekte i ugradnju na namensku PCB. Pinout ovog čipa je malo drugačiji od 74HC165. Naponski izvodi su standardno dijagonalno postavljeni i na GND i VCC treba dovesti pet volti (iako radi na naponima od dva do šest volti). Sa leve strane imamo sedam izlaznih izvoda sa oznakama od Q1-Q7, dok je osmi Q0 (bolje reći prvi) sa suprotne strane, odmah do VCC. Izvod pod brojem 9 je Q7S i on se koristi za povezivanje više ovakvih integralnih kola kaskadno, poput 74HC165, samo ovaj put kao izlaz. Kako se bitovi pomeraju unutar registra, ukoliko imamo povezan sledeći čip na ovom izvodu, bitovi će nastaviti da se pomeraju dalje, ovaj put u narednom čipu. Na izvodu broj 10 je MR (master reset). Logička nula na ovom izvodu će resetovati pomerački registar. Za njim ide SH_CP (shift register clock input) na izvodu broj 11 i ispisujući LOW ka HIGH na ovom izvodu ćemo pomerati podatke u osmobitnom registru. Pod oznakom ST_CP (storage register clock input) je takozvani Latch Clock Input, a sa LOW->HIGH na ovom pinu postižemo da se podaci iz pomeračkog registra prebace u „Latch blok”. Dovođenjem LOW na OE (output enable) izvod, omogućavamo podacima da se iz latch bloka pojave na izlaznim izvodima. Sa HIGH primoravamo izlazne izvode da budu u stanju visoke impedanse. Na izvodu 14 je DS (serial data input), a podatke koje čip dobije na ovom izvodu kasnije prebacuje u registar. Da se ne bismo i previše ponavljali, predlažemo vam da u vašoj arhivi starijih brojeva bacite oko na pomenuti tekst o LE diodama.Za povezivanje sa Arduinom tu je fritzing šema. Mi smo ovaj čip dodali na prototipsku ploču sa postavkom iz prethodnog broja, gde smo koristili prekidače i 74HC165 za unos podataka, a sada ćemo te podatke iskoristiti da bismo upalili po jednu LED za svaki prekidač. Na naponske izvode dovodimo pet volti. Pored napajanja, dovodimo GND na OE i pet volti na MR. Izvode od Q0-Q7 vodimo preko otpornika od 330 oma na crvene LED koje su sa druge strane već povezane na GND. Upravljačke izvode DS povezujemo na digitalni pin 4, SH_CP na 2, a ST_CP na digitalni pin 3. Ovim integralnim kolom možemo upravljati direktno kao na primeru sa LE diodama i na taj primer se nećemo vraćati. Mnogo lakše je za to koristiti biblioteke, a mi smo se odlučili za ShiftRegister595 koju možete preuzeti sa adrese bit.ly/2WR8T4w. Postojeći skeč iz prethodnog broja smo modifikovali u meri da nam stanja DIP prekidača, koje je pročitao Nano preko 74HC165, prikaže LE diodama preko 74HC595. Mi smo se odlučili za LED, ali to mogu biti releji ili bilo šta drugo.#include <ShiftIn.h> #include <ShiftRegister595.h> ShiftIn<1> shift; int x; ShiftRegister595 shiftRegister595(4, 2, 3); // DS, SHCP, STCP void setup() { Serial.begin(9600); shift.begin(9, 10, 11, 8); shiftRegister595.setup(1); //broj shift registara } void displayValues() { for(int i = 0; i < shift.getDataWidth(); i++){ x = i; if(shift.state(i) == 1){ shiftRegister595.setPin(x, HIGH); shiftRegister595.write(); }else{ shiftRegister595.setPin(x, LOW); shiftRegister595.write(); } } Serial.println(); } void loop() { if(shift.update()) displayValues(); delay(100); } Deo koji se tiče 74HC165 nećemo ponovo pojašnjavati. Za potrebe ovog pomerača registra smo uvezli ShiftRegister595.h biblioteku i napravili objekat shiftRegister595 u kome smo definisali na koje izvode smo povezali upravljačke izvode čipa. U setup funkciji smo naveli da imamo samo jedan čip, a ukoliko će u nekom vašem slučaju njih biti više, potrebno je taj broj navesti. Funkciju displayValues() smo blago prepravili i u if petlji proveravamo da li je određeni izvod 74HC165 promenio stanje na HIGH te shodno tome i mi menjamo stanje i palimo LED. U suprotnom, šaljemo logičku nulu odgovarajućem izvodu našeg 74HC595 te gasimo LED. I ovaj komad silicijuma, kao i prethodni, nije „pravi” SPI uređaj, ali se može povezati po SPI interfejsu. Svakom od izvoda se uz SPI.h biblioteku može pristupiti preko SPI funkcija. Bez obzira na to koji pristup koristili, 74HC595 integralno kolo može biti idealno rešenje. Mi smo u ovom primeru koristili Nano i njegovu pet-voltnu logiku GPIO, ali to ne znači da se u slučaju projekta sa recimo, ESP8266, cela postavka ne može spustiti na 3,3 volta. Mi smo u našem primeru otpornicima ograničili struju na nekih deset miliampera, ali treba znati da se izlazni izvodi mogu maksimalno opteretiti sa 35 miliampera. Maksimalno opterećenje ulaznih izvoda ne sme preći 20 miliampera. Ono što nismo pomenuli u prethodnom broju vezano za 74HC165, a važi i u ovom slučaju, jeste da se svi ulazni izvodi koji se ne koriste moraju vezati za odgovarajuću logiku, što će reći, GND ili VCC. Svi nekorišćeni izlazni izvodi moraju ostati otvoreni.Dejan PETROVIĆ | | |