595-Registrul este necesar peste tot și în toată lumea, note pe câmpuri

Aplicarea registrelor de deplasare 74HC595 sau cum să gestionați totul direct folosind doar 3 picioare de MC.

595th - un lucru folosit pe scară largă atunci când nu există suficiente porturi de ieșire pentru microcontroler. Pentru a controla registrul, sunt necesare cel puțin două iesiri de controler (sau mai bine trei), iar ieșirile obțin teoretic la fel de mult cum am dorit (am avut maximum 48), care vor fi discutate mai departe.

La sfârșit, voi descrie experiența de protecție împotriva interferențelor, cum ar fi atunci când registrele unității conectate la bucla de control, și pentru că CMOS de intrări, nu este-dobryy- vechi „cald“ TTL, atunci curenții sunt aproape de zero. Și nu-i rău pentru astfel de conexiuni, și să furnizeze o situație în care bucla de conectare sgryzli neașteptat arsenal nuclear grizzly și porturile controlate.

Ei bine, până când gramada scrie ce comenzi pentru controlere Atmel (ATMEGA, ATtiny), este convenabil de a lucra cu porturile când programarea în C (orice operatori de biți, viclean #define pentru a îmbunătăți lizibilitatea codului și așa mai departe.). Se pare că este un astfel de ghid pentru începători. Și este mai bine să nu începătorii imediat la cel de-al doilea post despre interferențe ...

În primul rând, cum funcționează registrul de deplasare?

După cum sugerează și numele, el schimbă ceva undeva. Orice astfel de registru are două intrări principale:

  • Intrare de intrare a datelor
  • Introducerea impulsului * de schimbare (ceas Shift)

* „Pulse“ (sau „poarta“), o modificare consecutivă a valorilor de intrare de la „0“ la „1“ și înapoi la „0“, sau o versiune inversat de la „1“ la „0“ și înapoi la „1“. Trecerea de la "0" la "1" este numită marginea de vârf, dimpotrivă - cea din spate. 74HC595 comută pe marginea în creștere, adică în momentul trecerii de la "0" la "1".

Strobe de schimbare inițiază "rescrierea" valorilor de ieșire la următoarea ieșire: de la 1 la 2, de la 2 la 3, ..., 7-> 8, apoi ceea ce a fost pierdut la 8. O schimbare este obținută de la prima ieșire în direcția celui din urmă. În același timp, prima ieșire înregistrează datele de intrare.

De exemplu: inițial au existat zerouri (00000000) la ieșiri,

Apoi Data a fost dat 1, după care au fost făcute 3 lovituri pe ceasul Shift.

Ca rezultat, obținem: 11100000 (de exemplu, de 3 ori toate s-au mutat spre dreapta și au scris 1 din datele din prima ieșire).

Apoi, la introducerea datelor, a fost afișat 0 și a fost trimis un alt stroboscop:

Ieșire: 01110000 (3 unități au fost accesate cu crawlere la dreapta și 0 au fost scrise la prima cifră din date)

În cele din urmă, datele au lăsat 0 și au făcut încă 5 strobe (5 mutări spre dreapta):

Ieșire: 00000011 (deplasat atât de puternic încât prima unitate înregistrată a apărut în 8 biți și a dispărut)

Prin setarea secvențială a valorilor cerute pe intrarea și schimburile de date, puteți obține orice combinație la ieșirile din registru, adică Conversia serial la paralel. La 74HC595 ieșiri 8, se dovedește că ieșirea controlerului 2 poate „dilua“ cele 8 elemente de acționare. Și în cazul în care ultimul Registru de ieșire Hitch date de intrare un alt registru și zaparallelit ceasul Shift de pe ceas Shift în primul rând, apoi „fugar 8 cifre“ va deveni primul în registrul următor, și vom obține nu 8, iar 16 biți este, de conducere încă cu ambele picioare controler (puteți crește numărul de registre suplimentare, primind 24, 32 etc.).

Un pic de codificare.

Cel mai simplu exemplu (adecvat pentru dispozitivele de indicare și lentă, cum ar fi releele).

Ieșirea secvențială a fiecărui bit la portul controlerului în care este conectată intrarea datelor și trageți înainte și înapoi portul în care este conectată intrarea Shift a registrului.

În general, acest cod este extrem de înfricoșător (și de modul în care nu este testat, pentru că nu scriu), este mai bine să introduceți mai multe #define:

* Poți să mergi mai departe și să faci o #define imbrăcată pentru a scăpa de portul direct B. DDR B. P B ... dar nu am încă o bibliotecă universală care să devină critică.

Acum să trecem la circuite și nuanțe.

Ca victimă, alegem Attiny13, pe care Dumnezeu a ofensat-o cu picioarele, dar a acordat un preț extrem de mic. Resetați și resetați MR nu uitați să închideți rezistoarele pull-up, în caz contrar puteți obține erecție zero și mult timp pentru a înțelege de ce este întotdeauna 8 :).

Opțiunea 1 (cea mai simplă) - controlul indicatorilor cu 7 segmente cu ATTINY13 pe 2 fire:

595-Registrul este necesar peste tot și în toată lumea, note pe câmpuri
Este timpul să spunem despre o altă intrare importantă a celui de-al 595-lea - este un Latch Clock (în conformitate cu schema ST_CP), care "clipește" informațiile de pe ieșiri.

Circuitul celui de-al 595-lea se face astfel încât un registru paralel să fie ascuns între ieșirile registrului de deplasare (virtual 1 ... 8) și ieșirile chipului (Qa-Qh). Aceasta înseamnă că putem scrie și muta cât de mult ne place, dar starea ieșirilor fizice (Qa-Qh) se va schimba numai când apariția strobei apare la intrarea ceasului de blocare (scrieți în registrul paralel). Acesta poate fi pur și simplu conectat la Shift Lock și continuă să controleze cele 2 linii, care este prezentat aici.

Un avertisment este că trecerea și (SH_CP sau Shift ceas) și „snapping“ ieșiri (ST_CP sau de blocare a Slock) sunt realizate pe creșterea stroboscopul de margine. Se pare că ieșirile sunt blocate de starea registrului înainte de aplicarea turei, tk. curentul nu are timp să ajungă la blocurile.

În cazul în care inginerii au făcut una dintre intrările de pe "marginea posterioară", ar fi mult mai ușor de trăit și astfel pentru a rezolva problema, în cod trebuie să înregistrați o poartă suplimentară după ciclul de ieșire (caractere aldine):

Și, în cele din urmă, despre caracteristica de a nu utiliza ceasul de blocare pentru scopul propus. Afișăm fiecare schimbare a registrului pe indicator, și nu doar ultima "starea corectă a ieșirilor". Și înainte de a aprinde segmentul corect conectat la Q6, vom vedea seria „lumina“ va rula pe toate celelalte segmente, mănâncă, dar atunci când cronometrat 9.6MGts se va întâmpla foarte repede, dar poate fi sesizabilă.

Și, bineînțeles, acest lucru nu se poate face dacă nu avem diode simple de emisie de lumină pe ieșiri, dar ceva mai inteligent și mai rapid, de exemplu, un controler de ecran LCD. Și prin urmare:

Opțiunea 2 (3 linii):

595-Registrul este necesar peste tot și în toată lumea, note pe câmpuri
Nu va exista nici o ieșire intermediară a indicatorului până când nu trimitem un impuls de-a lungul liniei PB2 - ST_CP (blocarea blocării). Codul este acum reglementat puțin diferit (această versiune sau echivalentul de asamblare pe care îl folosesc acum):

Aceeași opțiune, dar cu doi biți de indicație statică.

595-Registrul este necesar peste tot și în toată lumea, note pe câmpuri

Este timpul să spuneți câte ceva despre cascadarea mai multor registre. Este clar că semnalul alimentat în mod continuu trece prin toate ieșirile din registru, dar arată registrul stațiilor de ieșire numai prin ceasul de blocare (ST_CP), dar există o piedă "secretă" Q7 'care este ieșită din registru direct, adică ocolind zăvorul (și, prin urmare, nu depinde de ceasul de blocare). Au existat 8 lovituri pe Shift Clock, pentru a obține statutul DS pe Q7 ', indiferent dacă am permis ieșirea la Q0-Q7. Ie Datele (DS) ale fiecărui registru următor trebuie să fie conectate la Q7 'din cel precedent și astfel capacitatea de biți va fi mărită. În această schemă, primul byte trimis este afișat pe indicatorul inferior, iar cel de-al doilea octet pe indicatorul superior.

Codul pentru această schemă este puțin diferit în stilistica, deoarece Am scos-o afară din vechiul proiect folosind un afișaj cu 7 segmente. El are un mic dezavantaj - munca sa este mai dificil de a considera un osciloscop, deoarece în versiunea anterioară, este convenabil să închideți sincronizarea pentru declinul PCLatch și să urmăriți unde este transmis și aici Blocul trece atunci când este peste tot. Ei bine, ieșirea unui bit byte de biți prin bitul mare (în schimbul din stânga) în asamblare este realizată mai bine și apoi prin deplasarea inferioară (dreapta), deoarece pe C este atât de "natural". Dar am înțeles toate acestea mult mai târziu decât proiectul rezultat :) Dar acest cod este mai evident și mai plin de sens practic:

Doar în caz, puțin despre sintaxa C folosită:

Datele de înregistrare scurte = 2; echivalentul datelor = date 2;

Utilizatori de biți folosiți pe scară largă:

Articole similare