- Kružni dijagram:
- PIC mikrokontroler PIC16F877A Šifra sekvencije trepćućeg LED diode i radno objašnjenje:
U našem prethodnom vodiču naučili smo o treptanju LED diode pomoću PIC mikrokontrolera i izgradili isti krug na Perf ploči. Zatim smo koristili PICkit 3, ICSP i MPLAB IPE za izbacivanje programa na našu Perf ploču. Sada ćemo u ovom vodiču unaprijediti sebe tako da koristimo više pinova na PIC mikrokontroleru. Upotrijebit ćemo 7 izlaza (LED) i jedan ulaz. Za ovaj tutorial upotrijebit ćemo staru Perf ploču (prikazanu dolje) i dodati ćemo berg štapiće da izvučemo potrebne igle na drugu LED ploču. Na kraju ovog vodiča generirat ćemo sekvencu trepćućih LED dioda pomoću PIC mikrokontrolera PIC16F877A i naučit ćemo kako koristiti više ulaza i izlaza, neke osnove o pozivanju petlje i funkcije.


LED ploča nije ništa drugo nego još jedna perf ploča, na koju ćemo lemiti LED diode trenutnim otpornikom koji ograničava (prikazan dolje). Također ćemo dodati tipku za pokretanje treptanja LED diode u nizu.

Kružni dijagram:

PIC mikrokontroler PIC16F877A Šifra sekvencije trepćućeg LED diode i radno objašnjenje:
Kompletni kod dan je u nastavku (provjerite na kraju), ovdje ćemo ga prenijeti kroz redak po redak. Ovaj kod započet će uzastopno svijetliti LED-ima kad se pritisne tipka. Da biste razumjeli sekvence, pogledajte video na kraju vodiča. Preporučio bih vam da usporedite izlaz prikazan u videu s donjim kodom i pokušate razumjeti program.
Pogledajmo kod red po redak. Prvih nekoliko redaka odnosi se na postavljanje konfiguracijskih bitova koji su objašnjeni u prethodnom vodiču pa ih zasad preskačem. Najbolji način da razumijete bilo koji program je da krenete od glavne ( void main () ) funkcije, pa učinimo to
TRISB0 = 1; // Uputite MCU da se PORTB pin 0 koristi kao ulaz za gumb. TRISD = 0x00; // uputite MCU da su svi pinovi izlazni PORTD = 0x00; // Inicijalizirajte sve pribadače na 0
Riječ TRIS koristi se za definiranje koristi li se pin kao ulaz / izlaz, a riječ PORT za izradu pina High / Low. Linija TRISB0 = 1 učinit će 0-tim pinom LUKE B kao ulaz. Ovo će biti naš gumb. Linije TRISD = 0x00; LUKA = 0x00; učinit će sve pinove priključka D izlaznim i dodijeliti početnu vrijednost LOW tim pinovima.
Budući da smo rekli da se B0 koristi kao ulaz, spojit ćemo jedan kraj tipke na zatik B0, a drugi kraj na zemlju. Do tada, kad god pritisnemo gumb, zatik će se držati uzemljen kako je prikazano na gornjem dijagramu povezivanja. Ali da bi se to dogodilo, moramo upotrijebiti povlačni otpor tako da se pin drži visoko kad se ne pritisne tipka. Vučni otpor je otprilike ovako.

Ali naš PIC MCU ima unutarnji slabi otpornik koji se može aktivirati softverom na taj način štedeći puno gnjavaže (kada treba povezati više gumba).
Što je slabi otpornik na izvlačenje?
Postoje dvije vrste otpornika na izvlačenje, jedan je Slabi na izvlačenje, a drugi Jaki na izvlačenje. Slabi vučni otpornici velike su vrijednosti i na taj način omogućuju prolaz slabe struje, a jaki otpornici male vrijednosti, što omogućuje jaku struju. Svi MCU uglavnom koriste slabe otpornike na izvlačenje. Da bismo to aktivirali u našem PIC MCU-u, moramo potražiti naš podatkovni list za OPTION_REG (registar opcija) kao što je prikazano na donjoj snimci.

Kao što je prikazano, bit 7 se bavi slabim otpornikom na izvlačenje. Treba ga postaviti na nulu da bi se aktivirao. To se postiže OPTION_REG <7> = 0 . Ovo se posebno odnosi na bit 7 koji ostavlja ostale bitove na zadane vrijednosti. Ovim ulazimo u našu while petlju, gdje provjerava je li gumb pritisnut pomoću if (RB0 == 0). Ako je uvjet zadovoljen, pozivamo našu funkciju s parametrima 1, 3, 7 i 15.
treptaj (1); // FUNKCIJSKI POZIV 1 s parametrom 1 sblink (3); // FUNKCIJSKI POZIV 3 s parametrom 3 sblink (7); // FUNKCIJSKI POZIV 7 s parametrom 7 sblink (15); // FUNKCIJSKI POZIV 4 s parametrom 15
Zašto koristimo funkcije?
Funkcije se koriste za smanjenje broja redaka u našem kodu. To je ono što bi većina nas znala. Ali zašto trebamo smanjiti broj linija, posebno kada je riječ o MCU programiranju. Razlog je ograničeni prostor u našoj memoriji programa. Ako kôd ne optimiziramo pravilno, možda ćemo ostati bez memorije. To će vam dobro doći kada napišemo duge stranice kodova.
Svaka funkcija će imati definiciju funkcije ( sblink (int get) u našem slučaju) i funkciju Call ( sblink (1) u našem slučaju). Nije obavezno imati deklaraciju funkcije, da bih je izbjegao, stavio sam definiciju funkcije prije pozivanja funkcije u svoju glavnu funkciju.
Parametri funkcije su vrijednost koja će se prenijeti iz poziva funkcije u definiciju funkcije. U našem su slučaju cjelobrojne vrijednosti (1, 3, 7, 15) parametri koji se prenose iz poziva funkcije, a varijabla "get" dobiva vrijednost parametara u definiciji funkcije za njihovu obradu. Funkcija može imati više parametara.
Jednom kada je funkcija pozvana, izvršit će se donji redovi u definiciji funkcije.
za (int i = 0; i <= 7 && RB0 == 0; i ++) {PORTD = get << i; // LED pomicanje lijevog slijeda __delay_ms (50); } za (int i = 7; i> = 0 && RB0 == 0; i--) {PORTD = get << i; // LED pomicanje lijevog slijeda __delay_ms (50); }
Sada se čini da je ovaj redak čudan: PORTD = get << i . Objasnit ću što se zapravo ovdje događa.
"<<" je operator lijevog pomaka koji pomiče sve bitove u svoj lijevi položaj. Sada kada zovemo funkciju sblink (int get) s parametrom '1' kao sblink (1), ona će vrijednost 'get' stvoriti kao 1, što je u binarnom formatu 0b00000001. Stoga će ovaj redak biti poput PORTD = 0b00000001 << i .
Vrijednost "i" varirat će od 0 do 7 budući da smo za " int i = 0; i <= 7 && RB0 == 0; i ++ " upotrijebili 'for loop' . Vrijednost 'i' koja je od 0 do 7 promijenit će rezultat na sljedeći način:

Kao što vidite, uključili smo po jednu LED diodu (slijeva udesno) držeći ostatak ISKLJUČENIM. Sljedeća 'for petlja' za (int i = 7; i> = 0 && RB0 == 0; i--) , također će učiniti isto, ali ovaj put LED će se redom UKLJUČATI slijeva ulijevo, kao što smo započeli od 7, a spuštajući se na 0. Koristili smo kašnjenje od 200 ms kako bismo mogli vizualizirati kako se LED uključuje i isključuje.
Sada kada proslijedimo vrijednost 3 u funkciji sblink (int get) , pa će se izvršiti funkcija sblink (3) što čini vrijednost 'get' 0b00000011, pa će rezultat na PORTD-u biti:

Dakle, sada će se ovaj put dvije LED-ice uključiti u bilo kojem trenutku pomoću sblink-a (3). Slično za sblink (7) i sblink (15), tri i četiri LED diode bit će uključene u nizu. Kad ovo završi, učinit ćemo da sve LED diode budu uključene pomoću crte PORTD = 0xFF . Pogledajte donji videozapis za cjelovitu demonstraciju.
Nadam se da ste razumjeli kôd i tako naučili kako koristiti funkcije petlje 'for' i 'while' da biste dobili željene izlaze. Sada se možete prilagoditi oko koda kako biste dobili drugačiji redoslijed LED-a koji trepće. Naprijed sastavite svoj kod i izbacite ga na svoj MCU i uživajte u rezultatima. Odjeljak za komentare možete koristiti ako negdje zapnete. Ovdje sam također priložio datoteke simulacije i programa.
To je za sada u našem sljedećem vodiču naučit ćemo kako koristiti PIC16F877A timere umjesto da koristimo funkcije odgode. Ovdje možete pregledati sve upute za PIC mikrokontroler.
