Yra įterptojo dizaino galimybių, kai mikrokontroleryje nėra pakankamai įvesties / išvesties kaiščių. Taip gali būti dėl bet kokios priežasties, gali būti, kad jūsų programai reikia kelių šviesos diodų arba norite naudoti kelis 7 segmentų ekranus, tačiau jūsų mikrovaldiklyje nereikalingi įvesties / išvesties kaiščiai. Čia ateina puikus komponentas, pamainų registras. „Shift“ registras priima nuoseklius duomenis ir suteikia lygiagrečią išvestį. Norint prisijungti prie mikrovaldiklio, reikia tik 3 kontaktų, ir iš jo gausite daugiau nei 8 išvesties kaiščius. Vienas iš populiariausių pamainų registrų yra 74HC595. Jis turi 8 bitų atminties registrą ir 8 bitų poslinkio registrą. Sužinokite daugiau apie pamainų registrus čia.
Jūs pateiksite nuoseklius duomenis į pamainų registrą ir jie bus užfiksuoti saugojimo registre, o tada saugojimo registras valdys 8 išėjimus. Jei norite daugiau išvesties, tiesiog pridėkite kitą pamainų registrą. Iki domino dvi pamainos registrus, gausite papildomus 8 išėjimai, bendra 16bit išvestį.
Pamainų registras 74HC595:
Čia yra 74HC595 kaiščių diagrama, kaip nurodyta duomenų lape.
HC595 turi 16 smeigtukų; jei pamatysime duomenų lapą, suprasime kaiščių funkcijas-
Apsaugos į QH, nuo PIN numerius nuo 1 iki 7 ir 15 naudojama kaip 8 bitų produkcijos nuo pamainos registre, kur, kaip kaištis 14 naudojama gavimo serijos duomenų. Taip pat yra tiesos lentelė apie tai, kaip naudoti kitus kaiščius ir naudotis kitomis pamainų registro funkcijomis.
Kai rašysime 74HC595 sąsajos kodą, pritaikysime šią tiesos lentelę norimiems išėjimams gauti.
Dabar mes susiesime 74HC595 su PIC16F877A ir valdysime 8 šviesos diodus. Mes susiejome 74HC595 „shift register“ su kitais mikrovaldikliais:
- Sąveikaujantis „74HC595“ serijos keitimo registras su „Raspberry Pi“
- Kaip naudotis „Shift Register“ 74HC595 su „Arduino Uno“?
- Sąsajos skystųjų kristalų ekranas su „NodeMCU“ naudojant „shift register“
Būtini komponentai:
- PIC16F877A
- 2vnt. 33pF keraminiai diskiniai kondensatoriai
- 20Mhz kristalas
- 4.7k rezistorius
- 8vnt šviesos diodai
- 1k rezistorius -1 pc (reikalingi 8 vnt. 1k rezistoriai, jei reikia atskirų rezistorių kiekvienoje lemputėje)
- 74HC595 ic
- 5V sieninis adapteris
- PIC programavimo aplinka
- Breadboard ir laidai
Grandinės schema:
Grandinės schemoje mes sujungėme nuoseklų duomenų kaištį; laikrodžio ir stroboskopo (fiksatoriaus) kaištis ant mikrovaldiklio RB0, RB1 ir RB2 kaiščių. Čia mes naudojome vieną rezistorių 8 šviesos diodams. Pagal tiesos lentelę įgalinome išvestį, prijungdami 74HC595 kaištį 13 prie žemės. GP kaištis paliktas atviras, nes mes ne kaskados kitą 74HC595 su juo. Mes išjungėme išvalymo įvesties vėliavą, prijungdami pamainų registro 10 kaištį su VCC.
Kristalinis osciliatorius yra prijungtas prie mikrovaldiklio OSC kaiščių. PIC16F877A neturi vidinio osciliatoriaus. Šiame projekte mes apšviesime vieną po kito nuo Q0 iki Q7, naudodami „shift regitster“.
Mes sukonstravome grandinę duonos lentoje -
Kodo paaiškinimas:
Straipsnio pabaigoje pateikiamas visas šviesos diodų su poslinkio registru valdymo kodas. Kaip visada, mes turime nustatyti konfigūracijos bitus PIC mikrovaldiklyje.
#pragma config FOSC = HS // Oscilatoriaus pasirinkimo bitai (HS osciliatorius) #pragma config WDTE = OFF // Watchdog Timer Įjungti bitą (WDT išjungtas) #pragma config PWRTE = OFF // Įjungimo laikmatis Įgalinti bitą (PWRT išjungtas) # pragmos konfigūracija BOREN = ĮJUNGTA // Išjungta iš naujo Įgalinti bitą (įjungta BOR) #pragma konfigūracija LVP = IŠJUNGTA // Žemos įtampos (vieno tiekimo) grandinės nuosekliojo programavimo įgalinimo bitai (RB3 / PGM kaištis turi PGM funkciją; žemas Įjungtas įtampos programavimas) #pragma config CPD = OFF // Duomenų EEPROM atminties kodo apsaugos bitai (duomenų EEPROM kodo apsauga išjungta) #pragma config WRT = IŠJUNGTA // „Flash“ programos atminties įrašymas Įgalinti bitus (Rašymo apsauga išjungta; visa programos atmintis gali būti parašė EECON kontrolė) #pragma config CP = OFF // „Flash“ programos atminties kodo apsaugos bitas (kodo apsauga išjungta)
Po to mes deklaravome kristalų dažnį, kuris reikalingas vėlavimui, ir 74HC595 kontaktų deklaraciją.
# įtraukti
Tada mes paskelbėme funkciją system_init (), kad inicijuotume kaiščio kryptį.
void system_init (negaliojantis) { TRISB = 0x00; }
Laikrodžio impulsą ir fiksatoriaus impulsą sukūrėme naudodami dvi skirtingas funkcijas
/ * * Ši funkcija įjungs laikrodį. * / negaliojantis laikrodis (negaliojantis) { CLK_595 = 1; __delay_us (500); CLK_595 = 0; __delay_us (500); }
ir
/ * * Ši funkcija įsijungs ir įjungs išvesties paleidiklį. * / negaliojantis strobas (negaliojantis) { STROBE_595 = 1; __delay_us (500); STROBE_595 = 0; }
Po šių dviejų funkcijų paskelbėme funkciją „ data_submit“ (nepasirašyti int duomenys), norėdami pateikti serijos duomenis į 74HC595.
void data_submit (nepasirašyti int duomenys) { for (int i = 0; i <8; i ++) { DATA_595 = (duomenys >> i) & 0x01; laikrodis(); } strobe (); // Pagaliau pateikti duomenys }
Šioje funkcijoje mes priimame 8 bitų duomenis ir kiekvieną bitą siunčiame naudodamiesi dviem kairės pakopos operatoriais ir AND operatoriumi. Pirmiausia perkeliame duomenis po vieną ir sužinome tikslų bitą, ar tai yra 0, ar 1, naudojant AND operatorių su 0x01. Kiekvienus duomenis saugo laikrodžio impulsas, o galutiniai duomenys išvedami naudojant fiksatorių arba stroboskopinį impulsą. Šiame procese duomenų išvestis pirmiausia bus MSB (reikšmingiausias bitas).
Į pagrindinį funkcija mes pateikė dviejų ir padarė išvesties smeigtukai aukštą po vieną.
system_init (); // Sistema ruošiasi, kol (1) { data_submit (0b00000000); __delay_ms (200); data_submit (0b10000000); __delay_ms (200); data_submit (0b01000000); __delay_ms (200); data_submit (0b00100000); __delay_ms (200); data_submit (0b00010000); __delay_ms (200); data_submit (0b00001000); __delay_ms (200); data_submit (0b00000100); __delay_ms (200); data_submit (0b00000010); __delay_ms (200); data_submit (0b00000001); __delay_ms (200); data_submit (0xFF); __delay_ms (200); } grįžti; }
Štai kaip galima naudoti poslinkių registrą, norint gauti daugiau laisvų įvesties / išvesties kaiščių bet kuriame mikrovaldiklyje, kad būtų galima prijungti daugiau jutiklių.