Documente Academic
Documente Profesional
Documente Cultură
Rodica CONSTANTINESCU
Microcontrolere PIC
Figura 1
1
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
Figura 3 – PIC12F508
Figura 6 – PIC16F877
2
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
Figura 7 – PIC18F97J60
▪ Din familia PIC16 fac parte microcontrolerele cu o arhitectură pe 16 biţi
PIC24H şi PIC24F, precum şi procesoarele de semnal pe 16 biţi dsPIC30F şi dsPIC33F.
Figura 8 – DSPIC33FJ256MC710
Figura 9 – PIC32MX3XXL
3
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
Câteva modele mai complexe în această familie oferă facilităţi avansate, precum:
• Interfaţă CAN (Controller Area Network);
• Interfaţă bus I2C (Inter-Integrated Circuit);
• Interfaţă serială SPI;
• Interfaţă dedicată pentru afişaj LCD;
• Interfaţă USB;
• Funcţii specifice pentru controlul motoarelor.
Având în vedere gama extrem de mare de microcontrolere PIC pe 8 biţi, de peste 550
modele, în alegerea unui microcontroler trebuie ţinut cont de următorii factori:
• Numărul de pini de I/O necesari;
4
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
Deşi pot exista mai multe modele ce satisfac aceste cerinţe, va fi preferat
microcontrolerul ce satisface cerinţele minime şi nu oferă mai mult decât este nevoie. De
exemplu, dacă o aplicaţie necesită un număr de 8 pini de I/O şi avem la dispoziţie
microcontrolere cu 8 şi cu 16 pini de I/O, alegerea va fi cea a microcontrolerului cu 8 pini de
I/O.
După dimensiunea magistralei de program putem diviza familia de microcontrolere
PIC (de la firma Microchip) pe 8 biţi în trei categorii:
• Microcontrolere cu lungimea cuvântului instrucţiune de 12 biţi (microcontrolere
PIC12);
• Microcontrolere cu lungimea cuvântului instrucţiune de 14 biţi (microcontrolere
PIC16);
• Microcontrolere cu lungimea cuvântului instrucţiune de 16 biţi (microcontrolere
PIC17 şi PIC18).
Toate aceste categorii de microcontrolere au un set comun de instrucţiuni, cu câteva
instrucţiuni adiţionale disponibile pentru microcontrolerele cu lungimea cuvântului
instrucţiune de 14 biţi şi cu un număr mult mai mare de instrucţiuni adiţionale la
microcontrolerele cu lungimea cuvântului instrucţiune de 16 biţi. În toate aceste cazuri
instrucţiunile ocupă un singur cuvânt în memoria pentru program. Instrucţiunile şi datele sunt
transferate pe magistrale separate, fapt ce duce la o performanţă sporită a microcontrolerelor.
Tabelul 1
Microcontroler Memorie program RAM (octeţi) Frecvenţa (MHz) Porturi I/O ADC
12C508 512x12 25 4 6 Nu
16C54 384x12 25 20 12 Nu
16C57 2048x12 72 20 20 Nu
16C505 1024x12 41 4 12 Nu
16C58A 2048x12 73 20 12 Nu
5
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
Tabelul 2
Microcontroler Memorie program RAM (octeţi) Frecvenţa (MHz) Porturi I/O ADC
16C554 512 x 14 80 20 13 Nu
16C64 2048 x 14 128 20 33 Nu
16F84A 1024 x 14 36 10 13 Nu
16F627 1024 x 14 224 20 16 Nu
16F628 2048 x 14 224 20 16 Nu
16F676 1024 x 14 64 20 12 8
16F73 4096 x 14 192 20 22 5
16F876 8192 x 14 368 20 22 5
16F877 8192 x 14 368 20 33 8
6
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
7
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
Tabelul 3
Microcontroler Memorie program RAM (octeţi) Frecvenţa (MHz) Porturi I/O ADC
17C43 4096 x 16 454 33 33 Nu
17C752 8192 x 16 678 33 50 12
18C242 8192 x 16 512 40 23 5
18C252 16384 x 16 1536 40 23 5
18F4250 32768 x 16 1536 40 36 13
8
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
9
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
Figura 16
Adresele registrelor de control ale porturilor sunt fixe şi se află în aria de adrese a SFR.
c) Registrele timerelor
În funcţie de model un microcontroler PIC poate avea între unu şi trei timere. (Dat
fiind că funcţionarea acestora este similară, vom exemplifica numai modul de funcţionare la
microcontrolerul PIC16F84A, care este echipat cu un singur timer.)
PIC16F84A este echipat cu un singur registru pe 8 biţi numit TMR0, ce poate fi
utilizat atât ca timer cât şi ca numărător. Când este utilizat ca numărător acest registru este
incrementat de fiecare dată când un impuls este aplicat pinului T0CK1. Când este folosit ca
timer, acest registru este incrementat cu o rată determinată de frecvenţa semnalului de tact şi
de valoarea stabilită pentru prescalare în registrul de opţiuni. De exemplu, pentru o frecvenţă
de tact de 4MHz, ciclul instrucţiune are 1µs (semnalul de ceas este divizat intern cu patru).
Dacă este setată pentru prescalare valoarea 1:16, atunci timerul va fi incrementat la fiecare
16µs. În harta memoriei RAM registrul timer TMR0 este situat la adresa 01H. Ori de câte ori
apare depăşirea registrului TMR0 (depăşirea valorii 255) este generată o întrerupere. Această
întrerupere poate fi activată sau dezactivată prin program.
Circuitul watchdog timer este utilizat pentru a preveni blocarea microcontrolerului
într-o buclă infinită. Pentru a preveni apariţia depăşirii, acest timer trebuie resetat periodic
prin program. Circuitul de watchdog poate fi dezactivat în timpul programării
microcontrolerului dacă nu se doreşte utilizarea acestuia.
Timerul TMR1
Anumite microcontrolere au în afară de registrul timer TMR0 încă două registre timere
suplimentare: TMR1 şi TMR2. TMR1 este un timer pe 16 biţi, format cu ajutorul registrelor
TMR1H şi TMR1L. Acest timer are, de asemenea, un circuit de prescalare, valorile posibile
pentru prescalare fiind de 1, 2, 4 şi 8. Funcţionarea timerului TMR1 este determinată de
valorile încărcate în registrul de control T1CON.
TMR1 poate fi activat sau dezactivat în funcţie de setarea bitului 0 (TMR1ON) al registrului
T1CON, pentru a reduce consumul de energie. TMR1 poate funcţiona atât ca numărător cât şi
ca timer, funcţie de setarea bitului 1 (TMR1CS) din registrul T1CON. În mod timer TMR1
este incrementat la fiecare puls al fosc/4. În mod numărător TMR1 este incrementat pe fiecare
front crescător al intrării de semnal de tact. TMR1 poate număra de la 0 la 65535, iar o
depăşire va fi semnalată la trecerea de la 65535 la 0.
10
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
Observație: Dacă în registrul INTCON sistemul de întreruperi este activ şi este activată
întreruperea pentru timer-ul TMR1, o întrerupere va fi semnalată la apariţia depăşirii.
Timerul TMR2
TMR2 este un timer pe 8 biţi (echipat cu prescaler şi postscaler) care are şi un registru
timer asociat PR2 (=registru de perioadă al timerului 2, pe 8 biți, valoare maximă 256).
Funcţionarea acestui timer este controlată cu ajutorul registrului special T2CON. TMR2
incrementează de la 0 până la valoarea înscrisă în registrul PR2, apoi este resetat. TMR2 poate
fi dezactivat pentru a reduce consumul de energie cu ajutorul bitului 0 (TMR2ON) din
registrul de control T2CON.
Figura 18
11
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
PIC16F84 are două blocuri separate de memorie, unul pentru date şi celălalt pentru
programe. Memoria EEPROM şi registrele GPR în memoria RAM constituie un bloc de date
şi memoria FLASH constituie un bloc de programe.
Din punct de vedere logic harta memoriei este împărțită în două segmente (figura 19).
Această împărțire este un atribut de arhitectură, deoarece modificarea conținutului unei locații
de memorie implică mai întâi poziționarea în segmentul vizat. Fiecare segment conține 128
locații, dintre care primele 12 sunt rezervate SFR, următoarele 68 sunt registre de uz general –
GPR, iar ultimele 48 de adrese nu sunt implementate fizic (zonele haşurate din figura 19).
Orice locație din harta memoriei poate fi adresată direct (prin adresă sau prin numele asociat
în cazul SFR) sau indirect cu ajutorul registrelor speciale FSR şi INDF. Astfel FSR conține
adresa locației din harta memoriei care trebuie citită şi/sau scrisă, iar printr-un mecanism
implementat fizic citim din INDF conținutul locației respective. Acesta este de fapt
mecanismul adresării indirecte.
12
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
unde: INDF* – nu este un registru fizic, e folosit la mecanismul adresării indirecte (când se
şterge INDF*, de fapt se şterge ceea ce se află la adresa conţinută în FSR);
PCL – octet inferior al PC (citibil şi modificabil);
STATUS – conține starea aritmetică a UAL (biții 0-2, C-carry, DC-digit carry şi Z-
zero), starea RESET (biții 3 şi 4, TO şi PD) şi biții pentru selectarea bancului de
memorie (biții 5-7, RP0, RP1 şi IRP);
FSR (File Select Register) – conține adresa locației din harta memoriei care trebuie
citită şi/sau scrisă;
PORTA, PORTB – registrul de date asociat portului A, respectiv portului B;
TRISA, TRISB – registrul de direcție asociat portului A, respectiv portului B;
PCLATH – partea superioară a PC (locația poate fi modificată doar de utilizator).
13
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
(pinul 14) trebuie să fie stabilizată între 4.5V şi 5.5V. Memoria program poate fi programată
serial folosind doi pini „data/clock” ce trebuie să fie mai întâi separaţi de liniile montajului, ca
să nu apară erori în timpul programării.
b) Memoria de date
Memoria de date este realizată din memoriile EEPROM şi RAM.
Memoria EEPROM constă din 64 de locaţii de opt biţi a căror conţinut nu este pierdut
în timpul opririi sursei de alimentare.
Memoria EEPROM e plasată într-un loc special al memoriei şi poate fi accesată prin
regiştri speciali. Aceşti regiştri sunt:
- EEDATA la adresa 08H, care reține datele de citit sau cele de scris;
- EEADR la adresa 09H, ce conține o adresă a locației EEPROM ce este accesată;
- EECON1 la adresa 88H, ce conține biții de control;
- EECON2 la adresa 89H. Acest registru nu există fizic şi serveşte la protejarea
memoriei EEPROM de scrieri accidentale.
EEPROM-ul nu este direct adresabil, dar este accesat indirect prin regiştrii EEADR
(conține adresa locației de memorie EEPROM ce va fi accesată) şi EEDATA (conține cei 8
biți de date pentru scriere sau citire). Pentru că memoria EEPROM este folosită curent la
memorarea unor parametri importanţi (de exemplu, o temperatură dată în regulatoarele de
temperatură), există o procedură strictă de scriere în EEPROM ce trebuie urmată pentru a
preveni scrierea accidentală, adică un octet scris şterge în mod automat locația înainte de a
scrie data.
Memoria RAM pentru date ocupă un spaţiu într-o hartă a memoriei de (de la locaţia
0x0C la 0x4F ceea ce înseamnă) 68 de locaţii. Locaţiile memoriei RAM sunt de asemenea
denumite registre GPR (General Purpose Registers) – Registre cu Scop General. Deci putem
spune că registrele GPR sunt folosite ca o memorie RAM. Când sunt accesate locaţiile
8CH÷CFH (140-207) în bancul 1, accesăm de fapt exact aceleaşi locaţii în bancul 0, deci
aceste registre pot fi accesate indiferent de ce banc este selectat la un moment dat.
c) Registrele SFR
Registrele SFR (Special Function Registers) ocupă primele 12 locaţii în bancurile 0 şi
1 şi sunt registre cu funcţii specializate asociate cu unele blocuri ale microcontrolerului.
14
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
2.2.3 Stiva
PIC16F84 are o stivă de 13 biți cu 8 nivele, sau cu alte cuvinte, un grup de 8 locații de
memorie de 13 biți lățime cu funcții speciale. Rolul său de bază este de a păstra valoarea PC
după un salt din programul principal la o adresă a unui subprogram. Pentru ca un program să
ştie cum să se întoarcă la punctul de unde a pornit, trebuie să înapoieze valoarea PC din stivă.
Când se mută dintr-un program într-un subprogram, PC este împins în stivă (un exemplu de
acesta este instrucțiunea CALL). Când se execută instrucțiuni ca RETURN (ieşire din
subrutină), RETLW (ieşire din subrutină cu extragerea unei constante din memoria de
program) sau RETFIE (ieşire din rutina de tratare a întreruperii) ce au fost executate la
sfârşitul unui subprogram, PC a fost luat dintr-o stivă, astfel încât programul să poată continua
de unde a fost oprit înainte de a fi întrerupt. Aceste operații de plasare într-o stivă şi de luare
dintr-o stivă de contor de program sunt numite PUSH şi POP, şi sunt numite conform cu
instrucțiunile similare ale microcontrolerelor.
15
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
Reset-ul este folosit pentru a pune microcontrolerul într-o stare ”inițială”. Pentru a
funcționa corect trebuie resetat, însemnând că toate registrele vor fi puse într-o stare de start.
Resetul nu este folosit numai când microcontrolerul nu se comportă cum vrem noi, dar poate,
de asemenea, să fie folosit când apare o întrerupere în programul de execuție.
Pentru a preveni ajungerea unui zero logic la pinul MCLR accidental (linia de
deasupra înseamnă că resetul este activat de un zero logic), MCLR trebuie să fie conectat
printr-un rezistor la polul pozitiv al sursei de alimentare. Rezistorul trebuie să fie între 5 şi
10K. Funcția acestui rezistor este de a menține o anumită linie la starea logică unu, preventiv.
Locațiile de memorie RAM pot fi accesate direct sau indirect, deci modurile de
adresare a datelor sunt: directă şi indirectă.
Adresarea directă
Adresarea directă se face printr-o adresă de 9 biți. Această adresă este obținută prin
conectarea celui de-al şaptelea bit al adresei directe a unei instrucțiuni cu doi biți (biții 5 şi –
RP1, RP0) din registrul STATUS după cum se arată în figura următoare.
16
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
Adresarea indirectă
Observație: Acest tip de adresare nu are nici un avantaj față de adresarea directă, dar
există unele nevoi în timpul programării ce se pot rezolva mai simplu doar prin adresarea
indirectă.
Un asemenea exemplu poate trimite un set de date prin comunicația serială sau să
şteargă o parte a memoriei RAM (16 locații) ca în următorul exemplu:
17
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
Citind datele din registrul INDF când conținutul registrului FSR este egal cu zero
întoarce valoarea zero şi scrie în el rezultatul în operația NOP (no operation-fără operație).
Adresarea relativă
Adresarea relativă se mai numeşte şi redundantă, deoarece se folosesc doar o parte din biții
de adresă.
În cazul adresării relative registrul referit în mod implicit este PC. Deci adresa instrucțiunii
curente e adunată la conținutul câmpului de adresă pentru a genera adresa efectivă. Câmpul de
adresă e tratat ca un număr în complement față de 2 pentru această operație. Deci, câmpul de
adresă este un deplasament relativ la adresa instrucțiunii.
Observații:
- Utilizarea adresării relative reduce numărul de biți de adresă din instrucțiune,
deoarece majoritatea referințelor la memorie sunt relativ apropiate de instrucțiunea
curentă.
- Adresele (sau o parte dintre acestea) nu sunt folosite la selecția memoriei. În acest
fel o celulă de memorie se poate găsi la mai multe adrese diferite.
PIC 12
18
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
Unitatea centrală este o unitate pe 8 biţi care poate realiza funcţii aritmetice şi
booleene: adunare, scădere, deplasare şi operaţii logice cu date care se găsesc în registrul de
lucru (PSW) şi în oricare registru de uz general. Setul de instrucţiuni are un mare grad de
ortogonalitate, ceea ce reduce mult timpul necesar de realizare a unei aplicaţii.
Stiva este de 12 biţi şi este realizată hard. Nu există indicator de stivă şi nu sunt
instrucţiuni de PUSH şi POP, lucrul cus tiva fiind automat la instrucţiunile CALL şi RETLW.
Stiva admite o adâncime de 2 nivele.
Liniile de I/O pot fi programate ca intrări sau ieşiri cu registrul special GPIO (Port
Generic de Intrare/Ieşire, care permite setarea sau colectarea nivelului logic de pe un pin al
microcontrolerului). Pinii pot avea semnificaţii duble. La RESET toate liniile se definesc ca
intrări. Unii pini pot trezi MC din starea inactivă (WAKE UP). Operaţiile de intrare/ieşire se
fac prin intermediul registrului GPIO.
- Temporizator/numărător pe 8 biţi;
- Numărător pentru prescalare de 8 biţi;
- Ceas din exterior sau din interior.
Memoria EEPROM cu care sunt echipate anumite circuite din familie poate fi de 16
octeţi, poate fi supusă la peste 1 milion de cicluri de scriere/ştergere şi poate reţine informaţia
mai mult de 40 de ani. Transmisia se face serial sincron pe două fire, unul de tact şi unul de
date, bidirecţional, fără a avea conexiune în exterior. Protocolul pentru transferul de date
poate avea loc doar dacă magistrala de date nu este ocupată.
Familia PIC12 are posibilitatea de lucru într-un mod cu economie de energie, numit
SLEEP. În modul SLEEP oscilatorul este oprit, iar pinii I/O îşi păstrează starea. Intrarea în
SLEEP se face cu o instrucţiune specială. MC poate fi scos din acest mod de lucru printr-un
front aplicat la pin extern sau de ceasul de gardă.
Identificarea sursei de RESET se face prin poziţionarea unor biţi în registrul de stare,
registru al cărui conţinut nu se modifică prin RESET.
PIC16
MC din familia PIC16 pot fi echipate cu o diversitate mult mai mare de interfeţe decât
cele din familia PIC12, cum ar fi: comparatoare, convertoare CAD şi CDA, USART, I 2C, SPI,
PWN, etc..
20
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC
PIC17
21