Documente Academic
Documente Profesional
Documente Cultură
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.
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).
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
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.
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).
15
Fig. 1.4. Schema bloc a mecanismului de iniţializare
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]).
17
Tabelul 1.2. Comparaţia performanţelor unor operaţii de multiplicare
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.
19
Fig. 1.7. Structura contorului de instrucţiuni
20
Fig. 1.8. Memoria stivă pentru adrese de întoarcere şi registrele asociate
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
î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.
22
Fig. 1.13. Structura pointer-ului TBLPTR şi limitele lui în funcţie de operaţia efectuată
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).
24
Fig. 1.16. Harta memoriei de date
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.
26
Fig. 1.18. Adresarea indirectă
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).
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
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.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