Sunteți pe pagina 1din 21

S.L.Dr.Ing.

Rodica CONSTANTINESCU
Microcontrolere PIC

Familii de microcontrolere PIC – Microchip

1. Prezentare generală a familiilor de microcontrolere Microchip

Compania Microchip produce o gamă de peste 550 microcontrolere pe 8, 16 sau 32 de


biţi, destinate unei largi game de aplicaţii. Pentru a facilita dezvoltarea de aplicaţii, Microchip
oferă în mod gratuit mediul de dezvoltare MPLAB, ce asigură suport pentru toată gama de
microcontrolere Microchip. MPLAB este un pachet de program Windows ce face scrierea şi
dezvoltarea unui program mai uşoară. Poate fi descris cel mai bine ca un mediu de dezvoltare
pentru un limbaj de programare standard ce este folosit pentru programarea unui computer
PC. Unele operaţii ce erau făcute din linia de instrucţiuni cu un număr mare de parametri până
la descoperirea IDE-ului, "Integrated Development Environment", sunt acum făcute mai
uşoare prin folosirea MPLAB. În orice caz, programul scris este uşor de citit, şi este
disponibil un help bine documentat. MPLAB constă din câteva părţi:
- Gruparea fişierelor aceluiaşi proiect într-un singur proiect (Project Manager);
- Generarea şi procesarea unui program (Text Editor);
- Simulator de program scris, folosit pentru simularea funcţionării programului în
microcontroler.

Figura 1

Familia microcontrolerelor pe 8 biţi conţine peste 400 de variante, grupate în trei


categorii, după lungimea cuvântului instrucţiune, respectiv microcontrolere cu lungimea
cuvântului instrucţiune de 12, 14 sau 16 biţi (familiile reprezentative pentru acestea sunt
PIC10, PIC12, PIC16 şi PIC18).
▪ Familia PIC10 cuprinde unele din cele mai simple microcontrolere, în capsulă
cu 6 sau 8 pini, destinate în special aplicaţiilor cu alimentare de la baterie şi aplicaţiilor unde
sunt impuse dimensiuni reduse. (Figura 2)
▪ Familia PIC12 cuprinde microcontrolere în capsulă cu 8 pini, cu un preţ de cost
redus (0,41 USD/bucata). (Figura 3)
▪ Familia PIC16 conţine microcontrolere cu performanţe medii, cu un set extins
de dispozitive periferice, realizate în capsule cu 14 ÷ 64 pini. (Figurile 4, 5 şi 6)

1
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC

▪ Microcontrolerele din seria PIC18, disponibile în capsule cu 18 până la 100


pini, constituie versiunea cea mai performantă a microcontrolerelor de 8 biţi Microchip, având
câteva îmbunătăţiri semnificative faţă de generaţiile anterioare: multiplicator hardware, un set
mai bogat de instrucţiuni, un număr mai mare de registre interne, ş.a.. (Figura 7)

PIC10F200 în capsula SOT23 PIC10F200 în capsula DIP8


Figura 2

Figura 3 – PIC12F508

Figura 4 – PIC16F505 în capsula cu 14 pini

Figura 5 – PIC16F84 în capsula cu 18 pini

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

Familia PIC32 cuprinde o serie de microcontrolere cu performanţe înalte, în capsulă


cu 64 sau 100 de pini, compatibile la nivel de pini cu microcontrolerele pe 16 biţi dsPIC.
Aceasta facilitează migrarea de la dsPIC la noile procesoare.

Figura 9 – PIC32MX3XXL

3
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC

Microcontrolere PIC de 8 biţi

2.1 Familii de microcontrolere PIC de 8 biţi

Microcontrolerele pe 8 biţi din familia PIC produsă de către firma Microchip au o


arhitectură Harvard modificată, cu magistrala memoriei de date separată de magistrala
memoriei pentru program, având lărgimea magistralei memoriei de program de 12, 14 sau 16
biţi.
În această familie vom găsi o gamă variată de microcontrolere, cu 6 până la 80 pini şi
cu o memorie pentru program între 384 B (octeţi) şi 128 KB. Cele mai simple microcontrolere
din familia PIC de 8 biţi au un set de instrucţiuni restrâns, cu numai 33 de instrucţiuni. Acest
set de instrucţiuni se regăseşte la majoritatea microcontrolerelor pe 8 biţi, în acest fel fiind
facilitată migrarea de la un model la altul. Aceasta permite ca programele scrise pentru un
anumit microcontroler să poată fi rulate pe modele cu o arhitectură similară fără a fi necesare
modificări ale codului.
Toate microcontrolerele PIC pe 8 biţi oferă caracteristici comune şi anume:
• Arhitectură RISC cu un set redus de instrucţiuni;
• Moduri de adresare directă, indirectă şi relativă;
• Memorie RAM internă;
• Memorie EPROM sau FLASH;
• Porturi I/O digitale, care suportă curenţi mari de intrare/ieşire (maxim 25mA);
• Timer integrat cu prescalare pe 8 biţi;
• Circuite de reset;
• Watchdog timer (timer de urmărire);
• Mod de economisire a energiei (SLEEP);
• Interfaţă pentru semnal de tact extern.

Unele modele de microcontrolere oferă facilităţi suplimentare:


• Canale de intrare analogice;
• Comparatoare analogice;
• Circuite timere suplimentare;
• Memorie EEPROM pentru stocarea datelor;
• Întreruperi interne şi externe;
• Circuit intern de generare a semnalului de tact;
• Ieşiri PWM (Pulse Width Modulation);
• Interfaţă serială USART.

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

• Periferice necesare (USART, USB);


• Dimensiunea minimă a memoriei pentru program;
• Dimensiunea minimă a memoriei pentru date;
• Necesitatea utilizării de memorie EEPROM;
• Viteza de lucru;
• Dimensiunile;
• Preţul de cost.

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.

Microcontrolere cu lungimea cuvântului instrucţiune de 12 biţi

Aceste microcontrolere au o arhitectură foarte simplă, fiind preferate în aplicaţii unde


sunt necesare dimensiuni reduse şi în aplicaţii cu alimentare de la baterie. Scăderea preţurilor
la microcontrolerele cu lungimea cuvântului instrucţiune de 14 biţi a dus la restrângerea
utilizării microcontrolerelor din grupul pe 12 biţi.

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

Exemplu: Microcontrolerul PIC12C508 este un microcontroler RISC de 8 biţi, cu 33


de instrucţiuni codate pe 12 biţi. Este dotat cu o memorie EPROM de 512 x 12 biţi şi poate
funcţiona la frecvenţe de până la 4MHz. PIC12C508 este echipat cu 6 linii de I/O, un timer
intern pe 8 biţi, watchdog timer, şi are un oscilator intern de 4MHz. În cazul PIC12F508
memoria EPROM este înlocuită cu memorie FLASH, ce permite reprogramarea cu ajutorul

5
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC

unui programator standard. Versiunea PIC12CE508 este echipată şi cu o memorie nevolatilă


EEPROM de 16 octeţi.

Figura 10 – PIC 12F508/509

Microcontrolerul PIC16C5X este unul din primele microcontrolere produse de către


Microchip. Acesta este un microcontroler cu 18 pini, având o memorie de program de 384 x
12 biţi, 25 octeţi memorie RAM, 12 linii de I/O, un timer şi este echipat şi cu un watchdog
timer. Din aceiaşi familie fac parte PIC16C56, echipat cu 1024 x 12 biţi memorie pentru
program şi PIC16C58A care este dotat cu 2048 x 12 biţi memorie program şi cu 73 octeţi
memorie RAM.

Figura 11 – PIC C5X

Microcontrolere cu lungimea cuvântului instrucţiune de 14 biţi

În această categorie intră majoritatea microcontrolerelor Microchip pe 8 biţi. Cele mai


multe microcontrolere din această categorie pot funcţiona la frecvenţe de tact de 20MHz.
Setul de instrucţiuni conţine 35 de instrucţiuni. În tabelul 2 se regăsesc o parte din
microcontrolerele aparţinând acestui grup.

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

Exemple de microcontrolere din această familie:


▪ PIC16F84A este unul din cele mai populare microcontrolere. Este disponibil
într-o capsulă cu 18 pini şi oferă o memorie de program de 1024 x 14 biţi, 68 octeţi memorie
RAM, 64 octeţi memorie nevolatilă EEPROM. Are 13 pini de I/O şi este echipat cu un timer
pe 8 biţi ce poate genera întreruperi interne. Este dotat cu watchdog timer. Are surse de
întrerupere interne şi externe. PIC16F84A poate opera cu diferite surse de semnal de tact cum
ar fi oscilator cu cristal, rezonator ceramic sau cu circuit RC (în aplicaţii în care precizia
semnalului de tact nu este importantă).

Figura 12 – PIC 16F84A

▪ PIC16F877 este disponibil în capsulă cu 40 de pini şi este un microcontroler


destinat aplicaţiilor performante. Acest microcontroler este echipat cu 8192 x 14 biţi memorie
program, 368 octeţi memorie RAM, 256 octeţi memorie EEPROM. O largă gamă de
dispozitive periferice sunt disponibile: 33 pini de I/O, 8 canale A/D multiplexate, cu o
rezoluţie de 10 biţi, generator PWM, trei timere, circuit comparator, USART, surse de
întrerupere interne şi externe.

Figura 13 – PIC 16F877

Microcontrolere cu lungimea cuvântului instrucţiune de 16 biţi

Aceste microcontrolere reprezintă gama de vârf a microcontrolerelor PIC pe 8 biţi.


Cele mai multe microcontrolere din această gamă au 33 pini de I/O, trei timere şi pot opera la
frecvenţe de tact de maxim 40MHz. Setul de instrucţiuni include cele 35 de instrucţiuni
întâlnite la microcontrolerele cu lungimea cuvântului instrucţiune pe 14 biţi, la care se adaugă

7
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC

încă 23 de instrucţiuni specifice. În tabelul 3 se regăsesc o parte din microcontrolerele


aparţinând acestui grup de microcontrolere.

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

2.2 Arhitectura internă a microcontrolerelor PIC pe 8 biţi

Microcontrolerele din această familie folosesc o arhitectură Harvard cu spaţii de


memorie separate pentru coduri şi pentru date. Setul de instrucţiuni este tipic RISC şi conţine
între circa 35 de instrucţiuni la versiunile simple până la circa 80 de instrucţiuni la versiunile
performante. Această familie este destinată dezvoltării unor aplicaţii ieftine. Deşi familia de
microcontrolere PIC pe 8 biţi cuprinde o gamă largă de modele, acestea au caracteristici
comune (memorie internă, porturi I&O, timere). Unele microcontrolere oferă facilităţi
avansate (convertoare A&D, USART, etc.). Date fiind aceste caracteristici comune, putem
descrie o parte din atributele de arhitectură internă a microcontrolerelor din această familie.
Ca model pentru această familie vom prezenta microcontrolerul PIC16F84 a cărui structură
internă este prezentată în figura următoare. Microcontrolerul este alimentat cu o singură sursă
de +5V şi poate primi semnal de tact din 4 surse diferite.

8
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC

2.2.1 Registrele microcontrolerelor PIC pe 8 biţi

Registrele microcontrolerelor PIC pe 8 biţi pot fi grupate în registre speciale - SFR


(Special Function Register) şi registre de uz general GPR (General Purpose Register). SFR
reprezintă o colecţie de registre utilizate de către microcontroler pentru a controla perifericele
şi funcţiile interne ale acestuia. Numărul de registre speciale poate fi diferit în funcţie de
complexitatea microcontrolerului. De exemplu, scrierea şi citirea din memoria EEPROM se
face prin intermediul registrelor speciale EECON1, EECON2, EEADR şi EEDATA.
Alte registre speciale sunt:
• Registrul de opţiuni OPTION;
• Registrele asociate porturilor I/O;
• Registrele timerelor;
• Registrele speciale ale modulului CCP (captură/comparare/PWM);
• Registrele convertoarelor A/D;
• Registrul de control al întreruperilor INTCON.

a) Registrul de opţiuni: OPTION_REG


Registrul de opţiuni OPTION_REG aflat la adresa 81H controlează diferite funcţii
interne ale microcontrolerului. Acest registru este disponibil atât pentru citire cât şi pentru
scriere, funcţiile acestui registru fiind următoarele:

Figura 15 – Registrul de opţiuni

▪ Bitul 7 – Activare rezistori pull-up pentru portul B (1-activare, 0-dezactivare)


▪ Bitul 6 – Front detectare întrerupere (frontul crescător/descrescător)
▪ Bitul 5 – Sursa de semnal de ceas pentru timer (extern/intern)
▪ Bitul 4 – Modul de incrementare al timerului TMR0
▪ Bitul 3 – Modul de asignare a circuitului de prescalare (watchdog timer)
▪ Biţii 2÷0 – Fixarea ratei de prescalare (000-1:2, 001-1:4, ...,111-1:256)

De exemplu pentru a configura declanşarea întreruperii externe pe front crescător în


registrul OPTION_REG trebuie scris X1XXXXXX, unde X poate fi 0 sau 1.

b) Registrele porturilor I/O


Fiecare port de I/O are două registre asociate: registrul de direcţie şi registrul de date.
Registrul de date are acelaşi nume cu portul asociat. De exemplu, PIC16F84 are două
registre de date: PORTA şi PORTB. Un microcontroler PIC16F877 are cinci registre de date,
PORTA, PORTB, PORTC, PORTD şi PORTE. Datele de 8 biţi pot fi trimise către un port,
sau pot fi citite simultan din registrul de date asociat portului. Este de asemenea posibilă
citirea sau scrierea individuală a fiecărui pin al portului.
Porturile, la microcontrolerele PIC, sunt bidirecţionale, deci orice pin poate fi utilizat
atât ca intrare, cât şi ca ieşire. Modul de funcţionare al pinilor unui port este configurat cu
ajutorul registrului de direcţie asociat portului. Acesta se numeşte registru TRIS. De
exemplu, portul A are asociat registrul TRISA. Setarea unui bit din registrul TRIS
configurează pinul asociat ca intrare. Punerea pe 0 logic a unui bit configurează pinul
respectiv ca ieşire. De exemplu, pentru a seta biţii 0 şi 1 ai portului B ca intrare şi restul biţilor
ca ieşire va trebui să încărcăm în TRISB valoarea 00000011.

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.

Figura 17 – 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.

d) Registrele speciale ale modulului CCP (captură/comparare/PWM)

Adiţional timerelor, în cazul sistemelor dedicate realizate cu microcontrolere, apare


adesea necesitatea de a măsură timpul la care se petrece un eveniment. La nivel hardware,
aceasta se realizează cu ajutorul unui registru de captură, a cărui valoare este comparată cu
valoarea unui timer. Când cele două valori sunt egale, se generează o întrerupere. În cazul
microcontrolerelor PIC aceste funcţii sunt îndeplinite de către modulul CCP
(Capture/Compare/PWM). În cadrul funcţionării acest modul interacţionează cu timerele
TMR1 şi TMR2.

e) Registrele asociate convertoarelor A/D

Convertorul A/D intern permite achiziţionarea de semnale analogice direct de către


microcontroler. La majoritatea microcontrolerelor PIC, portul PORTA este utilizat ca intrare
analogică aceşti pini putând fi configuraţi fie pentru funcţionare ca I/O digitală, fie ca intrare
analogică. Modul de funcţionare al convertorului A/D este controlat cu ajutorul registrelor
speciale asociate.
De exemplu, PIC16F876 conţine cinci canale de intrare analogice, iar varianta
PIC16F877 include opt canale de intrare analogice. Există un singur convertor A/D, canalele
de intrare fiind multiplexate. Rezoluţia acestui convertor depinde de modelul de
microcontroler, ea fiind de 8 sau 10 biţi. PIC16F876 şi PIC16F877 au convertorul A/D pe 10
biţi, iar PIC16F73 are convertorul A/D pe 8 biţi.

Figura 18

Pentru funcţionarea convertorului A/D este necesară o tensiune de referinţă. Aceasta


este programată cu ajutorul registrelor de control şi valoarea tipică este de +5V. Aşadar, în
cazul unui convertor pe 10 biţi (1024 niveluri de cuantizare) rezoluţia acestuia va fi de 5/1024
= 4,88mV. În cazul convertorului pe 8 biţi (256 niveluri de cuantizare) vom avea o rezoluţie
de 5/256=19,53mV.

11
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC

Funcţionarea convertorului A/D este controlată cu ajutorul registrelor ADCON0 şi


ADCON1. Registrul ADCON0 îndeplineşte următoarele funcţii: selectează sursa de semnal
de tact (bitul 7 – ADCS1), selectează canalul (bitul 6 – ADCS0), activează/dezactivează
conversia (bitul 5/4 – CHS2/CHS1), comandă începutul conversiei (bitul 3 – CHS0). Bitul 2
(GO/DONE) al registrului ADCON0 îndeplineşte următoarea funcţie: prin setarea acestui bit
se începe conversia A/D. Acest bit este pus pe 0 logic la finalizarea conversiei şi poate fi
testat din program pentru a determina dacă conversia a fost finalizată sau nu. Rezultatul
conversiei A/D este stocat în registrele ADRESH şi ADRESL. ADRESL conţine biţii cei mai
puţin semnificativi, iar ADRESH conţine cei doi biţi mai semnificativi în cazul conversiei pe
10 biţi.
Registrul de control ADCON1 specifică modul de configurare al portului PORTA şi
formatul datelor de ieşire.

f) Registrul sistemului de întreruperi - INTCON

La microcontrolerele PIC sistemul de întreruperi este controlat cu ajutorul registrului


INTCON. În cazul microcontrolerelor simple, cum ar fi PIC16F84A, acest registru are
următoarea structură:

Figura 19 – Registrul INTCON al microcontrolerului PIC16F84A

PIC16F84 are patru surse de întrerupere:


1. Terminarea scrierii datelor în EEPROM;
2. Întrerupere TMR0 cauzată de depăşirea timer-ului;
3. Întrerupere în timpul schimbării la pinii RB4, RB5, RB6 şi RB7 ai portului B;
4. Întrerupere externă de la pinul RB0/INT al microcontrolerului.
Pentru gestionarea acestor surse de întrerupere au fost adăugaţi patru registre speciale,
cu rol în gestionarea întreruperilor dispozitivelor periferice. Registrele PIE1 (Peripheral
Interrupt Enable 1) şi PIE2 (Peripheral Interrupt Enable 2) sunt utilizate pentru
activarea/dezactivarea întreruperilor pentru fiecare periferic în parte. Registrele PIR1
(Peripheral Interrupt Read 1) şi PIR2 (Peripheral Interrupt Read 2) conţin fanioanele de
întrerupere asociate perifericelor.

2.2.2 Organizarea memoriei

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

Adresa Segmentul 0 Segmentul 1 Adresa


00H INDF* INDF* 80H
01H TMR0 OPTION 81H
02H PCL PCL 82H
03H STATUS STATUS 83H
04H FSR FSR 84H
05H PORTA TRISA 85H
06H PORTB TRISB 86H
07H //////////////////////////////// ///////////////////////////// 87H
08H EEDATA EECON1 88H
09H EEADR EECON2* 89H
0AH PCLATH PCLATH 8AH
0BH INTCON INTCON 8BH
0CH 8CH
. .
68 REGISTRE 68 REGISTRE
. .
GPR GPR remapate
. .
4FH CFH
50H ///////////////////////// ///////////////////////// D0H
. ///////////////////////// ///////////////////////// .
. ///////////////////////// ///////////////////////// .
. ///////////////////////// ///////////////////////// .
7FH ///////////////////////// ///////////////////////// FFH

Figura 19 – Harta memoriei PIC16F84 (harta ”fişierului de registre”)

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).

a) Memoria pentru programe


Memoria pentru programe este de tip FLASH ceea ce face posibil a programa un
microcontroler de mai multe ori înainte de a fi instalat într-un montaj, şi chiar după instalarea
sa dacă se întâmplă unele schimbări în program sau parametri de proces. Mărimea memoriei
program este de 1024 locaţii cu lăţime de 14 biţi, unde locaţiile zero şi patru sunt rezervate
pentru reset şi pentru vectorul de întrerupere.
Observație: Pentru a programa o memorie de program, microcontrolerul trebuie să fie
setat pentru un mod de lucru special prin aducerea pinului 4 (MCLR, pin care resetează
intrarea şi tensiunea de programare a microcontrolerului) la 13.5V, iar sursa de tensiune Vdd

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

Figura 20 – Organizarea memoriei microcontrolerului PIC16F84

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

2.2.4 Iniţializarea procesorului (Reset-ul)

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.

Microcontrolerul PIC16F84 poate fi iniţializat in următoarele moduri:


a) Reset la alimentare, POR (Power-On Reset);
b) Reset în timpul lucrului obişnuit prin aducerea unui zero logic la pinul 4 (MCLR) al
microcontrolerului;
c) Reset în timpul regimului SLEEP;
d) Reset la depăşirea timer-ului watchdog (WDT);
e) Reset în timpul depăşirii WDT în timpul regimului SLEEP;
Cele mai importante resurse de reset sunt a) şi b). Prima are loc de fiecare dată când
este alimentat microcontrolerul şi serveşte la aducerea tuturor registrelor la starea iniţială a
poziţiei de start. A doua este pentru a aduce un zero logic la pinul 4 (MCLR) în timpul
operaţiei normale a microcontrolerului, fiind des folosită în dezvoltarea de programe. În
timpul unei iniţializări, locaţiile de memorie RAM nu sunt resetate. Ele sunt necunoscute la
alimentare şi nu sunt schimbate la iniţializare. Spre deosebire de acestea, registrele SFR sunt
resetate la o stare iniţială a poziţiei de start. Cel mai important efect al iniţializării este setarea
numărătorului de program (PC) la zero (0000H), ceea ce permite programului să înceapă
executarea de la prima instrucţiune scrisă.

Modurile de adresare la PIC16F84

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.

Observație: Orice acces la registrele SFR pot fi un exemplu de adresare directă.

Bsf STATUS, RP0 ;Bankl


movlw 0xFF ;w=0xFF
movwf TRISA ;address of TRISA register is taken from instruction movwf

16
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC

Adresarea indirectă

Adresarea indirectă, spre deosebire de cea directă, nu ia o adresă dintr-o instrucțiune ci o


creează cu ajutorul bitului 7 (IRP) al registrului STATUS şi al bitului 7 al registrului
FSR. Locația adresată este accesată prin registrul INDF care de fapt ține o adresă indicată de
registrul FSR. Cu alte cuvinte, orice instrucțiune care foloseşte INDF ca registru, în realitate
accesează datele indicate de registrul FSR.
Să spunem, de exemplu, că un registru cu scop general (GPR) la adresa 0Fh conține
valoarea 20. Prin scrierea unei valori 0Fh în registrul FSR vom obține un registru indicator la
adresa 0Fh, iar prin citirea din registrul INDF, vom obține valoarea 20, ceea ce înseamnă că
am citit din primul registru valoarea lui fără accesarea lui directă (dar prin FSR şi INDF).

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.

FAMILII DE MICROCONTROLERE PIC

PIC 12

MC PIC12 sunt MC cu preţuri mici şi uşor de utilizat datorită arhitecturii RISC. MC


are un număr de 33 instrucţiuni cu un grad mare de ortogonalitate (această caracteristică
impune ca fiecare instrucţiune din setul de instrucţiuni să poată opera cu orice tip de date
conţinute în oricare registru sau oricare locaţie de memorie şi să poată fi adresată prin oricare
mod de adresare), din care majoritatea se execută într-un singur ciclu, iar cele de salt în două
cicluri. Spaţiul mic ocupat (capsulă de 8 pini) fac aceste MC foarte potrivite aplicaţiilor
miniatură, precum şi aplicaţiilor casnice. Pentru a putea fi realizată o şi mai mare economie de
spaţiu, circuitul de RESET este integrat.

Aceste MC admit o frecvenţă de până la 4 MHz.

MC PIC12 are o arhitectură Harvard, cu magistrale diferite pentru date şi pentru


instrucţiuni. Acest lucru permite ca magistrala de instrucţiuni să fie mai mare (de 12 biţi) şi ca
urmare majoritatea instrucţiunilor pot fi de un cuvânt şi pot fi executate într-un singur ciclu.

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.

Setul de registre localizat în RAM conţine registre cu funcţii speciale şi registre de uz


general. Registrele generale pot fi apelate direct sau indirect, prin intermediul registrului
special FSR (File Select Register).

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.

Registrul de opţiuni (OPTION) este un registru special de configurare. Registrul TRIS


este folosit pentru a controla liniile de I/O. Un 1 în TRIS pune linia corespunzătoare în înaltă
impedanţă, iar un 0 validează linia.

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.

Modulul timer 0 poate fi utilizat în următoarele moduri:

- 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ă.

Pentru a asigura siguranţa rulării corecte a programului, circuitul este echipat cu un


ceas de gardă, care poate fi resetat printr-o instrucţiune specială, asigurând o întârziere de 18
ms până să declanşeze un RESET.

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ă.

Un RESET poate fi generat de una din următoarele surse:

- La conectarea tensiunii de alimentare, POR (Power On Reset);


- Un RESET extern /MCLR pe pinul GP3;
19
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC

- Un RESET când circuitul este în mod SLEEP pe /MCLR;


- De la ceasul de timp real în operare normală;
- De la ceasul de timp real în mod SLEEP;
- Trezirea din mod SLEEP prin schimbarea stării unui pin extern.

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

Cu o arhitectură asemănătoare familiei PIC12, aceste MC au câteva îmbunătăţiri:

- 35 instrucţiuni faţă de 33;


- Frecvenţa maximă admisă de 20 MHz faţă de 4MHz;
- Posibilitatea de lucru în întreruperi, cu 7 surse interne şi o sursă externă;
- Stivă automată cu 8 nivele;
- 13 linii de I/O cu posibilitatea stabilirii individuale a sensului de transfer şi cu o linie
de putere pentru comanda directă a unui LED;
- Magistrala de instrucţiuni este pe 14 biţi, faţă de 12 biţi;
- Memoria ROM este de 512x14 cuvinte până la 2Kx14 cuvinte;
- Memoria RAM este de 80-128 octeţi.
- Aceste MC sunt livrate în capsule cu 20 pini.

Întreruperile sunt controlate de un registru de comandă a întreruperilor care poate


valida sau invalida global sistemul de întreruperi şi individual pe fiecare linie. Fiecare
interfaţă care poate cere întrerupere are ataşat un bit care poate fi testat pentru a determina
sursa întreruperii.

Pentru creşterea siguranţei în funcţionare familia PIC16 are integrat un circuit de


protecţie care generează un RESET la scăderea tensiunii de alimentare (Brown-Out Reset).
Acest circuit poate fi validat sau invalidat cu un bit de comandă.

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..

Apare un modul suplimentar de timere numit modulul CCP (Capture/Compare/PWM),


după funcţiile pe care le poate îndeplini (un MC poate avea unul sau mai multe module CCP).
Modulul CCP conţine un registru de 16 biţi şi folosesşte timerele suplimentare 1 şi 2.
Modurile de lucru posibile pentru modulul CCP sunt:

- Modul captură - la apariţia unui eveniment la pinul exterior 3, registrul CCP se


încarcă cu valoarea din timerul 1. Un eveniment poate fi un front crescător, unul
descrescător, la fiecare 4 sau 16 fronturi crescătoare (prescalare). În momentul
evenimentului se poate cere o întrerupere.

20
S.L.Dr.Ing. Rodica CONSTANTINESCU
Microcontrolere PIC

- Modul comparare - registrul CCP este permanent comparat cu conţinutul timerului 1.


Dacă apare o coincidenţă, se semnalizează prin schimbarea stării pinului extern 3. În
acelaşi moment se poate cere o întrerupere.
- Modul PWM – se folosesc 2 timere, 1 şi 2, unul pentru a determina perioada
semnalului şi celălalt factorul de umplere. Ieşirea PWM se face tot la pinul 3.

PIC17

PIC17 are următoarele îmbunătăţiri faţă de PIC16:

- 58 instrucţiuni faţă de 35;


- Frecvenţa maximă admisă de 33 MHz faţă de 20 MHz;
- Stivă automată cu 16 nivele faţă de 8;
- 33 linii de I/O cu posibilitatea stabilirii individuale a sensului de transfer şi cu o linie
de putere pentru comanda directă a unui LED;
- Magistrala de instrucţiuni este pe 16 biţi, faţă de 14 biţi;
- Memoria ROM este de 2048x16 cuvinte;
- Memoria RAM este de 232 octeţi;
- Magistralele de date şi adrese (multiplexate) sunt accesibile la pin;
- Unitatea centrală poate executa înmulţiri;
- Sunt admise 11 surse de întreruperi faţă de 8;
- Aceste MC sunt livrate în capsule cu 44 pini.

Şi circuitele din familia PIC17 pot fi echipate cu o gamă largă de interfeţe.

Observaţie: Este de remarcat la MC din familia PIC faptul că nu au nevoie de componente


externe pentru RESET şi pentru ceas, ceea ce poate fi un avantaj.

21

S-ar putea să vă placă și