Shift Registri

Croduino ima na raspolaganju ukupno 22 pina koji mogu poslužiti kao digitalni izlazi i u većini slučajeva će nam to biti sasvim dovoljno. Međutim neki projekti mogu od nas zahtjevati više od 22 digitalna izlaza. Što učiniti u tom slučaju?

Najjednostavnije rješenje dolazi upravo u obliku shift registra (pogledaj datasheet), integriranog kruga kojeg ćemo koristiti za proširenje broja digitalnih izlaza Croduina. No krenimo od početka...

Što je shift register?

DSC_8933

Shift registri su integrirani krugovi koji se u osnovi sastoje od većeg broja bistabila (engl. flip-flop) smještenih u jednom čipu. Bistabil ima dva stabilna stanja tj. može pamtiti jedan bit podataka (0 ili 1). Ako se registar sastoji od 8 bistabila tada on može zapamtiti 8 bitova. Bistabili u jednom chipu mogu biti povezani na različite načine pa tako razlikujemo registre sa serijskim i pralelnim upisom i ispisom podataka. Postoje različite kombinacije u ovisnosti o vrsti upisa ili ispisa podataka pri čemu ćemo mi koristiti shift registar sa serijskim upisom i paralelnim ispisom podataka kao što je 74HC595N. Osim toga naš registar se sastoji od 16 bistabila, od kojih su 8 spojeni serijski ulazi i 8 pojedinih izlaza. Na taj način se ostvaruje 8 izlaza na registru pomoću, teoretski, samo jednog pina.

U stvarnosti nam nije dovoljan samo jedan pin za prijenos podataka iz Croduina u registar. Osim pina koji nam je spojen na ulaz potreban nam je i tzv. clock pin (SRCLK i RCLK) koji siknoniziraju slanje i primanje podataka. Bez toga komunikacija između Croduina i registra ne bi bila moguća.

574px-SN74HC595-pinout

Kako bi mogli bilo što raditi s registrom (ili bilo kojim integriranim krugom) potrebno je prvo odgonetnuti gdje se nalazi i što radi pojedini pin. Na slici možemo vidjeti raspored pinova na shift registru 74HC595N.

Vcc - do 6V (potrebno je na istom naponu kao i mikrokontroler, obično 3.3V odnosno 5V)

Qa do Qh - izlazi shift registra (ukupno 8)

OE - (Output enable) Potrebno ga je spojiti na gnd kako izlaz shift registra bio omogućen. Izlaze možemo onemogućiti ako ovaj pin spojimo na HIGH.

SER - (Serial) ulaz na sljedeći pin koji se shifta

SRCLK - (Serial clock) kada je ovaj pin HIGH, shiftat će register

RCLK - (Register clock) mora ući u HIGH stanje kako bi prebacio izlaz na sljedeći pin shift registra i to odmah nakon što SRCLK ponovno uđe u LOW stanje

SRCLR - (Serial clear) obrisati će cijeli shift registar ako se stavi u LOW stanje, stoga je nužno da bude HIGH

Untitled

Dakle, naš registar se čine ukupno 16 bistabila. Prvih 8 su povezani serijski i čini ulaze shift registra, drugih 8 pinova je paralelno povezano prvoj osmorki na način da je izlaz svakog bistabila shift registra povezan na ulaz drugog bistabila koji služe kao spremnici podataka i omogućuju istovremeno slanje podataka i njihovo prikazivanje. Iz tog razloga, za pravilno korištenje shift registra potrebno nam je 3 pina. Prednost je što serijski možemo nizati proizvoljan broj registra (maksimalno 40) pa tri pina Croduina možemo proširiti na 8, 16, 24, i td.

gh

Na slici gore vidimo dva serijski spojena registra, na taj način 3 izlaza Croduina proširujemo na 16. Pri takvom povezivanju serijski ulaz prvog registra (SI1) je zajednički ulaz, dok je ulaz drugog registra spojen na izlaz prvog. Clock pinovi oba registra spojeni su paralelno, kao i latch pinovi. Tako povezani registri ponašaju se kao 16-bitni.

Kako radi shift register?

U ovom ćemo odlomku pokušati objasniti rad 74HC595 shift registra bez ulaženja u same detalje.

Kao što je već rečeno, da bi uspješno upravljali registrom potrebna su nam tri pina: Ulaz podataka (SI), Clock i Latch.

Proces slanja je sljedeći:

Za početak Clock i Latch pinove postavimo na 0 (LOW), a na ulaz dovedemo prvi bit podatka kojeg šaljemo. Nakon toga Clock stavimo na 1 (HIGH). U trenutku prijelaza stanja na Clock pinu iz 0 u 1, podatak koji je prethodno doveden na ulaz sprema se u prvi registar (slika 4. a). Ako sada na ulaz dovedemo 0 i ponovo okinemo Clock pin, 1 iz prvog registra „skače“ u drugi registar, a na njegovo mjesto dolazi 0 koja je na ulazu (slika 4. b). To znači da svaki novi bit „gura“ one ispred sebe. Ako proces ponovimo još 14 puta ispunit ćemo svih 16 bistabila nizom bitova podatka dovedenog na ulaz. Treba obratiti pažnju da smo ispunili gornje bistabile podacima dok su donji u našem slučaju prazni.

a

a) Proces slanja prvog bita

b

b) Proces slanja drugog bita

Ako sada okinemo Latch pin (prijelaz iz 0 u 1) svih 16 bitova istovremeno će „skočiti“ iz gornjih registara u donje i ako su izlazi registara spojeni na ledice svaka neparna će svijetliti.

f

Stanje u registrima nakon okidanja Latch pina

Ne treba se okinuti Latch zasebno, nego ga možemo okidati zajedno s clock pinom. Međutim, ovakva konfiguracija ima prednost što možemo držati stanje na izlaznim registrima onako kakvo je, dok u isto vrijeme šaljemo novih 16 bitova podataka u ulazne registre.

Ovakvim spajanjem registara možemo proširiti broj digitalnih izlaza našeg croduina na broj po potrebi i njime upravljati velikim brojem ledica ili nekih drugih trošila. Međutim pri tome treba voditi računa da registar ne može napajati svaku ledicu s 20mA jer bi to zahtjevalo ukupno 160mA. Maksimalna ukupna struja može biti 40-ak mA što nam daje najviše 5 mA po ledici. U slučaju da nam to nije dovoljno morati ćemo se poslužiti tranzistorima kao sklopkama.

Spajanje na Croduino i kod

Pretpostavimo da nam ova "teorija" nije zanimljiva i da želimo što prije spojiti shift registar na Croduino i započeti s programiranjem. Jednostavno ćemo spojiti pinove Croduina i shift registra kako pokazuje skica, kopirati priloženi kod i koristiti za što smo već naumili. Pogledajmo shemu spajanja jednog i više shift registara na Croduino.

Screen Shot 2015-05-17 at 20.04.06

Screen Shot 2015-05-17 at 20.14.06

U komentarima priloženog koda nalazi se objašnjenje kako ga koristiti. Ako ste pratili cijeli tutorial o načinu rada shift registra nećete imati problema sa shvaćanjem koda, a ako niste probleme ste se rješili odmah u startu. U nastavku možete vidjeti kod koji podržava do 40 spojenih 75HC595 shift registra.

Ukoliko želite nešto što će imate mogućnost proširenja PWM pinova, preporučujemo TLC5940 ili slični. Pogledajte ostale naše tutorijale, ili neke naše projekte sa registerima.

int SER_Pin = 8; //pin 14 na 75HC595
int RCLK_Pin = 9; //pin 12 na 75HC595
int SRCLK_Pin = 10; //pin 11 na 75HC595
//broj 75HC595
#define broj_74hc595a 1
//broj pinova 75HC595, ne mijenjati
#define brojPinova brojPinova_74hc595a * 8
boolean shiftReg[brojPinova];
void setup(){
pinMode(SER_Pin, OUTPUT);
pinMode(RCLK_Pin, OUTPUT);
pinMode(SRCLK_Pin, OUTPUT);
//reset pinova
clearRegisters();
writeRegisters();
}
//postavi sve pinove na LOW
void clearRegisters(){
for(int i = brojPinova- 1; i >= 0; i--){
shiftReg[i] = LOW;
}
}
//postavljanje pinova
//preporuceno prvo postaviti stanje svih pinova zatim pozvati funkciju prikazivanja
void writeRegisters(){
digitalWrite(RCLK_Pin, LOW);
for(int i = brojPinova- 1; i >= 0; i--){
digitalWrite(SRCLK_Pin, LOW);
int val = shiftReg[i];
digitalWrite(SER_Pin, val);
digitalWrite(SRCLK_Pin, HIGH);
}
digitalWrite(RCLK_Pin, HIGH);
}
//funkcija postavlja pojedini pin
void setRegisterPin(int index, int value){
registers[index] = value;
}
void loop(){
// pozivanje funkcija za postavljanje stanja pojedinog pina
setRegisterPin(2, HIGH); // postavlja pin2 75HC595a na HIGH
setRegisterPin(3, HIGH); // postavlja pin3 75HC595a na HIGH
setRegisterPin(4, LOW); // postavlja pin4 75HC595a na LOW
setRegisterPin(5, HIGH); // i td.
setRegisterPin(7, HIGH);
writeRegisters(); //na kraju pozivamo fuknciju koja prikazuje
//stanje postavljenih pinova
Leave a Reply