Indholdsfortegnelse:

Skiftregistret 74HC164 og din Arduino: 9 trin
Skiftregistret 74HC164 og din Arduino: 9 trin

Video: Skiftregistret 74HC164 og din Arduino: 9 trin

Video: Skiftregistret 74HC164 og din Arduino: 9 trin
Video: LDmicro 18: GPS-будильник Ublox NEO-6M (программирование лестничной схемы ПЛК микроконтроллера с помощью LDmicro) 2024, November
Anonim
74HC164 skiftregistret og din Arduino
74HC164 skiftregistret og din Arduino
74HC164 skiftregistret og din Arduino
74HC164 skiftregistret og din Arduino

Skiftregistre er en meget vigtig del af digital logik, de fungerer som lim mellem parallelle og serielle verdener. De reducerer trådtælling, pin -brug og hjælper endda med at tage belastning af din cpu ved at kunne gemme deres data. De findes i forskellige størrelser, med forskellige modeller til forskellige anvendelser og forskellige funktioner. Den jeg vil diskutere i dag er 74HC164 8 bit, seriel parallelt ud, ikke låst, skiftregister. Hvorfor? For det første er det et af de mest grundlæggende skiftregistre derude, hvilket gør det nemmere at lære om det, men det var tilfældigvis den eneste, jeg havde (lol!) Denne instruktive dækker hvordan denne chip fungerer, hvordan man kabler den, og grænseflade det med en arduino, herunder nogle eksempler på skitser og ledede kredsløb. Jeg håber, at I alle nyder det!

Trin 1: Så hvad er skiftregistre?

Så hvad er skiftregistre?
Så hvad er skiftregistre?

Som nævnt tidligere findes de i alle forskellige varianter, og jeg nævnte også, at jeg bruger en 74HC164 8 bit, seriel parallelt ud, ikke låst, skiftregister, hvad betyder det så?!? For det første betyder navnet 74-dets del af 74xx-logikfamilien, og da det ikke direkte kan styre særlig meget strøm (16-20ma for hele chippen er almindelig), sender det kun signaler rundt, men det betyder ikke det signal går ikke til en transistor, der kan skifte en højere strømbelastning. HC betyder, at det er en cmos -enhed med høj hastighed, du kan læse om det på linket herunder, men hvad du grundlæggende har brug for at vide om det, er, at det er en lav strøm og vil køre fra 2 til 5 volt (så hvis du bruger en 3,3 volt arduino din ok) Det kan også fungere ordentligt ved høje hastigheder, denne særlige chip har en typisk hastighed på 78mhz, men du kan gå så langsomt eller så hurtigt (indtil det begynder at tude) som du vil www.kpsec.freeuk.com/components/74series.htm164 er modelnummeret for denne chip, der er et stort diagram over dem på wikipediaen.wikipedia.org/wiki/List_of_7400_series_integrated_circuits Næste, 8 bit Et skiftregister består af flip flop kredsløb, et flip flop er 1 bit hukommelse, denne ene ha s 8 (eller 1 byte hukommelse). Da det er hukommelse, kan du bare stoppe med at "tale" til det, hvis du ikke har brug for at opdatere registret, og det forbliver i den tilstand, du forlod det, indtil du "taler" med det igen eller nulstiller strømmen. andre 7400 logiske serier skiftregistre kan gå op til 16 bit seriel parallelt ud Dette betyder, at din arduino sender data data serielt (on off pulser den ene efter den anden), og skiftregistret placerer hver bit på den korrekte output pin. Denne model kræver kun, at 2 ledninger styres, så du kan bruge 2 digitale ben på arduinoen og bryde disse 2 ud til 8 flere digitale output. Nogle andre modeller er parallelle i seriel udgang, de gør det samme, men som input til arduinoen (f.eks. en NES gamepad) ikke låst Dette kan være et fald i denne chip, hvis du har brug for det. Når data kommer ind i et skiftregister via seriel, vises det på den første output -pin, når en urpuls kommer ind, skifter den første bit over 1 sted, hvilket skaber en rulleeffekt på output, for eksempel 00000001 ville dukke op på output som 101001000100001000001000000100000001 Hvis du taler med andre logiske enheder, der deler det samme ur og ikke forventer dette, kan det forårsage problemer. Låste skiftregistre har et ekstra sæt hukommelse, så når dataene er færdige med at komme ind i registret, kan du vende en switch og vise output, men det tilføjer endnu en ledning, software og ting at følge med i. I tilfælde af dette instruerbare vi styrer LED -skærme, sker rulleeffekten så hurtigt, at du ikke kan se den (undtagen når du først tænder chippen), og når byten er i skifteregisteret, er der ikke mere rulning Vi kontrollerer søjlediagramtype, 7 segment, og en 16LED 4x4 dot matrix med denne chip og software på arduinoen ved hjælp af kun 2 digitale ben (+ strøm og jord)

Trin 2: Grundlæggende ledningsføring og betjening

Grundlæggende ledningsføring og betjening
Grundlæggende ledningsføring og betjening
Grundlæggende ledningsføring og betjening
Grundlæggende ledningsføring og betjening

Kabelføring 74HC164 er en 14 -pins chip, den har 4 input -pins, 8 output pins, strøm og jord, så lad os starte fra toppen. Pin 1 og 2 er begge serielle indgange, de er opsat som en logisk AND -port, hvilket betyder, at de skal begge være logiske høje (dvs. 5 volt) for at bit kan ses som en 1, en lav tilstand (0 volt) på begge vil blive læst som et nul. Vi har ikke rigtig brug for dette, og det er lettere at håndtere i software, så vælg en og bind den til V+, så den altid læser højt. Jeg vælger at bruge en jumper fra pin 1 til pin 14 (V+), da du bare kan pope en brødbræt jumper over chippen. Den ene tilbageværende serielle indgang (pin 2 i mine skemaer) vil gå til digital pin 2 i arduinoen. Pin 3, 4, 5 og 6 i 74HC164 er de første 4 bytes af outputPin 7 forbindes til jorden Jumping til højre, pin 8 er urpinden, sådan ved skifteskiftet, at den næste serielle bit er klar til at den kan læses, denne skal tilsluttes digital pin 3 på arduinoen. Pin 9 er at slette hele registret på én gang, hvis det går lavt, du har mulighed for at bruge det, men intet i dette uigennemsigtige gør, så bind det til V+ben 10, 11 12 og 13 er de sidste 4 bytes med outputpin 14 er chipsets strøm Operation Først skal du indstille seriel input i registret (digital pin 2 på arduino) høj eller lav, derefter skal du vende urstiften (digital pin 3) fra lav til høj, skifteregistret vil læse dataene på den serielle indgang og flytte outputstifterne med 1, gentag 8 gange, og du har indstillet alle 8 udgange. Dette kan gøres manuelt med sløjfer og digitale skrivninger i arduino IDE, men siden t hans er en meget almindelig hardware -niveau kommunikation (SPI) de har en enkelt funktion, der gør det for dig. shiftOut (dataPin, clockPin, bitOrder, værdi) Bare fortæl det, hvor data og urpinde er forbundet til arduinoen, hvilken måde at sende dataene og hvad de skal sende, og det er taget hånd om for dig (praktisk)

Trin 3: Projekter

Projekter
Projekter

Okay, nok foredrag og teori, lad os lave nogle sjove ting med denne chip! Der er 3 projekter at prøve i denne instruerbare, de to første er lette og kan brødboardes ud på få øjeblikke. Den tredje, 4x4 led matrix, kræver mere tid og tanke at konstruere, på grund af led ledninger. Liste over dele Projekt 1: '2 Wire' bargraph LED display controller 1 * 74HC164 Skiftregister1 * loddet brødbræt1 * arduino eller arduino kompatibel (5v) 1 * 330 ohm 1/4 watt modstand 8 * normal output røde LED'er 12 * jumperwires Projekt 2: '2 Wire' 7 segment display controller 1 * 74HC164 Skiftregister1 * loddet brødbræt1 * arduino eller arduino kompatibel (5v) 1 * 330 ohm 1/4 watt modstand 1 * fælles katode syv segment display9 * jumper ledninger Projekt 3: '2 Wire' 4x4 led matrix display 1 * 74HC164 Skiftregister 1 * arduino eller arduino kompatibel (5v) 4 * 150 ohm 1 1/4 watt modstand 8 * 1Kohm 1/8 watt modstand (eller større) 8 * NpN transistor (2n3904 eller bedre) 16 * normal udgang rød LED er et middel til at konstruere den og reguleret 5 volt effekt, der kan klare 160+ma (du kan tænde alle LED'erne på én gang som et bremselys)

Trin 4: Projekt 1 [pt 1]: '2 Wire' Bargraph LED Display Controller Hardware

Projekt 1 [pt 1]: '2 Wire' Bargraph LED Display Controller Hardware
Projekt 1 [pt 1]: '2 Wire' Bargraph LED Display Controller Hardware
Projekt 1 [pt 1]: '2 Wire' Bargraph LED Display Controller Hardware
Projekt 1 [pt 1]: '2 Wire' Bargraph LED Display Controller Hardware

Tilslut arduino- og skiftregistret i henhold til skematisk, jeg har allerede et 10 segment -søjlediagram -display klar til brug på brødbræt, og det er det, du vil se på billedet, men du kan gøre det samme med individuelle LED'er På den anden side Jeg erklærede, at disse ikke var driverenheder, at de var logiske enheder, med bittesmå mængder strøm, der kunne passere gennem dem. For at køre 8 lysdioder, samtidig med at kredsløbet er enkelt og ikke tilbereder skiftregisteret, kræver det, at vi begrænser strømmen en smule. LED'erne er parallelt tilsluttet og deler en fælles jord (fælles katode), inden vi går ind i strømmen strømforsyning, de har brug for at passere gennem en 330 ohm modstand, hvilket begrænser den samlede mængde strøm, som alle lysdioderne muligvis kan bruge til 10ma (ved 5 volt) Dette efterlader LED'erne i en sygelig tilstand, men de lyser op og tjener dermed til dette eksempel, for at drive lysdioderne til deres rigtige strøm skal du indsætte en transistor, hvor skiftregistret kan tænde / slukke en højere strømkilde (se projekt 3) Datapinden i skiftregistret (pin 2) har brug for for at oprette forbindelse til arduino digital pin # 2 Clock pin på skiftregistret (pin 8) skal tilsluttes til arduino digital pin # 3

Trin 5: Projekt 1 [pt 2]: '2 Wire' Bargraph LED Display Controller Software

Projekt 1 [pt 2]: '2 Wire' Bargraph LED Display Controller Software
Projekt 1 [pt 2]: '2 Wire' Bargraph LED Display Controller Software
Projekt 1 [pt 2]: '2 Wire' Bargraph LED Display Controller Software
Projekt 1 [pt 2]: '2 Wire' Bargraph LED Display Controller Software

Eksempel 1: Åbn filen "_164_bas_ex.pde" Inde i arduino IDE, Det er en simpel skitse, der bare lader dig definere til eller fra lysdioder i søjlediagramvisningen. De første 2 linjer definerer de pin -numre, vi vil bruge til data og ur, I brug #define over const heltal, jeg synes det er lettere at huske, og der er ingen fordel ved det ene eller det andet, når de er udarbejdet #definer data 2 #definer ur 3 næste er tomrumsopsætningsfunktionen, det kører kun en gang, så arduinoen vender på, indstiller vagtregistret og har ikke andet at gøre. Inde i void -opsætningsfunktionen indstiller vi uret og datastifterne som OUTPUT -ben, derefter bruger vi shiftOut -funktionen dataene til skiftregisterets hulrumsopsætning () {pinMode (ur, OUTPUT); // gør urpinden til en output pinMode (data, OUTPUT); // gør datapinden til et output shiftOut (data, ur, LSBFIRST, B10101010); // send denne binære værdi til skiftregistret} I shiftOut -funktionen kan du se dens argumenter data er datapinden, uret er urpinden LSBFIRST refererer til hvilken rækkefølge den er i, når den skrives ud i binær notation (Bxxxxxxxx) den 7. element forbi B er den mindst betydningsfulde bit. Først indføres dette først, så det ender på det sidste output, når alle 8 bits er matet inB10101010 er den binære værdi, der sendes til skiftregistret, og det vil tænde hvert ulige lys, prøv at lege med forskellige værdier for at tænde eller slukke forskellige mønstre og endelig en tom hulrumsløkke (fordi du har brug for en, selvom du ikke bruger den) hulrumsløbet () {} // tom løkke for nu Eksempel 2: de første 8 linjer er det samme som de første 8 linjer i det første eksempel, faktisk ændres de ikke for nogen af de andre projekter, så #define data 2 #definer ur 3void setup () {pinMode (clock, OUTPUT); // gør urpinden til en output pinMode (data, OUTPUT); // gør datapinden til en udgang Men nu i hulrumsopsætning er der 8 tællinger for sløjfe, det tager en tom byte og skifter 1 bit ind ad gangen fra den bit længst til venstre og bevæger sig til højre. Dette er baglæns fra det første eksempel, hvor vi startede fra den højre yderste bit og arbejdede til venstre, men ved hjælp af MSBFIRST sender shift out -funktionen dataene på den rigtige måde. Også tilføjer vi en forsinkelse i for -sløjfen, så den sænkes nok til at være synlig. for (int i = 0; i <8; ++ i) // for 0 - 7 do {shiftOut (data, ur, MSBFIRST, 1 << i); // bitskift en logisk høj (1) værdi med i forsinkelse (100); // forsink 100 ms, eller du ville ikke kunne se det}} void loop () {} // tom loop for nu at uploade scriptet, og du skulle nu se søjlediagrammet tænde hvert lys ad gangen

Trin 6: Projekt 2: '2 Wire' 7 Segment Display Controller

Projekt 2: '2 Wire' 7 Segment Display Controller
Projekt 2: '2 Wire' 7 Segment Display Controller
Projekt 2: '2 Wire' 7 Segment Display Controller
Projekt 2: '2 Wire' 7 Segment Display Controller

Kig på pinout på dit 7 -segment display (jeg havde kun en dobbelt men brugte kun halvdelen) og brug tegningen herunder til at forbinde hvert segment til den korrekte bit på skiftregistret 1 = pin 3bit 2 = pin 4bit 3 = pin 5bit 4 = pin 6bit 5 = pin 10bit 6 = pin 11bit 7 = pin 12bit 8 = pin 13 (hvis du vil bruge decimalpunktet) Og katodens display gennem 330ohm modstanden og til strømforsyningen skal nu åbne seven_seg_demo.pde i arduino IDFørst ser du, hvor vi definerer data og urnåle #definerer data 2 #definerer ur 3 Derefter indstiller vi alle charatermønstre i binært, dette er ret let, se på tegningen herunder, hvis du har brug for det midterste segment indtast et et, næste skal du bruge det øverste segment, hvis det er tilfældet, skal du indtaste et andet. Bliv ved med at gøre dette, indtil du dækker alle 8 segmenter. Bemærk, at min bit til højre (bit 8) altid er 0, det er fordi jeg aldrig tænder decimalet punkt. byte nul = B01111110; byte en = B00000110; byte to = B11011010; byte tre = B11010110; byte fire = B10100110; byte fem = B11110100; byte seks = B11111100; byte syv = B01000110; byte otte = B11111110; byte ni = B111101 næste i void -opsætning sætter vi vores data og urpinde til at udsende hulrumsopsætning () {pinMode (ur, OUTPUT); // gør urpinden til en output pinMode (data, OUTPUT); // gør datapinden til en output3} så i void loop bruger vi shiftOut til at vise hvert mønster (tal), vent 1/2 et sekund og vis det næste, 0 til 9, da det gøres i void loop funktionen tæller det 0-9 og gentag for altid. void loop () {shiftOut (data, ur, LSBFIRST, nul); forsinkelse (500); shiftOut (data, ur, LSBFIRST, en); forsinkelse (500); shiftOut (data, ur, LSBFIRST, to); forsinkelse (500); shiftOut (data, ur, LSBFIRST, tre); forsinkelse (500); shiftOut (data, ur, LSBFIRST, fire); forsinkelse (500); shiftOut (data, ur, LSBFIRST, fem); forsinkelse (500); shiftOut (data, ur, LSBFIRST, seks); forsinkelse (500); shiftOut (data, ur, LSBFIRST, syv); forsinkelse (500); shiftOut (data, ur, LSBFIRST, otte); forsinkelse (500); shiftOut (data, ur, LSBFIRST, ni); forsinkelse (500);}

Trin 7: Projekt 3 [pt 1]: '2 Wire' 4x4 Led Matrix Display

Projekt 3 [pt 1]: '2 Wire' 4x4 Led Matrix Display
Projekt 3 [pt 1]: '2 Wire' 4x4 Led Matrix Display
Projekt 3 [pt 1]: '2 Wire' 4x4 Led Matrix Display
Projekt 3 [pt 1]: '2 Wire' 4x4 Led Matrix Display

4x4 LED -matrixprojektet er lidt mere komplekst, men det er næsten alt i konstruktion, jeg vælger at lave mit loddet på perfboard, men det burde være muligt at replikere på et brødbræt, bare meget mere adskilt. Kredsløbet også adskiller sig ved, at skiftregistret ikke direkte driver LED'erne, i stedet sendes skiftregisterudgange gennem en 1Kohm -modstand til bunden af en NpN -transistor, når bitens output er høj, lader det nok strøm og spænding passere ind i transistor for at skifte forbindelsen mellem kollektoren og emitteren, er kollektorerne bundet til en "robust" reguleret 5 volt. Transistorernes emittere er forbundet til 150 ohm modstande, og modstandene er bundet til anoderne på 4 lysdioder i træk og begrænser rækken til 20ma, selvom når der tegnes billeder på displayet, er kun 1 LED tændt ad gangen, og derfor nær fuld lysstyrke (nær fordi de tænder og slukker virkelig hurtigt for at udgøre hele billedet) Der er 4 rækker og 4 kolonner, hver række får en modstand og en transistor, på hver kolonne er LED's katoder bundet sammen, løb ind i kollektoren af en transistor, hvis base også styres af skiftregistret og til sidst ud til jorden. Stor version af skematisk www.instructables.com/files/orig/F7J/52X0/G1ZGOSRQ/F7J52X0G1ZGOSRQ.jpg

Trin 8: Projekt 3 [pt 2]: '2 Wire' 4x4 Led Matrix Display

Projekt 3 [pt 2]: '2 Wire' 4x4 Led Matrix Display
Projekt 3 [pt 2]: '2 Wire' 4x4 Led Matrix Display
Projekt 3 [pt 2]: '2 Wire' 4x4 Led Matrix Display
Projekt 3 [pt 2]: '2 Wire' 4x4 Led Matrix Display
Projekt 3 [pt 2]: '2 Wire' 4x4 Led Matrix Display
Projekt 3 [pt 2]: '2 Wire' 4x4 Led Matrix Display

Skiftregistret styrer både anoden og katoderne på LED'erne i et YX -format, se på følgendebit 1 = kolonne 1 (længst til højre) bit 2 = kolonne 2bit 3 = kolonne 3bit 4 = kolonne 4bit 5 = række 1 (øverst) bit 6 = række 2bit 7 = række 3bit 8 = række 4 For at lave et billede skal du tegne en firkant på 4x4 på grafpapir og udfylde hvilke du vil have vist, lav derefter en YX -tabel. Nedenfor ser du en kortlægning til en lignelse, samt det bedste man kan gøre på 4x4 "pixels" For hver udfyldt sektion skriver jeg ned hvilken kolonne (Y) den er i, derefter hvilken række den er i (X) Åbn nu op _4x4.pde -filen i arduino IDE vil du se vores gamle 2 venner #define data 2 #definere ur 3 derefter en række heltal int img = {1, 1, 4, 1, 1, 3, 4, 3, 2, 4, 3, 4}; Hvis du ser det bare er en liste over mine nedskrevne YX -koordinater, ville det være en stor smerte i rumpen at konvertere disse værdier i hånden, og vi har en computer … lad det gøre det! Hvis du fortsætter, er der tomrumsopsætning, hvor vi laver vores ur og datapinde OUTPUTS ugyldig opsætning () {pinMode (ur, OUTPUT); // gør urpinden til en output pinMode (data, OUTPUT); // gør datapinden til en output3} Og en forvirrende hulrumsløjfe, for at starte tingene er vi nødt til at erklære nogle lokale variabler for void loop () {int Y; int X; byte ud; Så en for loop, denne loop skal være så lang som mængden af poster i img -arrayet, for dette billede brugte jeg kun 6 pixels, så det giver 12 YX -koordinater. Jeg får det til at springe hvert andet tal over ved at bruge i += 2, fordi vi læser 2 koordinater pr. Loop for (int i = 0; i <12; i += 2) // antal punkter i img -arrayet, dette tilfælde 12 {Nu læser vi Y -enterien ved i arrayet og trækker en fra dens værdi, fordi bytes ikke starter med en, de starter på nul, men vi tællede fra 1 // få det første par YX -ledninger Y = (img - 1); // træk en fra, da bit -antallet starter ved 0 Dernæst læser vi X -enteriet ved [i + 1] i arrayet og trækker en fra dens værdi på grund af samme årsag X = (img [i + 1] - 1); Når vi har pixelens YX -værdier, laver vi lidt bitvis eller matematik og skifter til venstre. Først skal vi læse X -værdien, og uanset dens værdi er forskydning den så mange steder + 4 tilbage, så hvis X er 4 og tilføj 4 det er bit 8 (MSB), ser på diagrammet igen … bit 1 = kolonne 1 (længst til højre) bit 2 = kolonne 2bit 3 = kolonne 3bit 4 = kolonne 4bit 5 = række 1 (øverst) bit 6 = række 2bit 7 = række 3bit 8 = række 4 Bit 8 er den sidste række Næste forskydes Y -værdien også til venstre, denne gang bare af sig selv, intet tilføjes. Endelig er de to sammenlagt til 1 byte i stedet for 2 halve bytes (nibbles), ved hjælp af bitvis eller (symbolet |) tager to bytes og tilføjer dem grundlæggende, lad os antage X = 10000000Y = 00000001 -------------------- ELLER = 10000001pil 4 kolonne 1 ud = 1 << (X + 4) | 1 << Y; Og til sidst shiftOut for at vise det aktuelle billede, og fortsæt med at gøre det, indtil vi ikke har flere data i arrayet … forsink et øjeblik og loop for evigt, da vi flyttede data til venstre, og vi har brug for MSB til at være på den sidste output pin i vagtregistret send det først ud. shiftOut (data, ur, MSBFIRST, ud); // skift byte ud til vores registerforsinkelse (1); // forsink det abit, så det har en chance for at efterlade et lyspunkt i dine øjne Du er velkommen til at lave dine egne billeder og effekter, Der er 3 prøvefiler, smiley -ansigtet og et skakbræt (der ligner mere striber), og til sidst en tilfældig funklemaskine

Trin 9: Konklusion

Konklusion
Konklusion
Konklusion
Konklusion
Konklusion
Konklusion

Over alt dette er en temmelig praktisk lille chip, og jeg er glad for, at jeg fjernede den fra et gammelt stykke elektronik på vej til skraldespanden. Den kan bruges til andre ting udover displaysystemer, men alle kan lide lys og øjeblikkelig feedback om at se hvad der foregår er ekstremt nyttigt for de visuelle tænkere som I. Også tilgiv venligst min kode, jeg har kun haft arduino siden den tredje uge i oktober, og det har været et temmelig stort styrtkursus. Men det er det fantastiske ved systemet, hvis du sætter dig ned og arbejder med det, er det fuld af pæne funktioner, der gør det let at kontrollere verden med en 8 bit mikrokontroller. Som altid er spørgsmål og kommentarer meget velkomne, og tak for læsning, jeg håber du har lært meget

Anbefalede: