Sunteți pe pagina 1din 28

Fig. 1.1.

Arhitectura microcontrolerelor PIC pe 8 biţi

1. STRUCTURA HARDWARE A MICROCONTROLERULUI


PIC 18LF4520

Scopul lecţiei:
Prezentarea succintă a arhitecturii şi componentelor de bază ale microcontrolerului
PIC 18LF4520, componenta centrală în sistemul de dezvoltare PICDEM 2 Plus
folosit pentru lecţiile practice din acest manual . Familiarizarea cu documentaţia şi pagina de
internet a firmei Microchip.

1.1. Introducere
Microcontrolerele sunt de fapt structuri de microcalculator special concepute pentru
aplicaţii de comandă şi control ale unor sisteme dedicate (embedded). În esenţă, un microcontroler
integrează pe acelaşi chip următoarele componente de bază ale unui microcalculator: unitatea
centrală de prelucrare (CPU), memoria de date, memoria program şi funcţii periferice cum ar fi:
porturi, timere, comunicaţii serie, interfeţe analogice (convertor analog–digital, comparatoare
analogice), memorie suplimentară de date de tip EEPROM etc.
Arhitectura microcontrolerelor PIC ale firmei Microchip (Fig. 1 .1) este bazată pe un set
modificat de instrucţiuni Harvard RISC care asigură o cale de migrare uşoară de la 6 la 80 de pini
şi de la 384 bytes la 128 Kbytes de memorie program. Un set de instrucţiuni simple şi o migraţie
lină între familiile de produse fac din microcontrolerele PIC o alegere bună pentru cei care au
nevoie de flexibilitate şi performanţă.
Instrucţiunile cu lăţimea de 12 biţi (gama de bază), de 14 biţi (gama medie şi medie
îmbunătăţită) şi de 16 biţi (PIC18) sunt compatibile în sus şi sunt adaptate pentru a maximiza
eficienţa procesării şi pentru creşterea performanţei.
Instrucţiunile şi datele sunt transferate pe magistrale diferite pentru evitarea blocajelor în
prelucrare (arhitectură Harvard). Aceasta creşte viteza şi performanţa globală a sistemului. Tehnica

7
pipeline cu două etaje permite ca în timp ce o instrucţiune este executată o alta să fie preluată.
Instrucţiunile având un singur cuvânt cresc eficienţa codului şi reduc memoria de program
necesară.
Sistemul de dezvoltare PICDEM 2 Plus, folosit pentru lecţiile din prezenta lucrare, este
echipat cu microcontrolerul de înaltă performanţă 18LF4520 având următoarele caracteristici:
 Este un microcontroler de 8 biţi cu arhitectură RISC;
 Are un set redus de instrucţiuni (77);
 Instrucţiunile se execută într-un singur ciclu maşină, cu excepţia celor de salt care
necesită două cicluri;
 Este realizat într-o tehnologie CMOS de tip nano–watt, ceea ce permite o reducere
substanţială a consumului de energie;
 Este special conceput pentru aplicaţii de tip comandă şi control necesitând un număr
minim de componente suplimentare în exterior, ceea ce permite reducerea costurilor cu
creşterea concomintentă a fiabilităţii;
 Are o structură flexibilă pentru oscilatorul de ceas;
 Memorie program proprie de tip flash de 32 Kbytes;
 Memorie de date de 1536 bytes de tip SRAM şi 256 bytes de tip EEPROM;
 Cinci porturi paralele;
 Convertor analog–digital (A/D) de 10 biţi cu 13 canale analogice de intrare;
 Două module Captură/Comparare/Modulare în durată a impulsurilor
(Capture/Compare/Pulse Width Modulation – CCP);
 Patru circuite timer (unul pe 8 biţi şi trei pe 16 biţi);
 Un modul receptor/transmiţător universal sincron/asincron (Universal Synchronous
Asynchronous Receiver Transmitter – USART);
 Port serial sincron master (Master Synchronous Serial Port – MSSP) pentru comunicaţii
de tipul SPI sau I2C;
 Două comparatoare analogice;
 Circuit de multiplicare hardware de 8 x 8 biţi;
 Circuit de detectare a tensiunii de alimentare prea coborâte (Low Voltage Detect);
 Circuit de supraveghere de tip Watchdog Timer – WDT;
 Dispune de numeroase posibilităţi de lucru în întreruperi pe două nivelurie de prioritate;
 Circuit de programare în–circuit serial integrat (In Circuit Serial Programming – ICSP);
 Circuit de depanare în–circuit serial integrat (In Circuit Debug – ICD);
 Are o gamă largă de tensiuni de alimentare de la 2 V la 5,5 V.
În cadrul prezentului manual se va descrie şi prezenta pe scurt structura hardware a
microcontrolerului doar cu acele detalii care sunt necesare înţelegerii aplicaţiilor prezentate.
Pentru detalii sumplimentare se recomandă consultarea foii de catalog a microcontrolerului
PIC18F4520 [???DS] – fişierul LAB PICDEM 2 Plus\Datasheets\PIC18F4520 Data
Sheet – precum şi manualul de referinţă al familiei de microcontrolere PIC18 de la firma
Microchip [???RM] – fişierul LAB PICDEM 2 Plus\Datasheets\PICmicro 18C MCU
Reference Manual.

1.2. Structura internă a microcontrolerului


Componentele structurii interne ale microcontrolerului pot fi incluse într-una din
următoarele categorii:
 Componente de bază (core)

8
Componentele de bază asigură funcţionarea sistemului şi sunt următoarele: oscilatorul,
circuitul de reset, concepţia arhitecturală, unitatea centrală de prelucrare, circuitul de multiplicare
hardware, memoria internă, magistralele de sistem, suportul pentru lucrul în întreruperi şi setul de
instrucţiuni.
 Componente care asigură funcţii periferice (peripherals)
Componentele care asigură funcţii periferice diferenţiază microcontrolerul de un
microprocesor. Acestea asigură, pe de o parte, interfaţarea cu mediul exterior (porturi, comunicaţia
serie, intrările analogice), iar pe de altă parte, asigură îndeplinirea unor funcţii interne cum ar fi
generarea unor baze de timp diferite (circuitele timer). Din această categorie fac parte următoarele
circuite: porturile paralele de intrare/ieşire, circuitele timer, modulul CCP (Compare/Capture/
PWM), Parallel Slave Port (PSP), Serial Slave Port (SSP), Master Synchronous Serial Port
(MSSP), Adressable USART, comparatoare analogice şi convertorul A/D.
 Componente cu funcţii speciale (special feature)
La microcontrolerele aparţinând unor structuri evoluate se găsesc şi următoarele circuite
care îndeplinesc funcţii speciale: Low Voltage Detect, Watchdog Timer, biţi de configurare a
microcontrolerului, In–Circuit Serial Programming (ICSP).

Schema bloc a microcontrolerului


Schema bloc a microcontrolerului 18F4520 este prezentată în Fig. 1 .2.
Arhitectura RISC a microcontrolerului presupune existenţa unor memorii interne de date şi
de program separate. Memoria program de 32 Kbytes este de tip flash, existând posibilitatea scrierii
şi ştergerii pe cale electrică de către sistemul în care este încorporată. Acest tip de memorie este
foarte potrivit pentru un sistem de dezvoltare. Pentru sisteme dedicate consacrate sunt folosite, din
considerente de cost, variante de microcontroler având memoria program programabilă o singură
dată (One–Time Programmable – OTP) de tip ROM sau EPROM.
Memoria program este adresabilă fie din contorul de instrucţiuni printr-o magistrală de 20
biţi (Programm Counter – PC), fie din tabela de pointeri (Table Pointer – TP) printr-o magistrală
de 21 de biţi.
Contorul de instruncţiuni specifică adresa instrucţiunii care urmează a fi extrasă şi este
împărţit în trei entităţi: PCU, PCH şi PCL. Octetul inferior aflat în PCL poate fii citit sau scris
direct de către sistem pe când PCU şi PCH pot fi scrise sau citite doar indirect prin intermediul
registrelor PCLATU şi PCLATH.
Pentru a asigura alinierea instrucţiunilor (cuvintelor) de doi octeţi la adresă pară, contorul de
instrucţiuni adresează octeţii în memoria program având bitul cel mai puţin semnificativ fixat pe
valoarea zero, ceea ce înseamnă că PC incrementează adresele instrucţiunilor din doi în doi iar în
schema bloc magistrala corespunzătoare figurează ca fiind de 20 de biţi.
Memoria program mai poate fi adresată printr-o adresă de 21 biţi generată de Table Pointer
prevăzut şi cu un hardware de incrementare/ decrementare propriu (mai multe detalii vor fi
prezentate la descrierea memoriei).
Microcontrolerul este prevăzut şi cu o memorie stivă cu 31 de niveluri (care poate stoca
până la 31 de cuvinte de adresă având 21 de biţi) care este organizată într-o zonă de memorie RAM.
Adresa vârfului stivei este gestionată de un indicator de stivă de 5 biţi (Stack Pointer).
Memoria de date este realizată ca o memorie de tip SRAM de 4096 bytes adresată prin
cuvinte de adresă de 12 biţi. Memoria este organizată în 16 blocuri (banks) a câte 256 bytes fiecare.
Pentru a facilita o accesare rapidă a tuturor acestor blocuri, este utilizat un pointer de 4 biţi (Bank
Select Register – BSR) iar pentru o accesare rapidă într-un singur ciclu maşină a locaţiilor cele mai
frecvent utilizate este implementată o structură numită Acces Bank. Acesta conţine prima jumătate a
blocului zero de memorie RAM cu registre generale şi a doua jumătate a blocului 15 cu registre cu
funcţtii speciale (Special Function Registers – SFR). Acces Bank este gestionată la rândul ei de un
Pointer Acces Bank.

9
Anumite instrucţiuni apelează la o adresare indirectă a memoriei de date prin intermediul
unor pointer-i (File Select Registers – FSRs – FSR0, FSR1, FSR2) aflaţi în zona registrelor
speciale. Aceşti pointer-i (Indirect Data Memory Access Pointer) sunt prevăzuţi şi cu un hardware
special care asigură decrementarea sau incrementarea acestora.
Adresarea memoriei de date mai poate fi făcută şi cu un cuvânt de adresă de 12 biţi direct
din registrul de instrucţiuni (Instruction Register – IR).

10
Fig. 1.2. Schema bloc a microcontrolerului 18F4520

11
Memoria program este organizată pe cuvinte de 16 biţi, iar memoria de date pe 8 biţi.
Citirea memoriei program se face octet cu octet, scrierea în memoria program se face pe blocuri de
32 de octeţi, iar stergerea pe blocuri de 64 de octeţi.
Pentru a scrie sau citi date din memoria program sunt utilizate operaţiile Table Read
(TBLRD) respectiv Table Write (TBLWT). Cum memoria program este organizată pe 16 biţi iar
cea de date pe 8 biţi, operaţiile Table Read respectiv Table Write vor transfera octeţii între cele două
memorii prin intermediul unui registru de 8 biţi numit Table Latch (TABLAT). Astfel, la citirea
memoriei program, aceasta va fi adresată de un pointer de 21 de biţi (Table Pointer), octetul citit va
fi depus în registrul TABLAT iar de acolo în memoria de date RAM. La scrierea memoriei program
datele din memoria de date RAM vor fi depuse în registrul intermediar TABLAT iar de acolo în
memoria program la adresa indicată de pointerul Table Pointer (detalii legate de aceste operaţii vor
fi prezentate ulterior).
Instrucţiunea citită din memoria program (cuvânt de 16 biţi) este interpretată într-o memorie
de tip ROM (ROM Latch) din care se obţin, pe de- o parte, comenzile pentru decodorul de adresă al
setului de registre cu funcţtii speciale (Special Function Registers – SFR), şi pe de altă parte,
instrucţiunea propriu zisă care este depusă în registrul de instrucţiuni (Instruction Register – IR) în
vederea decodării şi interpretării.
Unitatea aritmetico–logică (Arithmetic Logic Unit – ALU) este organizată pe 8 biţi. Una din
intrările sale este legată direct la magistrala internă de date, iar pe cealaltă intrare se poate selecta
fie registrul de lucru W (Working Register), fie registrul BITOP.
Registrul W poate stoca rezultatul unei operaţii, este utilizat şi pentru a furniza operanzi
către multiplicatorul hardware de 8 biţi, respectiv de a prelua rezultatul multiplicării. Registrul
BITOP este de fapt un tabel de 8 octeţi adresabil cu 3 biţi direct din codul instrucţiunii.
Schema mai conţine:
 Blocul oscilatorului având o arhitectură care permite o manieră flexibilă de generare a
semnalului de tact;
 Cirucuitele timer pentru întârzierea la alimentare (Power On Timer) şi întârzierea
pornirii oscilatorului (Oscilator Start Up Timer);
 Circuite de iniţializare (reset) la pornire (Power–On Reset) şi la căderea tensiunii de
alimentare (Brown–Out Reset – BOR);
 Circuitul de supraveghere a bunei funcţionări (Watchdog Timer);
 Circuitul de programare a dispozitivului folosind o singură sursă de tensiune (Single
Supply Programming);
 Circuitul de depanare în-circuit a programelor încărcate (In Circuit Debugger);
 Circuitul de supraveghere a generatorului de tact (Fail Safe Clock Monitor);
Restul de circuite din categoria de periferice sunt conectate direct la magistrala internă de
date:
 Cinci porturi paralele de intrare/iesire cu terminale multifuncţionale (PORTA, …,
PORTE);
 Patru circuite de tip timer (Timer0, …, Timer3);
 Convertorul A/D de 10 biţi (ADC 10-bit);
 Memoria suplimentară de date EEPROM;
 Blocurile Compare/Capture/PWM (ECCP1 şi CCP2);
 Comparatoarele analogice;
 Circuitele pentru comunicaţie serie (EUSART şi MSSP);
 Circuitul de detectare a schimbării stării logice High to Low Voltage Detect (BOR
HLVD).

12
Fig. 1.3. Schema de selectare a surselor semnalelor de tact

În continuare, vor fi descrise succint doar componentele de bază. Componentele pentru


funcţii periferice şi pentru cele speciale fac obiectul lecţiilor propuse în continuare şi vor fi
prezentate în cadrul acestora.

1.3. Componentele de bază ale microcontrolerului

1.3.1. Oscilatorul
Proiectantul dispozitivului a conceput o structură de oscilator extrem de flexibilă, capabilă
să lucreze în zece moduri diferite împărţite în trei categorii: oscilator primar, oscilator secundar şi
oscilator intern. Schema de selectare a surselor semnalelor de tact este prezentată în Fig. 1 .3.
Cele zece configuraţii ale oscilatorului sunt:
1. LP – Oscilator cu cristal de cuarţ de joasă putere (Low Power Crystal);
2. XT – Oscilator cu cristal de cuarţ sau rezonator ceramic (Crystal/Resonator);
3. HS – Oscilator cu cristal de cuarţ sau rezonator ceramic de frecvenţă ridicată
(High–Speed Crystal/Resonator);
4. HSPLL – Oscilator cu cristal de cuarţ sau rezonator ceramic de frecvenţă ridicată cu
circuitul PLL activat (High–Speed Crystal/Resonator with PLL enabled);
5. RC – Oscilator cu circuit Rezistor–Condensator extern cu ieşire Fosc/4 pe RA6
(External Resistor/Capacitor with Fosc/4 output on RA6);
6. RCIO – Oscilator cu RC extern cu pin I/O pe RA6 (External Resistor/Capacitor
with I/O on RA6);
7. INTIO1 – Oscilator intern cu ieşire pe RA6 şi pin I/O pe RA7 (Internal Oscilator with
output on RA6 and I/O on RA7);
8. INTIO2 – Oscilator intern cu pini I/O pe RA6 şi RA7 (Internal Oscilator with I/O on
RA6 and RA7);
9. EC – Ceas extern şi ieşire Fosc/4 (External Clock with Fosc/4 Output);
10. ECIO – Ceas extern cu pin I/O pe RA6 (External Clock with I/O on RA6).

13
Oscilatoare cu cristal de cuarţ sau rezonator ceramic
În modurile LP, XT, HS şi HSPLL, un cristal de cuarţ sau un rezonator ceramic este
conectat între terminalele OSC1/CLK1/RA7 şi OSC2/CLK0/RA6. Valori tipice de frecvenţă pentru
aceste configuraţii de oscilator sunt: LP – 32 KHz, XT – 1 MHz sau 4 MHz şi HS – 4 MHz,
10 MHz, 20 MHz şi 25 MHz.
Schema hardware a blocului oscilator mai conţine şi un circuit de multiplicare a frecvenţei
semnalului de ieşire a oscilatorului, un circuit bazat pe o buclă cu calare de fază (Phase Locked
Loop – PLL), proiectat să multiplice cu 4 frecvenţa de oscilaţie. În felul acesta, în modul de lucru
HSPLL, cu un cuarţ de 10 MHz, se poate obţine o frecvenţă a semnalului de tact de 40 MHz.
Oscilatorul cu sursă externă de semnal
Modurile de oscilaţie EC şi ECIO presupun conectarea din exterior pe borna OSC1/RA7 a
unui semnal provenit de la un oscilator extern. În modul EC, pe borna OSC2/RA6 se va genera un
semnal Fosc/4 (util pentru teste sau pentru sincronizarea altor circuite digitale externe), iar în
modul ECIO borna OSC2/RA6 poate fi folosită ca pin de intrare/ieşire digitală obişnuită a portului
A (RA6).
Oscilatorul RC
O soluţie ieftină pentru sursa de oscilaţie este oscilatorul RC obţinut prin conectarea din
exterior a unui grup rezistor–condensator pe borna OSC1/RA7. În configuraţia RC, pe borna
OSC2/RA6 va fi disponibilă o oscilaţie având Fosc/4, iar în configuraţia RCIO borna OSC2/RA6
va putea fi utilizată ca un pin obişnuit de intrare/ieşire digitală a portului A (RA6).
Această structură de oscilator este recomandată pentru aplicaţii la care stabilitatea
oscilaţiilor generate nu este critică, frecvenţa tactului fiind alterată de variaţiile tensiunii de
alimentare VDD, de dispersia componentelor RC externe, precum şi de variaţiile de temperatură.
Blocul oscilator intern
Acest bloc este capabil de a genera două semnale de tact diferite, ambele putând fi utilizate
de către microcontroler ca sursă pentru tact fără a mai fi necesare componente suplimentare din
exterior.
Ieşirea principală INTOSC generază un semnal de tact de 8 MHz care poate fi folosit direct
sau prin intermediul unui circuit de postscalare. Astfel se poate obţine o gamă largă de frecvenţe de
tact de la 31 KHz la 4 MHz.
A doua sursă internă de oscilaţie este un oscilator RC care generează o frecvenţă nominală
de 31 KHz şi care este activată dacă este selectată ca sursă pentru tact sau dacă sunt activate funcţii
de temporizare care îl folosesc ca semnal de tact.
Cele două configuraţii pentru blocul de oscilator intern sunt:
 INTIO1 în care pe borna OSC2/RA6 se generează semnalul Fosc/4 iar borna
OSC1/RA7 este folosită ca pin de intrare/ieşire digitală a portului A (RA7);
 INTIO2 în care terminalele OSC1/RA7 şi respectiv OSC2/RA6 sunt folosite ca pini de
intrare/ieşire digitală a portului A (RA6 şi RA7).
Microcontrolerul 18F4520 are şi o sursă secundară de oscilaţie, şi anume oscilatorul intern
al circuitului Timer1 care este utilizat ca semnal de tact în modurile de lucru Power Managed Mode
ale microcontrolerului. Cel mai adesea, acest oscilator se realizează prin conectarea unui cristal de
cuarţ de frecvenţă 31,768 KHz între terminalele RC0/T10S0 şi RC1/T10S1.
Selectarea modului de oscilaţie, a frecvenţei, precum şi posibilitatea de ajustare a acesteia se
realizează prin configurarea corespunzătoare a biţilor de control din registrul de comandă ale
blocului oscilator aflat în zona SFR.

1.3.2. Managementul Puterii (Power Management Mode)


Microcontrolerul 18F4520 oferă utilizatorului un total de şapte moduri de lucru diferite
pentru realizarea unui consum eficient de energie. Aceste moduri oferă posibilitatea reducerii

14
Tabelul 1.1. Modurile de lucru

substanţiale a energiei consumate în aplicaţii în care acest lucru este deosebit de important (de
exemplu, cazul alimentării de la baterie).
Există trei categorii ale modului de lucru din punct de vedere al managementului puterii:
 Moduri active (Run modes);
 Moduri în asteptare (Idle modes);
 Mod inactiv (Sleep mode).
Aceste categorii stabilesc care subsisteme ale microcontrolerului vor fi funcţionale, şi
uneori vor stabili frecvenţa de lucru a acestora. Cele şapte moduri de lucru sunt prezentate în
Tabelul 1 .1. Selectarea modurilor se face cu biţii 7,1 şi 0 din registrul de comandă OSCCON.
Consumul de curent tipic este de 11 µA pentru modurile active (Run), 2,5 µA pentru
modurile în asteptare (Idle) şi 100 nA în modul inactiv (Sleep).

1.3.3. Circuitul de iniţializare hardware


Microcontrolerul 18F4520 are prevăzute mai multe posibilităţi de iniţializare (reset) utile în
aplicaţii. Schema bloc simplificată a mecanismului de iniţializare este prezentată în Fig. 1 .4.
Power–On Reset (POR)
POR reprezintă iniţializarea sistemului la pornire (alimentare) atunci când tensiunea de
alimentare VDD depăşeşte un anumit prag. Acest lucru permite microcontrolerului să pornească de
fiecare dată dintr-o anumită stare predefinită numai atunci când tensiunea de alimentare a atins
valoarea prescrisă care asigură o funcţionare stabilă şi previzibilă a sa.
Brown–Out Reset (BOR)
Orice scădere a tensiunii de alimentare VDD sub un anumit nivel de prag VBOR (controlabil)
pe un interval de timp mai mare decat TBOR (controlabil) va declanşa generarea unui semnal de
iniţializare. Circuitul va rămâne în această stare (Brown–Out Reset) atâta timp cât tensiunea de
alimentare VDD nu depăşeşte valoarea de prag VBOR.
Proiectantul a prevăzut mai multe opţiuni de configurare pentru BOR utilizabile în soluţiile
de reducere a consumului de energie (vezi secţiunea 4.4 Brown–Out Reset din foaia de catalog a
microcontrolerului PIC18F4520 [??? DS]).

15
Fig. 1.4. Schema bloc a mecanismului de iniţializare

Master Clear ( MCLR )


Terminalul MCLR permite utilizatorului să declanşeze o iniţializare a circuitului printr-o
comandă Reset aplicată din exterior. Această comandă poate fi aplicată atât în regimul de
funcţionare normală cât şi în regimul de funcţionare Power Managed Mode.
Watchdog Timer Reset
În multe aplicaţii dedicate (Embedded Systems) se impune o supraveghere a bunei
funcţionări a sistemului. Microcontrolerul are încorporat un circuit de supraveghere (Watchdog
Timer) care în esenţă este un numărător invers, încărcat cu o anumită valoare iniţială şi care apoi
este decrementat la fiecare ciclu maşină. În momentul în care ajunge la zero numărătorul generează
o comandă de Reset. Într-o funcţionare normală, în programul aplicaţiei sunt prevăzute instrucţiuni
de reiniţializare periodică a acestui timer, evitându-se în felul acesta ajungerea lui în starea zero.
Stack Full/Underflow Reset
Microcontrolerul este prevăzut cu o memorie stivă de 31 de niveluri folosită pentru
memorarea stării unor registre interne în cazul apariţiei unei întreruperi. Depăşirea capacităţii
acestei memorii stivă, atât la scriere cât şi la citire, va genera o comandă Reset.
Iniţializare software
Există posibilitatea aducerii la zero a microcontrolerului şi printr-o comandă software cu
instrucţiunea RESET.

16
Iniţializare cu timere speciale
Microcontrolerul 18F4520 are încorporate trei circuite timer speciale care gestionează
corectitudinea procesului de iniţializare la pornire (Power On Reset) pentru a asigura condiţii
iniţiale corecte în momentul în care începe execuţia programului. Acestea sunt:
 Power–up Timer (PWRT)
 Oscillator Start–up Timer (OST)
 PLL Lock Time–out Timer
Timer-ul PWRT este un numărător de 11 biţi care numără impulsurile oscilatorului RC
intern INTRC şi generează, la pornire, un interval de timp de 2048 · 32 s = 65,6 ms. Pe durata
numărării microcontrolerul este menţinut în starea de Reset.
Timer-ul OST este realizat cu un numărător de 10 biţi şi asigură o întârziere suplimentară de
1024 cicluri maşină după terminarea perioadei de numărare a timer-ului PWRT. Acest lucru va v-a
asigura că oscilatorul cu cuarţ sau rezonatorul ceramic a intrat în regimul normal de lucru.
Întârzierea generată de timer-ul OSC este utilizată numai în modurile de lucru LP, XT, HS sau
HSPLL ale oscilatorului, numai la pornire (POR) sau la ieşirea din majoritatea situaţiilor de Power
Managed Mode.
Timer-ul PLL Lock Time–out este necesar pentru a asigura întârzierea necesară în regimul
normal de lucru al blocului PLL pentru calarea sa pe frecvenţa oscilatorului principal. Această
întârziere are o valoare tipică de 2 ms după întârzierea generată de timer-ul OST.
Mecanismul de generare a semnalului de Reset este de asemenea controlat de anumiţi biţi
din registrele de comandă asociate acestei funcţii (vezi foaia de catalog a microcontrolerului PIC
18F4520 [??? DS]).

1.3.4. Circuitul de multiplicare


Microcontrolerul 18F4520 conţine şi un multiplicator hardware de 8 x 8 biţi ca parte a
unităţii ALU. Rezultatul pe 16 biţi al multiplicării este stocat în registrele interne PRODH şi
PRODL asociate multiplicatorului. Realizarea operaţiei de multiplicare printr-o structură hardware
specializată permite realizarea acestei operaţii într-un singur ciclu maşină. În exemplele de mai jos
sunt indicate rutine de multiplicare pentru numere fără semn respectiv cu semn:
; 8 x 8 UNSIGNED MULTIPLY ROUTINE
MOVF ARG1, W ;
MULWF ARG2 ; ARG1 * ARG2 ->
; PRODH:PRODL

; 8 x 8 SIGNED MULTIPLY ROUTINE


MOVF ARG1, W
MULWF ARG2 ; ARG1 * ARG2 ->
; PRODH:PRODL
BTFSC ARG2, SB ; Test Sign Bit
SUBWF PRODH, F ; PRODH = PRODH - ARG1
MOVF ARG2, W
BTFSC ARG1, SB ; Test Sign Bit
SUBWF PRODH, F ; PRODH = PRODH - ARG2

În Tabelul 1 .2 este făcută o comparaţie între operaţiile de multiplicare efectuate hardware


respectiv software, atât din punct de vedere al spaţiului de memorare ocupat cât şi al vitezei de
execuţie.

17
Tabelul 1.2. Comparaţia performanţelor unor operaţii de multiplicare

Fig. 1.5. Logica întreruperilor

1.3.5. Întreruperile
Întreruperea este un mecanism extrem de util în aplicaţii permiţând o reacţie rapidă a
sistemului la situaţii neprevăzute precum şi o tratare ierarhizată după priorităţi a acestora.
Microcontrolerul 18F4520 are prevăzute un mare număr de surse de întreruperi cărora li se
poate asocia o prioritate superioară (adresa vectorului de întrerupere se află la adresa 0008H)
respectiv o prioritate inferioară (adresa vectorului de întrerupere se află la adresa 0018H).
Întreruperile se află sub controlul unor registre cu funcţii speciale (se recomandă consultarea
secţiunii 9.0 Interrupts din foaia de catalog a microcontrolerului PIC 18F4520 [??? DS]). Logica
întreruperilor este prezentată schematic în Fig. 1 .5.
În principiu, mecanismul de generare a unei întreruperi se derulează astfel:
 Circuitul gândit să poată genera întreruperi (de exemplu un timer), la apariţia
fenomenului generator (depăşirea capacităţii de numărare în cazul circuitului timer), va
seta un bit numit fanion (flag) într-un anumit registru special (bitul TMR0IF în cazul
timer-ului T0). Acest bit semnifică o solicitare de întrerupere.
 Proiectanţii microcontrolerului au prevăzut şi un mecanism de validare, în general în
două trepte, a acestei solicitări. Acest lucru înseamnă că există, într-un anumit registru
cu funcţii speciale, un bit de validare a întreruperilor pentru timerul în cauză, în cazul
exemplului nostru (Timer 0 Interrupt Enable – TMR0IE), precum şi un bit de validare
generală a întreruperilor (General Interrupt Enable – GIE).

18
 Cum în cazul acestui microcontroler sunt prevăzute şi două niveluri de prioritate pentru
tratarea întreruperilor, v-a trebui setat şi bitul corespunzător nivelului de prioritate alocat
respectivei solicitări (TMROIP în cazul exemplului nostru).
 În concluzie, o cerere de întrerupere, solicitată de un anumit circuit, v-a fi declanşată
acceptată doar dacă sunt îndeplinite concomitent (funcţia logică ŞI) condiţiile de mai
sus: TMROIF · TMROIE · TMROIP · GIE.

1.3.6. Organizarea memoriei


Microcontrolerul 18F4520 este prevăzut cu trei tipuri de memorie internă: memoria
program, memoria de date şi o memorie suplimentară de date de tip EEPROM.
Memoria de date şi memoria program sunt conectate la magistrale interne separate, ceea ce
permite folosirea simultană a acestora (arhitectură Harvard). Memoria EEPROM de date este
accesată, din considerente practice, ca un dispozitiv periferic.

1.3.6.1. Organizarea memoriei program


În cadrul descrierii organizării memoriei program, se impune abordarea următoarelore
subiecte principale: harta memoriei program, contorul de instrucţiuni PC, memoria stivă, modul de
execuţie a instrucţiunilor şi organizarea cuvintelor în memoria program.

19
Fig. 1.7. Structura contorului de instrucţiuni

Fig. 1.6. Harta memoriei program

Contorul de instrucţiuni PC generează adrese de 21 de biţi, ceea ce permite accesarea unui


spaţiu de memorie de 2 Mbytes. La microcontrolerul 18F4520, memoria program este de tip flash
şi are o capacitate de 32 Kbytes. Accesarea unei locaţii inexistente fizic în dispozitiv întoarce „0”
peste tot (instrucţiunea NOP).
Harta memoriei program
Harta memoriei program este prezentată în Fig. 1 .6. Se observă că zona memoriei stivă cu
31 de locaţii nu face parte din spaţiul memoriei program. La adresa 0000H se află vectorul
subrutinei de RESET iar la adresele 0008H respectiv 0018H se află vectorii de întrerupere pentru
prioritatea superioara respectiv inferioară, urmate de zona propriu-zisă de memorie program.
Contorul de instrucţiuni
Contorul de instrucţiuni este de 21 biţi şi se împarte în următoarele trei registre separate
(Fig. 1 .7): PCL pentru biţii <7:0>, PCH pentru biţii <15:8> şi PCU pentru biţii <21:16>.
Registrul inferior PCL poate fi accesat pentru scriere sau citire directă pe când registrele
PCH şi PCU nu pot fi accesate direct, ci doar prin intermediul unor registre intermediare PCLATH
şi PCLATU.
Conţinutul registrelor PCLATH şi PCLATU este transferat în PCH respectiv în PCU la orice
operaţie de scriere în PCL şi, în mod similar, conţinutul registrelor PCH şi PCU se transferă în
registrele PCLATH şi PCLATU la orice operaţie de citire a lui PCL.

20
Fig. 1.8. Memoria stivă pentru adrese de întoarcere şi registrele asociate

Memoria stivă pentru adrese de întoarcere (Return Address Stack)


Această memorie stivă este destinată memorării conţinutului contorului de instrucţiuni în
cazul apariţiei unei instrucţiuni de salt la o subrutină sau a unei întreruperi. Memoria stivă este de
tip RAM şi poate stoca 31 de cuvinte a câte 21 de biţi, ceea ce înseamnă că permite gestionarea a
până la 31 de salturi sau întreruperi. Memoria stivă nu face parte din spaţiul de adresare a memoriei
interne sau de date fiind o entitate complet separată.
Pentru adresarea memoriei stivă este utilizat un registru de 5 biţi numit Stack Pointer
(STKPTR). Acest registru este iniţializat la baza stivei 0000H (după reset) şi v-a conţine în
permanenţă adresa vârfului stivei. La apariţia unei instrucţiuni de tip CALL sau a unei întreruperi,
conţinutul registrului STKPTR este incrementat cu o unitate iar apoi conţinutul lui PC este depus la
adresa respectivă (în vârful stivei). La apariţia unor instrucţiuni de tip RETURN, mai întâi este citită
locaţia din vârful stivei indicată de conţinutul registrului STKPTR iar apoi este decrementat
conţinutul acestuia. În ceea ce priveşte memoria stivă propriu-zisă, doar locaţia aflată în vârful
stivei (adresată de STKPTR) este accesibilă pentru scriere sau citire prin intermediul unui registru
cu funcţii special numit Top Of the Stack (TOS) format tot din trei registre TOSU, TOSH respectiv
TOSL, similare cu structura registrului PC (vezi Fig. 1 .8).

Observaţie:
Existenţa registrului TOS permite utilizatorului să-şi construiască, prin soft, propria
sa memorie stivă. De exemplu, în cazul apariţiei unei instrucţiuni de tip CALL, are
loc o operaţie de scriere în stivă şi deci în registrul TOS, conţinut ce poate fi preluat
şi plasat în stiva de tip soft.
Pointer-ul STKPTR este prevăzut şi cu o logică de sesizare a depăşirii capacităţii memoriei
stivă şi de generare a unei cereri de întrerupere într-o astfel de situaţie. De exemplu, după 31 de
scrieri consecutive şi fără nici o citire, se setează bitul STKFUL (Stack Full). În mod similar, în
cazul a 31 de citiri consecutive, se setează bitul STKUNF (Stack Underflow). În cazul în care bitul
de validare STVREN (Stack Overflow Reset Enable) este la rândul său setat, apariţia depăşirilor
menţionate anterior va duce la generarea unui semnal de Reset.
Cum vârful memoriei stivă este accesibil pentru operaţii de scriere respectiv citire de date în
anumite situaţii (salvarea respectiv refacerea contextului unui program în cazul apariţiei unei cereri
de întrerupere), este utilă scrierea sau citirea în sau din vârful stivei fără a perturba prin aceasta
desfăşurarea normală a derulării programului. Proiectanţii au prevăzut în setul de instrucţiuni al
microcontrolerului două instrucţiuni cu ajutorul cărora se poate scrie (PUSH) respectiv citi (POP)
din vârful stivei. Deoarece, în cazul apariţiei unei cereri de întrerupere, în registrele interne ale
procesorului se află date importante ale programului întrerupt, se impune salvarea conţinutului
acestora înaintea încărcării subrutinei de servire a întreruperii care le poate altera. Salvarea se face

21
Fig. 1.10. Fluxul pipeline al instrucţiunilor

Fig. 1.9. Ciclul instrucţiune

în memoria stivă, iar la revenirea în programul principal, pentru a putea continua programul
principal din punctul în care el a fost întrerupt, trebuie refăcute conţinuturile registrelor interne prin
citiri din memoria stivă. Deoarece aceste operaţii de scriere respectiv citire în şi din memoria stivă
sunt mari consumatoare de timp, proiectanţii microcontrolerului au prevăzut o memorie stivă
specială (Fast Register Stack) pentru stocarea temporară a conţinutului celor mai importante trei
registre: STATUS, WREG şi BSR. Stiva pentru fiecare dintre aceste trei registre are doar un singur
nivel.
La apariţia unei cereri de întrerupere, conţinutul acestor trei registre este salvat în mod
automat în această memorie stivă specială, iar la revenirea în programul principal, după derularea
rutinei de servire a întreruperii, tot în mod automat, are loc reîncărcarea acestor registre din această
memorie stivă specială.
Modul de execuţie al instrucţiunilor
La acest microcontroler, durata unui ciclu maşină este de patru perioade de tact, notate cu
Q1, Q2, Q3 şi Q4. Pentru a mări viteza de execuţie a instrucţiunilor, proiectanţii microcontrolerului
au implementat o variantă de execuţie prin suprapunerea ciclurilor (tehnica pipeline), ceea ce
permite ca majoritatea instrucţiunilor să se execute într-un singur ciclu maşină.
Execuţia unei instrucţiuni are loc în felul următor (vezi Fig. 1 .9): în faza Q1 a ciclului
maşină unu se extrage codul operaţiei care apoi se depune în registrul de instrucţiuni IR în faza Q4
a ciclului maşină unu. Decodarea şi execuţia instrucţiunii se fac în fazele Q1 la Q4 ale ciclului
maşină doi. Se realizează astfel o suprapunere a fazei de extragere a instrucţiunii curente cu faza de
execuţie a instrucţiunii precedente (vezi Fig. 1 .10).
Organizarea instrucţiunilor în memoria program
Memoria program este adresată pe octeţi iar instrucţiunile sunt de doi sau patru octeţi.
Pentru a asigura alinierea instrucţiunilor stocate, octetul cel mai puţin semnificativ al instrucţiunii
este stocat de fiecare dată la adresă pară (LSb = 0). Pentru a menţine alinierea, contorul de
instrucţiuni PC este incrementat de fiecare dată cu 2 pentru a asigura că întotdeauna LSb = 0.

1.3.6.2. Memoria program de tip flash


În principiu, memoria program trebuie să fie o memorie nevolatilă, ceea ce se poate realiza
prin utilizarea unor circuite de memorie de tipul ROM, EPROM sau flash.

22
Fig. 1.13. Structura pointer-ului TBLPTR şi limitele lui în funcţie de operaţia efectuată

Fig. 1.15. Mecanismul de scriere în memoria flash de program

Fig. 1.11.
Fig. 1.14. Mecanismul de Operaţia
citire din Table Read
memoria flash de program
Fig. 1.12. Operaţia Table Write

Memoriile de tip ROM (Read–Only Memory) sunt recomandate în cazul unor produse bine
puse la punct, realizate într-un număr foarte mare de exemplare, caz în care acest tip de memorie
asigură costuri minime.
Realizarea cu memorii de tip EPROM (Erasable Programmable Read Only Memory) oferă
facilitatea de a putea fi şterse (nu pe cale electrică), ceea ce oferă inginerului proiectant o anumită
flexibilitate, dar costul acestor memorii este ceva mai mare deoarece capsula circuitului trebuie
prevăzută cu o fereastră de cuarţ pentru a permite ştergerea cu raze ultraviolete.
Memoriile flash sunt de tipul EEPROM (Electrically Erasable Programmable Read–Only
Memory) putând fi scrise, citite şi şterse pe cale electrică de către sistemul care le utilizează. Sunt
încapsulate într-un material plastic, ceea ce permite realizarea lor la costuri mici avantajoase, fiind
foarte potrivite în activitatea de proiectare sau de realizare a unor sisteme de dezvoltare.
Din punct de vedere constructiv, memoriile de tip flash pot fi citite octet cu octet, scrise
doar pe blocuri de 32 de octeţi şi şterse pe blocuri de 64 de octeţi. Operaţiile de scriere respectiv
citire pe blocuri sunt realizate de un hardware încorporat în memorie şi pe durata acestor operaţii
memoria program nu poate fi accesată.
Operaţiile de scriere, respectiv citire, în şi din memoria program presupun un transfer de
date cu memoria şi sunt gestionate de microcontroler prin intermediul a două operaţii numite Table
Read (Fig. 1 .11), respectiv Table Write (Fig. 1 .12).
Deoarece memoria program este organizată pe cuvinte de 16 biţi şi memoria de date pe
cuvinte de 8 biţi, operaţiile de transfer dintre cele două memorii se realizează prin intermediul unui
registru de 8 biţi (Table Latch – TABLAT) iar adresarea memoriei program pentru această operaţie
se face printr-un pointer (Table pointer – TBLPTR).
Registrele TABLAT respectiv TBLPTR fac parte din setul de registre SFR aile
microcontrolerului. Structura pe biţi a pointer-ului TBLPTR şi modul de utilizare a acestor secvenţe
de biţi pentru operaţiile de citire, scriere şi ştergere este dată în Fig. 1 .13.
Mecanismul exact de citire a memoriei program este ilustrat în Fig. 1 .14.
Scrierea în memoria program se face pe blocuri de 32 de octeţi cu ajutorul unui hardware
special implementat (Fig. 1 .15). Operaţia de scriere în memoria propriu-zisă se face din 32 de
registre auxiliare (Holding Register) care trebuie încărcate din registrul TABLAT prin 32 de operaţii
de scriere consecutive. Aceste scrieri sunt operaţii scurte, deoarece sunt scrise doar Holding

23
Register. După actualizarea tuturor acestor 32 de registre, registrul EECON1 trebuie scris pentru a
declanşa operaţia de programare a blocului de memorie, care este scrierea propriu-zisă a memoriei
flash şi este o scriere de lungă durată.
În aplicaţii este recomandat ca operaţia de scriere să fie urmată de o operaţie de verificare a
corectitudinii scrierii (Write Verify). Gestionarea memoriei program flash se face prin intermediul
unui număr de registre cu funcţii speciale (pentru detalii se recomandă consultarea secţiunii
7.0 DATA EEPROM MEMORY din foaia de catalog a microcontrolerului PIC18F4520 [??? DS]).

Observaţie:
Mediile de programare elaborate de firmele producătoare pentru produsele pe care le
comercializează, conţin programe speciale pentru a facilita utilizatorului operaţiile
de scriere, citire, verificare şi ştergere a memoriei program fără ca utilizatorul sa fie
nevoit a gestiona la nivel de amănunt aceste operaţii (de exemplu mediul MPLAB al
firmei Microchip).

1.3.6.3. Organizarea memoriei de date


Generalităţi
Memoria de date a microcontrolerului este de tip SRAM şi are o capacitate de 4096 octeţi.
Fiecare locaţie de memorie (denumită şi registru) este adresabilă printr-un cuvânt de cod de adresă
de 12 biţi. Pentru o gestionare eficientă şi pentru un acces rapid la informaţie, acest spaţiu de
memorie este împărţit în 16 blocuri a câte 256 de octeţi fiecare. Registrele de memorie din acest
spaţiu sunt de două categorii: registre de memorie de uz general (General Purpose Register) şi
registre cu funcţii speciale (Special Function Register). Acestea din urmă ocupă ultima parte a
zonei adresabile. Harta memoriei de date este prezentată în Fig. 1 .16.
Bank Select Register
Datorită modului de organizare a memoriei de date, o anume locaţie de memorie (registru)
va putea fi adresată în doua moduri diferite:
 prin generarea unei adrese de 12 biţi (adresare absolută);
 printr-o adresare care să permită mai întâi selecţia blocului în care se află locaţia dorită –
printr-un pointer de 4 biţi cu Bank Pointer, iar apoi accesul registrului dorit din blocul
selectat prin cei mai puţin semnificativi 8 biţi (adresare indexată).
Cea de-a doua modalitate de adresare este mai rapidă deoarece, în general, în cadrul
majorităţii programelor aplicative, se lucrează cu un număr mic de registre care pot fi accesate într-
un singur bloc. În felul acesta, adresa blocului rămâne practic neschimbată, modificându-se doar
offset-ul (cei mai puţin semnificativi 8 biţi ai adresei) care face parte din instrucţiune. Pointer-ul
pentru aceste blocuri poartă numele de Bank Select Register (BSR).
Access Bank
Cu ajutorul pointer-ului BSR şi a celor mai puţin semnificativi 8 biţi incluşi în instrucţiuni
există posibilitatea accesării rapide a întregului spaţiu al memoriei de date. Dar în majoritatea
aplicaţiilor este necesar accesul doar la setul de registre speciale şi la un număr redus de registre
generale pentru stocarea unor date curente ale programului. Pentru acest gen de aplicaţii,
proiectanţii au realizat o structură de memorie numită Acces Bank care cuprinde un număr redus de
128 de locaţii de memorie pentru date curente (locaţiile 00H–7FH din blocul 0) şi 128 de locaţii de
memorie pentru registrele cu funcţii speciale (locaţiile 80–FFH din blocul 15) – vezi Fig. 1 .17.
Această structură de memorie poate fi utilizată de toate instrucţiunile de bază ale
microcontrolerului şi este adresată cu 8 biţi direct din instrucţiune.

24
Fig. 1.16. Harta memoriei de date

Adresarea memoriei de date este gestionată suplimentar şi cu un parametru „a” cuprins de


asemenea în instrucţiune. Pentru a = 1, instrucţiunea utilizează pointer-ul BSR şi poate fi accesat

25
Fig. 1.17. Utilizarea Bank Select Register (adresare directă)

întreg spaţiul memoriei de date, iar pentru a = 0 instrucţiunea utilizează doar spaţiul de memorie
din Acces Bank.

Regristrele care compun memoria de date


În memoria de date se întâlnesc două tipuri de registre:
 registre generale de date (GPR);
 registre cu funcţii speciale (SFR).
Registrele cu funcţii speciale, la rândul lor, se pot împărţi în două categorii:
– cele care sunt asociate cu structura de bază a microcontrolerului (ALU, întreruperi etc.);
– registre cu care se gestionează funcţionarea perifericelor.
Moduri de adresare a memoriei de date
Dacă pentru adresarea memoriei program se foloseşte exclusiv contorul de instrucţiuni
(Program Counter), pentru adresarea memoriei de date exista următoarele patru posibilităţi:
 Adresarea implicită
O astfel de instrucţiune care nu necesită argumente suplimentare, afectează în general tot
sistemul sau lucrează implicit cu un singur registru. Exemplu: RESET.
 Adresarea explicită
În acest caz, instrucţiunea conţine în mod explicit registrul cu care se lucrează precum şi
operandul. Exemplu: MOVLW 7FH.
 Adresarea directă
În acest caz, cel de-al doilea octet al instrucţiunii este o adresă care poate fi, de exemplu,
adresa locaţiei în cadrul unui bloc de date selectat. Exemplu: ADDWF f,d,a.
Instrucţiunea adună la conţinutul registrului W, conţinutul registrului selectat f. Cei doi
parametrii suplimentari aflaţi în argumentul instrucţiunii sunt folosiţi astfel:

26
Fig. 1.18. Adresarea indirectă

o Cu parametrul a se selectează sursa pentru f:


 Pentru a = 1 registrul f este selectat, din tot spaţiul memoriei de date, cu
pointer-ul BSR şi cu cei 8 biţi din octetul inferior al instrucţiunii (practic cu
12 biţi de adresă),
 Pentru a = 0 registrul f este selectat doar din spaţiul de memorie delimitat de
Acces Bank;
o Cu parametrul d se selectează destinaţia pentru rezultatul operaţiei:
 Pentru d = 1 rezultatul este stocat înapoi în registrul f,
 Pentru d = 0 rezultatul este stocat înapoi în registrul W.
 Adresarea indirectă
Adresarea indirectă permite utilizatorului să acceseze o anumită locaţie de memorie fără a-i
preciza în mod concret adresa acesteia.
Acest lucru este realizat prin utilizarea unor pointer-i (notaţi cu FSRs) pentru adresarea
locaţiei de memorie ce urmează a fi accesată.
Pointer-ii FSR fac parte din setul de registre speciale SFR, în consecinţă se află în memoria
de date şi vor putea fi, la rândul lor, accesaţi cu uşurinţă de programul aplicativ. În felul acesta,
aceşti pointer-i FSR vor fi foarte utili pentru implementarea unor tabele sau structuri de date.
Microcontrolerul 18F4520 conţine trei pointer-i de tipul FSR notaţi cu FSR0, FSR1 şi
FSR2. Fiecare din aceşti pointer-i este realizat cu câte doua registre a câte 8 biţi (FSRnH şi FSRnL)
şi va conţine un cuvânt de adresă de 12 biţi (cei mai semnificativi 4 biţi din registrul FSRnH nu
sunt folosiţi).
Registrele pentru adresarea indirecta (FSR) sunt implementate prin intermediul Indirect File
Operands (INDF) care va permite o manipulare a pointer-ului pentru incrementare şi decrementare
automată, precum şi încărcarea automată a unui offset, ceea ce va duce la eficientizarea
programelor, de exemplu, în cazul unor bucle.
Adresarea indirectă (Fig. 1 .18) presupune existenţa a Indirect File Operands (de asemenea
în număr de 3 – INDF0, INDF1, INDF2). Aceştia pot fi imaginaţi ca nişte registre „virtuale” care
fac parte din registrele speciale (SFR) fără însă a fi implementate în mod fizic.

27
Scrierea sau citirea unui registru de tip INDFn accesează de fapt perechea de registre
SFRnH şi SFRnL asociate acestuia. Folosirea lui INDFn ca operand va utiliza de fapt conţinutul
pointer-ului aferent FSRnH şi FSRnL.

Observaţie:
Deoarece adresarea indirectă foloseşte o adresă de 12 biţi, mecanismul de împărţire
în 16 blocuri a câte 256 de locaţii (RAM–Banking) nu este luat în considerare.
Pointer-ului FSRn, îi mai sunt asociaţi, pe lângă registrul INDFn, alţi patru registre–
operanzi suplimentari. Ca şi INDFn, şi aceşti registre–operanzi vor reprezenta de fapt nişte registre
„virtuale”. Accesarea acestor registre–operanzi înseamnă de fapt accesarea pointer-ului asociat
FSRn, dar şi efectuarea, suplimentara, a unei anumite operaţii asupra conţinutului acestora.
Aceste registre–operanzi sunt:
 POSTDEC – accesează pointer-ul FSR, după care îl decrementează în mod automat;
 POSTINC – accesează pointer-ul FSR, după care îl incrementează în mod automat;
 PREINC – incrementează conţinutul lui FSR iar apoi îl foloseşte pe acesta ca operand;
 PLUSW – adună la conţinutul pointer-ului FSR un număr (offset) cu semn (–127 la 128)
stocat în registrul W, după care foloseşte noua valoare calculată în operaţie.

Observaţii:
 Accesarea registrului INDFn permite utilizarea conţinutului pointer-ului asociat FSRn
fără modificarea valorii acestuia.
 Accesarea registrului PLUSW permite calculul unui offset (ca mai sus) şi folosirea
acestei valori într-o operaţie fără însă ca prin aceasta să se modifice conţinutul pointer-
ului FSRn sau a registrului W.
 Folosirea unei tehnici de adresare indirectă pentru a accesa registrele virtuale mai sus
menţionate poate duce la rezultate imprevizibile (pentru detalii se recomandă
consultarea secţiunii 5.4.3.3 Operations by FSRs on FSRs din foaia de catalog a
microcontrolerului PIC18F4520).
 Folosirea setului extins de instrucţiuni presupune şi o anumită schimbare în organizarea
şi folosirea memoriei de date (pentru detalii se recomandă consultarea secţiunii 5.5 Data
Memory and the Extended Instruction Set din foaia de catalog a microcontrolerului
PIC18F4520).

1.3.6.4. Memoria de date EEPROM


Memoria de date EEPROM este o memorie separată de memoria program sau de memoria
de date SRAM şi este folositabilă pentru stocarea pe termen lung a unor date de program. Nu face
parte din spaţiul de adresare al memoriilor program sau de date şi este accesibilă doar printr-o
adresare indirectă prin intermediul unor registre speciale (SFR).
Controlul memoriei EEPROM se realizeaza prin intermediul urmatoarelor registre speciale:
EECON1, EECON2, EEDATA şi EEADR.
Operaţiile de citire şi scriere din şi în memoria EEPROM se efectuează pe octet prin
intermediul registrelor EEDATA resprectiv EEADR.
Octetul citit sau cel care urmează a fi scris se afla în registrul de 8 biţi EEDATA, iar adresa
la care se face operaţia de citire/scriere se afla în registrul de 8 biţi EEADR (spaţiul memoriei
EEPROM este de 256 de octeţi).
Accesul la datele din memoria EEPROM este controlat de registrele EECON1 respectiv
EECON2, aceleaşi care controlează şi accesul la datele memoriei program.

28
Fig. 1.19. Registrul 1 EEPROM de control (EECON1)

Semificaţia biţilor registrului de control EECON1 este prezentată în Fig. 1 .19. Registrul
EECON2 nu este fizic realizat şi este folosit de către microcontroler exclusiv pentru operaţiile de
scriere şi ştergere a memoriei EEPROM.
Operaţia de citire a memoriei EEPROM
Pentru o operaţie de citire, utilizatorul trebuie să scrie adresa operandului în registrul
EEADR, să şteargă bitul EEPG0 şi să seteze bitul RD. Data adresată va fi depusă în registrul
EEDATA şi va fi disponibilă pentru citire în ciclul maşină următor. Registrul EEDATA va păstra
data citită până la o nouă întrebuinţare a acestuia de către utilizator pentru o operaţie de scriere sau
citire.

29
O secvenţă tipică de program pentru citirea memoriei EEPROM este următoarea:
MOVLW DATA_EE_ADDR ;
MOVWF EEADR ; Data Memory Address to read
BCF  EECON1, EEPGD ; Point to DATA memory
BCF  EECON1, CFGS ; Access EEPROM
BSF  EECON1, RD ; EEPROM Read
MOVF  EEDATA, W ; W = EEDATA

Operaţia de scriere în memoria EEPROM


Scrierea unui octet în memoria EEPROM va determina în mod automat ştergerea prealabilă
a respectivei locaţii de memorie şi apoi scrierea noului octet (aplicaţie de tipul erase – before –
write).
La scriere, octetul care urmează a fi scris se depune în registrul EEDATA iar adresa la care
se face scrierea în registrul EEADR. Pentru a iniţia un ciclu de scriere, trebuie urmată cu stricteţe
secvenţa din următorul exemplu:
MOVLW DATA_EE_ADDR ;
MOVWF EEADR ; Data Memory Address to write
MOVLW DATA_EE_DATA ;
MOVWF EEDATA ; Data Memory Value to write
BCF EECON1, EEPGD ; Point to DATA memory
BCF EECON1, CFGS ; Access EEPROM
BSF EECON1, WREN ; Enable writes
BCF INTCON, GIE ; Disable Interrupts
; Required sequence ===================================
MOVLW 55h ;
MOVWF EECON2 ; Write 55h
MOVLW 0AAh ;
MOVWF EECON2 ; Write 0AAh
BSF EECON1, WR ; Set WR bit to begin write
; Required sequence ===================================
BSF INTCON, GIE ; Enable Interrupts
; User code execution
BCF EECON1, WREN ; Disable writes on write complete
; (EEIF set)

Ciclul de scriere nu poate să înceapă dacă nu se respectă următoarea secvenţă: scrierea


valorii 55H în EECON2 urmată de scrierea valorii 0AAH în EECON2 iar apoi setarea bitului WR –
operaţie ce trebuie repetată pentru fiecare octet ce urmează a fi scris.

Observaţii:
 Pe durata acestei secvenţe, întreruperile trebuie dezactivate. După aceasta se va seta
bitul de validare a scrierii (bitul WREN din registrul EECON1) pentru a permite
desfăşurarea operaţiei de scriere.
 Prezenţa mecanismului de validare a scrierii prin bitul WREN permite prevenirea unor
operaţii de scriere accidentale, motiv pentru care acest bit trebuie menţinut la valoarea
zero cu excepţia situaţiilor de scriere sau a reîmprospătării memoriei.
După iniţierea procedurii de scriere, conţinutul registrelor EEADR, EEDATA şi EECON1
nu vor putea fi modificate. Timpul de scriere este controlat de hardware-ul microcontrolerului
printr-un timer special destinat acestei operaţii.
Operaţia propriu-zisă de scriere începe prin setarea bitului de comanda WR.

Observaţie:
Bitul WR nu va putea fi setat dacă în prealabil WREN nu a fost setat.

30
După terminarea ciclului de scriere, bitul WR este resetat de hardware iar fanionul (flag) de
întrerupere a memoriei EEPROM – bitul EEIF – va fi setat. Programatorul poate lua în considerare
sau nu această solicitare de întrerupere prin setarea sau nu a biţilor de validare corespunzători.

Observaţie:
Bitul EEIF trebuie şters prin soft. De regulă este bine ca operaţia de scriere să fie
urmată şi de o operaţie de verificare a corectitudinii scrierii.

Mecanisme de protecţie
Memoria EEPROM este prevăzută cu un mecanism de protecţie prin setarea unor biţi din
cuvântul de cod de configurare (vezi secţiunea 23.0 Special Features of the CPU din foaia de
catalog a microcontrolerului PIC18F4520 [??? DS]).
Odată mecanismul activat, operaţiile de scriere sau citire din exterior a memoriei EEPROM
nu vor mai fi posibile dar microcontrolerul însuşi va putea citi sau scrie această memorie internă
EEPROM.
Un mecanism suplimentar de protecţie împotriva unor operaţii de scriere accidentale şi
nedorite este asigurat de bitul de validare WREN (pus pe zero la POR) împreună cu secvenţa
obligatorie ce precede o operaţie de scriere a unui octet.
Folosirea memoriei de date EEPROM
Memoria de data EEPROM este o memorie de înaltă fiabilitate (permite circa 1.000.000 de
operaţii de scriere/ştergere şi garantează calitatea informaţiei stocate pentru circa 100 de ani). Este
recomandată utilizarea ei pentru informaţii supuse unor modificări frecvente (de exemplu variabile
de program sau date supuse unor update-uri frecvente). În astfel de situaţii, se impune o operaţie de
reîmprospătare a datelor din memorie. O rutină simplă de reîmprospătare a memoriei EEPROM
este următoarea:
CLRF EEADR ; Start at address 0
BCF EECON1, CFGS ; Set for memory
BCF EECON1, EEPGD ; Set for Data EEPROM
BCF INTCON, GIE ; Disable interrupts
BSF EECON1, WREN ; Enable writes
Loop ; Loop to refresh array
BSF EECON1, RD ; Read current address
MOVLW 55h ;
MOVWF EECON2 ; Write 55h
MOVLW 0AAh ;
MOVWF EECON2 ; Write 0AAh
BSF EECON1, WR ; Set WR bit to begin write
BTFSC EECON1, WR ; Wait for write to complete
BRA $-2
INCFSZ EEADR, F ; Increment address
BRA LOOP ; Not zero, do it again
BCF EECON1, WREN ; Disable writes
BSF INTCON, GIE ; Enable interrupts

31
1.4. Desfăşurarea lecţiei

ACTIVITATEA 1.1
Studiul altor materiale informative
Studiaţi manualele de utilizare, foile de catalog şi documentele informative incluse în
următoarele directoare: LAB Picdem 2 Plus\User's Guide, LAB Picdem 2
Plus\Datasheets şi LAB PICDEM 2 Plus\Documents.

ACTIVITATEA 1.2
Studiul structurii paginilor WEB ale firmei Microchip
Studiaţi structura paginilor de internet oferite de firma Microchip pentru documentare
suplimentară: www.microchip.com/tools şi http://forum.microchip.com.

ACTIVITATEA 1.3
Sintetizarea structurilor de memorie implementate în microcontrolerul
PIC 18LF4520
Faceţi un tabel cu memoriile prezente în microcontrolerul PIC18LF4520 precizând pentru
fiecare tipul, rolul, capacitatea, pe câţi biţi este organizat, cu câţi biţi este adresat şi modalităţile de
citire, scriere şi ştergere a memoriei.

ACTIVITATEA 1.4
Comparaţie între posibilităţile a două sisteme de dezvoltare
Faceţi o comparaţie a dotărilor şi facilităţilor celor două sisteme de dezvoltare disponibile în
laborator: PICKIT 1 FLASH Starter Kit şi PICDEM 2 Plus.

1.5. Activităţi propuse


[1] Faceţi o comparaţie din punct de vedere al caracteristicilor şi funcţionalităţilor între
următoarele două microcontrolere: PIC18LF4520 şi PIC18LF4620.
[2] Comparaţi caracteristicile şi facilităţile celor două dispozitive de programare/depanare
disponibile în laborator: ICD2 şi ICD3.
[3] Studiaţi şi celelalte sisteme de dezvoltare oferite de firma Microchip. Alegeţi unul şi precizaţi
care sunt componentele şi posibilităţile suplimentare ale sale care nu sunt prezente la cele din
laborator. Imaginaţi şi descrieţi două aplicaţii didactice bazate pe sistemul de dezvoltare ales.
[4] Faceţi o organigramă (schemă logică) care să descrie sugestiv desfăşurarea evenimentelor şi
acţiunilor în cadrul mecanismului de generare şi tratare a întreruperilor în cazul
microcontrolerului PIC 18LF4520.

1.6. Întrebări
[1] Care este diferenţa principală între microcontrolerele PIC18LF4520 şi PIC18F4520? Ce
consecinţe practice înseamnă acest lucru pentru aplicaţiile în care se utilizează respectivele
microcontrolere? (Indicaţie: vezi secţiunea 26.0 Electrical Characteristics din fişierul LAB
PICDEM 2 Plus\Datasheets\PIC18F4520 Data Sheet [??? DS])

32
[2] Care credeţi că sunt utilizările principale în aplicaţiile practice ale memoriei EEPROM
prezente la microcontrolerul PIC18LF4520?
[3] Care sunt modalităţile de adresare ale memoriei de date?
[4] Care sunt motivele pentru care proiectantul a introdus structura de memorie Access Bank în
microcontrolerele PIC?
[5] Pentru un automat de vânzare, ce fel de oscilator şi de gestionare a consumului de energie aţi
alege?
[6] Daţi un exemplu în care supravegherea programului aplicativ prin intermediul unui Watchdog
Timer este necesară.
[7] De ce au fost introduse în schema microcontrolerului memorii de date şi de program
distincte?

33
34

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