Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AeronauticaComunicatiiElectronica electricitateMerceologieTehnica mecanica


Alimentarea microcontrolerului, Macrouri folosite in programe

Electronica electricitate



+ Font mai mare | - Font mai mic



Mostrele

Introducere

1
Alimentarea microcontrolerului
2
Macrouri folosite in programe



Macrourile WAIT, WAITX

Macroul PRINT

3 Exemple

Light emitting diodes LEDuri

Tastatura

Optocuploare

o               Izolarea galvanica a liniilor de intrare folosind optocuploare

o               Izolarea galvanica a liniilor de iesire folosind optocuploare

Relee

Generarea unui sunet

Registri de deplasare

o               Registru de deplasare de intrare

o               Registru de deplasare de iesire

Afisoare 7segmente (multiplexare)

Afisor LCD

Convertor AD pe 12 biti

Comunicatia seriala

Introducere

Exemplele oferite in aceast capitol va vor arata cum sa conectati microcontrolerul PIC cu alte componente sau dispozitive periferice cand  produceti propriul sistem bazat pe microcontroler. Fiecare exemplu contine descriere detaliata a partii hardware cu schema electrica si comentarii despre program. Toate programele pot fi luate direct din prezentarea de pe internet MikroElektronika.

Alimentarea microcontrolerului

In general, alimentarea corecta este de o importanta maxima pentru functionarea corecta a sistemului cu microcontroler. Poate fi usor comparata cu respiratia unui om in aer. Este mai probabil ca un om care respira in aer curat va trai mai mult decat un om care locuieste intrun mediu poluat. Pentru o functionare corecta a oricarui microcontroler, este necesar sa oferim o sursa stabila de alimentare, un reset sigur in momentul in care il porniti si un oscilator. Conform specificatiilor tehnice oferite de producatorul microcontrolerului PIC, tensiunea de alimentare ar trebui sa se incadreze intre 2.0V si 0V pentru toate versiunile. Cea mai simpla solutie este folosirea stabilizatorului de tensiune LM7805 care ofera tensiune stabila de +5V la iesire. O astfel de sursa este ilustrata in figura de mai jos.

Pentru a functiona corect sau pentru a avea o tensiune stabilizata la 5V la iesire (pinul 3), tensiunea de intrare pe pinul 1 la LM7805 ar trebui sa fie intre 7V si 24V. In functie de curentul consumat de montaj vom folosi tipul corespunzator de stabilizator de tensiune LM7805. Sunt diferite versiuni de LM7805. Pentru consum de curent de pana la un 1A ar trebui sa folosim versiunea in capsula TO-220 cu posibilitatea de racire aditionala. Daca consumul total este de 50mA, putem sa folosim 78L05 (versiune de stabilizator in capsula mica TO-92 pentru curent de pana la 100mA).



Macrouri folosite in programe

Exemplele din sectiunile urmatoare ale acestui capitol utilizeaza deseori WAIT, WAITx si PRINT, de aceea ele vor fi explicate in detaliu. 

Macrourile WAIT, WAITx

Fisierul Wait.inc contine doua macrouri: WAIT si WAITx. Prin intermediul acestor macrouri este posibil sa repartizam intarzieri de timp in intervale variate. Amandoua macrouri folosesc depasirea contorului TMR0 ca un interval de timp de baza. Prin schimbarea prescaler-ului putem schimba lungimea intervalului depasirii contorului TMR0.

Daca folosim un oscilator (rezonator) de 4MHz, pentru valorile prescaler-ului 0,1 si 7 care divid ceasul de baza al oscilatorului, intervalul urmat de o depasire a contorului TMR0 va fi 0.512, 1.02 si 65.3ms. Practic, aceasta inseamna ca cea mai mare intarziere va fi 256x65.3ms care este egala cu 172 secunde.

Pentru a utiliza macrouri in programul principal este necesar sa declaram variabilele wcycle si prescWAIT dupa cum vom vedea in exemplele ce vor urma acestui capitol. Macroul WAIT are un singur argument. Valoarea standard atribuita prescaler-ului acestui macro este 1 (1.02ms), si nu poate fi schimbata.

WAIT timeconst_1

timeconst_1 este un numar de la 0 la 255. Prin multiplicarea acestui numar cu perioada de timp de depasire (overflow) vom obtine durata totala a intarzierii: TIME = timeconst_1 x 1.02ms.

Exemplu: WAIT .100

Exemplul arata cum sa obtinem o intarziere de 100x1.02ms, sau durata totala de 102ms.

Spre deosebire de macroul WAIT, macroul WAITX mai are un argument care poate atribui o valoare prescaler-ului. Macroul WAITX are doua argumente:

timeconst_2 este un numar de la 0 la 255. Prin multiplicarea acestui numar cu perioada de timp de depasire (overflow) vom obtine durata totala a intarzierii: TIME = timeconst_1 x 1.02ms x PRESCext.

PRESCext este un numar de la 0 la 7 care seteaza relatia dintre tact si timer-ul TMR0.

Exemplu: WAITX .100,7

Exemplul arata cum sa obtinem o intarziere de 100x65.3ms, sau durata totala de 653ms.

Macroul PRINT

Macroul PRINT este localizat in fisierul Print.inc. El usureaza lucrul pentru trimiterea unui sir de date la unul dintre dispozitivele de iesire, cum ar fi: LCD, RS232, imprimanta matricialaetc. Cea mai usoara cale pentru a forma o serie este prin folosirea unei directive dt (define table). Aceasta instructiune memoreaza o serie de date in cadrul memoriei programului ca un grup de instructiuni retlw al carui operand este data din sir.

Modalitatea prin care o astfel de secventa este formata folosind instructiunea dt este aratata in urmatorul exemplu:

org 0x00
goto Main

String movwf PCL
String1 dt '
acesta este un sir ASCII'
String2 dt '
al doilea sir'
End
Main

movlw .5
call String
:

Prima instructiune dupa eticheta Main scrie pozitia unui membru al sirului in registrul W. Executam un salt cu instructiunea call la eticheta sirului unde pozitia membrului sirului este adunata la valoarea PC (Program Counter): PCL = PCL + W. In continuare avem in program counter o adresa a instructiunii retlw cu membrul dorit al sirului. In momentul in care aceasta instructiune este executata, membrul sirului va fi in registrul W, si adresa instructiunii care va fi executata dupa instructiunea call va fi in program counter. Eticheta end este o metoda eleganta de a marca adresa la care sirul se termina.

Macroul PRINT are cinci argumente:

PRINT macro Addr, Start, End, Var, Out

Addr este o adresa unde unul sau mai multe siruri (situate unul dupa altul) incep. Start este o adresa a primului membru al sirului. End este o adresa unde sirul se termina. Var este variabila care are rolul de a arata (pointa) membrii sirului. Out este un argument pe care il folosim pentru a trimite adresa rutinelor existente atribuite dispozitivelor de iesire cum ar fi: LCD, RS-232, etc.

Macroul PRINT scrie la iesire un sir mikroElektronika format din caractere ASCII la un dispozitiv de afisare LCD. Sirul takes one part of program memory incepand cu adresa 0x03.



Example

Light Emitting Diodes LEDuri

Ledurile sunt unele dintre cele mai folosite elemente in electronica. LED este o abreviere pentru Light Emitting Diode. In momentul in care alegem un led, sunt mai multi parametri de care trebuie sa tinem seama: diametrul, care este deobicei 3 sau 5mm (milimetri), curentul de functionare care este in jur de 10mA (poate fi mai mic decat 2mA pentru ledurile cu randament maxim: emisie de lumina puternica) si bineinteles culoarea, care poate fi rosie sau verde desi mai sunt leduri portocalii, albastre, galbene . Ledurile trebuie conectate corect pentru a emite lumina si rezistenta care limiteaza curentul trebuie sa fie de o valoare corecta pentru ca ledul sa nu se arda (supraincalzire). Tensiunea pozitiva de alimentare este legata la ANOD, iar catodul este legat la tensiunea negativa sau la masa circuitului. Pentru a identifica fiecare pin, catodul este cel mai scurt pin iar corpul are in general o tesitura pe partea catodului. Diodele vor emite lumina numai daca curentul circula de la ANOD spre CATOD. Altfel jonctiunea PN este polarizata invers si curentul nu va circula. Pentru a conecta corect un led trebuie adaugata o rezistenta in serie pentru a limita de curentul prin dioda, pentru ca aceasta sa nu se arda. Valoarea rezistentei este determinata de curentul care vreti sa circule prin led. Curentul maxim care poate curge printr-un led a fost stabilit de producator. Ledurile cu randament maxim pot produce rezultate bune cu un curent mai mic de de 2mA

Pentru a determina valoarea rezistentei serie, trebuie sa cunoastem valoarea tensiunii de alimentare. De aici scadem tensiunea care cade pe led. Aceasta valoare va varia de la 1,2v la 1,6v, depinzand de culoarea ledului. Raspunsul este valoarea lui Ur. Folosind aceasta valoare si curentul care vrem sa circule prin LED (intre 0.002A si 0.01A) putem sa aflam valoarea rezistentei cu ajutorul formulei: R=UR / I.

Ledurile sunt conectate la microcontroler in doua metode. Una este sa le activam cu zero logic si a doua este sa le activam cu unu logic. Prima metoda este numita logica NEGATIVA iar cea de-a doua este numita logica POZITIVA. Figura de mai sus ilustreaza modalitatea de conectare prin logica POZITIVA. Deoarece logica POZITIVA ofera o tensiune de +5v diodei si rezistentei serie, ledul va emite lumina de fiecare data cand un pin al portului B este in starea 1 logic (1 = iesire HIGH). Logica NEGATIVA necesita ca ledul sa fie intors si terminalele de tip anod sa fie conectate impreuna la borna pozitiva a sursei. In momentul in care este livrata o iesire LOW de la microcontroler catre anod si rezistenta, ledul va lumina.

Connecting LED diodes to PORTB microcontroller

Exemplul urmator initializeaza portul B ca port de iesire si seteaza unu logic pe fiecare pin al portului B pentru a activa toate ledurile.



Tastatura

Tastaturile sunt dispozitive mecanice utilizate pentru a executa o intrerupere sau pentru a realiza o conexiune intre doua puncte. Ele au diferite marimi si au diferite scopuri. Tastele care sunt utilizate aici sunt denumite taste dip. Ele sunt lipite direct pe o placa de circuit si sunt deseori intalnite in electronica. Au patru pini (doi pentru fiecare contact), ceea ce le ofera stabilitate mecanica.

Exemplu pentru conectarea tastelor la pinii microcontrolerului

Functia tastei este simpla. In momentul in care apasam o tasta, doua contacte sunt unite si se realizeaza o conexiune. Totusi, nu toate lucrurile sunt simple. Problema consta in natura tensiunii ca valoare, si in imperfectiunea contactelor mecanice. Inainte ca un contact sa fie realizat sau decuplat, exista o perioada scurta de timp cand pot aparea vibratii (oscilatii) ca rezultat al imperfectiunii contactelor mecanice, sau din cauza vitezei diferite de apasare (acest lucru depinde de persoana care apasa tasta). Termenul atribuit acestui fenomen este denumit switch (contact) debounce. Daca acest lucru nu este prevazut in momentul in care un program este conceput, poate aparea o eroare sau programul poate produce mai mult decat un singur impuls la iesire pentru o singura apasare de tasta. Pentru a evita acest lucru, putem introduce o mica intarziere cand detectam inchiderea unui contact. Aceasta va asigura faptul ca apasarea unei taste este interpretata ca un singur impuls. Intarzierea de debounce este produsa in software si durata intarzierii depinde de buton si de scopul butonului. Problema poate fi partial rezolvata prin adaugarea unui condensator in paralel la tasta, dar un program bine realizat ofera rezultate mai bune. Programul poate fi ajustat pana cand detectia falsa este complet eliminata. In anumite cazuri o simpla intarziere poate fi suficienta dar daca vreti ca programul sa se ocupe de mai multe lucruri in acelasi timp, o simpla intarziere va insemna ca procesorul nu va face nimic pe o lunga perioada de timp si poate rata alte intrari sau poate decupla portul de iesire catre un afisor. Solutia este sa avem un program care sa urmareasca apasarea unei taste cat si decuplarea unei taste. Macroul de mai jos poate fi folosit pentru keypress debounce.

Macroul precedent are mai multe argumente care trebuiesc explicate:

BUTTON macro HiLo, Port, Bit, Delay, Address

HiLo poate fi 0 sau 1 care reprezinta frontul crescator sau cazator unde subrutinele pot fi executate in momentul in care apasati o tasta. Port este un port al microcontrolerului la care trebuie conectata tasta. In cazul microcontrolerului PIC16F84, el poate fi PORT A sau PORT B.
Bit este un pin al portului la care tasta este conectata.
Delay este un numar de la 0 la 255, folosit pentru a atribui timpul necesar pentru a detecta key debounce contact oscillation to stop. El este calculat astfel: TIME = Delay x 1ms.
Adress este adresa la care microcontrolerul se duce dupa ce este detectat un eveniment provenit de la tastatura. Subrutina de la aceasta adresa executa instructiunile necesare pentru apasarea unei taste.

Exemplu 1 BUTTON 0, PORTA, 3, .100, Tester1_above

Tasta-1 este conectata la RA0 (prima iesire a portului A) cu o intarziere de 100 milisecunde si cu o reactie la zero logic. Subrutina care proceseaza tasta este localizata la adresa etichetei Tester1_above.

Exemplu 2 BUTTON 1, PORTA, 2, .200, Tester1_below

Tasta-2 este conectata la RA1 (a doua iesire a portului A) cu 200ms intarziere si cu reactie la unu logic.

Exemplul urmator arata modul de folosire intr-un program. BUTTON.ASM aprinde si stinge LEDul. LEDul este conectat la cea de-a saptea iesire a portului B. Tasta-1 este folosita pentru a aprinde LEDul. Tasta-2 stinge LEDul.


Optocuplor Optocuplorul combina un LED si un fototranzistor in aceeasi capsula. Rolul unui optocuplor este acela de a separa doua parti de circuit.

Aceasta este realizata pentru un numar de motive:

Interferenta. O parte a unui circuit poate fi intr-o zona unde este influentat de interferente (cum ar fi cele de la motoarele electrice, echipamente de sudura, motoare termice etc.). Daca iesirea acestui circuit trece printr-un optocuplor spre alt circuit, numai semnalele dorite vor trece prin optocuplor. Semnalele de interferenta nu vor avea destula putere sa activeze LEDul din optocuplor si de aceea ele sunt eliminate. Exemplele tipice sunt unitatile industriale care au mai multe interferente care afecteaza semnalele pe cablu. Daca aceste interferente afecteaza functia unei sectiuni de control, vor apare erori si unitatea nu va mai functiona.

Separare simultana si intensitatea semnalului. Un semnal mai mic de 3v este capabil sa activeze un optocuplor si iesirea optocuplorului poate fi conectata la o linie de intrare a microcontrolerului. Microcontrolerul are nevoie de un impuls de intrare de 5v si in caz semnalul de 3v este amplificat la 5v. Poate fi folosit pentru a amplifica curentul semnalului. Uitati-va mai jos pentru utilizarea unei linii de iesire a microcontrolerului pentru amplificare de curent.

Separare de tensiune mare. Optocuploarele au calitati innascute pentru separarea tensiunilor mari. Deoarece LEDul este complet separat de fototranzistor, optocuploarele pot da dovada de izolare de tensiune de 3Kv sau chiar mai mare.

Optocuploarele pot fi folosite ca dispozitive de intrare sau iesire. Ele au functii aditionale cum ar fi Schmitt triggering (iesirea unui Schmitt trigger este 0 sau 1 se schimba incet ridicand si coborand forma de unda in valori definite LOW sau HIGH). Optocuploarele sunt impachetate ca o singura unitate sau in grupuri de doua sau mai multe intr-o singura capsula. Ele mai sunt denumite foto-intrerupatoare in care un disc cu fante este introdus intr-un lacas intre LED si fototranzistor si de fiecare data cand lumina este intrerupta, tranzistorul produce un impuls. Fiecare optocuplor are nevoie de doua alimentari pentru a functiona. Ele pot fi folosite cu o alimentare, dar capacitatea de izolare a tensiunii este pierduta.

Optocuplor pe o linie de intrare

Modul de functionare este simplu: cand ajunge un semnal, LEDul din optocuplor este aprins si lumineaza pe baza fototranzistorului din aceeasi carcasa. In momentul in care tranzistorul este activat, tensiunea dintre colector si emitor cade la 0.5v sau mai putin si microcontrolerul sesizeaza acest lucru ca zero logic pe pinul RA4. Exemplul de mai jos este un contor, folosit pentru numararea produselor de pe o linie de productie, pentru determinarea vitezei motorului, pentru contorizarea numarului de revolutii a unei axe etc. Consideram senzorul ca un microintrerupator. De fiecare data cand intrerupatorul este inchis, LEDul este luminat. LEDul transfera semnalul catre fototranzistor si operatia fototranzistorului livreaza LOW catre intrarea RA4 a microcontrolerului. Un program in microcontroler va fi necesar pentru a preveni contorizarile false si un indicator conectat la oricare dintre iesirile microcontrolerului va indica starea curenta a contorului.

Exemplu de linie de intrare cu optocuplor

Optocuplor pe o linie de iesire Un optocuplor poate fi folosit pentru a separa semnalul de iesire a unui microcontroler fata de un dispozitiv de iesire. Acest lucru poate fi necesar pentru separarea tensiunilor inalte sau pentru amplificare. Iesirea unor anumite microcontrolere este limitata la 25mA. Optocuplorul va lua semnal de curent scazut din microcontroler si tranzistorul de iesire va comanda un LED sau un releu, cum este exemplificat mai jos:

Output line optocoupler example

Programul pentru acest exemplu este simplu. Prin livrarea unui 1 logic in pinul 4 al portului A, LEDul se va aprinde si tranzistorul va fi activat in optocuplor. Orice dispozitiv conectat la iesirea optocuplorului va fi activat. Curentul limita pentru tranzistor este in jur de 250mA.



Releul

Releul este un dispozitiv electromecanic care transforma un semnal electric intr-o miscare mecanica. El este alcatuit dintr-o bobina din conductori izolati infasurati pe un nucleu metalic si o armatura metalica cu unul sau mai multe contacte. In momentul in care o tensiune de alimentare este aplicata la bornele unei bobina, curentul circula si va fi produs un camp magnetic care misca armatura pentru a inchide un set de contacte si/sau pentru a deschide un alt set. Cand alimentarea este dezactivata din releu, cade fluxul magnetic din bobina si se produce o tensiune inalta in directia opusa. Aceasta tensiune poate strica tranzistorul de comanda si de aceea este conectata o dioda cu polarizare inversa de-a lungul bobinei pentru a scurtcircuita varfurile de tensiune in momentul in care apar.

Conectarea unui releu la microcontroler prin intermediul unui tranzistor

Multe microcontrolere nu pot comanda un releu direct si de aceea un tranzistor de comanda este necesar. Un HIGH pe baza tranzistorului activeaza tranzistorul si acesta la randul lui activeaza releul. Releul poate fi conectat la orice dispozitiv electric prin intermediul contactelor. Rezistenta de 10K din baza tranzistorului limiteaza curentul dinspre microcontroler la o valoare solicitata de tranzistor. Rezistenta de 10K dinspre baza si bara negativa previne ca tensiunile de zgomot aplicate in baza tranzistorului sa activeze releul. De aceea numai un semnal clar de la microcontroler va activa releul.

Connecting the optocoupler and relay to a microcontroller

Un releu poate fi de altfel activat prin intermediul unui optocuplor care in acelsi timp amplifica curentul provenit de la iesirea microcontrolerului si ofera un grad inalt de izolare. Optocuploarele HIGH CURRENT deobicei contin un tranzistor cu o iesire Darlington pentru a oferi curent mare de iesire. Conectarea prin intermediul unui optocuplor este recomandata in mod special pentru aplicatiile microcontroler unde motoarele sunt activate si zgomotulele de comutatie provenite de la motor pot ajunge in microcontroler prin intermediul liniilor de alimentare. Optocuplorul comanda un releu iar releul activeaza motorul. Figura de mai jos arata programul necesar pentru activarea releului si include cateva din macrourile deja discutate.





Generarea unui sunet

Un buzzer piezo poate fi adaugata la o linie de iesire a unui microcontroler pentru a livra tonuri audio, piuituri si semnale. Este important de stiut ca sunt doua mari tipuri de dispozitive piezoelectrice emitatoare de sunet. Una are componente active inauntrul carcasei si are nevoie numai de alimentare de curent continuu pentru a emite un ton sau un beep. In general tonurile sau beep-urile emise de aceste difuzoare sau piuitoare nu pot fi schimbate ele sunt fixe din cauza circuitelor interne. Acesta nu este tipul despre care discutam in acest articol. Celalalt tip consta dintr-un buzzer piezo si necesita semnal livrat in ea pentru a functiona. Depinzand de frecventa formei de unda, iesirea poate fi ton, melodie, alarma sau chiar un mesaj vocal. Pentru ca ele sa functioneze trebuie sa livram un ciclu care este alcatuit din semnale HIGH si LOW. Tranzitia de la HIGH la LOW sau de la LOW la HIGH cauzeaza miscari diafragmei pentru a produce secvente de sunete. Forma de unda poate avea o schimbare fina de la o valoare la alta (denumita unda sinusoidala) sau o schimbare rapida (denumita unda dreptunghiulara). Un calculator este ideal pentru producerea de unde dreptunghiulare. Livrarea de unde dreptunghiulare produce o iesire usor grosiera. Conectarea unui buzzer piezo este foarte usoara. Un pin este conectat la linia negativa, iar cealalta la o iesire a microcontrolerului, dupa cum este ilustrat in figura de mai jos. Acesta va livra o forma de unda de 5v catre buzzerul piezo. Pentru a produce o tensiune mai mare, forma de unda trebuie amplificata si aceasta necesita un tranzistor de comanda si o bobina.

Conectarea unui buzzer piezo la un microcontroler

Ca si in cazul tastaturii, puteti folosi un macro care va furniza o rutina BEEP intr-un program cand va fi necesar.

BEEP macro freq, duration

freq: frecventa sunetului. Un numar mai mare produce o frecventa mai inalta. duration: durata sunetului. Un numar mai mare reprezinta un sunet mai lung.

Exemplu 1: BEEP 0xFF, 0x02

Iesirea buzzerului piezo are cea mai inalta frecventa si durata de 2 cicluri de 65.3ms, ceea ce rezulta 130.6ms.

Exemplu 2: BEEP 0x90, 0x05

Iesirea buzzerului piezo are frecventa de 0x90 si durata de 5 cicluri de 65.3ms. Este bine ca argumentele macroului sa fie determinate prin experimente si astfel sa fie ales sunetul care se potriveste cel mai bine pentru aplicatie. In continuare este prezentat macroul BEEP:

Urmatorul exemplu arata intrebuintarea unui macro intr-un program. Programul produce doua melodii care sunt obtinute prin apasarea T1 sau T2. Cateva din macrourile discutate anterior sunt incluse in program.







Registrii de deplasare

Exista doua tipuri de registrii de deplasare: de intrare si de iesire. Registrii de intrare incarca datele paralel, prin intermediul a 8 linii, si apoi le trimite serial prin intermediul a doua linii catre microcontroler. Registrii de iesire opereaza in directie opusa: primesc date serial si la un semnal pe linia latch, transforma datele in date paralele. Registrii de deplasare sunt folositi in general pentru a mari numarul de intrari iesiri ale unui microcontroler. Ei nu prea mai sunt folositi pentru ca microcontrolerele moderne au un numar mare de linii intrare iesire. Oricum, utilizarea lor cu microcontrolere cum ar fi PIC16F84 este foarte importanta. Registrii de deplasare de intrare 74HC597 Reistrii de deplasare de intrare transforma datele paralele in date seriale si le transfera catre microcontroler. Modul lor de functionare este simplu. Sunt patru linii pentru transferul datelor: clock, latch, load si data. Datele sunt citite de la pinii de intrare de un registru intern prin intermediul unui semnal latch. Apoi, cu un semnal load, datele sunt transferate de la registrul latch de intrare catre registrul de deplasare, iar de acolo sunt transferate serial catre un microcontroler prin intermediul liniilor data si clock.

O schema de legatura a registrului de deplasare 74HC597 la un microcontroler este prezentata mai jos:

Modalitatea de conectare a unui registru de deplasare de intrare la un microcontroler

Pentru simplificarea programului principal, un macro poate fi utilizat pentru registrul de deplasare de intrare. Macroul HC597 are doua argumente:

HC597 macro Var, Var1

Var variabila unde datele provenite de la pinii registrului de deplasare de intrare sunt transferate.
Var1 contor bucla.

Exemplu: HC597 data, counter

Datele provenite de la pinii registrului de deplasare sunt stocate in variabila data. Variabila Time/counter este folosita pe post de contor bucla.

Textul macroului:

Exemplul care va arata cum sa folositi macroul HC597 este in programul urmator. Programul receptioneaza date de la intrarea paralela a registrului de deplasare si le muta serial in variabila RX a microcontrolerului. LEDurile conectate la portul B vor indica rezultatul datelor de intrare.

Registru de deplasare de iesire Registrii de deplasare de iesire transforma datele seriale in date paralele. Pe fiecare front crescator al tactului, registrul de deplasare citeste valoarea de la linia de date, o memoreaza intr-un registru temporar, apoi repeta acest ciclu de 8 ori. La un semnal de la linia latch, datele sunt copiate din registrul de deplasare in registrul de intrare, apoi datele sunt transformate din date seriale in date paralele.

O schema a registrului de deplasare este prezentata mai jos

Conectarea unui registru de deplasare de iesire la un microcontroler

Macroul folosit in acest exemplu este localizat in fisierul HC595.INC si se numeste HC595.

Macroul HC595 are doua argumente:

Var variabila a carei continut este transferat la iesirea registrului de deplasare. Var1 contor bucla.

Exemplu: HC595 Data, Counter

Datele pe care vrem sa le transferam sunt stocate in variabila Data, iar variabila Counter este folosita pe post de contor bucla

Un exemplu al utilizarii macroului HC595 este in programul urmator. Datele provenite de la variabila TX sunt transferate serial in registrul de deplasare. LEDurile conectate la iesirea paralela a registrului de deplasare vor indica starea liniilor. In acest exemplu valoarea 0xCB (11001011) este transmisa astfel incat LEDurile 8, 7, 4, 2 si 1 sunt iluminate.


Afisaj cu 7 segmente (multiplexare)

Segmentele intr-un afisaj cu 7 segmente sunt aranjate astfel incat sa formeze un singur digit de la 0 la F, dupa cum se observa in desen:

Putem afisa un numar pe mai multi digiti prin conectarea de afisaje aditionale. Chiar daca este mult mai confortabil sa lucram cu LCDuri, afisajele cu 7 segmente sunt inca un standard in industrie. Aceasta din cauza rezistentei la temperatura, vizibilitatii si unghiului larg de observare. Segmentele sunt marcate cu litere mici: a, b, c, d, e, f, g si dp, unde dp este punctul zecimal. Cele 8 LEDuri din cadrul fiecarui afisaj pot fi aranjate cu catod comun sau cu anod comun. La un afisaj cu catod comun, catodul comun trebuie sa fie conectat la linia de 0v si LEDurile sunt activate cu unu logic. Afisajele cu anod comun trebuie sa prezinte anodul comun conectat la linia de +5v. Segmentele sunt activate cu zero logic. Dimensiunea afisajului este masurata in milimetri; se masoara doar inaltimea digitului (nu carcasa, doar digitul!). Afisajele sunt disponibile cu digiti de inaltimi de 7, 10, 13.5, 20 sau 25 milimetri. Sunt de diferite culori incluzand: rosu, portocaliu si verde. Cea mai simpla metoda pentru a comanda un afisaj este prin intermediul unui driver de afisaj. Acestea sunt disponibile pentru pana la 4 afisaje. Alternativ, afisajele pot fi comandate de un microcontroler, si, daca este necesar mai mult decat un afisaj, metoda de comandare se numeste multiplexare. Principala diferenta dintre cele doua metode este numarul de linii de comanda. Un driver special poate avea numai o singura linie de tact si integratul de comanda va accesa  toate segmentele si va incrementa afisajul. Daca avem doar un singur afisaj de comandat de catre microcontroler, vor fi necesare 7 linii plus una pentru punctul zecimal. Pentru fiecare afisaj zecimal, este necesara doar cate o linie in plus. Pentru a produce un afisaj cu 4, 5 sau 6 digiti, toate afisajele cu 7 segmente vor fi conectate in paralel. Linia comuna (linia catodului comun) este conectata separat si aceasta linie este conectata la zero logic pentru o perioada scurta de timp pentru a activa afisajul. Fiecare afisaj este activat de 100 ori pe secunda si vor da impresia ca toate afisajele sunt active in acelasi timp. In timp ce fiecare afisaj este activat, informatia trebuie livrata astfel incat el va afisa informatia corecta. Pot fi accesate pana la 6 afisaje in acest mod fara ca stralucirea fiecarui afisaj sa fie afectata. Fiecare afisaj este activat efectiv pentru 1/6 din timp si persistenta vizuala a ochilor da impresia ca afisajul este pornit tot timpul. Toate semnalele de sincronizare pentru afisaj sunt produse de program, avantajul unui afisaj controlat de un microcontroler este flexibilitatea. Afisajul poate fi configurat ca un contor crescator, contor descrescator, si poate produce un numar de mesaje folosind literele alfabetului care pot fi usor de afisat.

Exemplul de mai jos arata cum sa controlam doua afisaje.

Conectarea unui microcontroler cu afisaje cu 7 segmente in mod multiplexat

Fisierul LED.INC contine doua macrouri: LED_Init si LED_Disp2. Primul macro este folosit pentru initializarea afisajului. Aici este definita perioada de reimprospatare cat si pinii microcontrolerului utilizati pentru conectarea afisajelor.

Macroul LED_Disp2 are un argument:

LED_Disp2 macro first

first este numarul de la 0 la 99 care trebuie afisat pe digitii MSD si LSD.

Exemplu: LED_Disp2 0x34

Numarul 34 va fi afisat.

Realizarea macroului arata modalitatea de utilizare a macrourilor intr-un program. Programul afiseaza numarul 21 in 2 digiti cu 7 segmente.

Afisaj cu 7 segmente (multiplexare)

Segmentele intr-un afisaj cu 7 segmente sunt aranjate astfel incat sa formeze un singur digit de la 0 la F, dupa cum se observa in desen:

Putem afisa un numar pe mai multi digiti prin conectarea de afisaje aditionale. Chiar daca este mult mai confortabil sa lucram cu LCDuri, afisajele cu 7 segmente sunt inca un standard in industrie. Aceasta din cauza rezistentei la temperatura, vizibilitatii si unghiului larg de observare. Segmentele sunt marcate cu litere mici: a, b, c, d, e, f, g si dp, unde dp este punctul zecimal. Cele 8 LEDuri din cadrul fiecarui afisaj pot fi aranjate cu catod comun sau cu anod comun. La un afisaj cu catod comun, catodul comun trebuie sa fie conectat la linia de 0v si LEDurile sunt activate cu unu logic. Afisajele cu anod comun trebuie sa prezinte anodul comun conectat la linia de +5v. Segmentele sunt activate cu zero logic. Dimensiunea afisajului este masurata in milimetri; se masoara doar inaltimea digitului (nu carcasa, doar digitul!). Afisajele sunt disponibile cu digiti de inaltimi de 7, 10, 13.5, 20 sau 25 milimetri. Sunt de diferite culori incluzand: rosu, portocaliu si verde. Cea mai simpla metoda pentru a comanda un afisaj este prin intermediul unui driver de afisaj. Acestea sunt disponibile pentru pana la 4 afisaje. Alternativ, afisajele pot fi comandate de un microcontroler, si, daca este necesar mai mult decat un afisaj, metoda de comandare se numeste multiplexare. Principala diferenta dintre cele doua metode este numarul de linii de comanda. Un driver special poate avea numai o singura linie de tact si integratul de comanda va accesa  toate segmentele si va incrementa afisajul. Daca avem doar un singur afisaj de comandat de catre microcontroler, vor fi necesare 7 linii plus una pentru punctul zecimal. Pentru fiecare afisaj zecimal, este necesara doar cate o linie in plus. Pentru a produce un afisaj cu 4, 5 sau 6 digiti, toate afisajele cu 7 segmente vor fi conectate in paralel. Linia comuna (linia catodului comun) este conectata separat si aceasta linie este conectata la zero logic pentru o perioada scurta de timp pentru a activa afisajul. Fiecare afisaj este activat de 100 ori pe secunda si vor da impresia ca toate afisajele sunt active in acelasi timp. In timp ce fiecare afisaj este activat, informatia trebuie livrata astfel incat el va afisa informatia corecta. Pot fi accesate pana la 6 afisaje in acest mod fara ca stralucirea fiecarui afisaj sa fie afectata. Fiecare afisaj este activat efectiv pentru 1/6 din timp si persistenta vizuala a ochilor da impresia ca afisajul este pornit tot timpul. Toate semnalele de sincronizare pentru afisaj sunt produse de program, avantajul unui afisaj controlat de un microcontroler este flexibilitatea. Afisajul poate fi configurat ca un contor crescator, contor descrescator, si poate produce un numar de mesaje folosind literele alfabetului care pot fi usor de afisat.

Exemplul de mai jos arata cum sa controlam doua afisaje.

Conectarea unui microcontroler cu afisaje cu 7 segmente in mod multiplexat

Fisierul LED.INC contine doua macrouri: LED_Init si LED_Disp2. Primul macro este folosit pentru initializarea afisajului. Aici este definita perioada de reimprospatare cat si pinii microcontrolerului utilizati pentru conectarea afisajelor.

Macroul LED_Disp2 are un argument:

LED_Disp2 macro first

first este numarul de la 0 la 99 care trebuie afisat pe digitii MSD si LSD.

Exemplu: LED_Disp2 0x34

Numarul 34 va fi afisat.

Realizarea macroului arata modalitatea de utilizare a macrourilor intr-un program. Programul afiseaza numarul 21 in 2 digiti cu 7 segmente.

Afisaj LCD

Multe dispozitive cu microcontroler folosesc LCDuri inteligente pentru a afisa informatia vizuala. Urmatorul material se ocupa de conectarea unui afisaj LDC Hitachi la un microcontroler PIC. Afisajele LCD proiectate cu HD44780, modulul pentru LCD fabricat de Hitachi, nu sunt scumpe si sunt usor de folosit, si chiar posibil sa produca verificarea datelor afisate folosind cei 8x80 pixeli ai afisajului. Afisajele LCD Hitachi contin un set de caractere ASCII plus simboluri japoneze, grecesti si matematice.

A 16x2 line Hitachi HD44780 display

Fiecare dintre cei 640 de pixeli ai afisajului trebuie sa poata fi accesat individual si aceasta se poate realiza cu un numar de integrate SMD pentru control montate pe spatele afisajului. Aceasta ne salveaza de o cantitate enorma de fire si de un control adecvat astfel incat sunt necesare doar cateva linii pentru a accesa afisajul. Putem comunica cu afisajul prin intermediul unui bus de date pe 8 biti sau de 4 biti. Pentru un bus de 8 biti, afisajul are nevoie de o tensiune de alimentare de +5v si 11 linii I/O. Pentru un bus de 4 biti sunt necesare doar liniile de alimentare si 7 linii. Cand afisajul LCD nu este pornit liniile de date sunt TRI-STATE, ceea ce inseamna ca ele sunt in stare de inalta impedanta (ca si cum ar fi deconectate) si astfel nu interfereaza cu functionabilitatea microcontrolerului cand afisajul nu este adresat. LCDul necesita de altfel 3 linii de control de la microcontroler.

Linia Enable (E) permite accesul la afisaj prin intermediul liniilor R/W si RS. Cand aceasta linie este LOW, LCDul este dezactivat si ignora semnalele de la R/W si RS. Cand linia (E) este HIGH, LCDul verifica starea celor doua linii de control si raspunde corespunzator.

Linia Read/Write (R/W) stabileste directia datelor dintre LCD si microcontroler. Cand linia este LOW, datele sunt scrise in LCD. Cand este HIGH, datele sunt citite de la LCD.

Cu ajutorul liniei Register select (RS), LCD interpreteaza tipul datelor de pe liniile de date. Cand este LOW, o instructiune este scrisa in LCD. Cand este HIGH, un caracter este scris in LCD.

Starea logica a liniilor de control:

E  0  Accesul la LCD dezactivat
1  Accesul la LCD activat

R/W  0  Scrie date in LCD
1 Citeste date din LCD

RS 0 Instructiuni
1 Caracter

Scrierea datelor in LCD se realizeaza in cativa pasi:

se seteaza bitul R/W LOW se seteaza bitul RS in 0 sau 1 logic (instructiune sau caracter) se trimit datele catre liniile de date (daca se executa o scriere) se seteaza linia E HIGH se citesc datele de la liniile de date (daca se executa o citire)

Citirea datelor de la LCD se realizeaza similar, cu deosebirea ca linia de control R/W trebuie sa fie HIGH. Cand trimitem un HIGH catre LCD, el se va reseta si va accepta instructiuni. Instructiunile tipice care sunt transmise catre un afisaj LCD dupa reset sunt: pornirea afisajului, activarea cursorului si scrierea caracterelor de la stanga spre dreapta. In momentul in care un LCD este initializat, el este pregatit sa primeasca date sau instructiuni. Daca receptioneaza un caracter, el il va afisa si va muta cursorul un spatiu la dreapta. Cursorul marcheaza locatia urmatoare unde un caracter va fi afisat. Cand dorim sa scriem un sir de caractere, mai intai trebuie sa setam adresa de start, si apoi sa trimitem cate un caracter pe rand. Caracterele care pot fi afisate pe ecran sunt memorate in memoria video DD RAM (Data Display RAM). Capacitatea memoriei DD RAM este de 80 bytes.

Afisajul LCD mai contine 64 bytes CG RAM ( Character Generator RAM). Aceasta memorie este rezervata pentru caracterele definite de utilizator. Datele din CG RAM sunt reprezentate sub forma de caractere bitmap de 8 biti. Fiecare caracter ocupa maxim 8 bytes in CG RAM, astfel numarul total de caractere pe care un utilizator poate sa le defineasca este 8. Pentru a afisa caracterul bitmap pe LCD, trebuie setata adresa CG RAM la punctul de start (de obicei 0) si apoi sa fie scrise datele in afisaj. Definirea unui caracter special este exemplificata in figura.

Inainte de a accesa DD RAM, dupa definirea unui caracter special, programul trebuie sa seteze adresa in DD RAM. Orice scriere si citire a datelor din memoria LCD este realizata de la ultima adresa care a fost setata, folosind instructiunea set-adress. Odata ce adresa DD RAM este setata, un caracter nou va fi afisat in locul potrivit pe ecran. Pana acum am discutat operatia de scriere si citire a memoriei unui LCD ca si cum ar fi o memorie obisnuita. Acest lucru nu este adevarat. Controlerul LCD are nevoie de 40 pana la 120 microsecunde (us) pentru scriere si citire. Alte operatii pot dura pana la 5 ms. In acest timp microcontrolerul nu poate accesa LCDul, astfel un program trebuie sa stie cand un LCD este ocupat. Putem rezolva aceasta in doua metode.

O metoda este verificarea bitului BUSY de pe linia de date D7. Aceasta nu este cea mai buna metoda pentru ca LCDul se poate bloca si programul va sta intr-o bucla infinita verificand bitul BUSY. O alta metoda este introducerea unei intarzieri in program. Intarzierea trebuie sa fie destul de lunga pentru ca LCDul sa termine operatia in desfasurare. Instructiunile pentru scriere si citire cu memoria LCDului sunt afisate mai sus. La inceput am mentionat ca avem nevoie de 11 linii I/O pentru a comunica cu un LCD. Oricum, putem comunica cu un LCD printr-un bus de 4 linii. Putem reduce numarul total de linii de comunicatie la 7. Schema pentru conectarea printr-un bus de 4 biti este in imaginea de mai jos. In acest exemplu folosim un afisaj LCD cu 2x16 caractere, denumit LM16x212 fabricat de producatorul japonez Sharp. Mesajul character este scris pe prima linie urmat de doua caractere speciale ~ si }. Pe a doua linie este scris cuvantul mikroElektronika.

Conectarea unui afisaj la un microcontroler

Fisierul LCD.inc contine un grup de macrouri pentru lucrul cu afisajele LCD.

Macro pentru lucrul cu LCD

Macroul LCDinit este utilizat pentru a initializa portul conectat la LCD. LCDul este configurat sa mearga in modul de 4 biti. Exemplu: LCDinit

LCDchar LCDarg scrie un caracter ASCII. Argumentul este caracterul ASCII. Exemplu: LCDchar d

LCDw scrie caracterul din registul W. Exemplu:  movlw p
LCDw

LCDcmd LCDcommand trimite comenzi. Exemplu: LCDcmd LCDCH

LCD_DDAdr DDRamAddress seteaza adresa DD RAM Exemplu: LCD_DDAdr .3

LCDline line_num seteaza pozitia cursorului la inceputul primei sau celei de-a doua linie. Exemplu: LCDline 2

Cand lucram cu microcontrolere numerele sunt reprezentate in forma binara. Din aceasta cauza ele nu pot fi afisate. Pentru aceasta este necesar sa schimbam numerele dintr-un sistem binar intr-un sistem zecimal pentru ca ele sa fie usor de inteles. Sursele celor doua macrouri LCDval_08 si LCDval_16 sunt prezentate mai jos.

Macroul LCDval_08 realizeaza conversia unui numar binar de 8 biti intr-un numar zecimal de la 0 la 255 si il afiseaza. Este necesar sa declaram urmatoarele variabile in programul principal: TEMP1, TEMP2, LO, LO_TEMP, Bcheck. Numarul binar de 8 biti este in variabila LO. Cand macroul este executat, echivalentul zecimal al acestui numar este afisat. Zerourile precedente numarului nu sunt afisate.

Macroul LCDval_16 realizeaza conversia unui numar binar de 16 biti intr-un numar zecimal de la 0 la 65535 si il afiseaza. Urmatoarele variabile trebuie declarate in programul pricipal: TEMP1, TEMP2, TEMP3, LO, HI, LO_TEMP. HI_TEMP, Bcheck. Numarul binar de 16 biti este in variabilele LO si HI. Cand macroul este executat, echivalentul zecimal al acestui numar este afisat. Zerourile precedente numarului nu sunt afisate.

Programul principal este o demontratie pentru utilizarea afisajelor LCD si desenarea de noi caractere. La inceputul programului, trebuie sa declaram variabilele LCDbuf si LCDtemp folosite in subrutinele pentru LCD, cat si portul microcontrolerului conectat la LCD. Programul scrie mesajul characters: pe prima linie urmat de doua caractere speciale ~ si }. Pe cea de-a doua linie este afisat mikroElektronika.

Convertor analog digital de 12 biti

Deoarece totul in lumea microcontrolerelor este reprezentat cu 0 si 1, ce facem cu un semnal care este 0.5 sau 0.77? Aproape toata lumea exterioara unui calculator consista din semnale analogice. In afara de vorbire si muzica, sunt multe cantitati care trebuie cuantificate intr-un calculator. Umiditatea, temperatura, presiunea aerului, culoarea, turbidity, si concentratia metanului sunt doar o parte. Raspunsul este sa luam un numar de linii digitale pe care sa le combinam asfel incat ele sa exprime o valoare analogica. O valoare analogica este orice valoare dintre 0 si 1. O puteti numi valoare fractionala. Toate cantitatile de mai sus trebuie sa fie convertite la o valoare cuprinsa intre 0 si 1 astfel sa fie utilizata intr-un calculator. Acesta este conceptul cel mai raspandit. El devine ceva mai putin complex in aplicatii. Daca luam 8 linii si le aranjam astfel incat sa accepte valori binare, rezultatul total va fi 256 (acesta este obtinut de o numarare pana la 255 plus valoarea 0). Daca conectam aceste 8 linii intr-o cutie neagra, vor fi numite linii de iesire si astfel trebuie sa-i furnizam o singura linie de intrare. Cu acest aranjament putem detecta pana la 255 incrementari intre 0 si 1. Aceasta cutie neagra este denumita CONVERTOR si pentru ca noi convertim din Analog in Digital, convertorul se numeste convertor AD sau ADC (Analog to Digital Convertor). Convertoarele AD pot fi clasificate dupa parametrii diferiti. Cei mai importanti parametri sunt precizia si modul de transfer al datelor. Referitor la precizie, domeniul este: 8 biti, 10 biti, 12 biti, 14 biti, 16 biti. Deoarece conversia pe 12 biti este un standard industrial, exemplul de mai jos a fost realizat cu ajutorul unui convertor pe 12 biti. Celalalt parametru important este modul prin care datele sunt transferate in microcontroler. Poate fi paralel sau serial. Transmisia paralela este mai rapida. Oricum, aceste convertoare sunt deobicei mai scumpe. Transmisia seriala este mai lenta, dar considerand pretul scazut si numarul redus de linii de intrare la un microcontroler, este transmisia preferata pentru multe aplicatii. Semnalele analogice pot depasi limitele de intrare ale unui ADC. Aceast lucru poate duce la stricarea convertorului. Pentru a proteja intrarea sunt conectate doua diode, dupa cum se observa in schema. Acestea vor proteja de tensiuni de peste 5V si sub 0V. In exemplul nostru am folosit LTC1286, un ADC pe 12 biti (Linear Technology). Convertorul este conectat cu microcontrolerul prin intermediul a trei linii: data, clock si CS (Chip Select). Linia CS este folosita pentru a selecta un dispozitiv de intrare ca sa fie posibil sa fie conectate si alte dispozitive de intrare (ex. registru de deplasare de intrare, registru de deplasare de iesire, ADC serial) pe aceleasi linii ale microcontrolerului. Circuitul de mai jos arata cum sa conectam un ADC, tensiune de referinta si un afisaj LCD la un microcontroler. Afisajul LCD a fost adaugat pentru a vizualiza rezultatele conversiei AD.

Conectarea unui convertor AD cu tensiune de referinta la un microcontroler

Macroul folosit in acest exemplu este LCD86 si este localizat in fisierul LTC128inc.

Macroul LTC86 are trei argumente:

LTC86 macro Var_LO, Var_HI, Var

Variabila Var_LO este unde se stocheaza rezultatul  conversiei byte-ului mai putin semnificativ.
Variabila Var_HI este unde se stocheaza rezultatul  conversiei byte-ului cel mai semnificativ.
Var este un contor bucla.

Exemplu: LTC86 LO, HI, Count

Cei patru biti ai celei mai mari valori sunt in variabila HI, iar primii 8 biti ai rezultatului conversiei sunt in variabila LO. Count este o variabila de asistenta care numara trecerile prin bucle.

Urmatorul exemplu arata cum macrourile sunt folosite in program. Programul citeste valoarea provenita de la ADC si o afiseaza pe LDC. Rezultatul este dat in quantums. Ex: pentru 0V rezultatul este 0, iar pentru 5V este 4095.




Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 196
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved