LAKI PINGVINI<>
062019<><>

Nuts and Bolts (2): 74HC165 IC

Još inputa

U situacijama kada nam zatrebaju digitalni ulazi, rešenje ne mora biti Mega. Elegantnije i mnogo kompaktnije rešenje može biti dodavanje jednog ili više integralnih kola sa oznakom 74HC165. Ova integralna kola spadaju u grupu 8-bitnih pomeračkih (shift) registara i funkcionišu po principu Paralel In/Serial Out (PISO). Razlika između Serial In(puta) i Paralel In(puta) jeste da se kod paralelnog svih osam bita mogu koristiti u jednom ciklusu kloka, dok se kod serijskog može koristiti samo jedan bit. Sa druge strane, mi kod ovog čipa imamo input na svih osam bita odjednom, ali s obzirom na to da je serijski output, to znači da će ih čip dalje slati bit za bitom. Ovaj pomerač registra ima osam bita memorije, ili jedan bajt, a sastavljen je iz flip-flop kola (slično kao i 74HC595 o kome je bilo malo reči u SK 6/2017). Integralno kolo ima osam paralelnih inputa preko kojih ćemo slati podatke sa senzora ili tastera ka mikrokontroleru, u našem slučaju Arduino Nano. U slučaju da se ukaže potreba za više od osam digitalnih inputa, možemo vezati više njih kaskadno. Čip 74HC165 se ne može koristiti za analogne inpute, već samo za digitalne. Čip pripada porodici logičkih komponenti, samim tim ne može direktno kontrolisati mnogo struje (do 20 miliampera). HC u oznaci se odnosi na High Speed CMOS uređaj. Zadnja tri broja se odnose na podvrstu 74xx porodice čipova.

 
Čip koji ćemo mi koristiti je 16-pinski DIP jer je pogodan za ubadanje u prototipsku ploču. Oznake pinova koje se mogu naći na mreži blago variraju, ali suština je ista. Mi ćemo se držati oznaka sa slike, koje su ujedno i oznake u zvaničnoj dokumentaciji. 74HC165 se može napajati naponima do sedam volti, ali je preporučljivo da to bude pet volti koje dovodimo na izvode VCC i GND koji su standardno dijagonalno postavljeni. Izvod broj jedan je PL pin, što je skraćenica od Parallel Load (negde je SH/LD – shift load). Da bi se input pomerio u registar, ovaj pin mora biti HIGH. Ako je LOW, podaci se pomeraju u registar asinhrono. Dok je PL pin HIGH podaci ulaze u registar serijski i pomeraju se za jedno mesto na desno (Q0 ka Q7) sa svakim klokom. Ovim se omogućava vezivanje Q7 izvoda za DS input u narednom ciklusu. DS (serial data input) je inače na izvodu broj 10 i koristi se kada pravimo kaskade više ovakvih čipova. Da bismo napravili serijski output, šaljemo CP (clock pulse) sa LOW na HIGH i tada CE (clock enable) ide na LOW. Tek tada će osmobitni podaci biti poslati ka mikrokontroleru. Na slici vidimo da imamo dva Q7, gde je onaj na izvodu broj 9 serijski output zadnjeg ciklusa, dok je /Q7 na izvodu broj 7 dopunski sa istom ulogom (invertovan). Izvodi od D1 do D7 su digitalni ulazi čipa i na njih povezujemo senzore ili tastere.

Nano sa 74HC165 povezujemo prema šemi. GND i 5V smo doveli na odgovarajuće izvode čipa. PL smo povezali sa digitalnim pinom 9, CE sa pinom 10, Q7 sa pinom 11, dok smo CP povezali sa pinom 8. Ovo zapravo mogu biti bilo koji digitalni pinovi. DIP prekidač smo povezali sa izvodima D0-D7 uz pulldown konfiguraciju gde smo upotrebili otpornike od po deset kilooma da bismo bili sigurni da ćemo imati ispravna očitavanja.

Nakon inicijalizacije svih neophodnih pinova, postavljamo ih kao OUTPUT, sem dataPin-a (Q7) koji je INPUT i preko njega vršimo očitavanja. Clock (CP) i Shift (PL) pri inicijalizaciji idu na HIGH. Funkcijom reg_values() šaljemo puls našem pomeraču registra da prikupi podatke. Prema dokumentaciji, potrebno je Shift pinu postaviti logičku nulu, a zatim jedinicu sa zadržavanjem od pet mikrosekundi, što i radimo. Takođe, iz istog razloga je potrebno postaviti stanja CP, Q7i CE izvodima da bismo uz pomoć Arduino shiftIn() funkcije preuzeli dolazeće vrednosti gde za redosled stavljamo MSBFIRST. Funkcija print_values() nam služi da dobijene vrednosti ispišemo na terminalu.

const int dataPin = 11; // Q7

const int loadPin = 9; // PL

const int clockPin = 8; // CP

const int clockEnablePin = 10; // CE

byte values;

void setup(){

Serial.begin(9600);

pinMode(loadPin, OUTPUT);

pinMode(clockEnablePin, OUTPUT);

pinMode(clockPin, OUTPUT);

pinMode(dataPin, INPUT);

digitalWrite(clockPin, HIGH);

digitalWrite(loadPin, HIGH);

}

void loop(){

values = reg_values();

print_values(values);

delay(2000);

}

byte reg_values(){

byte reading = 0;

digitalWrite(loadPin, LOW);

delayMicroseconds(5);

digitalWrite(loadPin, HIGH);

delayMicroseconds(5);

pinMode(clockPin, OUTPUT);

pinMode(dataPin, INPUT);

digitalWrite(clockPin, HIGH);

digitalWrite(clockEnablePin, LOW);

reading = shiftIn(dataPin, clockPin, MSBFIRST);

digitalWrite(clockEnablePin, HIGH);

return reading;

}

void print_values(byte val){

byte i;

for(byte i=0; i<=7; i++){

Serial.print(val >> i & 1, BIN);

}

Serial.print(„\n”);

}

Kao i uvek, najpraktičnije je koristiti ovakva integralna kola sa namenskom bibliotekom. Naš izbor je biblioteka ArduinoShiftIn, koju možete preuzeti sa adrese bit.ly/2JCMdOm. Biblioteka je izuzetno mala i vrlo lako se implementira u postojeći projekat. Na početku dodajemo biblioteku Shift.h i nakon toga pravimo objekat shift. U slučaju da se koristi kaskadno povezivanje više ovih integralnih kola samo je potrebno u zagradi napisati broj povezanih čipova. Objekat pokrećemo definisanjem pinova našeg mikrokontrolera na koje ćemo povezati upravljačke izvode čipa. Funkcijom displayValues() očitavamo stanje izvoda čipa, dok u loop funkciji ukoliko dođe do promena, njih ispisujemo na terminalu. U našem slučaju ako pomerimo neki od DIP prekidača. Svakom izvodu možemo direktno pristupiti tako što ćemo ga adresirati po rednom broju, recimo, stanje izvoda broj tri pratimo sa shift.state(2), a biblioteka ima podršku do četiri čipa. Biblioteka nema previše funkcija, ali ovih nekoliko je dobro dokumentovano. Ukoliko imamo više ovakvih čipova, potrebno je Q7 izvod svakog sledećeg povezati sa DS izvodom svakog prethodnog, dok se upravljački izvodi povezuju paralelno sa svakim integralnim kolom.

#include <ShiftIn.h>

ShiftIn<1> shift;

void setup() {

Serial.begin(9600);

// declare pins: LoadPin, clockEnablePin, // dataPin, clockPin

shift.begin(9, 10, 11, 8);

}

void displayValues() {

for(int i = 0; i < shift.getDataWidth(); i++)

Serial.print( shift.state(i) );

Serial.println();

Serial.println(shift.state(7));

}

}

void loop() {

if(shift.update())

displayValues();

delay(100);

}

 
Ukoliko je opcija da nam treba samo direktan pristup nekom od izvoda, biblioteka je idealno rešenje. Vrlo se lako koristi i bez previše linija koda dobijamo očitavanja izvoda. Ukoliko pak tražimo od ovog čipa više, koristićemo direktan pristup samom čipu. Recimo, klok po kome će čip raditi se može postaviti i na sat vremena, što se može promeniti u samoj biblioteci. Zatim, klok ne mora da pošalje naš Nano, čak ne mora da to bude mikrokontroler uopšte. To se može izvesti i sa običnim tasterom uz pulldown otpornik ili neko slično rešenje. Bilo koji pristup da se koristi, 74HC165 je svakako zanimljivo parče silicijuma. Na kraju da napomenemo, 74HC165 nije punokrvni SPI uređaj, ali će raditi savršeno povezan po SPI protokolu. Čak se na mreži mogu naći razni primeri gde se za očitavanje inputa koriste funkcije SPI biblioteke. Samo je potrebno povezati upravljačke izvode čipa na GPIO SPI interfejsa samog mikrokontrolera.

Dejan PETROVIĆ

 
Ubuntu 19.04
Converseen 0.9.7.2
DIY: Mini meteo stanica
Nuts and Bolts (2): 74HC165 IC
Šta mislite o ovom tekstu?
Croduino Nova2 i Maker Display
Home / Novi brojArhiva • Opšte temeInternetTest driveTest runPD kutakCeDetekaWWW vodič • Svet igara
Svet kompjutera Copyright © 1984-2018. Politika a.d. • RedakcijaKontaktSaradnjaOglasiPretplata • Help • English
SKWeb 3.22
Opšte teme
Internet
Test Drive
Test Run
PD kutak
CeDeteka
WWW vodič
Svet igara



Naslovna stranaPrethodni brojeviOpšte informacijeKontaktOglašavanjePomoćInfo in English

Svet kompjutera