Documente Academic
Documente Profesional
Documente Cultură
MICROCONTROLERUL PIC18F4455
1. ARHITECTURA GENERALĂ
Introducere
Obiective
1.1 ARHITECTURA VON NEUMANN
Cuprins
1.1.1 Unitatea centrală de prelucrare
1.1.2 Magistralele
1.1.3 Memoria
1.1.4 Echipamentele de intrare-ieşire
1.2 ARHITECTURA HARVARD
1.3 MICROPROCESOR SAU MICROCONTROLER?
1.4 STRUCTURA INTERNĂ A MICROCONTROLERELOR
DIN FAMILIA PIC18F
1.4.1 Execuţia instrucţiunilor
1.4.2 Unitatea de control
1.4.3 Unitatea aritmetică şi logică
Concluzii
Întrebări de autoevaluare
Termeni esenţiali
9
ARHITECTURA GENERALĂ
Din punct de vedere istoric sistemele de calcul moderne îşi au originea în cele
dezvoltate în timpul celui de-al doilea război mondial. Aceste sisteme iniţiale îndeplineau o
funcţionalitate dedicată, fiind proiectate pentru a realiza o singură sarcină pe baza unui set de
date, iar pentru a-şi schimba comportamentul era necesară refacerea conexiunilor fizice dintre
elementele componente. Evoluţia esenţială a acestor sisteme de calcul rudimentare s-a produs
în momentul în care s-a înţeles că programul putea fi stocat în memorie alături de date. Unul
dintre avantajele acestei arhitecturi, denumită von Neumann, după numele celui care a
coordonat proiectul, îl reprezintă flexibilitatea. Astfel, modificarea programului presupune
doar încărcarea secvenţei de biţi corespunzătoare în zona de memorie potrivită.
Simplitatea arhitecturii von Neumann a făcut ca majoritatea sistemelor de calcul
moderne să fie bazate pe această structură. Elementele caracteristice ale acestor sisteme de
calcul sunt: unitatea centrală de prelucrare (UCP), memoriile, echipamentele de intrare ieşire
şi magistralele. Unitatea centrală de prelucrare conţine o unitate de control, care realizează
interpretarea, secvenţierea instrucţiunilor şi comandă celelalte componente ale sistemului, şi o
unitate aritmetică şi logică (UAL), care execută instrucţiuni. Unitatea de memorie stochează
instrucţiuni şi date, iar echipamentele periferice asigură interacţiunea dintre sistemul de calcul
10
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Fig. 1.1. Structura generală a sistemelor de calcul bazate pe arhitectura von Neumann
11
ARHITECTURA GENERALĂ
1.1.2 Magistralele
3. Magistrala de control are rolul de a conduce semnalele de control ale UCP care
comandă componentele sistemului. De exemplu, semnalele transmise prin intermediul
magistralei de control pot specifica modul de acces la memorie în vederea realizării
unor operaţii de scriere sau de citire. Practic liniile de scriere şi citire ale magistralei
controlează direcţia datelor de pe magistrala de date. Alte semnale ale magistralei de
control pot include: tactul sistem, liniile de întrerupere, linii de stare etc.
12
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
1.1.3 Memoria
Memoriile sunt caracterizate prin conţinutul pe care acestea îl stochează într-un set de
regiştri şi locaţia sau adresa individuală a fiecărui registru. În cazul arhitecturii von Neumann,
atât instrucţiunile cât şi datele se găsesc în acelaşi spaţiu de memorie. Indiferent că este
internă sau externă, memoria reprezintă un spaţiu de stocare şi poate fi accesată cu ajutorul
magistralelor dacă se specifică adresa locaţiei dorite şi tipul operaţiei (scriere sau citire).
13
ARHITECTURA GENERALĂ
În Fig. 1.2 sunt alăturate, cu scop comparativ, cele două tipuri de arhitecturi de sisteme
de calcul: von Neumann (Fig. 1.2-a) şi Harvard (Fig. 1.2-b). În cea din urmă se evidenţiază
cele două spaţii de memorie distincte împreună cu magistralele asociate. Fiecare memorie
dispune de propria sa magistrală de adrese, respectiv de date, astfel încât nu există nici o
legătură între adresele sau datele celor două spaţii de memorie.[10,19]
Până acum, în paragrafele anterioare s-a făcut referire doar la câteva sisteme de calcul
care ne trimit cu gândul mai mult spre calculatoarele numerice.
Dar, ce sunt de fapt microprocesoarele, respectiv microcontrolerele?
Pe scurt, microprocesorul implementează funcţiile unităţii centrale de prelucrare.
Pentru a putea fi folosit într-un sistem de calcul, unui microprocesor trebuie să i se adauge
alte componente, cum ar fi memorie, sau componente pentru primirea şi trimiterea datelor.
Pe de altă parte microcontrolerul a fost proiectat să conţină toate cele trei
componente principale (UCP, memorie, echipamente de intrare-ieşire) într-un singur circuit
integrat. Astfel, nu mai sunt necesare alte componente externe deoarece toate perifericele
sunt deja incluse în el. Funcţiile principale ale componentelor însă rămân neschimbate fiind
aceleaşi indiferent de aplicaţia dezvoltată, dar din motive de preţ şi dimensiune
microcontrolerele dispun de un set redus de instrucţiuni şi o capacitate de adresare mai mică.
Astfel, făcând trimitere la cele două tipuri de arhitecturi prezentate anterior în Fig. 1.1
şi Fig. 1.2, microprocesorul reprezintă unitatea centrală de prelucrare, pe când
microcontrolerul reprezintă întreg sistemul de calcul.[4,6]
14
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
15
ARHITECTURA GENERALĂ
16
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
1
http://www.microchip.com [22]
17
ARHITECTURA GENERALĂ
Unul dintre avantajele importante ale arhitecturii Harvard este dat de faptul că
magistralele celor două tipuri de memorii pot avea dimensiuni diferite. Astfel, magistrala de
date (instrucţiuni) a memoriei program împreună cu memoria program pot fi organizate pe
cuvinte (în cazul analizat este vorba de cuvinte de 16 biţi), iar magistrala şi memoria de date
sunt organizate pe octet. Acest lucru, combinat cu setul redus de instrucţiuni permit
implementarea unor instrucţiuni cu lungime fixă ce pot fi extrase într-un singur pas.
18
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
19
ARHITECTURA GENERALĂ
fiecare instrucţiune. Sub controlul acestui numărător, instrucţiunile vor fi extrase pe rând din
memoria program, iar apoi vor fi executate.
Doi regiştri de instrucţiuni, care împreună formează Pipeline-ul, vor stoca codul
instrucţiunilor extrase din memoria program. Cel de sus, Registrul de Instrucţiuni 1 (RI1) va
stoca instrucţiunea n şi o va păstra pe durata următorului ciclu instrucţiune. Această structură
permite ca instrucţiunea n-1, aflată în registrul de la baza pipeline-ului (Registrul de
Instrucţiuni 2 - RI2) să fie executată în timp ce instrucţiunea n este extrasă din memorie şi
stocată în Registrul de instrucţiuni 1 al pipeline-ului. După execuţia instrucţiunii n-1 se
transferă conţinutul din registrul de instrucţiuni 1 al pipeline-ului în registrul de instrucţiuni 2,
urmând ca în timp ce instrucţiunea n+1 este extrasă din memorie şi stocată în vârful pipeline-
ului, instrucţiunea de la bază (instrucţiunea n) să fie executată.
Una din componentele de bază ale UCP, decodificatorul, are rolul de a descifra codul
instrucţiunii stocate în registrul de la baza pipeline-ului şi contribuie la generarea semnalelor
de control interne necesare pentru execuţia instrucţiunii.
20
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
bit 7 bit 0
- - - N OV Z DC C
Fig. 1.9. Registrul STATUS
21
ARHITECTURA GENERALĂ
Adresă
Colecţie de biţi utilizaţi pentru a identifica locaţiile de memorie
Termeni Ciclu instrucţiune
esenţiali Procesul prin care se extrage o instrucţiune din memoria program şi se
execută
CISC
Complex Instruction Set Computer
Dată
Conţinutul unei locaţii de memorie
Instrucţiuni
Comenzi pe care le execută UCP
Magistrală
Colecţie de fire prin care informaţia se transmite paralel între componentele
unui sistem de calcul
Memorie
Spaţiu de stocare
Memorie de date
Spaţiu de stocare temporar (RAM) pentru datele cu care lucrează programul
22
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Memorie program
Spaţiu de stocare pentru program
Microcontroler
Sistem de calcul încapsulat într-un singur circuit integrat
Microprocesor
Parte componentă a unui sistem de calcul, UCP
Numărător de program
Numărător binar utilizat pentru adresarea instrucţiunilor. Conţine adresa
instrucţiunii care urmează a fi executată
PIC
Programmable Intelligent Computer
Pipeline
Tehnică utilizată pentru a creşte numărul de instrucţiuni care pot fi
executate în unitatea de timp. Pipeline-ul nu reduce timpul necesar
execuţiei unei instrucţiuni, ci creşte numărul de instrucţiuni care pot fi
procesate simultan
Port
Calea de legătură a sistemului de calcul cu lumea exterioară prin care acesta
poate să trimită şi să primească date
Registru
Spaţiu de stocare
Registru de instrucţiuni
Spaţiu de stocare temporar pentru o instrucţiune extrasă din memorie
RISC
Reduced Instruction Set Computer
STATUS
Registru care indică starea operaţiilor aritmetice şi logice executate de
unitatea aritmetică şi logică
UAL
Unitate aritmetică şi logică
UCP
Unitate centrală de prelucrare
WREG
Registru de lucru / acumulator. În general conţine unul din operanzii
instrucţiunilor
23
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
1. ARHITECTURA GENERALĂ
Introducere
Obiective
1.1 ARHITECTURA VON NEUMANN
Cuprins
1.1.1 Unitatea centrală de prelucrare
1.1.2 Magistralele
1.1.3 Memoria
1.1.4 Echipamentele de intrare-ieşire
1.2 ARHITECTURA HARVARD
1.3 MICROPROCESOR SAU MICROCONTROLER?
1.4 STRUCTURA INTERNĂ A MICROCONTROLERELOR
DIN FAMILIA PIC18F
1.4.1 Execuţia instrucţiunilor
1.4.2 Unitatea de control
1.4.3 Unitatea aritmetică şi logică
Concluzii
Întrebări de autoevaluare
Termeni esenţiali
9
ARHITECTURA GENERALĂ
Din punct de vedere istoric sistemele de calcul moderne îşi au originea în cele
dezvoltate în timpul celui de-al doilea război mondial. Aceste sisteme iniţiale îndeplineau o
funcţionalitate dedicată, fiind proiectate pentru a realiza o singură sarcină pe baza unui set de
date, iar pentru a-şi schimba comportamentul era necesară refacerea conexiunilor fizice dintre
elementele componente. Evoluţia esenţială a acestor sisteme de calcul rudimentare s-a produs
în momentul în care s-a înţeles că programul putea fi stocat în memorie alături de date. Unul
dintre avantajele acestei arhitecturi, denumită von Neumann, după numele celui care a
coordonat proiectul, îl reprezintă flexibilitatea. Astfel, modificarea programului presupune
doar încărcarea secvenţei de biţi corespunzătoare în zona de memorie potrivită.
Simplitatea arhitecturii von Neumann a făcut ca majoritatea sistemelor de calcul
moderne să fie bazate pe această structură. Elementele caracteristice ale acestor sisteme de
calcul sunt: unitatea centrală de prelucrare (UCP), memoriile, echipamentele de intrare ieşire
şi magistralele. Unitatea centrală de prelucrare conţine o unitate de control, care realizează
interpretarea, secvenţierea instrucţiunilor şi comandă celelalte componente ale sistemului, şi o
unitate aritmetică şi logică (UAL), care execută instrucţiuni. Unitatea de memorie stochează
instrucţiuni şi date, iar echipamentele periferice asigură interacţiunea dintre sistemul de calcul
10
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Fig. 1.1. Structura generală a sistemelor de calcul bazate pe arhitectura von Neumann
11
ARHITECTURA GENERALĂ
1.1.2 Magistralele
3. Magistrala de control are rolul de a conduce semnalele de control ale UCP care
comandă componentele sistemului. De exemplu, semnalele transmise prin intermediul
magistralei de control pot specifica modul de acces la memorie în vederea realizării
unor operaţii de scriere sau de citire. Practic liniile de scriere şi citire ale magistralei
controlează direcţia datelor de pe magistrala de date. Alte semnale ale magistralei de
control pot include: tactul sistem, liniile de întrerupere, linii de stare etc.
12
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
1.1.3 Memoria
Memoriile sunt caracterizate prin conţinutul pe care acestea îl stochează într-un set de
regiştri şi locaţia sau adresa individuală a fiecărui registru. În cazul arhitecturii von Neumann,
atât instrucţiunile cât şi datele se găsesc în acelaşi spaţiu de memorie. Indiferent că este
internă sau externă, memoria reprezintă un spaţiu de stocare şi poate fi accesată cu ajutorul
magistralelor dacă se specifică adresa locaţiei dorite şi tipul operaţiei (scriere sau citire).
13
ARHITECTURA GENERALĂ
În Fig. 1.2 sunt alăturate, cu scop comparativ, cele două tipuri de arhitecturi de sisteme
de calcul: von Neumann (Fig. 1.2-a) şi Harvard (Fig. 1.2-b). În cea din urmă se evidenţiază
cele două spaţii de memorie distincte împreună cu magistralele asociate. Fiecare memorie
dispune de propria sa magistrală de adrese, respectiv de date, astfel încât nu există nici o
legătură între adresele sau datele celor două spaţii de memorie.[10,19]
Până acum, în paragrafele anterioare s-a făcut referire doar la câteva sisteme de calcul
care ne trimit cu gândul mai mult spre calculatoarele numerice.
Dar, ce sunt de fapt microprocesoarele, respectiv microcontrolerele?
Pe scurt, microprocesorul implementează funcţiile unităţii centrale de prelucrare.
Pentru a putea fi folosit într-un sistem de calcul, unui microprocesor trebuie să i se adauge
alte componente, cum ar fi memorie, sau componente pentru primirea şi trimiterea datelor.
Pe de altă parte microcontrolerul a fost proiectat să conţină toate cele trei
componente principale (UCP, memorie, echipamente de intrare-ieşire) într-un singur circuit
integrat. Astfel, nu mai sunt necesare alte componente externe deoarece toate perifericele
sunt deja incluse în el. Funcţiile principale ale componentelor însă rămân neschimbate fiind
aceleaşi indiferent de aplicaţia dezvoltată, dar din motive de preţ şi dimensiune
microcontrolerele dispun de un set redus de instrucţiuni şi o capacitate de adresare mai mică.
Astfel, făcând trimitere la cele două tipuri de arhitecturi prezentate anterior în Fig. 1.1
şi Fig. 1.2, microprocesorul reprezintă unitatea centrală de prelucrare, pe când
microcontrolerul reprezintă întreg sistemul de calcul.[4,6]
14
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
15
ARHITECTURA GENERALĂ
16
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
1
http://www.microchip.com [22]
17
ARHITECTURA GENERALĂ
Unul dintre avantajele importante ale arhitecturii Harvard este dat de faptul că
magistralele celor două tipuri de memorii pot avea dimensiuni diferite. Astfel, magistrala de
date (instrucţiuni) a memoriei program împreună cu memoria program pot fi organizate pe
cuvinte (în cazul analizat este vorba de cuvinte de 16 biţi), iar magistrala şi memoria de date
sunt organizate pe octet. Acest lucru, combinat cu setul redus de instrucţiuni permit
implementarea unor instrucţiuni cu lungime fixă ce pot fi extrase într-un singur pas.
18
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
19
ARHITECTURA GENERALĂ
fiecare instrucţiune. Sub controlul acestui numărător, instrucţiunile vor fi extrase pe rând din
memoria program, iar apoi vor fi executate.
Doi regiştri de instrucţiuni, care împreună formează Pipeline-ul, vor stoca codul
instrucţiunilor extrase din memoria program. Cel de sus, Registrul de Instrucţiuni 1 (RI1) va
stoca instrucţiunea n şi o va păstra pe durata următorului ciclu instrucţiune. Această structură
permite ca instrucţiunea n-1, aflată în registrul de la baza pipeline-ului (Registrul de
Instrucţiuni 2 - RI2) să fie executată în timp ce instrucţiunea n este extrasă din memorie şi
stocată în Registrul de instrucţiuni 1 al pipeline-ului. După execuţia instrucţiunii n-1 se
transferă conţinutul din registrul de instrucţiuni 1 al pipeline-ului în registrul de instrucţiuni 2,
urmând ca în timp ce instrucţiunea n+1 este extrasă din memorie şi stocată în vârful pipeline-
ului, instrucţiunea de la bază (instrucţiunea n) să fie executată.
Una din componentele de bază ale UCP, decodificatorul, are rolul de a descifra codul
instrucţiunii stocate în registrul de la baza pipeline-ului şi contribuie la generarea semnalelor
de control interne necesare pentru execuţia instrucţiunii.
20
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
bit 7 bit 0
- - - N OV Z DC C
Fig. 1.9. Registrul STATUS
21
ARHITECTURA GENERALĂ
Adresă
Colecţie de biţi utilizaţi pentru a identifica locaţiile de memorie
Termeni Ciclu instrucţiune
esenţiali Procesul prin care se extrage o instrucţiune din memoria program şi se
execută
CISC
Complex Instruction Set Computer
Dată
Conţinutul unei locaţii de memorie
Instrucţiuni
Comenzi pe care le execută UCP
Magistrală
Colecţie de fire prin care informaţia se transmite paralel între componentele
unui sistem de calcul
Memorie
Spaţiu de stocare
Memorie de date
Spaţiu de stocare temporar (RAM) pentru datele cu care lucrează programul
22
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Memorie program
Spaţiu de stocare pentru program
Microcontroler
Sistem de calcul încapsulat într-un singur circuit integrat
Microprocesor
Parte componentă a unui sistem de calcul, UCP
Numărător de program
Numărător binar utilizat pentru adresarea instrucţiunilor. Conţine adresa
instrucţiunii care urmează a fi executată
PIC
Programmable Intelligent Computer
Pipeline
Tehnică utilizată pentru a creşte numărul de instrucţiuni care pot fi
executate în unitatea de timp. Pipeline-ul nu reduce timpul necesar
execuţiei unei instrucţiuni, ci creşte numărul de instrucţiuni care pot fi
procesate simultan
Port
Calea de legătură a sistemului de calcul cu lumea exterioară prin care acesta
poate să trimită şi să primească date
Registru
Spaţiu de stocare
Registru de instrucţiuni
Spaţiu de stocare temporar pentru o instrucţiune extrasă din memorie
RISC
Reduced Instruction Set Computer
STATUS
Registru care indică starea operaţiilor aritmetice şi logice executate de
unitatea aritmetică şi logică
UAL
Unitate aritmetică şi logică
UCP
Unitate centrală de prelucrare
WREG
Registru de lucru / acumulator. În general conţine unul din operanzii
instrucţiunilor
23
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
1. ARHITECTURA GENERALĂ
Introducere
Obiective
1.1 ARHITECTURA VON NEUMANN
Cuprins
1.1.1 Unitatea centrală de prelucrare
1.1.2 Magistralele
1.1.3 Memoria
1.1.4 Echipamentele de intrare-ieşire
1.2 ARHITECTURA HARVARD
1.3 MICROPROCESOR SAU MICROCONTROLER?
1.4 STRUCTURA INTERNĂ A MICROCONTROLERELOR
DIN FAMILIA PIC18F
1.4.1 Execuţia instrucţiunilor
1.4.2 Unitatea de control
1.4.3 Unitatea aritmetică şi logică
Concluzii
Întrebări de autoevaluare
Termeni esenţiali
9
ARHITECTURA GENERALĂ
Din punct de vedere istoric sistemele de calcul moderne îşi au originea în cele
dezvoltate în timpul celui de-al doilea război mondial. Aceste sisteme iniţiale îndeplineau o
funcţionalitate dedicată, fiind proiectate pentru a realiza o singură sarcină pe baza unui set de
date, iar pentru a-şi schimba comportamentul era necesară refacerea conexiunilor fizice dintre
elementele componente. Evoluţia esenţială a acestor sisteme de calcul rudimentare s-a produs
în momentul în care s-a înţeles că programul putea fi stocat în memorie alături de date. Unul
dintre avantajele acestei arhitecturi, denumită von Neumann, după numele celui care a
coordonat proiectul, îl reprezintă flexibilitatea. Astfel, modificarea programului presupune
doar încărcarea secvenţei de biţi corespunzătoare în zona de memorie potrivită.
Simplitatea arhitecturii von Neumann a făcut ca majoritatea sistemelor de calcul
moderne să fie bazate pe această structură. Elementele caracteristice ale acestor sisteme de
calcul sunt: unitatea centrală de prelucrare (UCP), memoriile, echipamentele de intrare ieşire
şi magistralele. Unitatea centrală de prelucrare conţine o unitate de control, care realizează
interpretarea, secvenţierea instrucţiunilor şi comandă celelalte componente ale sistemului, şi o
unitate aritmetică şi logică (UAL), care execută instrucţiuni. Unitatea de memorie stochează
instrucţiuni şi date, iar echipamentele periferice asigură interacţiunea dintre sistemul de calcul
10
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Fig. 1.1. Structura generală a sistemelor de calcul bazate pe arhitectura von Neumann
11
ARHITECTURA GENERALĂ
1.1.2 Magistralele
3. Magistrala de control are rolul de a conduce semnalele de control ale UCP care
comandă componentele sistemului. De exemplu, semnalele transmise prin intermediul
magistralei de control pot specifica modul de acces la memorie în vederea realizării
unor operaţii de scriere sau de citire. Practic liniile de scriere şi citire ale magistralei
controlează direcţia datelor de pe magistrala de date. Alte semnale ale magistralei de
control pot include: tactul sistem, liniile de întrerupere, linii de stare etc.
12
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
1.1.3 Memoria
Memoriile sunt caracterizate prin conţinutul pe care acestea îl stochează într-un set de
regiştri şi locaţia sau adresa individuală a fiecărui registru. În cazul arhitecturii von Neumann,
atât instrucţiunile cât şi datele se găsesc în acelaşi spaţiu de memorie. Indiferent că este
internă sau externă, memoria reprezintă un spaţiu de stocare şi poate fi accesată cu ajutorul
magistralelor dacă se specifică adresa locaţiei dorite şi tipul operaţiei (scriere sau citire).
13
ARHITECTURA GENERALĂ
În Fig. 1.2 sunt alăturate, cu scop comparativ, cele două tipuri de arhitecturi de sisteme
de calcul: von Neumann (Fig. 1.2-a) şi Harvard (Fig. 1.2-b). În cea din urmă se evidenţiază
cele două spaţii de memorie distincte împreună cu magistralele asociate. Fiecare memorie
dispune de propria sa magistrală de adrese, respectiv de date, astfel încât nu există nici o
legătură între adresele sau datele celor două spaţii de memorie.[10,19]
Până acum, în paragrafele anterioare s-a făcut referire doar la câteva sisteme de calcul
care ne trimit cu gândul mai mult spre calculatoarele numerice.
Dar, ce sunt de fapt microprocesoarele, respectiv microcontrolerele?
Pe scurt, microprocesorul implementează funcţiile unităţii centrale de prelucrare.
Pentru a putea fi folosit într-un sistem de calcul, unui microprocesor trebuie să i se adauge
alte componente, cum ar fi memorie, sau componente pentru primirea şi trimiterea datelor.
Pe de altă parte microcontrolerul a fost proiectat să conţină toate cele trei
componente principale (UCP, memorie, echipamente de intrare-ieşire) într-un singur circuit
integrat. Astfel, nu mai sunt necesare alte componente externe deoarece toate perifericele
sunt deja incluse în el. Funcţiile principale ale componentelor însă rămân neschimbate fiind
aceleaşi indiferent de aplicaţia dezvoltată, dar din motive de preţ şi dimensiune
microcontrolerele dispun de un set redus de instrucţiuni şi o capacitate de adresare mai mică.
Astfel, făcând trimitere la cele două tipuri de arhitecturi prezentate anterior în Fig. 1.1
şi Fig. 1.2, microprocesorul reprezintă unitatea centrală de prelucrare, pe când
microcontrolerul reprezintă întreg sistemul de calcul.[4,6]
14
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
15
ARHITECTURA GENERALĂ
16
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
1
http://www.microchip.com [22]
17
ARHITECTURA GENERALĂ
Unul dintre avantajele importante ale arhitecturii Harvard este dat de faptul că
magistralele celor două tipuri de memorii pot avea dimensiuni diferite. Astfel, magistrala de
date (instrucţiuni) a memoriei program împreună cu memoria program pot fi organizate pe
cuvinte (în cazul analizat este vorba de cuvinte de 16 biţi), iar magistrala şi memoria de date
sunt organizate pe octet. Acest lucru, combinat cu setul redus de instrucţiuni permit
implementarea unor instrucţiuni cu lungime fixă ce pot fi extrase într-un singur pas.
18
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
19
ARHITECTURA GENERALĂ
fiecare instrucţiune. Sub controlul acestui numărător, instrucţiunile vor fi extrase pe rând din
memoria program, iar apoi vor fi executate.
Doi regiştri de instrucţiuni, care împreună formează Pipeline-ul, vor stoca codul
instrucţiunilor extrase din memoria program. Cel de sus, Registrul de Instrucţiuni 1 (RI1) va
stoca instrucţiunea n şi o va păstra pe durata următorului ciclu instrucţiune. Această structură
permite ca instrucţiunea n-1, aflată în registrul de la baza pipeline-ului (Registrul de
Instrucţiuni 2 - RI2) să fie executată în timp ce instrucţiunea n este extrasă din memorie şi
stocată în Registrul de instrucţiuni 1 al pipeline-ului. După execuţia instrucţiunii n-1 se
transferă conţinutul din registrul de instrucţiuni 1 al pipeline-ului în registrul de instrucţiuni 2,
urmând ca în timp ce instrucţiunea n+1 este extrasă din memorie şi stocată în vârful pipeline-
ului, instrucţiunea de la bază (instrucţiunea n) să fie executată.
Una din componentele de bază ale UCP, decodificatorul, are rolul de a descifra codul
instrucţiunii stocate în registrul de la baza pipeline-ului şi contribuie la generarea semnalelor
de control interne necesare pentru execuţia instrucţiunii.
20
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
bit 7 bit 0
- - - N OV Z DC C
Fig. 1.9. Registrul STATUS
21
ARHITECTURA GENERALĂ
Adresă
Colecţie de biţi utilizaţi pentru a identifica locaţiile de memorie
Termeni Ciclu instrucţiune
esenţiali Procesul prin care se extrage o instrucţiune din memoria program şi se
execută
CISC
Complex Instruction Set Computer
Dată
Conţinutul unei locaţii de memorie
Instrucţiuni
Comenzi pe care le execută UCP
Magistrală
Colecţie de fire prin care informaţia se transmite paralel între componentele
unui sistem de calcul
Memorie
Spaţiu de stocare
Memorie de date
Spaţiu de stocare temporar (RAM) pentru datele cu care lucrează programul
22
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Memorie program
Spaţiu de stocare pentru program
Microcontroler
Sistem de calcul încapsulat într-un singur circuit integrat
Microprocesor
Parte componentă a unui sistem de calcul, UCP
Numărător de program
Numărător binar utilizat pentru adresarea instrucţiunilor. Conţine adresa
instrucţiunii care urmează a fi executată
PIC
Programmable Intelligent Computer
Pipeline
Tehnică utilizată pentru a creşte numărul de instrucţiuni care pot fi
executate în unitatea de timp. Pipeline-ul nu reduce timpul necesar
execuţiei unei instrucţiuni, ci creşte numărul de instrucţiuni care pot fi
procesate simultan
Port
Calea de legătură a sistemului de calcul cu lumea exterioară prin care acesta
poate să trimită şi să primească date
Registru
Spaţiu de stocare
Registru de instrucţiuni
Spaţiu de stocare temporar pentru o instrucţiune extrasă din memorie
RISC
Reduced Instruction Set Computer
STATUS
Registru care indică starea operaţiilor aritmetice şi logice executate de
unitatea aritmetică şi logică
UAL
Unitate aritmetică şi logică
UCP
Unitate centrală de prelucrare
WREG
Registru de lucru / acumulator. În general conţine unul din operanzii
instrucţiunilor
23
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
1. ARHITECTURA GENERALĂ
Introducere
Obiective
1.1 ARHITECTURA VON NEUMANN
Cuprins
1.1.1 Unitatea centrală de prelucrare
1.1.2 Magistralele
1.1.3 Memoria
1.1.4 Echipamentele de intrare-ieşire
1.2 ARHITECTURA HARVARD
1.3 MICROPROCESOR SAU MICROCONTROLER?
1.4 STRUCTURA INTERNĂ A MICROCONTROLERELOR
DIN FAMILIA PIC18F
1.4.1 Execuţia instrucţiunilor
1.4.2 Unitatea de control
1.4.3 Unitatea aritmetică şi logică
Concluzii
Întrebări de autoevaluare
Termeni esenţiali
9
ARHITECTURA GENERALĂ
Din punct de vedere istoric sistemele de calcul moderne îşi au originea în cele
dezvoltate în timpul celui de-al doilea război mondial. Aceste sisteme iniţiale îndeplineau o
funcţionalitate dedicată, fiind proiectate pentru a realiza o singură sarcină pe baza unui set de
date, iar pentru a-şi schimba comportamentul era necesară refacerea conexiunilor fizice dintre
elementele componente. Evoluţia esenţială a acestor sisteme de calcul rudimentare s-a produs
în momentul în care s-a înţeles că programul putea fi stocat în memorie alături de date. Unul
dintre avantajele acestei arhitecturi, denumită von Neumann, după numele celui care a
coordonat proiectul, îl reprezintă flexibilitatea. Astfel, modificarea programului presupune
doar încărcarea secvenţei de biţi corespunzătoare în zona de memorie potrivită.
Simplitatea arhitecturii von Neumann a făcut ca majoritatea sistemelor de calcul
moderne să fie bazate pe această structură. Elementele caracteristice ale acestor sisteme de
calcul sunt: unitatea centrală de prelucrare (UCP), memoriile, echipamentele de intrare ieşire
şi magistralele. Unitatea centrală de prelucrare conţine o unitate de control, care realizează
interpretarea, secvenţierea instrucţiunilor şi comandă celelalte componente ale sistemului, şi o
unitate aritmetică şi logică (UAL), care execută instrucţiuni. Unitatea de memorie stochează
instrucţiuni şi date, iar echipamentele periferice asigură interacţiunea dintre sistemul de calcul
10
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Fig. 1.1. Structura generală a sistemelor de calcul bazate pe arhitectura von Neumann
11
ARHITECTURA GENERALĂ
1.1.2 Magistralele
3. Magistrala de control are rolul de a conduce semnalele de control ale UCP care
comandă componentele sistemului. De exemplu, semnalele transmise prin intermediul
magistralei de control pot specifica modul de acces la memorie în vederea realizării
unor operaţii de scriere sau de citire. Practic liniile de scriere şi citire ale magistralei
controlează direcţia datelor de pe magistrala de date. Alte semnale ale magistralei de
control pot include: tactul sistem, liniile de întrerupere, linii de stare etc.
12
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
1.1.3 Memoria
Memoriile sunt caracterizate prin conţinutul pe care acestea îl stochează într-un set de
regiştri şi locaţia sau adresa individuală a fiecărui registru. În cazul arhitecturii von Neumann,
atât instrucţiunile cât şi datele se găsesc în acelaşi spaţiu de memorie. Indiferent că este
internă sau externă, memoria reprezintă un spaţiu de stocare şi poate fi accesată cu ajutorul
magistralelor dacă se specifică adresa locaţiei dorite şi tipul operaţiei (scriere sau citire).
13
ARHITECTURA GENERALĂ
În Fig. 1.2 sunt alăturate, cu scop comparativ, cele două tipuri de arhitecturi de sisteme
de calcul: von Neumann (Fig. 1.2-a) şi Harvard (Fig. 1.2-b). În cea din urmă se evidenţiază
cele două spaţii de memorie distincte împreună cu magistralele asociate. Fiecare memorie
dispune de propria sa magistrală de adrese, respectiv de date, astfel încât nu există nici o
legătură între adresele sau datele celor două spaţii de memorie.[10,19]
Până acum, în paragrafele anterioare s-a făcut referire doar la câteva sisteme de calcul
care ne trimit cu gândul mai mult spre calculatoarele numerice.
Dar, ce sunt de fapt microprocesoarele, respectiv microcontrolerele?
Pe scurt, microprocesorul implementează funcţiile unităţii centrale de prelucrare.
Pentru a putea fi folosit într-un sistem de calcul, unui microprocesor trebuie să i se adauge
alte componente, cum ar fi memorie, sau componente pentru primirea şi trimiterea datelor.
Pe de altă parte microcontrolerul a fost proiectat să conţină toate cele trei
componente principale (UCP, memorie, echipamente de intrare-ieşire) într-un singur circuit
integrat. Astfel, nu mai sunt necesare alte componente externe deoarece toate perifericele
sunt deja incluse în el. Funcţiile principale ale componentelor însă rămân neschimbate fiind
aceleaşi indiferent de aplicaţia dezvoltată, dar din motive de preţ şi dimensiune
microcontrolerele dispun de un set redus de instrucţiuni şi o capacitate de adresare mai mică.
Astfel, făcând trimitere la cele două tipuri de arhitecturi prezentate anterior în Fig. 1.1
şi Fig. 1.2, microprocesorul reprezintă unitatea centrală de prelucrare, pe când
microcontrolerul reprezintă întreg sistemul de calcul.[4,6]
14
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
15
ARHITECTURA GENERALĂ
16
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
1
http://www.microchip.com [22]
17
ARHITECTURA GENERALĂ
Unul dintre avantajele importante ale arhitecturii Harvard este dat de faptul că
magistralele celor două tipuri de memorii pot avea dimensiuni diferite. Astfel, magistrala de
date (instrucţiuni) a memoriei program împreună cu memoria program pot fi organizate pe
cuvinte (în cazul analizat este vorba de cuvinte de 16 biţi), iar magistrala şi memoria de date
sunt organizate pe octet. Acest lucru, combinat cu setul redus de instrucţiuni permit
implementarea unor instrucţiuni cu lungime fixă ce pot fi extrase într-un singur pas.
18
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
19
ARHITECTURA GENERALĂ
fiecare instrucţiune. Sub controlul acestui numărător, instrucţiunile vor fi extrase pe rând din
memoria program, iar apoi vor fi executate.
Doi regiştri de instrucţiuni, care împreună formează Pipeline-ul, vor stoca codul
instrucţiunilor extrase din memoria program. Cel de sus, Registrul de Instrucţiuni 1 (RI1) va
stoca instrucţiunea n şi o va păstra pe durata următorului ciclu instrucţiune. Această structură
permite ca instrucţiunea n-1, aflată în registrul de la baza pipeline-ului (Registrul de
Instrucţiuni 2 - RI2) să fie executată în timp ce instrucţiunea n este extrasă din memorie şi
stocată în Registrul de instrucţiuni 1 al pipeline-ului. După execuţia instrucţiunii n-1 se
transferă conţinutul din registrul de instrucţiuni 1 al pipeline-ului în registrul de instrucţiuni 2,
urmând ca în timp ce instrucţiunea n+1 este extrasă din memorie şi stocată în vârful pipeline-
ului, instrucţiunea de la bază (instrucţiunea n) să fie executată.
Una din componentele de bază ale UCP, decodificatorul, are rolul de a descifra codul
instrucţiunii stocate în registrul de la baza pipeline-ului şi contribuie la generarea semnalelor
de control interne necesare pentru execuţia instrucţiunii.
20
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
bit 7 bit 0
- - - N OV Z DC C
Fig. 1.9. Registrul STATUS
21
ARHITECTURA GENERALĂ
Adresă
Colecţie de biţi utilizaţi pentru a identifica locaţiile de memorie
Termeni Ciclu instrucţiune
esenţiali Procesul prin care se extrage o instrucţiune din memoria program şi se
execută
CISC
Complex Instruction Set Computer
Dată
Conţinutul unei locaţii de memorie
Instrucţiuni
Comenzi pe care le execută UCP
Magistrală
Colecţie de fire prin care informaţia se transmite paralel între componentele
unui sistem de calcul
Memorie
Spaţiu de stocare
Memorie de date
Spaţiu de stocare temporar (RAM) pentru datele cu care lucrează programul
22
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Memorie program
Spaţiu de stocare pentru program
Microcontroler
Sistem de calcul încapsulat într-un singur circuit integrat
Microprocesor
Parte componentă a unui sistem de calcul, UCP
Numărător de program
Numărător binar utilizat pentru adresarea instrucţiunilor. Conţine adresa
instrucţiunii care urmează a fi executată
PIC
Programmable Intelligent Computer
Pipeline
Tehnică utilizată pentru a creşte numărul de instrucţiuni care pot fi
executate în unitatea de timp. Pipeline-ul nu reduce timpul necesar
execuţiei unei instrucţiuni, ci creşte numărul de instrucţiuni care pot fi
procesate simultan
Port
Calea de legătură a sistemului de calcul cu lumea exterioară prin care acesta
poate să trimită şi să primească date
Registru
Spaţiu de stocare
Registru de instrucţiuni
Spaţiu de stocare temporar pentru o instrucţiune extrasă din memorie
RISC
Reduced Instruction Set Computer
STATUS
Registru care indică starea operaţiilor aritmetice şi logice executate de
unitatea aritmetică şi logică
UAL
Unitate aritmetică şi logică
UCP
Unitate centrală de prelucrare
WREG
Registru de lucru / acumulator. În general conţine unul din operanzii
instrucţiunilor
23
SETUL DE INSTRUCŢIUNI
2. SETUL DE INSTRUCŢIUNI
Introducere
Obiective
2.1 FORMATUL INSTRUCŢIUNILOR
Cuprins
2.1.1 Instrucţiuni pe octet
2.1.2 Instrucţiuni pe bit
2.1.3 Instrucţiuni cu constante
2.1.4 Instrucţiuni de control
2.2 CLASIFICAREA INSTRUCŢIUNILOR ÎN FUNCŢIE DE
OPERAŢIILE REALIZATE
2.2.1 Instrucţiuni matematice pe octet
2.2.2 Instrucţiuni logice pe octet
2.2.3 Instrucţiuni matematice şi logice cu constante
2.2.4 Instrucţiuni logice pe bit
2.2.5 Instrucţiuni de comparaţie pe bit
2.2.6 Instrucţiuni de comparaţie pe octet
2.2.7 Instrucţiuni de mutare
2.2.8 Instrucţiuni de control
2.2.9 Alte instrucţiuni
Concluzii
Întrebări de autoevaluare
Termeni esenţiali
24
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Scrierea unui program se poate asemăna, într-o oarecare măsură, cu ridicarea unei
case. Având la dispoziţie o serie de materiale de costrucţii, constructorul le asamblează pe
acestea într-o anumită ordine pentru a obţine produsul finit. Etapele necesare construcţiei:
săparea fundaţiei, zidirea, tencuirea etc. pot fi asociate instrucţiunilor implementate de UCP,
iar materialele şi echipamentele de construcţii necesare: cărămizi, mortar, ciment etc.
reprezintă datele cu care lucrează instrucţiunile.
În conformitate cu arhitectura de tip RISC pe care este bazat, microcontrolerul
PIC18F4455 implementeză un set redus de instrucţiuni standard, format din 75 de
instrucţiuni, care este completat cu 8 instrucţiuni opţionale care formează setul extins.[15]
Din setul standard de instrucţiuni, majoritatea (71) au lungimea de un cuvânt (16 biţi),
dar există şi 4 instrucţiuni având lungimea de două cuvinte (32 biţi). Pentru reprezentarea
acestor instrucţiuni în memoria program sunt necesari 16, respectiv 32 de biţi, adică 2,
respectiv 4 locaţii de memorie consecutive. Instrucţiunile lungi au fost introduse pentru a
25
SETUL DE INSTRUCŢIUNI
putea stoca toată informaţia necesară execuţiei operaţiilor pe care le implementează (ex.
instrucţiunea MOVFF utilizează ca operanzi două adrese absolute din memorie reprezentate
fiecare pe câte 12 biţi).
În esenţă majoritatea instrucţiunilor utilizează date stocate în memorie. În aceste
condiţii, o instrucţiune trebuie să aibă posibilitatea de a informa UCP despre tipul operaţiei
pe care o implementează, respectiv despre locul unde se găsesc datele cu care această
instrucţiune operează. Astfel, o instrucţiune va codifica binar următoarele informaţii:
- codul operaţiei
- unul sau mai mulţi operanzi (adresă, constantă, bit de destinaţie, bit de acces)
Există şi câteva excepţii de la această regulă cum ar fi, de exemplu, instrucţiunea NOP
(No OPeration), care consumă timpul procesorului fără a realiza însă o operaţie.
Pentru acest microcontroler au fost definite mai multe formate de instrucţiuni.
Lungimea câmpului corespunzător codului operaţiei variază în funcţie de tipul instrucţiunii,
permiţând astfel o utilizare mai eficientă a lungimii instrucţiunii.
Setul de instrucţiuni al microcontrolerului PIC18F4455 poate fi împărţit în patru
categorii de bază:
- Instrucţiuni pe octet
- Instrucţiuni pe bit
- Instrucţiuni cu constante (literali)
- Instrucţiuni de control
26
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
15 10 9 8 7 0
Cod operaţie d a f (adresa registrului)
Fig. 2.1. Formatul general al instrucţiunilor orientate pe octet
În program, aceste instrucţiuni vor fi scrise sub forma prezentată în Tabelul 2.1. Tot în
acest tabel se pune în evidenţă şi cazul unor instrucţiuni care operează cu octeţi, dar care
utilizează doar două argumente
Excepţie de la modul de reprezentare din Fig. 2.1 face instrucţiunea de mutare a unui
octet de la o adresă sursă la o adresă destinaţie (MOVFF). Această instrucţiune face parte din
categoria instrucţiunilor lungi şi necesită 32 de biţi pentru reprezentare. Formatul general al
acestei instrucţiuni se prezintă în Fig. 2.2.
15 12 11 0
Cod operaţie fs (adresa registrului sursă)
15 12 11 0
1 1 1 1 fd (adresa registrului destinaţie)
Fig. 2.2. Formatul general al instrucţiunilor de mutare octet MOVFF
27
SETUL DE INSTRUCŢIUNI
În cazul instrucţiunii MOVFF, prezentată mai sus, câmpurile alocate adreselor sursă şi
destinaţie au dimensiunea de 12 biţi. Astfel, această instrucţiune permite utilizarea adreselor
absoulute în realizarea operaţiei de mutare a unui octet între cele două locaţii de memorie.
Pentru codul operaţiei sunt rezervaţi 4 biţi (biţii <15:12> din cuvântul superior), iar cei 4 biţi
rămaşi neutilizaţi sunt întotdeauna 1 (biţii <15:12> din cuvântul inferior).
15 12 11 9 8 7 0
Cod operaţie b (poziţie bit) a f (adresa registrului)
Fig. 2.3. Formatul general al instrucţiunilor orientate pe bit
Instrucţiunile cu constante utilizează un singur operand k. Acesta are rezervaţi cei opt
biţi inferiori ai instrucţiunii şi reprezintă valoarea unei constante, denumită şi literal. Modul
de reprezentare al acestor instrucţiuni în memoria program se prezintă în Fig. 2.4.
28
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
15 8 7 0
Cod operaţie k (constantă)
Fig. 2.4. Formatul general al instrucţiunilor orientate pe bit
29
SETUL DE INSTRUCŢIUNI
15 8 7 0
Cod operaţie n<7:0> (adresă din memoria program)
15 12 11 0
1 1 1 1 n<19:8> (adresă din memoria program)
Fig. 2.5. Formatul general al unei instrucţiuni de control
30
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
acolo. Cele două situaţii posibile sunt puse în evidenţă în Fig. 2.6.
Parametrul a intervine în modul de formare al adresei f. Asupra acestui
parametru se va reveni în capitolul 3. În exemplele care vor urma acest
parametru se consideră ca având valoarea a=0.
31
SETUL DE INSTRUCŢIUNI
În cazul b.:
ADDWF 0x2C, F, 0
se produce acelaşi rezultat, dar acesta va fi stocat în memorie la adresa
0x02C, înlocuind operandul 2.
După cum se poate vedea şi din figură, operaţiile realizate pot influenţa şi
starea biţilor indicatori din registrul STATUS. Bineînţeles, pentru valorile
alese ale operanzilor, registrul STATUS nu este influenţat în urma execuţiei
instrucţiunii.
În acestă categorie s-au considerat instrucţiunile care realizează operaţii logice asupra
datelor cu dimensiunea de opt biţi. Printre operaţiile realizate se pot aminti: ŞI logic, SAU
logic, SAU-EXCLUSIV, Complement, rotire de biţi etc.
Tabelul 2.6 cuprinde instrucţiunile care se încadrează în categoria instrucţiunilor
logice pe octet.
O analiză comparativă între instrucţiunile din această categorie şi cele din categoria
instrucţiunilor matematice pe octet pune în evidenţă faptul că parametrii acestor instrucţiuni
(f,d,a) sunt aceeaşi şi îndeplinesc acelaşi rol. Se pot identifica totuşi câteva instrucţiuni, a
căror înţelegere poate ridica mici probleme. Este vorba despre instrucţiunile de rotire, la
stânga sau la dreapta, cu sau fără bit de transport (en. Carry). Aceste instrucţiuni vor fi
analizate în exemplul următor.
1
rezultatul acestei operaţii se va regăsi în regiştrii PRODH:PRODL
32
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
RLCF REG, W, 0
Înaintea instrucţiunii:
REG = 11100110
C = 0
După instrucţiune:
REG = 11100110
WREG = 11001100
C = 1
33
SETUL DE INSTRUCŢIUNI
RLCF REG, W, 0
Înaintea instrucţiunii:
REG = 11100110
C = 0
După instrucţiune:
REG = 11100110
WREG = 11001101
C = 1
34
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Aceste instrucţiuni au fost grupate într-o singură categorie deoarece respectă acelaşi
format şi acelaşi principiu de funcţionare, după cum se poate vedea din Tabelul 2.7, dar şi în
exemplul considerat.
ANDLW 0x0F
Înaintea instrucţiunii:
WREG = 11100110
După instrucţiune:
WREG = 00000110
35
SETUL DE INSTRUCŢIUNI
În această categorie au fost grupate instrucţiunile care manipulează starea unui singur
bit prin realizarea unor operaţii de setare, resetare sau negare a stării (en. toggle). De altfel,
această categorie cuprinde doar trei instrucţiuni cu format asemănător care implementează
cele trei operaţii amintite anterior. Tabelul 2.8 centralizează aceste instrucţiuni.
BCF REG, 2, 0
Înaintea instrucţiunii:
REG = 11100110
După instrucţiune:
REG = 11100010
36
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
37
SETUL DE INSTRUCŢIUNI
38
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Bucla_for
CLRF 0x00, 0
DECFSZ REG, F, 0
GOTO Bucla_for
39
SETUL DE INSTRUCŢIUNI
Instrucţiunile din această categorie permit mutarea datelor dintr-o locaţie în alta a
memoriei de date sau permit încărcarea unor constante în anumiţi regiştri. Aceste instrucţiuni
sunt prezentate în Tabelul 2.11.
Exemplu
MOVLW 0x55 ; 0x55Æ WREG
MOVWF 0x2A, 0 ; WREGÆ[F02A]
40
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Instrucţiunile de salt condiţionat (BC, BN, BNC, BNN, BNOV, BNZ, BOV,
BZ) realizează saltul la o instrucţiune destinaţie marcată printr-o etichetă dacă rezultatul
operaţiilor anterioare îndeplineşte anumite criterii care pot fi verificate prin intermediul biţilor
indicatori din registrul STATUS.
Instrucţiunile de salt necondiţionat vor realiza saltul prin modificarea directă a valorii
numărătorului program. Astfel, instrucţiunea BRA realizează un salt la o instrucţiune
destinaţie prin adaugarea unui offset la adresa curentă stocată de numărătorul program, iar
instrucţiunea GOTO realizează saltul direct la orice adresă din spaţiul de memorie al
programului. În consecinţă, instrucţiunea BRA realizează un salt relativ, iar instrucţiunea
GOTO realizează un salt absolut în memoria program.
Modul de execuţie al celor două instrucţiuni se prezintă în Fig. 2.12.
41
SETUL DE INSTRUCŢIUNI
Fig. 2.12. Exemplificarea diferenţei între saltul necondiţionat relativ (BRA)şi cel absolut (GOTO)
42
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
43
SETUL DE INSTRUCŢIUNI
MOVLW D’71’
MOVWF REG, 0
MOVLW D’50’
MOVWF CONTOR, 0
Bucla_for:
INCF REG, F, 0
DECFSZ CONTOR, F, 0
GOTO Bucla_for
BSF REG, 4, 0
MOVLW D’200’
CPFSGT REG, 0
SETF REG,0
CLRF REG,0
Carry
Bit de transport. Se găseşte în registrul STATUS
Termeni Codul operaţiei
esenţiali Tipul de operaţie implementat de o anumită instrucţiune
Cuvânt
Doi octeţi. 16 biţi
Decrementare
Operaţie matematică echivalentă cu scăderea cu 1
44
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Etichetă
Identificator introdus în codul sursă pentru a marca adresa de început a
unei instrucţiuni
Incrementare
Operaţie matematică echivalentă adunării cu 1
Instrucţiuni
Comenzi codificate binar pe care le execută UCP
Literal
Valoarea numerică constantă
Memorie
Spaţiu de stocare
Memorie de date
Spaţiu de stocare temporar (RAM) pentru datele cu care lucrează
programul
Memorie program
Spaţiu de stocare pentru program
Numărător de program
Numărător binar utilizat pentru adresarea instrucţiunilor. Conţine adresa
instrucţiunii care urmează a fi executată
Octet
1 Byte = 8 biţi. Capacitatea de stocare a unui registru
Registru
Spaţiu de stocare . Locaţie de memorie .
Resetare
Punerea unui bit sau a unui grup de biţi pe 0 logic
RISC
Reduced Instruction Set Computer
Setare
Punerea unui bit sau a unui grup de biţi pe 1 logic
STATUS
Registru care indică starea operaţiilor aritmetice executate de unitatea
aritmetică şi logică
WREG
Registru de lucru / acumulator. În general conţine unul din operanzii
instrucţiunilor
45
ORGANIZAREA MEMORIEI
3. ORGANIZAREA MEMORIEI
Introducere
Obiective
3.1 MEMORIA PROGRAM
Cuprins
3.1.1 Structura memoriei program
3.1.2 Numărătorul de program
3.1.3 Stiva adreselor de revenire
3.2 MEMORIA DE DATE RAM
3.2.1 Utilizarea Bank-urilor
3.2.2 Utilizarea Access Bank-ului
3.2.3 Utilizarea instrucţiunii MOVFF
3.3 MEMORIA DE DATE EEPROM
Concluzii
Întrebări de autoevaluare
Termeni esenţiali
46
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
47
ORGANIZAREA MEMORIEI
program se poate stoca un program format din până la 12268 de instrucţiuni scurte (de 16
biţi).
Accesarea unei locaţii de memorie cuprinsă între limita superioară a memoriei
implementate fizic şi limita maximă a spaţiului de adresare de 2MByte va întoarce valoarea
zero, fiind echivalentă execuţiei instrucţiunii NOP (No OPeration).
Microcontrolerele din familia PIC18 dispun de doi vectori de întrerupere care se
găsesc la adresele 0008h şi 0018h. La apariţia unor înteruperi vor fi executate în mod
automat instrucţiunile care se vor regăsi în memorie la aceste adrese. Asupra acestei chestiuni
se va reveni în capitolul dedicat sistemului de întreruperi. Adresa de reset a
microcontrolerului se găseşte la locaţia 0000h. Aceasta este adresa la care se resetează
numărătorul de program. În afara acestor trei locaţii de memorie mai speciale, restul locaţiilor
memoriei program sunt echivalente.[10,15]
În Fig. 3.1 se prezintă harta memoriei program pentru microcontrolerul PIC18F4455.
După cum s-a putut vedea în capitolul anterior, din punct de vedere al dimensiunii,
instrucţiunile pot fi împărţite în două categorii: instrucţiuni scurte (16 biţi) şi instrucţiuni lungi
(32 biţi). Instrucţiunile scurte vor ocupa două locaţii de memorie succesive, iar instrucţiunile
lungi vor ocupa patru locaţii de memorie. În ambele cazuri octetul cel mai puţin semnificativ
al instrucţiunii va ocupa o adresă pară. Următorul exemplu prezintă modul de reprezentare al
instrucţiunilor în memoria program.
48
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Exemplu
49
ORGANIZAREA MEMORIEI
50
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
51
ORGANIZAREA MEMORIEI
52
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Stiva are asociat un indicator de stivă (en. Stack Pointer) cu dimensiunea de 5 biţi,
care se găseşte în registrul STKPTR, biţii <4:0>. La fiecare apel de subrutină (CALL)
indicatorul de sitvă se incrementează automat şi starea numărătorului de program este copiată
în registrul din stivă spre care acesta indică. Adresa salvată reprezintă adresa instrucţiunii
imediat următoare (după CALL). După ce PC a fost pus pe stivă, acesta este suprascris cu
adresa instrucţiunii destinaţie. La fel ca şi în cazul instrucţiunii GOTO, şi instrucţiunea CALL
este tot o instrucţiune lungă, lucru care permite subrutinelor implementate să fie plasate
oriunde în spaţiul memoriei program.
Fig. 3.5-a prezintă configuraţia stivei la reset, atunci când indicatorul de stivă are
valoarea 0. Adresa 0 a stivei nu este utilizată niciodată, deoarece întotdeauna indicatorul de
stivă se incrementează înainterea punerii PC pe stivă. În situaţia prezentată în Fig. 3.5-b se
arată configuraţia stivei după apelul unei subrutine cu eticheta SR_exemplu.
Apelul subrutinei CALL SR_exemplu determină următoarele:
1. Indicatorul de stivă se incrementează;
2. Cei 21 de biţi ai PC se copiază în locaţia din stivă spre care indică indicatorul de stivă.
Datele stocate reprezintă adresa instrucţiunii care urmează după CALL;
53
ORGANIZAREA MEMORIEI
Pe lângă funcţionarea automată a stivei, care a fost prezentată până acum, există şi
posibilitatea de a accesa manual conţinutul stivei. În Fig. 3.7 se prezintă structura stivei care
utilizează, pe lângă indicatorul de stivă din registrul STKPTR, şi tripletul format din regiştrii
de la vârful stivei: TOSU:TOSH:TOSL (Top Of Stack Upper/High/Low). La orice moment
dat, regiştrii TOS conţin cei 21 de biţi de date de pe poziţia din stivă spre care indică
54
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Prin deplasarea indicatorului de stivă în sus şi în jos pot fi accesate datele localizate pe
diferite poziţii în stivă. Astfel, indicatorul de stivă STKPTR<4:0> poate lua valori de la 0 la
31. În momentul în care ajunge la valoarea 31, bitul STKFUL (en. STAcK FuLl) este pus pe 1
indicând stiva plină, iar în momentul în care ajunge la valoarea 0, bitul STKFUNF (en.
STAcK UNderFlow) este pus pe 1. Structura registrului STKPTR care conţine indicatorul de
stivă şi cei doi biţi de stare se prezintă în Fig. 3.8.
7 0
STKFUL STKUNF - SP4 SP3 SP2 SP1 SP0
Fig. 3.8. Structura registrului STKPTR
55
ORGANIZAREA MEMORIEI
Acest tip de memorie este utilizat de regulă pentru stocarea datelor temporare necesare
rulării programelor (ex. variabile şi constante de program).
Capacitatea totală de adresare a memoriei RAM pentru microcontrolerele din familia
PIC18 este de 4096 de octeţi, fiecare octet purtând denumirea de registru. Aceşti regiştri sunt
împărţiţi în două categorii: regiştri destinaţi stocării datelor denumiţi Regiştri de Uz General
(en. GPR = General Purpose Registers), respectiv regiştri cu anumite funcţii de configurare /
monitorizare cunoscuţi sub denumirea de Regiştri Speciali (en. SFR = Special Function
Registers). Maparea regiştrilor GPR şi SFR în acelaşi spaţiu de adrese permite accesarea lor
prin intermediul unui singur set de instrucţiuni. Din cei 4096 octeţi de memorie RAM,
microcontrolerul PIC18F4455 implementează un total de 2048 de octeţi.
Un spaţiu de stocare de 4kBytes necesită o adresă de 12 biţi (4096 Bytes = 212 Bytes).
După cum s-a putut vedea în capitolul anterior, pentru marea majoritate a instrucţiunilor,
câmpul prevăzut pentru adresă în codul instrucţiunii este de doar 8 biţi. Există patru modalităţi
de a ocoli acest inconvenient pentru a putea accesa întreaga memorie:
- utilizarea Bank-urilor;
- utilizarea Access Bank-ului;
- utilizarea instrucţiunii MOVFF;
- utilizarea pointerilor (vezi capitolul următor).
56
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Fig. 3.10. Structura memoriei RAM la microcontrolerul PIC18F4455 conform foii de catalog [15]
Numărul de bank-uri pentru seria PIC18 este de 16, fiecare bank conţinând 256 de
octeţi. Din aceste 16 bank-uri, microcontrolerul PIC18F4455 implementează doar 8. Regiştrii
SFR sunt implementaţi în partea superioară a bank-ului 15 (160 de octeţi), iar în rest regiştrii
sunt de uz general. Dacă se utilizează comunicarea prin USB, bank-urile 4-7 sunt folosite
pentru a asigura transferul de date USB.
57
ORGANIZAREA MEMORIEI
Pentru formarea adresei complete de 12 biţi se va utiliza un octet care specifică adresa
în cadrul bank-ului (cei 8 biţi inferiori ai adresei complete) şi 4 biţi reprezentând numărul
bank-ului accesat (restul de 4 biţi ai adresei complete).
Majoritatea instrucţiunilor din familia PIC18 utilizează cei 4 biţi pentru selecţia bank-
ului, aceştia fiind accesibili prin intermediul registrului special BSR (en. Bank Select
Register). Acest registru conţine biţii cei mai semnificativi ai adresei de 12 biţi (BSR<3:0>),
ceilalţi 8 biţi ai adresei fiind specificaţi în cadrul instrucţiunii.
Pentru modificarea conţinutului acestui registru este disponibilă o instrucţiune
specială: MOVLB (en. Move Literal to BSR).
De exemplu, selectarea bank-ului 2 se poate realiza cu următoarea instrucţiune:
MOVLB 0x02
sau, luând în considerare că BSR este un simplu registru ca oricare altul, valoarea sa se poate
modifica şi pe baza următoarei secvenţe de instrucţiuni:
MOVLW 0x02
MOVWF BSR
Trebuie menţionat faptul că toate instrucţiunile de lucru cu regiştrii se aplică şi asupra
registrului BSR.
Având în vedere că până la 16 regiştri pot avea aceeaşi adresă inferioară, utilizatorul
trebuie să se asigure că a selectat bank-ul de lucru potrivit înainte de a realiza operaţii de
scriere sau citire. Această situaţie este exemplificată în continuare:
58
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
În exemplul anterior se observă faptul că cei doi regiştri accesaţi, unul din bank-
ul 2 şi celălalt din bank-ul 3, dispun de aceeaşi adresă inferioară (0x00)
introdusă prin intermediul instrucţiunilor.
În Fig. 3.11 se prezintă modul de formare al adresei complete în cazul accesării
directe a memoriei prin intermediul bank-urilor şi a registrului BSR.
Fig. 3.11. Formarea adresei în vederea accesării memoriei RAM prin Bank-uri
59
ORGANIZAREA MEMORIEI
operaţie de scriere sau citire a memoriei poate deveni foarte ineficientă din cauza creşterii
numărului de instrucţiuni utilizate, care conduce, în mod evident, spre creşterea timpului de
execuţie al programului, şi predispune frecvent la erori.
Această problemă a fost rezolvată prin introducerea unei zone virtuale de memorie
denumită Access Bank, accesibilă fără modificarea bank-ului. Această zonă de memorie
mapează primii 96 de regiştri GPR (din Bank 0) şi cei 160 de regiştri SFR (din Bank 15).
Pentru a accesa zona de memorie mapată în Access Bank, utilizatorul va fi nevoit să
reseteze bitul de acces (a=0 sau a=ACCESS) existent în cadrul instrucţiunilor.
Astfel, când bitul de access (a) al instrucţiunilor va avea valoarea 1 (BANKED), la
formarea adresei se va lua în considerare conţinutul registrului BSR, iar operandul f al
instrucţiunilor va reprezenta locaţia accesată din cadrul bank-ului selectat. Când bitul de
access (a) al instrucţiunilor va avea valoarea 0 (ACCESS), conţinutul registrului BSR este
ignorat, iar operandul f al instrucţiunilor va reprezenta adresa unei locaţii din Access Bank.
Instrucţiunea MOVFF permite mutarea unui octet de date dintr-un loc în orice alt loc al
memoriei RAM de date. MOVFF este una din cele doar patru instrucţiuni lungi (având 32 biţi)
disponibile în setul de instrucţiuni al microcontrolerului, lucru care îi permite să stocheze, de
una singură, adresele complete de 12 biţi ale regiştrilor sursă şi destinaţie. Astfel, dacă se
doreşte, de exemplu, să se mute un octet din registrul de la adresa 0xF81 (PORTB) în locaţia
de memorie de la adresa 0x220 se poate utiliza MOVFF 0xF81, 0x220, fără a recurge la
Access Bank sau Bank-uri. Totuşi, având în vedere că MOVFF este o instrucţiune lungă,
aceasta va necesita două cicluri instrucţiune pentru a fi extrasă din memoria program, având
astfel un timp de execuţie dublu faţă de instrucţiunile simple.
60
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
61
ORGANIZAREA MEMORIEI
Access Bank
Zonă virtuală de memorie prin intermediul căreia se pot accesa primii 96
Termeni de regiştri GPR din Bank 0 şi cei 160 de regiştri SFR din Bank 15.
esenţiali Bank
Zonă de memorie formată din 256 de octeţi utilizată ca diviziune a
memoriei RAM de date.
BSR
Bank Select Register. Registru de selecţie a Bank-urilor
EEPROM
Electrically Erasable Programmable Read-Only Memory. Memorie
nevolatilă utilizată pentru a stoca mici cantităţi de date care trebuie
păstrate în lipsa alimentării.
Etichetă
Identificator introdus în codul sursă pentru a marca adresa de început a
unei instrucţiuni
GPR
General Purpose Registers. Regiştri de uz general
LIFO
Last In First Out. Mod în care sunt stocate şi scoase datele din stivă.
Memorie de date
Spaţiu de stocare temporar (RAM) pentru datele cu care lucrează
programul
62
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Memorie program
Spaţiu de stocare pentru program
Memorie virtuală
Tehnică de gestiune a memoriei care virtualizează diferite forme de
stocare a datelor (ex. RAM) care pot fi accesate din program în mod
asemănător memoriei fizice.
Numărător de program
Numărător binar utilizat pentru adresarea instrucţiunilor. Conţine adresa
instrucţiunii care urmează a fi executată
Octet
1 Byte = 8 biţi. Capacitatea de stocare a unui registru
PCL
Program Counter Low. Registrul care conţine biţii <7:0> ai numărătorului
de program.
PCLATH
Program Counter Latch High. Registru tampon asociat PCH
PCLATU
Program Counter Latch Upper. Registru tampon asociat PCU
PCH
Program Counter High. Registrul care conţine biţii <15:8> ai
numărătorului de program. Este un registru ascuns şi nu poate fi accesat
direct.
PCU
Program Counter Upper. Registrul care conţine biţii <20:16> ai
numărătorului de program. Este un registru ascuns şi nu poate fi accesat
direct.
Registru
Spaţiu de stocare . Locaţie de memorie. Octet în memoria RAM de date
SFR
Special Function Registers. Regiştri cu funcţii speciale
STKPTR
Stack Pointer Register. Registrul care conţine indicatorul de stivă şi doi
biţi care indică starea stivei.
63
ORGANIZAREA MEMORIEI
Stivă
Spaţiu de memorie în care se salvează adresele de revenire în cazul
apelurilor de subrutină
TOS
Top of stack. Regiştrii de la vârful stivei (TOSU:TOSH:TOSL) care
conţin imaginea datelor din stivă spre care indică indicatorul de stivă
64
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Introducere
Obiective
4.1 VARIABILE ŞI NUME SIMBOLICE
Cuprins
4.2 ADRESAREA DIRECTĂ
4.3 ADRESAREA INDIRECTĂ
4.3.1 Regiştri de adresare şi accesare conţinut
4.3.2 Adresarea indexată
Concluzii
Întrebări de autoevaluare
Termeni esenţiali
65
ADRESAREA MEMORIEI DE DATE
Noţiunea de „variabilă” presupune în varianta cea mai simplă o zonă de memorie care
are asociat un nume şi care îşi poate modifica valoarea pe parcursul execuţiei programului.
Spre deosebire de limbajele de nivel înalt (cum ar fi limbajul C), unde localizarea exactă în
memorie şi legarea numelui simbolic de adresa fizică nu sunt cunoscute, în domeniul
microcontrolerelor, utilizatorul are control total asupra implementării noţiunii de variabilă.
Variabila poate reprezenta un registru GPR, un registru SFR, un octet din memoria
EEPROM sau chiar un octet din memoria program. Deoarece variabilele sunt asociate datelor
care se modifcă frecvent (la nivel de microsecundă), utilizarea EEPROM-ului sau a memoriei
program pentru implementarea acestora nu pare a fi o soluţie viabilă. De regulă, memoria
EEPROM şi memoria program sunt folosite pentru stocarea constantelor sau a unor valori
care se modifică la intervale de timp foarte mari (la nivel de secunde sau chiar ore). Din
această cauză, singura soluţie practică pentru implementarea variabilelor rămâne cea a
memoriei RAM de date.[8]
Acestea fiind zise, putem considera o variabilă ca fiind un registru situat într-un
anumit bank (de la 0 la 15) şi având o anumită adresă (de la 0 la 255). Manipularea variabilei
se poate realiza fie utilizând adresa fizică, fie prin ataşarea unui nume simbolic adresei
respective.
66
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Chiar dacă acest fragment de cod este corect, iar cu ajutorul comentariilor funcţionarea
sa poate fi urmărită şi înţeleasă, nu este totuşi prea lizibil. O alternativă la acest cod, dar care
este identică din punct de vedere al asamblorului, poate fi următoarea:
TRISB EQU 0xF93 ; registrul de configurare a direcţiei
; portului B de la adresa 0xF93
Bineînţeles, cea de a doua variantă este de preferat întrucât creşterea clarităţii codului
conduce la reducerea erorilor şi face programele mai uşor de depanat şi de modificat.
În cele două exemple considerate, ataşarea de nume simbolice unor valori s-a realizat
cu ajutorul directivei EQU, prin care se informează asamblorul că în continuare, în program,
valorile numerice respective vor fi înlocuite prin nişte nume. Directiva EQU înseamnă
“EQUivalent to”1 şi este o pseudoinstrucţiune care nu produce cod maşină suplimentar, ci
permite doar transmiterea unei informaţii de la program către compilator.
Astfel, directiva TRISB EQU 0xF93 informează compilatorul că în instrucţiunile
care utilizează numele TRISB ca operand, la preprocesare, acesta să fie înlocuit cu valoarea
0xF93. La fel se întâmplă şi în cazul celui de-al doilea exemplu în care valoarea 0x02, care
reprezintă o adresă din memorie, are ataşată numele simbolic VAR.
1
Această directivă este echivalentă directivei #define din limbajul C
67
ADRESAREA MEMORIEI DE DATE
Cele două exemple prezentate anterior surprind două situaţii în care se realizează
adresarea simbolică: prima în care se utilizează numele simbolic pentru a înlocui adresa unui
registru special (TRISB) în codul instrucţiunii şi cea de-a doua în care se utilizează numele
simbolic pentru a defini adresa unui registru de uz general (0x002).
În realitate numele simbolice asociate regiştrilor SFR sunt predefinite în biblioteca
introdusă la începutul programelor prin directive de tipul #include “p18f4455.inc”
şi nu trebuie declarate de programator. De altfel, nu este recomandată implementarea de
variabile în spaţiul de memorie alocat SFR, deoarece modificarea necontrolată a acestor
regiştri poate altera funcţionarea microcontrolerului.
;Secţiune variabile
VAR1 EQU 0x02
VAR2 EQU 0x03
;Secţiune constante
CONST1 EQU B’10001010’
CONST2 EQU D’20’
END
68
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
De multe ori, apare situaţia în care se doreşte alocarea unui număr mare de variabile
sau utilizarea unor nume simbolice care au ataşate o serie de valori în ordine crescătoare. În
acest context se poate utiliza un bloc de nume simbolice în felul următor:
CBLOCK 0x00 ;valoare de start
VAR1 ;VAR1=0
VAR2 ;VAR2=1
VAR3 ;VAR3=2
VAR4 ;VAR4=3
VAR5 ;VAR5=4
ENDC
În cazul adresării directe (Fig. 4.1) câmpul alocat adresei în codul instrucţiunii conţine
adresa efectivă a operandului. Acest mod de adresare necesită o singură referire la memorie,
şi nu necesită un calcul de adresă. Dezavantajul este că permite un spaţiu de adresare limitat,
deoarece lungimea câmpului de adresă este mai mică decât lungimea cuvântului.[5]
69
ADRESAREA MEMORIEI DE DATE
distincte. Pentru a extinde capacitatea de adresare până la cei 12 biţi necesari pentru formarea
adresei complete se utilizează bitul 8 al instrucţiunilor, denumit bit de acces a. Dacă acest bit
este 0 atunci pot fi accesate adresele din domeniul 0x000-0x07F (96 de regiştri GPR) şi
0xF80-0xFFF (160 de regiştri speciali). Pentru a accesa celelalte adrese ale memoriei
RAM, bitul a trebuie setat şi atunci se utilizează octetul inferior al registrului BSR pentru a
completa adresa cu cei patru biţi necesari.
Majoritatea instrucţiunilor ce utilizează adresarea directă au posibilitatea de a plasa
rezultatul operaţiei implementate în registrul de lucru WREG sau înapoi în memoria RAM la
adresa specificată în instrucţiune. Bitul 9 din codul instrucţiunii, denumit bit de destinaţie al
rezultatului d specifică locul în care se va regăsi rezultatul.
În continuare se prezintă câte un exemplu pentru adresarea directă prin Access Bank,
respectiv pentru adresarea directă prin Bank-uri, în care adresa fizică a locaţiei de memorie
accesate este specificată în mod explicit în codul instrucţiunii.
Instrucţiunile
ADDWF 0x3A, w, 0
ADDWF 0x3A, f, 0
Exemplu sunt codificate binar sub forma:
001001 0 0 00111010
respectiv
001001 1 0 00111010
şi în ambele cazuri conţinutul de la adresa 0x3A din Access Bank (a=0)
este adunat cu conţinutul registrului de lucru WREG. Prima instrucţiune
plasează rezultatul operaţiei în WREG (d=0), iar cea de-a doua instrucţiune
suprascrie data de la adresa 0x3A (d=1).
70
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
După cum s-a văzut în exemplele anterioare cei opt biţi de adresă ai operandului sunt
specificaţi în mod explicit, fiind parte integrantă a instrucţiunii şi nu pot fi modificaţi în
timpul execuţiei programului. Chiar dacă aparent aceasta este modalitatea de a localiza exact
o adresă în memoria de date, există situaţii în care această variantă de adresare este restrictivă,
după cum se va vedea din exemplul următor.
71
ADRESAREA MEMORIEI DE DATE
7 4 0 7 0
- - - - Cei 4 biţi superiori ai adresei octetul inferior al adresei
FSR0H FSR0L
Fig 4.2. Structura FSR0 format din perechea FSR0H:FSR0L
7 0
Conţinutul adresei stocate în FSR0H:FSR0L
INDF0
Fig. 4.3. Structura registrului INDF0 corespunzător FSR0 (FSR0H:FSR0L)
73
ADRESAREA MEMORIEI DE DATE
74
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
75
ADRESAREA MEMORIEI DE DATE
Bucla_for:
CLRF INDF0 ; şterg registrul
INCF FSR0L,F ; incrementez adresa
CPFSEQ FSR0L ; verific condiţia de
GOTO Bucla_for ; oprire şi fac salt la
; iteraţia următoare dacă
; FSR0L≠0x60
76
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Cele cinci moduri de a realiza adresarea indirectă invocate prin intermediul regiştrilor
de accesare a conţinutului disponibili pentru fiecare din cei trei regiştri de adresare FSRn sunt
enumerate în continuare:
• INDFn: accesează conţinutul de la adresa stocată în FSRn
• POSTDECn: accesează conţinutul de la adresa stocată în FSRn, apoi
decrementează automat cu ‘1’ această adresă
• POSTINCn: accesează conţinutul de la adresa stocată în FSRn, apoi
incrementează automat cu ‘1’ această adresă
• PREINCn: incrementează cu ’1’ adresa din FSRn, apoi accesează conţinutul
noii adrese
• PLUSWn: adună valoarea (de la -127 la 128) conţinută în registrul de lucru
WREG la valoarea din FSRn, apoi accesează conţinutul de la adresa nou
obţinută
Bucla_for:
CLRF POSTINC0 ;şterg registrul, FSR0++
CPFSEQ FSR0L ;verific condiţia de
GOTO Bucla_for ;oprire şi fac salt la
;iteraţia următoare dacă
; FSR0L≠0x60
78
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Access Bank
Zonă virtuală de memorie prin intermediul căreia se pot accesa primii 96
Termeni de regiştri GPR din Bank 0 şi cei 160 de regiştri SFR din Bank 15.
esenţiali Bank
Zonă de memorie formată din 256 de octeţi utilizată ca diviziune a
memoriei RAM de date.
BSR
Bank Select Register. Registru de selecţie a Bank-urilor
CBLOCK
Directivă ce permite declararea unui bloc de nume simbolice ce iau valori
consecutive
79
ADRESAREA MEMORIEI DE DATE
Directivă
Pseudo-instrucţiune adresată asamblorului
EQU
Directivă ce permite ataşarea de nume simbolice unei valori numerice
FSR
File Select Register. Registru de adresare. Conţine o adresă absolută (12
biţi) din memorie. Este format din FSR0H:FSR0L
GPR
General Purpose Registers. Regiştri de uz general
INDF
Indirect File Operand. Registru de accesare conţinut. Permite accesul la
data stocată în memorie la adresa conţinută în FSR.
Nume simbolic
Denumire ataşată unei valori numerice. Poate fi interpretată ca variabilă
sau constantă.
Pointer
Variabilă ce conţine adrese. În cazul microcntrolerului, ia forma unui
registru de adresare FSR.
POSTINC
Post-incrementare. Accesează conţinutul apoi incrementează adresa
POSTDEC
Post-decrementare. Accesează conţinutul apoi decrementează adresa
PREINC
Pre-incrementare. Incrementează adresa apoi accesează conţinutul.
SFR
Special Function Registers. Regiştri speciali
Variabilă
Locaţie de memorie care are ataşat un nume simbolic
80
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
5. STRUCTURI DE PROGRAM
Introducere
Obiective
5.1 MACROURI
Cuprins
5.2 SUBRUTINE
5.3 TABLOURI
5.3.1 Implementarea tablourilor utilizând instrucţiuni
microprocesor
5.3.2 Implementarea tablourilor utilizând instrucţiuni
dedicate
5.3.3 Implementarea tablourilor utilizând adresarea
indirectă
Concluzii
Întrebări de autoevaluare
Termeni esenţiali
81
STRUCTURI DE PROGRAM
5.1 MACROURI
82
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
ENDM
83
STRUCTURI DE PROGRAM
În exemplul prezentat anterior s-au utilizat doi operanzi pentru macro. În general
macrourile pot avea diferite grade de complexitate ce implică utilizarea mai multor parametri.
Se recomandă ca numele date macrourilor să nu fie aceleaşi cu cele ale instrucţiunilor
microcontrolerului. Dacă definirea macroului implică utilizarea unor etichete în corpul
macroului, atunci se recomandă ca acestea să fie introduse prin directiva local. În acest fel
se pot evita eventualele conflicte care ar putea apărea din cauza denumirii etichetelor din
exteriorul macroului sau din cauza mai multor apeluri ale aceluiaşi macro.
Ceea ce este specific macrourilor este faptul că fiecare apel al acestora echivalează cu
o inserare a setului de instrucţiuni din corpul macroului la adresa de apel. Folosirea acestor
structuri se pretează de regulă în situaţii în care acestea nu conţin multe instrucţiuni şi
integrarea altor structuri (cum ar fi cele cu salt) ar duce la o creştere a timpului de execuţie.
Utilizarea frecventă a macrourilor poate conduce la dificultăţi în depanarea
programelor, mai ales atunci când o simplă macro instrucţiune poate ascunde un număr de
efecte secundare asupra unor regiştri GPR şi SFR sau asupra unor biţi indicatori. Aceste
efecte pot fi reduse prin tehnici de programare cum a fost cea ilustrată în exemplul anterior,
dar nu pot fi eliminate în totalitate de fiecare dată. De exemplu, o sursă frecventă de erori
poate fi cauzată de utilizarea unor instrucţiuni de salt condiţionat peste apelul macroului:
DECFSZ CONTOR, F
My_macro
[…]
Deoarece apelul macroului este de fapt o colecţie de instrucţiuni care formează corpul
macroului, saltul de mai sus va fi de fapt în interiorul macroului, având consecinţe
neprevăzute.
84
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
5.2 SUBRUTINE
Pentru a executa aceleaşi instrucţiuni de mai multe ori fără a recurge la reinserarea
codului, se pot folosi subrutine. În cadrul limbajelor de asamblare, subrutinele iau forma unor
instrucţiuni cuprinse între o etichetă şi o instrucţiune de revenire din subrutină.
În utilizarea subrutinelor se impune respectarea următoarelor cerinţe privind sintaxa şi
modul de utilizare:
- subrutina trebuie apelată folosind instrucţiunea CALL;
- punctul de intrare în subrutină (adresa primei instrucţiuni din subrutină) trebuie marcat
printr-o etichetă. Această etichetă va fi numele instrucţiunii.
- punctul de ieşire din subrutină trebuie să fie o instrucţiune de revenire din subrutină.
Astfel, sintaxa generală utilizată pentru definirea unei subrutine ia forma următoare:
Etichetă:
[INSTRUCŢIUNE 1]
[INSTRUCŢIUNE 2]
[…]
RETURN sau RETLW sau RETFIE
Main:
[…]
CALL Setare_Port
[…]
Setare_Port:
MOVLW 0x7F ;0x7F->WREG
MOVWF TRISB ;WREG->TRISB
RETURN
Main:
MOVLW 0x55 ;0x55->WREG (pas 1)
CALL Setare_Port ;0x7F->WREG !!!
MOVWF 0x20 ;WREG->F[20h] (pas 2)
86
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Rutina_Exemplu:
[…]
RETURN FAST ; restaurare valori salvate
; în stiva rapidă
Main:
[…]
CALL Rutina_Exemplu, FAST ; salvarea regiştrilor WREG,
[…] ; STATUS, BSR în stiva rapidă
În cazul întreruperilor, cei trei regiştri sunt salvaţi automat, însă utilizatorul poate opta
pentru restaurarea valorilor prin folosirea următoarei sintaxe a instrucţiunii de revenire din
subrutina de tratare a întreruperii:
RETFIE FAST
Existenţa stivei rapide cu un nivel permite salvarea şi refacerea contextului în cazul
existenţei unor subrutine neimbricate. În cazul subrutinelor imbricate, însă, se recomandă
salvarea manuală a acestor trei regiştri în nişte locaţii de memorie prevăzute de programator
special pentru acest lucru, iar apoi refacerea regiştrilor respectivi înainte de ieşirea din
subrutină.
Toate instrucţiunile disponibile pentru utilizarea subrutinelor şi variantele lor sunt
prezentate în Tabelul 5.1.[6,15]
87
STRUCTURI DE PROGRAM
5.3 TABLOURI
88
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
program în timp ce execuţia este suspendată. Totuşi, datorită arhitecturii Harvard, care separă
complet memoria program de memoria de date, accesul la datele stocate în memoria program
nu se poate realiza prin intermediul instrucţiunilor obişnuite.
În cazul anumitor microcontrolere s-a ocolit această restricţie impusă de arhitectură
prin implementarea instrucţiunii RETLW care permite realizarea de subrutine care pot întoarce
în registrul de lucru WREG constante de opt biţi din memoria program. Această soluţie este
costisitoare din punct de vedere al memoriei utilizate deoarece fiecare constantă de opt biţi
este stocată sub forma unei instrucţiuni de 16 biţi. În plus nu există un mecanism care să
permită modificarea valorilor după ce acestea au fost programate în memorie.
A doua metodă de implementare a tablourilor în memoria program o reprezintă
utilizarea unor instrucţiuni speciale de scriere şi citire tabelară care sunt implementate la seria
de microcontrolere PIC18.
După cum s-a vazut în Capitolul 4, adresarea indirectă oferă cea de-a treia metodă de
implementare a tabelelor, aceste tabele fiind implementate în memoria RAM de date.
89
STRUCTURI DE PROGRAM
GOTO Main
Tabel:
ADDWF WREG,W ;WREG=index+index
MOVFF PCL,TEMP ;PCL→TEMP,PCH→PCLATH,PCU→PCLATU
ADDWF PCL, F ;PCL+2*index→PCL
RETLW d’101’ ;index 0
RETLW d’115’ ;index 1
RETLW d’90’ ;index 2
RETLW d’83’ ;index 3
RETLW d’85’ ;…
RETLW d’99’
RETLW d’150’
RETLW d’149’
Main:
[…]
MOVLW d’3’ ;accesarea valorii cu indexul 3
CALL Tabel ;WREG=83
[…]
90
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
GOTO Main
Tabel:
ADDWF WREG,W ;WREG=index+index
MOVFF PCL,TEMP ;PCL→TEMP,PCH→PCLATH,PCU→PCLATU
ADDLW d’16’ ;16+2*index
ADDWF TEMP,F ;TEMP=TEMP+16+2*index
MOVLW 0 ;PCLATH++ dacă e cazul
ADDWFC PCLATH,F
MOVLW 0 ;PCLATU++ dacă e cazul
ADDWFC PCLATU,F
MOVFF TEMP,PCL ;TEMP→PCL,PCLATH→PCH,PCLATU→PCU
RETLW d’101’ ;index 0
RETLW d’115’ ;index 1
RETLW d’90’ ;index 2
RETLW d’83’ ;index 3
RETLW d’85’ ;…
RETLW d’99’
RETLW d’150’
RETLW d’149’
Main:
[…]
MOVLW d’3’ ;accesarea valorii cu indexul 3
CALL Tabel ;WREG=83
[…]
91
STRUCTURI DE PROGRAM
Operaţia de scriere tabelară realizează transferul de date între memoria de date RAM şi
memoria program prin blocuri de minim de 32 de octeţi. Aceste operaţii sunt folosite intern
pentru a incărca o serie de regiştri necesari programării memoriei Flash. Deoarece, registrul
92
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
93
STRUCTURI DE PROGRAM
Dacă se modifică „manual” valorile din regiştrii de adresă trebuie avut grijă
la depăşirea valorii 255, când trebuie modificat şi registrul imediat superior.
Acest lucru se poate vedea în secţiunea de cod corespunzătoare accesului la
elementul cu indexul 3 al tabelului unde s-a realizat incrementarea prin bitul
de transport a regiştrilor TBLPTRH şi TBLPTRU.
94
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Adresarea indirectă oferă posibilitatea accesării unei locaţii de memorie RAM fără
precizarea unei adrese fixe în instrucţiune. Folosind această metodă, se pot implementa
tablouri de variabile, ce pot fi modificate pe parcursul execuţiei programului (prin folosirea
RAM-ului ca zonă de stocare).
Microcontrolerele PIC fac posibilă adresarea indirectă prin implementarea unui set de
regiştrii speciali de adresare FSRn (en. File Select Register) şi a unor regiştri de accesare a
conţinutului INDFn (en. Indirect File Operands) de la adresa stocată în FSR. De asemenea,
patru operanzi adiţionali implementaţi sub forma regiştrilor virtuali POSTINCn, POSTDECn,
PREINCn şi PLUSWn permit realizarea unei adresări indexate utilă la accesarea şi
parcurgerea elementelor unui tablou. (pentru detalii suplimentare vezi Capitolul 4)
GOTO Main
95
STRUCTURI DE PROGRAM
Main:
[…]
CALL Stocare_Valori
[…]
Concluzii lizibile. Datele, la rândul lor, pot fi şi ele structurate sub forma unor
tablouri în memoria program sau în memoria RAM de date.
Acest capitol, foarte orientat spre exemple, a prezentat diferite variante de
implementare ale acestor structuri de program în limbaj de asamblare.
96
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Adresare indirectă
Metoda de adresare în care accesul la locaţiile din memoria de date RAM
Termeni se face fără a utiliza o adresă fixă în instrucţiuni
esenţiali Directivă
Pseudo-instrucţiune adresată asamblorului
FSR
File Select Register. Registru de adresare. Conţine o adresă absolută (12
biţi) din memorie. Este format din FSR0H:FSR0L
GPR
General Purpose Registers. Regiştri de uz general
INDF
Indirect File Operand. Registru de accesare conţinut. Permite accesul la
data stocată în memorie la adresa conţinută în FSR.
Macro
Secţiune de cod formată din instrucţiuni native ale microcontrolerului,
care ulterior vor fi înlocuite prin apelul macroului
Memorie de date
Spaţiu de stocare temporar (RAM) pentru datele cu care lucrează
programul
Memorie program
Spaţiu de stocare pentru program
PC
Program Counter. Numărător de program. Conţine adresa instrucţiunii
următoare din memorie. Are dimensiunea de 8 biţi şi poate fi accesat prin
intermediul regiştrilor PCL, PCLATH şi PCLATU
SFR
Special Function Registers. Regiştri speciali
Stiva rapidă
Spaţiu de stocare temporar, care nu poate fi accesat direct, utilizat pentru
97
STRUCTURI DE PROGRAM
98
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
6. PORTURI DE INTRARE-IEŞIRE
Introducere
Obiective
6.1 STRUCTURA GENERALĂ A PORTURILOR
Cuprins
6.1.1 Preliminarii
6.1.2 Implementarea hardware a porturilor
6.1.3 Iniţializarea porturilor
6.2 CONECTAREA CIRCUITELOR EXTERNE
6.3 APLICAŢII
6.3.1 Implementarea unui program de test al
butoanelor
6.3.2 Implementarea unui protocol Handshake
6.3.3 Comanda unui afişaj cu 7 segmente şi 4 digiţi
Concluzii
Întrebări de autoevaluare
Termeni esenţiali
99
PORTURI DE INTRARE-IEŞIRE
6.1.1 Preliminarii
100
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Fig. 6.1. Pinii şi porturile microcontrolerului PIC18F4455 conform foii de catalog [15]
101
PORTURI DE INTRARE-IEŞIRE
Să considerăm o situaţie în care pinul RA0 şi pinii RB[7:0] sunt ieşiri, iar
restul de pini ai portului A sunt intrări. Următoarea subrutină realizează
configurarea direcţiei pinilor utilizaţi.
Exemplu
Initializare
MOVLW b’1111110’ ;RA0 ieşire
MOVWF TRISA ;RA[1:7] intrări
CLRF TRISB ;RB[0:7] ieşiri
RETURN
102
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
103
PORTURI DE INTRARE-IEŞIRE
circuitul tristate (2) aflat la ieşirea bistabilului trebuie activat. În această situaţie (Fig. 6.3-b),
ieşirea bistabilului este conectată direct la lumea exterioară prin intermediul pinului, care
acum este pin de ieşire. Pentru a activa circuitul tristate (2), bistabilul D TRIS trebuie
încărcat în prealabil cu valoarea 0.
Citirea stării pinului se poate realiza prin intermediul latch-ului de date inferior a cărui
ieşire reflectă starea fizică a pinului. La execuţia unei comenzi de citire a portului, intrarea EN
a acestui latch este 0, bitul citit este menţinut la ieşirea circuitului tristate (4) pe durata citirii.
Această citire nu este influenţată de direcţia pinului (Fig. 6.3-a,c).
Din Fig. 6.2 se poate observa că bitul TRIS poate fi scris şi citit. Chiar dacă citirea
registrului TRIS este aparent nejustificată să considerăm cazul în care utilizatorul doreşte să
configureze direcţia unui pin. Pentru acest lucru se poate utiliza instrucţiunea:
BCF TRISB,2 ;şterge bitul 2 al registrului TRISB
Instrucţiunea BCF (Bit Clear File) este un exemplu de instrucţiune care realizează operaţiile
de citire-modificare-sciere, prin care starea registrului TRISB este mai întâi citită în UCP,
apoi modificată şi în cele din urmă scrisă înapoi în TRISB (vezi capitolul 1, fazele
instrucţiunilor). Pentru a putea realiza acest lucru, UCP trebuie să aibă posibilitatea de a
accesa registrul TRIS atât pentru scriere cât şi pentru citire. Acest lucru este valabil şi pentru
alte instrucţiuni. De fapt, majoritatea instrucţiunilor (ex. MOVWF) realizează un microciclu de
citire în Q2, înaintea operaţiei efective de scriere din Q4.
Pentru a evita problemele ce pot apărea din citirea stării fizice a pinilor,
microcontrolerele din seria PIC18 au introdus un circuit tristate suplimentar (1), asociat
bistabilului D de date, care permite UCP să realizeze direct citirea biţilor de date ca o
alternativă la citirea stării pinilor. Astfel, scrierea datelor în registrul LATn este echivalentă cu
scrierea datelor în registrul PORTn, iar citirea LATn va furniza datele stocate în registrul de
date, care de cele mai multe ori vor fi identice cu datele privind starea fizica a pinilor.
Deoarece pinii unui port pot fi configuraţi ca intrări, ieşiri sau combinaţii de intrări şi
ieşiri, este interesant de ştiut ce se întâmplă atunci când se citesc sau se scriu regiştrii
implicaţi. De exemplu, ce s-ar întâmpla dacă se realizează din program citirea unui port de
ieşire? Cele patru situaţii prezentate în Fig. 6.3 sunt descrise în continuare:
a. Citirea unui port de intrare (TRIS = 1)
În această situaţie circuitul tristate (2) este dezactivat, iar starea bistabilului de date
rămâne neschimbată. De exemplu, instrucţiunea MOVF PORTB, W citeşte starea
pinilor portului B în registrul de lucru WREG.
104
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Fig. 6.3. Citirea şi scrierea unui bit al unui port conectat la un pin de intrare sau de ieşire
105
PORTURI DE INTRARE-IEŞIRE
106
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Fig. 6.4. Conectarea butoanelor (a întrerupătoarelor) şi a LED-urilor cu consum mai mic de 20mA
După cum se vede şi din Fig. 6.4-b nu se recomandă conectarea directă a LED-urilor
la microcontroler, ci prin intermediul unei rezistenţe. Dacă se iau în considerare datele din
107
PORTURI DE INTRARE-IEŞIRE
În ciuda utilizării tot mai frecvente a afişajelor cu cristale lichide, afişajele cu şapte
segmente nu au dispărut din practică acestea având încă multiple utilizări mai ales în aplicaţii
care necesită afişarea unor valori numerice, aceste module fiind foarte eficiente în condiţii de
iluminare scăzută sau atunci când se doresc afişaje de dimensiuni mari. Afişajele cu şapte
108
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
segmente sunt în esenţă afişaje cu LED-uri, fiecare segment fiind reprezentat de un LED, şi
sunt disponibile în două variante de implementare: cu anod comun, respectiv cu catod comun.
Dispunerea segmentelor şi cele două variante de implementare se prezintă în Fig. 6.7.
În cazul utilizării unor afişaje multiplexate cu şapte segmente cu patru digiţi se pot
utiliza următoarele scheme de conectare la microcontroler (Fig. 6.8 – anod comun, Fig.6.9 –
catod comun). Liniile de date (a,b,c,..g,dp) fiind comune pentru toate cele patru afişaje, prin
multiplexare se asigură comanda succesivă a fiecărui afişaj. Practic, la un moment dat doar un
afişaj este comandat. Prin baleerea de la un afişaj la altul cu o frecvenţă suficient de mare se
crează impresia că toate cele patru cifre sunt afişate simultan. În paragraful 6.3.3 se va
prezenta un exemplu de aplicaţie care realizează comanda acestui tip de afişaje.
109
PORTURI DE INTRARE-IEŞIRE
Fig. 6.9. Conectarea unui afişaj multiplexat de 7 segmente cu catod comun de 4 digiţi
6.3 APLICAŢII
110
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Conform montajului din Fig. 6.10, la apăsarea unui buton se va citi pe port valorea 0
logic, iar atunci când butonul este eliberat se citeşte valoarea 1 logic. LED-urile se vor aprinde
prin setarea bitului corespunzător.
;Programul principal
Initializare_port:
CLRF PORTD ;ştergere buffere
CLRF LATD
Test_buton1:
BTFSS PORTD, 0 ;test buton legat pe pinul RD0
GOTO Buton1_apasat
GOTO Buton1_eliberat
111
PORTURI DE INTRARE-IEŞIRE
Test_buton2:
BTFSS PORTD, 1 ;test buton legat pe pinul RD1
GOTO Buton2_apasat
GOTO Buton2_eliberat
Buton1_apasat:
BSF LATD, 2 ;aprinde LED conectat la RD2
GOTO Test_buton2
Buton1_eliberat:
BCF LATD, 2 ;stinge LED conectat la RD2
GOTO Test_buton2
Buton2_apasat:
BSF LATD, 3 ;aprinde LED conectat la RD3
GOTO Test_buton1
Buton2_eliberat:
BCF LATD, 3 ;stinge LED conectat la RD3
GOTO Test_buton1
112
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
113
PORTURI DE INTRARE-IEŞIRE
;Programul principal
Initializare_port:
CLRF PORTB ;ştergere buffere
CLRF LATB
CLRF PORTD
CLRF LATD
114
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Se consideră montajul din Fig. 6.9 în care la microcontroler este conectat un afişaj
multiplexat cu 7 segmente cu catod comun de 4 digiţi. Liniile de date ale afişajului (a,b,...,g,
dp) sunt conectate la portul B (a-RB[0], b-RB[1],...,g-RB[6],dp-RB[7]), iar cele patru
linii de selecţie la pinii RA[3:0]. Având în vedere că afişajul este cu catod comun, LED-
urile se vor aprinde atunci când pe pinii corespunzători liniilor de date vom avea un 1 logic.
Multiplexarea se va realiza prin intermediul liniilor de selecţie, iar programul va trebui să
asigure selectarea succesivă a fiecărui digit prin comanda tranzistorilor şi menţinerea datelor
adecvate pentru fiecare digit pe port. Dacă multiplexarea se realizează suficient de repede (ex.
la fiecare 10ms se selectează un nou digit şi se trimit datele spre el) se va crea impresia că
toate cele 4 cifre sunt aprinse simultan.
Se doreşte afişarea numărului 1234 pe afişajul cu şapte segmente şi patru digiţi. În
acest scop trebuie identificate valorile care se transmit pe port pentru aprinderea cifrelor
dorite. Analizând Fig. 6.14 se pot identifica aceste valori care se vor regăsi şi în program.
După etapa de iniţializare a porturilor fiecare digit va fi selectat pe rând prin activarea
tranzistorilor de pe portul A şi se vor transmite datele dorite spre afişaj care vor fi menţinute
un timp de 10ms înainte de a se trece la afişarea pe următorul digit. În programul următor se
consideră implementată rutina de întârziere de 10ms
[...]
115
PORTURI DE INTRARE-IEŞIRE
;Programul principal
Initializare_port:
CLRF PORTB ;ştergere buffere
CLRF LATB
CLRF PORTA
CLRF LATA
MOVLW 0xF0
MOVWF TRISA ;pini RA[3:0] ieşire
CLRF TRISB ;pini RB[7:0] ieşire
Aprindere_LED:
MOVLW Unit
MOVWF LATB
BSF LATA,0 ;selectare digit unităţi
BCF LATA,1
BCF LATA,2
BCF LATA,3
CALL Delay_10ms
MOVLW Zeci
MOVWF LATB
BCF LATA,0
BSF LATA,1 ;selectare digit zeci
BCF LATA,2
BCF LATA,3
CALL Delay_10ms
MOVLW Sute
MOVWF LATB
BCF LATA,0
BCF LATA,1
BSF LATA,2 ;selectare digit sute
BCF LATA,3
CALL Delay_10ms
MOVLW Mii
MOVWF LATB
BCF LATA,0
BCF LATA,1
BCF LATA,2
BSF LATA,3 ;selectare digit mii
CALL Delay_10ms
GOTO Aprindere_LED
END
116
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
117
PORTURI DE INTRARE-IEŞIRE
Protocol de comunicaţie
Un ansamblu de mesaje / semnale şi reguli de schimbare a acestor mesaje
/ semnale între sisteme
TRISn
Registru în care se configurează direcţia unui port
Tristate
Circuit cu trei stări la ieşire: 0 logic, 1 logic şi impedanţă ridicată. Aceste
circuite dispun de o intrare de activare (ENABLE). Când circuitul este
activ acesta se comporta ca un circuit logic normal. Când circuitul este
inactiv ieşirea este în stare de impedanţă ridicată (ieşirea este deconectată
de la circuit)
UCP
Unitate centrală de prelucrare.
118
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
7. TEMPORIZĂRI SOFTWARE
Introducere
Obiective
7.1 TIMPII DE EXECUŢIE AI INSTRUCŢIUNILOR
Cuprins
7.2 IMPLEMENTAREA ÎNTÂRZIERILOR
7.2.1 Temporizare de 1 microsecundă
7.2.2 Temporizare de 1 milisecundă
Concluzii
Întrebări de autoevaluare
Termeni esenţiali
119
TEMPORIZĂRI SOFTWARE
120
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
lung. Aceste excepţii cuprind instrucţiunile care modifică valoarea numărătorului de program
(ex. instrucţiunile de salt) sau instrucţiunile lungi (reprezentate pe 4 octeţi) care nu pot fi
extrase din memorie într-o singură fază. Pentru aceste instrucţiuni timpul de execuţie poate fi
egal cu două sau trei cicluri instrucţiune.
În Tabelul 7.1 sunt prezentate instrucţiunile al căror timp de execuţie este variabil sau
este mai mare decât TC. Durata timpilor de execuţie pentru toate instrucţiunile este cuprinsă în
tabelele prezentate în Capitolul 2.
121
TEMPORIZĂRI SOFTWARE
Analizând Tabelul 7.1 se poate observa că instrucţiuni simple precum MOLW, BSF sau
CLRF se execută într-un timp egal cu durata unui ciclu instrucţiune TC, pe când instrucţiunile
lungi, cele de salt necondiţionat, cele de apel şi revenire din subrutină şi instrucţiunile tabelare
se execută într-un timp dublu egal cu durata a două cicluri instrucţiune 2TC. Pe de altă parte
există o serie de instrucţiuni care realizează salturi condiţionate ale căror timpi de execuţie
depind de context. Cazul unei asemenea instrucţiuni va fi analizat în exemplul următor.
Exemplu
122
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
După cum s-a menţionat anterior, durata unui ciclu instrucţiune depinde de frecvenţa
de lucru a microcontrolerului. Fără a cunoaşte cu exactitate această frecvenţă de oscilaţie nu
putem calcula cu exactitate durata unui ciclu instrucţiune TC şi astfel nu putem şti care este
timpul necesar execuţiei instrucţiunilor.
Întrucât microcontrolerele suportă numeroase frecvenţe de lucru vom analiza două
valori frecvent întâlnite în practică: FOSC=4MHz, respective FOSC = 20MHz. Pornind de la
aceste două valori rezultă următoarea durată a unui ciclu instrucţiune:
4 4
TC = 4TOSC = = = 1μs
FOSC 4 MHz
4 4
TC = 4TOSC = = = 0.2μs
FOSC 20 MHz
123
TEMPORIZĂRI SOFTWARE
Delay1us:
NOP ;0.2us
RETURN ;0.4us
[…]
Exemplu
124
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
#include “P18F4455.INC”
ORG 0x800
;salt peste suburutine la programul principal
GOTO Main
Main:
; iniţializare port
CLRF PORTA
BCF TRISA, 0
Bucla_main:
;Generarea impulsurilor
BSF PORTA, 0
CALL Delay2us
BCF PORTA, 0
CALL Delay2us
BSF PORTA, 0
CALL Delay3us
BCF PORTA, 0
CALL Delay1us
BSF PORTA, 0
CALL Delay1us
BCF PORTA, 0
CALL Delay1us
BSF PORTA, 0
CALL Delay5us
BCF PORTA, 0
CALL Delay1us
GOTO Bucla_main ;Reluarea ciclului
END
125
TEMPORIZĂRI SOFTWARE
După cum s-a văzut până acum implementarea unei întârzieri software constă pur şi
simplu din consumarea timpului procesorului prin lipsa unor operaţii pe durata de timp dorită.
O altă modalitate de a realiza acest lucru constă în consumarea timpului cu decrementarea
unei variabile de la o valoare prestabilită spre 0, după cum se poate vedea în Fig. 7.3. Prin
alegerea unei valori adecvate pentru valoarea iniţială, se poate obţine întârzierea dorită.
Bineînţeles, această întârziere depinde de frecvenţa de lucru a microcontrolerului. Pentru acest
exemplu vom considera FOSC = 4MHz care determină un ciclu instrucţiune cu durata TC=1μs.
N EQU d’249’
Delay1ms:
MOVLW N ;1us
Bucla1ms:
DECF WREG ;N*1us
NOP ;N*1us
BNZ Bucla1ms ;(N-1)*2us+1us
RETURN ;2us
[…]
126
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Delay1ms:
MOVLW N ;0.2us
Bucla1ms:
CALL Delay1us ;N*1us
CALL Delay1us ;N*1us
CALL Delay1us ;N*1us
CALL Delay1us ;N*1us
DECFSZ WREG,W ;(N-1)*0.2us+0.6us
GOTO Bucla1ms ;(N-1)*0.4us
NOP ;0.2us
NOP ;0.2us
NOP ;0.2us
NOP ;0.2us
RETURN ;0.4us
[…]
127
TEMPORIZĂRI SOFTWARE
Delay100ms:
MOVLW d’100’ ;0.2us
MOVWF Contor ;0.2us
Bucla100ms:
CALL Delay1ms ;100*1ms
DECFSZ Contor, F ;(100-1)*0.2us+0.6us
GOTO Bucla ;(100-1)*0.4us
RETURN ;0.4us
[…]
128
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
129
TEMPORIZĂRI SOFTWARE
Eliminarea oscilaţiilor din intervalul de stabilizare se face prin program relativ simplu.
Ideea de bază este de a citi periodic (eşantiona) semnalul care provine de la buton şi de a filtra
zgomotele produse. Există mai multe abordări privind rezolvarea acestei probleme. Una dintre
ele presupune utilizarea unui contor pentru a determina durata de timp în care semnalul a fost
în stare logică ‘0’. Dacă semnalul respectiv a fost ’0’ continuu o anumită durată de timp,
atunci acel semnal poate fi considerat stabil, iar butonul apăsat. Practic, la apariţia unui front
de apăsare se aşteaptă un timp ∆t în care alte fronturi nu se iau în considerare. După expirarea
acestui interval se poate considera că a avut loc o apăsare.
Exemplul următor oferă o soluţie la această problemă.
130
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
[…]
[…]
Buton_apasat:
CALL Delay10ms ;aştept ∆t=10ms
MOVF Front, W ;salvez starea anterioară
131
TEMPORIZĂRI SOFTWARE
Front_detectat:
[…] ;acţiuni efectuate la
;detectarea unei apăsări
;valide
Concluzii acestui timp se pot proiecta subrutine sau secţiuni de cod care
implementează întârzieri software cu diferite durate.
Întârzierile software reprezintă o soluţie de realizare a temporizărilor care
este disponibilă în cazul tuturor microcontrolerelor pentru care se
cunoaşte timpul de execuţie al instrucţiunilor.
132
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Ciclu instrucţiune
Durata de timp egală cu 4TOSC a fazelor instrucţiunii
Termeni Instrucţiuni
esenţiali Comenzi codificate binar pe care le execută UCP
Întârziere software
Temporizare realizată pe baza timpului de execuţie al instrucţiunilor
Pipeline
Tehnică utilizată pentru a creşte numărul de instrucţiuni care pot fi
executate în unitatea de timp. Pipeline-ul nu reduce timpul necesar
execuţiei unei instrucţiuni, ci creşte numărul de instrucţiuni care pot fi
procesate simultan
Subrutină
Structură de organizare a programelor care ia forma unor instrucţiuni
cuprinse între o etichetă şi o instrucţiune de revenire din subrutină.
Unitate independentă de program, plasată în memorie în altă zonă decât
programul principal
133
TEMPORIZĂRI HARDWARE
8. TEMPORIZĂRI HARDWARE
Introducere
Obiective
8.1 TIMER 0
Cuprins
8.1.1 Structura internă a timerului 0
8.1.2 Configurarea timerului 0
8.2 TIMER 1
8.2.1 Structura internă a timerului 1
8.2.2 Configurarea timerului 1
8.3 TIMER 2
8.3.1 Structura internă a timerului 2
8.3.2 Configurarea timerului 2
8.4 TIMER 3
Concluzii
Întrebări de autoevaluare
Termeni esenţiali
134
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
8.1 TIMER 0
Alături de porturile de intrare-ieşire, Timerul0 este printre singurele module care s-au
mai păstrat de la prima serie de microcontrolere PIC de 8 biţi produsă vreodată.
Din punct de vedere structural, Timerul0 este un numărător, a cărui valoare poate fi
scrisă şi citită, fiind stocată în doi regiştri: TMR0L şi TMR0HB. În funcţie de configurare,
timerul dispune de două moduri de lucru: numărător pe 8 biţi, sau pe 16 biţi.
Ca la orice numărător, incrementarea timerului se realizează pe baza unor impulsuri de
tact care pot proveni din două surse distincte:
135
TEMPORIZĂRI HARDWARE
Fig. 8.1. Schema bloc a timerului 0 în mod de lucru de 8 biţi conform foii de catalog [15]
Analizând schema din Fig. 8.1 putem constata că elementul principal al timerului0
este circuitul de numărare de 8 biţi a cărui valoare poate fi accesată prin intermediul
registrului TMR0L. Tactul de incrementare al acestui numărător poate proveni dintr-o sursă
externă, prin intermediul pinului T0CKI sau poate fi tactul intern de execuţie al
instrucţiunilor FOSC/4. Bitul T0CS (Timer0 Clock Select) din registrul T0CON[5] este
utilizat pentru a selecta între sursa internă sau externă a tactului. În cazul sursei de
136
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
incrementare externe se poate opta, prin intermediul bitului T0SE (Timer0 Select Edge) din
registrul T0CON[4], pentru numărarea fronturilor crescătoare sau descrescătoare ale
semnalului de pe pinul T0CKI.
Indiferent de sursa tactului, poate fi selectată utilizarea predivizorului, prin punerea
bitului PSA (Prescaler Assign) pe 0. În această situaţie, timerul se va incrementa la fiecare n
impulsuri primite, selectarea valorii predivizorului fiind realizată prin biţii T0PS2:T0PS0.
Pentru a nu folosi predivizorul, bitul PSA trebuie pus pe 1.
Deoarece, în cazul utilizării impulsurilor externe, evenimentele numărate pot să-şi facă
apariţia pe pinul T0CKI în mod aleator în raport cu tactul intern, este necesară realizarea unei
sincronizări între cele două semnale pentru a asigura corectitudinea ciclurilor de scriere sau
citire ale Timerului0.
După configurarea timerului, acesta se porneşte prin setarea bitului TMR0ON din registrul
T0CON[7]. Timerul semnalează utilizatorului trecerea de la valoarea maximă la valoarea
minimă (Overflow) prin setarea flagului TMR0IF din registrul INTCON[2]. În acelaşi timp
Timerul 0 poate genera o întrerupere dacă a fost în prealabil validată linia corespunzătoare de
întrerupere. Astfel, utilizatorul nu mai este nevoit să verifice tot timpul flag-ul timerului
pentru a determina momentul în care temporizarea stabilită a expirat.
Alegerea între utilizarea timerului 0 în mod de lucru de 8 biţi sau în mod de lucru de 16
biţi se realizează prin intermediul bitului T08BIT din registrul T0CON[6]. Dacă acest bit
este 1, timerul va funcţiona pe 8 biţi. În caz contrar, timerul funcţionează pe 16 biţi. Pentru a
păstra compatibilitatea cu modele anterioare de microcontrolere PIC, la resetare timerul 0 este
configurat implicit în mod de lucru de 8 biţi.
Indiferent de modul de lucru ales, principiul de funcţionare al timerului se păstrează:
timerul se incrementează la fiecare impuls primit. Se modifică doar modul de acces la
valoarea numărătorului.
În cazul funcţionării pe 8 biţi, accesul la valoarea timerului se realizează direct prin
intermediul registrului TMR0L. Accesarea valorii timerului se modifică puţin în cazul
funcţionării pe 16 biţi, deoarece toate instrucţiunile microcontrolerului permit accesul la date
cu dimensiunea de 8 biţi. În aceste condiţii, fără existenţa unor structuri ajutătoare, nu este
posibilă realizarea accesului atomic la valoarea de 16 biţi a numărătorului. Accesul atomic
permite citirea sau scrierea valorii instantanee a timerului. De exemplu, în lipsa acestuia
137
TEMPORIZĂRI HARDWARE
pentru a citi întreaga valoare de 16 biţi a timerului sunt necesare două operaţii succesive de
citire (se citeşte octetul inferior apoi cel superior) între care valorile se pot modifica.
În Fig. 8.2 se prezintă structura numărătorului care intră în componenţa timerului 0 în
mod de lucru de 16 biţi care permite accesul atomic la valoarea timerului.
138
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
7 0
TMR0ON T08BIT T0CS T0SE PSA T0PS2 T0PS1 T0PS0
Fig. 8.3. Registrul T0CON: Timer0 Control Register
139
TEMPORIZĂRI HARDWARE
4
Tdorita = NrIncr ⋅ Predivizor ⋅ TC = NrIncr ⋅ Pr edivizor ⋅ (8.1)
FOSC
unde:
- Tdorita este durata temporizării dorite
- NrIncr este numărul total de impulsuri care trebuie numărate pentru obţinerea
temporizării dorite
- Predivizor este valoarea predivizorului (se vor considera valorile predefinite posibile
Predivizor ∈ {1,2,4,8,16,32,64,128,256} )
4
- TC = este tactul de execuţie al instrucţiunilor. Pentru FOSC = 20MHz TC = 0.2μs
FOSC
1
Dacă se consideră un raport de predivizare de 1:128, rezultă NrIncr = 39062
140
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
CONFIGURARE_TIMER0:
BCF T0CON, TMR0ON ;Oprirea timerului
BCF T0CON, T0CS ;tact intern
BCF T0CON, PSA ;utilizare predivizor
BSF T0CON, T0PS2 ;predivizare 1:256
BSF T0CON, T0PS1
BSF T0CON, T0PS0
BCF T0CON, T08BIT ;numărător 16biţi
MOVLW 0xB3 ;valoare Timer0 46004
MOVWF TMR0H
MOVLW 0xB4
MOVWF TMR0L
BCF INTCON, TMR0IF ;Stergerea flag-ului
BSF T0CON, TMR0ON ;Pornirea timerului
BUCLA_TESTARE:
BTFSS INTCON, TMR0IF
GOTO LOOP_TESTARE
;Când se ajunge în acest punct, temporizarea s-a terminat
141
TEMPORIZĂRI HARDWARE
CONFIGURARE_TIMER0:
MOVLW b’00000111’ ;initializare T0CON
MOVWF T0CON
MOVLW 0xB3 ;valoare Timer0 46004
MOVWF TMR0H
MOVLW 0xB4
MOVWF TMR0L
BCF INTCON, TMR0IF ;Stergerea flag-ului
BSF T0CON, TMR0ON ;Pornirea timerului
BUCLA_TESTARE:
BTFSS INTCON, TMR0IF
GOTO LOOP_TESTARE
;Când se ajunge în acest punct, temporizarea s-a terminat
8.2 TIMER 1
Timerul 1 (Fig. 8.4) este construit în jurul unui numărător de 16 biţi implementat sub
forma unei perechi de regiştri de 8 biţi (TMR1HB:TMR1L), din care registrul superior
(TMR1HB) este ascuns. La fel ca şi în cazul timerului 0 accesul la octetul superior al timerului
1 se realizează prin intermediul registrului tampon TMR1H. Citirea registrului TMR1L va
determina transferul conţinutului registrului TMR1HB în registrul TMR1H. Totodată, o scriere
a registrului TMR1L va rezulta în actualizarea TMR1HB cu valoarea din TMR1H.
142
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
anterioare ale acestui modul disponibile pe microcontrolerele din familia PIC16 şi trebuie
utilizat cu preacauţie. De exemplu, Microchip recomandă ca timerul să fie oprit atunci când se
accesează cei doi regiştri.
La depăşirea capacităţii de numărare (la trecerea de la valoarea FFFFh la 0000h) se va
seta bitul indicator TMR1IF din registrul PIR[0].
143
TEMPORIZĂRI HARDWARE
poate fi dezactivată dacă bitul T1SYNC =1. Bitul de sincronizare este luat în considerare doar
în cazul utilizării unui tact extern (TMRCS=1).
7 0
RD16 T1RUN T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON
Fig. 8.6. Registrul T1CON: Timer0 Control Register
144
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
În vederea realizării unei temporizări cu o valoare dorită se poate utiliza relaţia (8.5)
pentru a determina valoarea de iniţializare a numărătorului.
Tdorita = NrIncr ⋅ Predivizor ⋅ TC (8.5)
unde:
- Tdorita este durata temporizării dorite
- NrIncr este numărul total de impulsuri care trebuie numărate pentru obţinerea
temporizării dorite
- Predivizor este valoarea predivizorului (se vor considera valorile predefinite posibile
Predivizor ∈ {1,2,4,8})
- TC este perioada impulsurilor numărate. În cazul utilizării tactul de execuţie al
instrucţiunilor ca sursă de incrementare TC=4/FOSC. Dacă se utilizează o sursă externă,
Timer1 se incrementează la fiecare front crescător al semnalului de tact extern. Dacă
acest semnal este periodic atunci, în relaţia (8.5) se poate considera TC=1/FOSCext.
145
TEMPORIZĂRI HARDWARE
146
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
#include "p18f4455.inc"
MAIN
movlw b’10101111’ ;configurare timer1
movwf T1CON ;oscilator ext., PS 1:4
bsf INTCON,PEIE ;întreruperi periferice
bsf PIE1,TMR1IE ;întrerupere timer1
STAND_BY
sleep ;UCP în mod SLEEP
bcf PIR1,TMR1IF ;şterg flag întrerupere
incf CONTOR,f ;incrementez contor
movlw d’75’ ;contor=75 ? (10 min.)
cpfseq CONTOR ; da: citeşte senzor
bra STAND_BY ; nu: SLEEP
147
TEMPORIZĂRI HARDWARE
8.3 TIMER 2
Timerul 2 (Fig. 8.7) are la bază un numărător de 8 biţi care dispune de un predivizor şi
un postdivizor programabil. Timerul va număra întotdeauna impulsurile de tact interne
(FOSC/4). Spre deosebire de celelalte timere, timerul 2 oferă posibilitatea generării unei
întreruperi la atingerea unei valori prestabilite, nu la depăşirea capacităţii de numărare cum se
întâmpla în cazul timerului 0, 1 şi 3. Astfel, în structura timerului 2 există un bloc comparator
care compară permanent valoarea curentă a numărătorului (TMR2) cu valoarea stocată în
registrului PR2 (Period Register). La egalitatea celor două valori se generează un impuls care
va reseta timerul în ciclul instrucţiune următor. În funcţie de postdivizor, după ce s-au realizat
n comparări reuşite ( n = 1,16 ), se va seta bitul indicator de întrerupere TMR2IF din registrul
PIR1[1]. Dacă întreruperea timerului a fost activată (bitul TMR2IE=1) atunci în aceste
condiţii se va genera o întrerupere.
Din schema bloc a timerului prezentată în Fig. 8.7 se poate observa că regiştrii TMR2
şi PR2 sunt accesibili direct prin operaţii uzuale. Tactul de incrementare al registrului TMR2
este divizat prin intermediul predivizorului, a cărui valoare poate fi programată prin biţii
T2CKPS1 şi T2CKPS0 din registrul T2CON[1:0]. Registrul PR2 este încărcat cu o valoare
ce se compară cu valoarea registrului TMR2. Pentru stabilirea valorii postdivizorului se
utilizează biţii T2OUTPS3:T2OUTPS0 ai registrului T2CON[6:3]. Atingerea celor n
comparări reuşite poate fi interogată prin bitul TMR2IF al registrului PIR1[1].
Utilizarea timerului 2 nu se rezumă doar la realizarea temporzărilor. Capacitatea sa de
a semnala o egalitate între două valori prin intermediul comparatorului implementat este o
caracteristică utilizată de modulele de comunicaţie serială sincronă sau de modulul PWM.
148
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
7 0
- T2OUTPS3 T2OUTPS2 T2OUTPS1 T2OUTPS0 TMR2ON T2CKPS1 T2CKPS0
Fig. 8.8. Registrul T2CON: Timer2 Control Register
Bit 7 Neutilizat
Biţii 6-3 T2OUTPS3:T2OUTPS0 – Biţi de selecţie a valorii de postdivizare
1111 = Raport de postdivizare 1:16
1110 = Raport de postdivizare 1:15
...
0001 = Raport de postdivizare 1:2
0000 = Raport de postdivizare 1:1
Bit 2 TMR2ON – Bit de Pornire / Oprire Timer2
1 = Pornire Timer2
0 = Oprire Timer2
Biţii 1-0 T2CKPS1:T2CKPS0 – Biţi de selecţie a valorii de predivizare
1x = Predivizor 16
01 = Predivizor 4
00 = Predivizor 1
- Predivizor este valoarea predivizorului (se vor considera valorile predefinite posibile
Predivizor ∈ {1,4,16} )
- PR2 este valoarea de 8 biţi înscrisă în registrul PR2 utilizat pentru realizarea
comparaţiei
149
TEMPORIZĂRI HARDWARE
- Postdivizor este valoarea postdivizorului (se vor considera valorile predefinite posibile
Postdivizor ∈ {1,2,3,...,16} )
- 4/FOSC este perioada impulsurilor numărate. Tactul de execuţie al instrucţiunilor.
150
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
8.4 TIMER 3
7 0
RD16 T3CCP2 T3CKPS1 T3CKPS0 T3CCP1 T3SYNC TMR3CS TMR3ON
Fig. 8.10. Registrul T3CON: Timer3 Control Register
151
TEMPORIZĂRI HARDWARE
152
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
153
TEMPORIZĂRI HARDWARE
Flag
Bit indicator
Termeni Întrerupere
esenţiali Mecanism prin care un periferic poate semnaliza procesorului despre
schimbarea stării sale
Predivizor
Circuit în structura timerelor care permite incrementarea la fiecare n
fronturi ale semnalului de tact
Postdivizor
Circuit în structura timerului 2 care permite activare bitului indicator de
întrerupere la fiecare n comparaţii reuşite între PR2 şi TMR2.
PWM
Pulse Width Modulation. Modulare în laţime a impulsurilor
Tact de incrementare
Semnal pe a cărui front se incrementează valoarea unui numărător
Timer
Circuit de temporizare
154
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
9. SISTEMUL DE ÎNTRERUPERI
Introducere
Obiective
9.1 INTEROGARE ŞI ÎNTRERUPERI
Cuprins
9.2 TRATAREA ÎNTRERUPERILOR
9.2.1 Modul compatibilitate (IPEN=0)
9.2.2 Modul prioritate (IPEN=1)
9.3 UTILIZAREA ÎNTRERUPERILOR
9.3.1 Configurarea întreruperilor
9.3.2 Recomandări privind rutinele de tratare a
întreruperilor
Concluzii
Întrebări de autoevaluare
Termeni esenţiali
155
SISTEMUL DE ÎNTRERUPERI
Există două metode care ne permit să determinăm dacă starea unui perifiric s-a
modificat: prin interogare sau prin întrerupere.
Pentru a înţelege mai bine diferenţa între cele două metode să considerăm următorul
exemplu.
156
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
aceste condiţii utilizatorul şi-ar petrece timpul mai mult lângă telefon şi în
funcţie de popularitatea sa ar recepţiona doar câteva apeluri într-o zi. Totuşi
99% din timp ar fi pierdut.
Un asemenea sistem telefonic, bazat pe principiul interogării, deşi este posibil
pare cel puţin frustrant. În realitate se foloseşte un sistem telefonic bazat pe
întreruperile cauzate de soneria de apel. Această variantă mai eficientă are şi
ea costurile ei, puse în evidenţă de complexitatea sistemului telefonic care este
mai pronunţată pe partea de semnalizare decât pe partea de voce. Există o altă
problemă: utilizatorul (ex. procesorul) nu are de unde şti când va primi un
apel. Bineînţeles acest lucru se va produce întotdeauna în cele mai nepotrivite
momente (ex. în mijlocul realizării unor activităţi). Astfel utilizatorul ar trebui
să renunţe la activitatea pe care o făcea şi să răspundă la telefon pentru ca la
încheierea apelului să revină înapoi la munca pe care a întrerupt-o.[6]
157
SISTEMUL DE ÎNTRERUPERI
158
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
159
SISTEMUL DE ÎNTRERUPERI
În cazul întreruperilor principale, cei doi biţi asociaţi fiecărei surse de întrerupere se
găsesc în regiştrii INTCON, INTCON2 şi INTCON3.
În cazul întreruperilor provenite de la periferice, flagurile de întrerupere se găsesc în
regiştrii PIR1 şi PIR2, iar biţii de activare a întreruperilor se găsesc în regiştrii PIE1 şi
PIE2.
Analizând figura de mai sus, putem urmări cursul evenimentelor în cazul în care
timerul 1 depăşeşte capacitatea sa de numărare care duce la setarea bitului indicator de
întrerupere TMR1IF din registrul PIR1[0]. Dacă bitul TMR1IE din registrul PIE1[0] este
setat atunci cererea de întrerupere va produce un 1 logic la ieşirea porţii logice SAU. Având în
vedere că timerul 1 face parte din grupul întreruperilor provenite de la periferice, dacă bitul
PEIE este 1 şi bitul GIE este tot 1 atunci cererea de întrerupere va iniţia răspunsul din Fig.
9.2. Bitul GIE (Global Interrupt Enable) din registrul INTCON[7] este bitul care permite
activarea şi dezactivarea tuturor surselor de întrerupere.
160
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
161
SISTEMUL DE ÎNTRERUPERI
În cazul porţilor ŞI care activează linia de prioritate ridicată bitul xxxIP intră direct,
iar în cazul porţilor ŞI care activează linia de prioritate scăzută bitul xxxIP intră inversat.
Bitul de prioritate pentru întreruperile principale poate fi accesat prin intermediul regiştrilor
INTCON2 şi INTCON3, excepţie face întrerupere INT0 de pe pinul RB0 care are întotdeauna
prioritate ridicată. În cazul întreruperilor provenite de la periferice biţii de prioritate pot fi
accesaţi prin intermediul regiştrilor IPR1 şi IPR2.
În Fig. 9.3 se prezintă o schemă simplificată a logicii de întreruperi în cazul modului
prioritate.
162
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
163
SISTEMUL DE ÎNTRERUPERI
compatibilitate. De asemenea, bitul GIEL din registrul INTCON[6] este multiplexat cu bitul
PEIE. În Tabelul 9.1 se prezintă modul de utilizare al acestor biţi.
Comparând diagrama de activitate din Fig. 9.2 cu cea din Fig. 9.4 se poate observă că
răspunsul procesorului la apariţia unei întreruperi activate este similar cu cel din funcţionarea
în modul compatibilitate. Totuşi, două difierenţe majore pot fi identificate:
1. Întreruperile de prioritate ridicată, având vectorul de întrerupere la adresa
0x0008, pot întrerupe întreruperile de prioritate scăzută în curs de deservire.
Nici o întrerupere de prioritate ridicată în curs de deservire nu poate fi
întreruptă.
2. Întreruperile de prioritate ridicată au vectorul de întrerupere la adresa
0x0018 în memoria program.
164
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
De regulă, paşii care trebuie urmaţi pentru configurarea întreruperilor sunt următorii:
- activarea/dezactivarea priorităţilor (bitul IPEN, registrul RCON[7]);
- activarea/dezactivarea întreruperilor provenite de la periferice (bitul PEIE, registrul
INTCON[6]);
- dacă bitul IPEN = 1, setarea priorităţii pentru sursa de întrerupere utilizată (bitul
xxxIP);
- ştergerea indicatorului corespunzător sursei de întrerupere configurate (bitul xxxIF);
- activarea întreruperii corespunzătoare sursei configurate (bitul xxxIE);
- setarea bitului global de întrerupere (bitul GIE, registrul INTCON[6], în modul
compatbilitate sau biţii GIEH şi GIEL, registrul INTCON[7,6] în modul
prioritate).[8]
165
SISTEMUL DE ÎNTRERUPERI
166
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
#include “P18F4455.INC”
ORG 0x00
[…]
ISR:
BTFSS INTCON, TMR0IF ;testare sursa întrerupere
RETFIE
[…] ;tratare întrerupere
BCF INTCON, TMR0IF ;Resetarea flagului
RETFIE ;Revenire din rutină
MAIN:
BCF INTCON, TMR0IF ;Resetare flag Timer 0
BCF RCON, IPEN ;Dezactivare priorităţi
BSF INTCON, TMR0IE ;Activare întrerupere Timer 0
BSF INTCON, GIE ;Activarea întreruperilor
[…]
END
#include “P18F4455.INC”
ORG 0x00
GOTO MAIN
167
SISTEMUL DE ÎNTRERUPERI
Concluzii unor acţiuni pentru tratarea lor. Astfel de evenimente pot fi: depăşirea
capacităţii de numărare a unui timer, terminarea unei conversii analog
digitale etc. Întreruperile permit microcontrolerului să reacţioneze rapid la
aceste evenimente, să se sincronizeze cu ele şi să le trateze în timp util. O
alternativă la sistemul de întreruperi ar fi testarea periodică prin program
(prin interogare) a tuturor indicatorilor de stare şi a semnalelor de intrare.
Această soluţie este ineficientă în cazul în care numărul de elemente care
trebuie testate este mare.
Pe lângă sistemul de întreruperi moştenit de la predecesorii săi,
microcontrolerul PIC18F4455 utilizează un sistem de priorităţi pentru a
stabili ordinea de deservire a cererilor concurente de întrerupere. Pentru
cele două nivele de priorităţi disponibile (prioritate ridicată şi prioritate
scăzută) se poate defini câte o rutină de tratare a întreruperii. Adresele de
inceput ale acestor rutine poartă denumirea de vectori de întrerupere şi au
nişte valori bine stabilite (0x0008 şi 0x0018).
În funcţie de cerintele aplicaţiei anumite surse de întrerupere sau anumite
grupuri de întreruperi pot fi invalidate.
La activarea unui bit indicator de întrerupere se testează dacă întreruperea
resepectivă este activă şi dacă nu sunt în curs de deservire alte întreruperi
mai prioritare; în caz afirmativ are loc întreruperea temporară a secvenţei
curente de execuţie, se salvează pe stivă adresa instrucţiunii urmatoare şi
se face salt la rutina de tratare a întreruperii. După executia rutinei de
întrerupere se revine la secvenţa întreruptă prin încarcarea în numărătorul
de program a adresei salvate pe stivă.
168
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Cerere de întrerupere
Semnal dat de un periferic care indică un eveniment
Termeni CCP
esenţiali Modul de comparare-captură-PWM
EUSART
Enhanced Universal Synchronous Asynchronous Receiver Transmitter.
Modul de comunicaţie serială
Flag
Bit indicator
Interogare
Testarea periodică prin program a biţilor indicatori de stare pentru a afla
despre apariţia unui eveniment
Întrerupere
Mecanismul de suspendare a firului de execuţie la apariţia unui eveniment
şi de execuţie a unei rutine de tratare a întreruperii
Rutină de tratare a întreruperii
Secvenţă de cod care se execută la apariţia unei întreruperi
SLEEP
Mod de funcţionare cu consum redus caracterizat prin oprirea
oscilatorului principal al microcontrolerului.
UCP
Unitate Centrală de Prelucrare
Vector de întrerupere
Adresa primei instrucţiuni a rutinei de tratare a întreruperii
Timer
Circuit de temporizare
169
CONVERTORUL ANALOG-DIGITAL
Introducere
Obiective
10.1 PRINCIPIUL DE FUNCŢIONARE AL CONVERTORULUI
Cuprins
ANALOG-DIGITAL
10.2 CONFIGURAREA MODULULUI DE CONVERSIE A/D
10.2.1 Rolul şi structura regiştrilor de control
10.2.2 Etapa de configurare
Concluzii
Întrebări de autoevaluare
Termeni esenţiali
170
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
171
CONVERTORUL ANALOG-DIGITAL
172
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
După cum s-a putut observa până acum, obţinerea rezultatului conversiei este un
proces secvenţial a cărui durată depinde de numărul de biţi necesar pentru reprezentarea
digitală, dar şi de frecvenţa de lucru. Timpul alocat conversiei unui bit se notează cu TAD, iar
pentru realizarea unei conversii complete de 10 biţi este necesar un timp egal cu 11·TAD.
Pentru a obţine rezultate corecte, pe durata timpului de conversie tensiunea Vin trebuie să
rămână constantă. De acest lucru se ocupă circuitul de eşantionare-memorare (Fig. 10.3)
prezent în structura modulului de conversie.
173
CONVERTORUL ANALOG-DIGITAL
Modulul poate fi configurat prin simpla modificare a unor regiştri speciali, iar citirea
datelor se rezumă la citirea a doi regiştri (ADRESH:ADRESL) care vor conţine rezultatul
conversiei. Modulul de conversie A/D dispune de 3 regiştri de configurare (ADCON0,
ADCON1, ADCON2), a căror structură se prezintă în continuare.
Cu toate că în structura microcontrolerului există un singur convertor A/D, prin
utilizarea unui multiplexor analogic se pot selecta din program, cu ajutorul biţilor
CHS3:CHS0 din registrul ADCON0[5:2], pe rând, până la 13 canale de intrare analogice
distincte. Conversia este declanşată prin setarea bitului GO / DONE din registrul ADCON0[1],
care îndeplineşte şi rolul unui bit de stare care indică prin resetarea sa automată terminarea
conversiei şi disponibilitatea rezultatului de 10 biţi în regiştrii ADRESH:ADRESL. De
asemenea, modulul de conversie analog digitală poate genera o întrerupere, terminarea
conversiei fiind semnalizată şi prin setarea bitului indicator de întrerupere ADIF din registrul
PIR1.
174
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
După cum s-a văzut şi în cazul altor module componente ale microcontrolerului, şi
convertorul A/D dispune de un bit de validare ADON în registrul ADCON0[0] care are rolul
de a activa (ADON = 1) sau dezactiva (ADON = 0) modulul de conversie.
În Fig. 10.5 se prezintă schema bloc simplificată a modulului de conversie A/D, iar în
Fig. 10.6 se prezintă structura registrului ADCON0 urmată de descrierea biţilor disponibili.
7 0
- - CHS3 CHS2 CHS1 CHS0 GO / DONE ADON
Fig. 10.6. Registrul ADCON0: A/D Control Register 0
175
CONVERTORUL ANALOG-DIGITAL
După cum s-a amintit şi în capitolul dedicat porturilor, canalele de intrare analogice
sunt multiplexate cu porturile de intrare-ieşire digitale. Astfel, pinul corespunzător canalului
selectat ca intrare în convertor trebuie să fie configurat ca pin de intrare (prin registrul TRIS
corespunzător) şi ca intrare analogică (prin biţii PCFG3:PCFG0 ai registrului
ADCON1[3:0]).
Canalele analogice 2 (AN2) şi 3 (AN3) îndeplinesc un dublu rol, prin faptul că pot fi
utilizate (opţional) pentru a specifica tensiuni de referinţă externe pentru realizarea conversiei
A/D. De regulă, tensiunile de referinţă corespund tensiunilor de alimentare ale
microcontrolerului (Vdd şi Vss), dar există situaţii când referinţele externe oferă o alternativă
mai puţin zgomotoasă, mai exactă, dar şi perspectiva unei precizii mai ridicate când semnalul
de intrare are o variaţie mult mai mică decât plaja de alimentare de 0-5V. Dacă se optează
pentru referinţe externe, atunci VREFH ar trebui să fie cuprins între Vdd/2 şi Vdd+0.6V, iar
VREFL între Vdd-3V şi Vss-0.3V. Indiferent de situaţie, diferenţa între tensiunile de referinţă
utilizate VREFH-VREFL ar trebui să fie nu mai puţin de 3V pentru Vdd≥3V şi 1.8V pentru
Vdd<3V.
În Fig. 10.7 se prezintă structura registrului ADCON1 urmată de descrierea biţilor
disponibili.
7 0
- - VCFG1 VCFG0 PCFG3 PCFG2 PCFG1 PCFG0
Fig. 10.7. Registrul ADCON1: A/D Control Register 1
176
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
1000 D D D D D D A A A A A A A
1001 D D D D D D D A A A A A A
1010 D D D D D D D D A A A A A
1011 D D D D D D D D D A A A A
1100 D D D D D D D D D D A A A
1101 D D D D D D D D D D D A A
1110 D D D D D D D D D D D D A
1111 D D D D D D D D D D D D D
A = intrare analogică D = intrare / ieşire digitală
1
Aceste cazuri sunt prevăzute pentru funcţionarea în regim SLEEP (cu consum redus de energie), tactul de
conversie provenind de la oscilatorul intern.
177
CONVERTORUL ANALOG-DIGITAL
S-a amintit în paragraful anterior că este necesar un timp TAQ pentru stabilizarea
tensiunii de intrare în circuitul de eşantionare memorare. În acest context, modulul de
conversie A/D oferă posibilitatea ca respectarea timpului de achiziţie TAQ să fie lăsată la
latitudinea utilizatorului prin introducerea unei întârzieri sau să se producă automat.
În primul caz (Fig. 10.8-a), după alegerea canalului de intrare dorit, utilizatorul trebuie
să asigure scurgerea timpului minim de achiziţie (2.4μs÷3μs la 25°C) înainte de declanşarea
unei conversii A/D prin setarea bitului GO.
În cea de-a doua situaţie (Fig. 10.8-b), după setarea bitului GO se va aştepta un timp
cuprins între 2TAD şi 20TAD (în funcţie de configurare) înainte de a începe conversia
propriuzisă care va dura 11TAD. După calcularea ultimului bit (LSB) în TAD11, bitul GO este
şters şi bitul indicator de întrerupere ADIF este setat pentru a indica sfârşitul conversiei şi
disponibilitatea rezultatului în regiştrii ADRESH:ADRESL.
Indiferent de modul ales pentru implementarea achiziţiei, înaintea declanşării unei noi
conversii este necesară aşteptarea unui timp de descărcare (vezi Fig. 10.4) de aproximativ
3TAD.
Cele două situaţii, exemplificate în Fig. 10.8, pot fi configurate prin intermediul biţilor
ACQT2:ACQT0 din registrul ADCON2[5:3]. Condiţia impusă pentru alegerea unei variante
de configurare este aceea că trebuie să se asigure un timp minim de achiziţie mai mare de
2.4μs÷3μs.
178
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Rezultatul conversiei A/D este reprezentat pe 10 biţi, în consecinţă acesta necesită doi
regiştri pentru a fi stocat. Deoarece capacitatea totală a celor doi regiştri ADRESH:ADRESL
este de 16 biţi, rezultatul conversiei poate fi aliniat la stânga sau la dreapta. În Fig. 10.9 se
prezintă modul de aliniere al rezultatului în funţie de starea bitului ADFM din registrul
ADCON2[7].
9 8 7 0
Rez. conv.
0 0 0 0 0 0 A/D MSb
Rezultat conversie A/D octetul inferior
ADRESH ADRESL
a)
9 2 1 0
Rez. conv.
Rezultat conversie A/D octetul superior
A/D LSb 0 0 0 0 0 0
ADRESH ADRESL
b)
Fig. 10.9. Rezultatul conversiei A/D
a) aliniere la dreapta ADFM = 1 b) aliniere la stânga ADFM = 0
Există aplicaţii în care 8 biţi de date sunt suficienţi pentru a reprezenta rezultatul
conversiei. În aceste cazuri se recomandă alinierea rezultatului la stânga (ADFM=0), utilizarea
datelor din registrul ADRESH şi ignorarea celor doi biţi mai nesemnificativi din registrul
179
CONVERTORUL ANALOG-DIGITAL
7 0
ADFM - ACQT2 ACQT1 ACQT0 ADCS2 ADCS1 ADCS0
Fig. 10.10. Registrul ADCON2: A/D Control Register 2
180
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
2
ATENŢIE se recomandă ca bitul GO/ DONE să nu fie setat în aceeaşi instrucţiune în care se porneşte modulul
de conversie A/D
181
CONVERTORUL ANALOG-DIGITAL
CONFIGURARE_CONVERTOR_AD:
BSF TRISA, TRISA0 ;pin RA0/AN0 de intrare
MOVLW b’00001110’ ;pin AN0 intrare analogică
MOVWF ADCON1 ;tens. de referiţă interne
BCF ADCON0,CHS3 ;selectare canal 0
BCF ADCON0,CHS2
BCF ADCON0,CHS1
BCF ADCON0,CHS0
MOVLW b’00010101’ ;aliniat stânga, TAQ=4TAD
MOVWF ADCON2 ;TAD = 16TOSC
BCF PIR1,ADIF ;şterg flag întrerupere
BSF ADCON0,ADON ;pornire modul
BSF ADCON0,GO ;start conversie
LOOP_TESTARE:
BTFSS PIR1, ADIF ;sau BTFSC ADCON0, GO
GOTO LOOP_TESTARE
182
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
CONFIGURARE_CONVERTOR_AD:
BSF TRISA, TRISA0 ;pin RA0/AN0 de intrare
MOVLW b’00001110’ ;pin AN0 intrare analogică
MOVWF ADCON1 ;tens. de referiţă interne
BCF ADCON0,CHS3 ;selectare canal 0
BCF ADCON0,CHS2
BCF ADCON0,CHS1
BCF ADCON0,CHS0
MOVLW b’00010011’ ;aliniat stânga, TAQ=4TAD
MOVWF ADCON2 ;TAD de la RC
BCF PIR1,ADIF ;şterg flag întrerupere
BSF INTCON, PEIE ;activare într. periferice
BSF PIE1,ADIE ;activare într. conv A/D
BCF INTCON, GIE ; GIE = 0
BSF ADCON0,ADON ;pornire modul
BSF ADCON0,GO ;start conversie
183
CONVERTORUL ANALOG-DIGITAL
Convertor Analog-Digital
Circuit care are la intrare o mărime analogică (curent, tensiune) şi
Termeni furnizează la ieşire un număr (reprezentat binar) care constituie o
esenţiali aproximare (mai mult sau mai puţin exactă) a valorii analogice a
semnalului de intrare
LSB
En. Least Significant Bit. Bitul cel mai nesemnificativ. Într-un octet
acesta este bitul 0.
MSB
En. Most Significant Bit. Bitul cel mai semnificativ. Într-un octet acesta
este bitul 7.
Timp de achiziţie
Timpul necesar pentru circuitul de eşantionare să încarce condensatorul de
menţinere la nivelul tensiunii analogice de intrare. Timpul necesar
stabilizării tensiunii de intrare în vederea realizării conversiei.
Timp de conversie
Timpul necesar convertorului A/D să realizeze conversia semnalului
184
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
185
MODULUL CCP
Introducere
Obiective
11.1 PRELIMINARII
Cuprins
11.2 CAPTURA
11.2.1 Funcţionarea modulului CCP în modul de lucru
Captură
11.2.2 Configurarea capturii
11.3 COMPARARE
11.3.1 Funcţionarea modulului CCP în modul de lucru
Comparare
11.3.2 Configurarea comparării
11.4 PWM
11.5 REGISTRUL CCPxCON
Concluzii
Întrebări de autoevaluare
Termeni esenţiali
186
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
11.1 PRELIMINARII
187
MODULUL CCP
11.2 CAPTURA
Exemplu
188
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
După cum se poate observa, citirea portului ocupă cel mai mult timp al
programului.
Fig. 11.3. Schema bloc a modulului CCP1 în mod de lucru Captură conform foii de catalog [15]
189
MODULUL CCP
La apariţia unuia din evenimentele menţionate mai sus, se poate realiza citirea valorii
stocate în regiştrii de date CCPR1H:CCPR1L fie prin intermediul rutinei de tratare a
întreruperii, fie ca urmare a interogării bitului CCPxIF.
Reluând exemplul de la începutul paragrafului, dacă timerul utilizat pentru a furniza
baza de timp este resetat după fiecare captură, atunci datele disponibile în regiştrii
CCPR1H:CCP1RL caracterizează timpul scurs de la ultimul eveniment (Fig. 11.4-a). O
variantă alternativă presupune incrementarea continuă a valorii timerului, perioada semnalului
fiind diferenţa între două valori capturate succesive(Fig. 11.4-b). Având în vedere că modulul
CCP poate fi configurat prin program, se poate determina factorul de umplere al unui semnal
prin modificarea evenimentului de captură şi realizarea diferenţei între două valori capturate
succesive (Fig. 11.4-c). Astfel, prin simpla schimbare a stării bitului CCPxM0 se poate opta
pentru frontul crescător sau descrescător pentru a genera captura.
Dacă se optează pentru utilizarea ambelor module de captură disponibile, acestea pot
fi configurate pentru a utiliza aceeaşi bază de timp (acelaşi timer) şi acelaşi semnal de intrare.
Pentru determinarea perioadei ambele module vor fi configurate pentru a detecta acelaşi front
(de ex. crescător) şi se va calcula diferenţa între valorile capturate. Pentru determinarea
factorului de umplere cele două module CCP vor fi configurate pentru detecta fronturi diferite
şi se va calcula diferenţa între valorile capturate.
190
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
1
Pinii CCP1 şi CCP2, asociaţi celor două module CCP sunt multiplexaţi cu pinii RC2, respectiv RC1 şi trebuie
configuraţi ca pini de ieşire cu ajutorul registrului TRISC
191
MODULUL CCP
7 0
RD16 T3CCP2 T3CKPS1 T3CKPS0 T3CCP1 T3SYNC TMR3CS TMR3ON
Fig. 11.5. Registrul T3CON: Timer3 Control Register
CONFIGURARE_CAPTURA:
BSF TRISC, TRISC2 ;pin CCP1 de intrare
BCF T3CON, T3CCP2 ;utilizare Timer1 cu CCP1
BCF T3CON, T3CCP1
MOVLW b’10100001’ ;configurare şi pornire
MOVWF T1CON ;Timer1
BCF CCP1CON,CCP1M3 ;captura la fiecare fr. cr.
BSF CCP1CON,CCP1M2
BCF CCP1CON,CCP1M1
BCF CCP1CON,CCP1M0
LOOP_TESTARE:
BTFSS PIR1, CCP1IF
GOTO LOOP_TESTARE
;Când se ajunge în acest punct, captura s-a terminat
;se citeşte rezultatul din CCPR1H:CCPR1L
;se restează flagul de întrerupere
192
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
11.3 COMPARARE
Fig. 11.6. Schema bloc a modulului CCP1 în mod de lucru Comparare conform foii de catalog [15]
2
Aceasta este singura diferenşă funcţională între CCP1 şi CCP2
193
MODULUL CCP
194
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
11.4 PWM
Selectarea regimului de lucru PWM se realizează prin punerea biţilor CCPxM3:0 din
registrul CCPxCON[3:0] în starea 11xx.
Configurarea care trebuie realizată în vederea generării unui semnal PWM presupune
determinarea valorilor de iniţializare pentru perioada semnalului şi factorul de umplere al
semnalului.
Registrul CCPxCON conţine cei mai nesemnificativi doi biţi (DCxB1:DCxB0), iar
CCPRxL conţine octetul superior
3
Pentru regimul de lucru PWM, biţii de interes din registrul T2CON sunt doar cei legaţi de activarea /
dezactivarea timerului 2, şi cei legaţi de algerea predivizorului. Postdivizorul nu va fi utilizat. Pentru detalii
privind structura registrului T2CON se poate consulta Cap. 8 – Temporizări hardware.
197
MODULUL CCP
FU ⋅ FOSC
(CCPRxL : CCPxCON 5 : 4 ) = =
Predivizor
(11.4)
50μs ⋅ 20MHz
= = 62.5 ≈ 63
16
Astfel, perioada semnalului PWM va fi configurată prin înscrierea în registrul
PR2 a valorii 30 (=1Eh), iar factorul de umplere al semnalului PWM va fi
configurat prin înscrierea valorii 63 în perechea CCPRxL:CCPxCON<5:4>.
Întrucât reprezentarea binară pe zece biţi a valorii 63 este (0000111111)2,
rezultă că DCxB1=1, DCxB0=1, iar CCPRxL=0Fh.
Exemplu
CONFIGURARE_PWM:
BCF TRISC, TRISC2 ; pin CCP1 de ieşire
BCF T2CON, TMR2ON ; oprire Timer2
MOVLW 0x1E ; configurare T
MOVWF PR2
MOVLW 0x0F ; configurare FU
MOVWF CCPR1L
BSF CCP1CON, DC1B1
BSF CCP1CON, DC1B0
BSF T2CON, T2CKPS1 ; predivizor 16
BSF T2CON, T2CKPS0
BSF T2CON, TMR2ON ; pornire Timer2
198
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
BSF CCP1CON, CCP1M3 ; configurare mod PWM
BSF CCP1CON, CCP1M2
BSF CCP1CON, CCP1M1
BSF CCP1CON, CCP1M0
Una din aplicaţiile în care se utilizează în mod frecvent semnalele PWM se referă la
comanda servomotoarelor. Acestea sunt servomecanisme, care au în structura lor un motor de
curent continuu cuplat cu un senzor de poziţie în cadrul unei bucle de reglare automată
controlată de un regulator intern (de obicei un circuit integrat dedicat). Comanda
servomotoarelor presupune aplicarea unui semnal PWM cu anumite caracteristici pe intrarea4
sa de comandă. În acest fel se transmite către bucla de reglare din structura servomotorului un
semnal de referinţă care conduce la poziţionarea axului motorului la un anumit unghi.
Principiul de comandă al servomotoarelor este pus în evidenţă în Fig. 11.9.
4
În general servomotoarele dispun de trei intrări, două se utilizează pentru alimentare şi cea de-a treia pentru
comandă.
5
Această poziţie unghiulară corespunde unui unghi de 90° dacă limitele de rotaţie ale motorului sunt cuprinse
între 0° şi 180°, sau unei alte poziţii (aflate la mijlocul intervalului) dacă mişcarea de rotaţie a motorului este
limitată între alte unghiuri.
199
MODULUL CCP
FU=1.5ms. Durata minimă şi cea maximă a impulsurilor de comandă care determină rotirea
servomotorului la poziţie unghiulară validă poate să difere de la un producător la altul, dar în
general durata minimă a impulsurilor este de 1 ms, iar cea maximă de 2 ms. Pentru aceste
două valori ale impulsului de comandă axul motorului se va poziţiona la cele două capete ale
intervalului în care este limitată mişcarea de rotaţie a motorului.
Din păcate implementarea comenzii pentru servomotoare cu ajutorul modulului PWM,
în cazul unor frecvenţe de lucru ale microcontrolerului ordinul MHz, devine imposibilă având
în vedere valorile de configurare care rezultă prin utilizarea relaţiilor (11.1) şi (11.2). O
soluţie la această problemă ar putea fi reducerea frecvenţei de lucru sau realizarea semnalelor
PWM necesare prin alte mecanisme (de ex. Timere, CCP în mod de lucru Comparare etc.). De
altfel, pentru toate funcţionalităţile oferite prin cele trei moduri de lucru ale modulelor CCP se
pot găsi soluţii de implementare alternative, care nu necesită în mod neapărat existenţa CCP
în structura microcontrolerului.
Selectarea regimului de lucru pentru cele două module CCP se face prin intermediul
regiştrilor de control CCPxCON. Deoarece factorul de umplere, în modul de lucru PWM se
specifică prin intermediul a 10 biţi, regiştrii CCPxCON conţin cei mai nesemnificativi doi biţi
care intervin în configurarea factorului de umplere dorit.
În Fig. 11.9 se prezintă structura regiştrilor CCPxCON, urmată de descrierea biţilor.
7 0
- - DCxB1 DCxB0 CCPxM3 CCPxM2 CCPxM1 CCPxM0
Fig. 11.9. Regiştrii CCPxCON: CCPx Control Register
200
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
201
MODULUL CCP
Captură
Mod de lucru în care apariţia unui eveniment extern determină salvarea
Termeni valorii timerului în regiştrii de date CCP
esenţiali CCP
Modul de Captură / Compare / PWM
Comparare
Mod de lucru în care atingerea egalităţii valorii timerului cu o valoare
prestabilită determină generarea unui eveniment
Comparator digital
Circuit care permite realizarea unei comparaţii între două valori binare
Factor de umplere
Intervalul de timp dintr-o perioadă cât semnalul este în starea ’1’
Predivizor
Circuit în structura timerelor care permite incrementarea la fiecare n
fronturi ale semnalului de tact
PWM
En. Pulse Width Modulation. Modularea în lăţime a impulsurilor. Tehnică
ce permite controlul circuitelor analogice din domeniul digital.
Timer
Circuit de temporizare
202
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
12.COMUNICAŢII SERIALE
Introducere
Obiective
12.1 PRELIMINARII
Cuprins
12.2 COMUNICAŢII SERIALE SINCRONE DE TIP SPI
IMPLEMENTATE PRIN SOFT
12.2.1 Transmisia
12.2.2 Recepţia
12.3 COMUNICAŢII SERIALE REALIZATE CU AJUTORUL
MODULULUI EUSART
12.3.1 Transmisia serială asincronă
12.3.2 Recepţia serială asincronă
12.3.3 Generarea tactului de comunicaţie
12.3.4 Detectarea automată a tactului de comunicaţie
12.3.5 Structura regiştrilor asociaţi modulului
EUSART
12.3.6 Configurarea comunicaţiei seriale asincrone
12.3.7 Implementarea comunicaţiilor seriale
asincrone cu adresare
12.3.8 Interfaţarea portului serial
12.3.9 Realizarea comunicaţiilor seriale sincrone cu
ajutorul modulului EUSART
Concluzii
Întrebări de autoevaluare
Termeni esenţiali
203
COMUNICAŢII SERIALE
12.1 PRELIMINARII
Pentru a înţelege rolul comunicaţiilor seriale să analizăm următorul exemplu din viaţa
cotidiană.
Să considerăm cazul Smart Card-urilor.
Fiecare asemenea card (card de debit / credit, card de sănătate etc.) are
încorporat în structura sa un microcontroler, în general de 8 biţi, ale cărui
Exemplu
contacte pot fi identificate pe una din feţele cardului. Restricţiile impuse de
costul şi utilizarea acestor carduri au condus la simplificarea structurii
microcontrolerului, minimizarea numărului de componente disponibile pe
card, pentru creşterea fiabilităţii, şi mutarea componentelor adiţionale
204
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
12.2.1 Transmisia
1
SIPO = Serial In Parallel Out
205
COMUNICAŢII SERIALE
Pentru interfaţarea acestor circuite se vor folosi doar doi pini ai microcontrolerului pe
care îi vom nota în continuare cu SDO (Serial Data Output) şi SCK (Serial Clock). Pe pinul
SDO se vor trimite datele bit cu bit, începând cu bitul cel mai semnificativ, către circuitul de
afişare, iar pe pinul SCK se va asigura tactul necesar deplasării datelor în regiştri.
Schimbarea valorii afişate pe cei trei digiţi presupune încărcarea a 24 de biţi în
regiştrii de deplasare.
Pentru a serializa acest proces se va proiecta o subrutină şi ulterior o funcţie C care
asigură punerea fiecărui bit al unui registru de date din memorie2 pe pinul RA0/SDO,
începând cu bitul cel mai semnificativ. În acelaşi timp pe pinul RA1/SCK se va asigura tactul
necesar pentru transmiterea datelor. Acest lucru se rezumă la implementarea unei subrutine
sau a unei funcţii C care parcurge următoarele etape:
1. se pune SCK pe 0 logic
2. CONTOR = 8
3. WHILE CONTOR>0 DO:
a. copiază MSB al registrului de date pe pinul SDO
b. deplasează la stânga conţinutul registrului de date
c. generează un impuls pe pinul SCK
d. decrementează CONTOR [6]
2
Acest registru va conţine codul pe şapte segmente corespunzător cifrei dorite
206
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
SPI_WRITE
bcf LATA, 1 ;pas 1 SCK = 0
movlw 8 ;pas 2 CONTOR = 8
movwf CONTOR
test ;pas 3 (a) & (b)
bcf LATA,0 ;SDO = 0
btfsc DATA_OUT,7 ;salt daca MSB = 0
bsf LATA,0 ;daca MSB ≠0 atunci SDO = 1
rlncf DATA_OUT,F ;deplasare date la stanga
Afişarea cifrelor pe cei trei digiţi folosind circuitul din Fig. 12.2 şi transmisia serială
amintită ridică o singură problemă, aceea că pe durata deplasării celor 24 de biţi, datele de
intrare pe afişajele cu şapte segmente nu sunt valide. Bineînţeles, în exemplul considerat,
ochiul uman nu va sesiza modificările iluminării segmentelor care sunt de ordinul
microsecundelor.
Implementarea din Fig. 12.2 se poate îmbunătăţi prin utilizarea unor circuite
optimizate pentru comunicaţia serială. Acestea au în dotare, pe lângă regiştrii de deplasare
câte un buffer cu rol de menţinere a datelor. De exemplu, circuitul 74HC595 are în structura
sa un buffer de 8 biţi cu încărcare şi descărcare paralelă3 intercalat între registrul de deplasare
şi lumea exterioară. O comandă externă, pe un pin al circuitului, transferă conţinutul
registrului de deplasare spre ieşirile paralele
3
PIPO – Parallel In Parallel Out
207
COMUNICAŢII SERIALE
12.2.2 Recepţia
După cum se poate vedea, există posibilitatea ca recepţia serială să utilizeze acelaşi
pin pentru semnalul de tact ca şi transmisia serială. Astfel, semnalul SCK poate fi legat la
pinul RA1 al microcontrolerului.
Interfaţa serială care citeşte bit cu bit datele de intrare şi le asamblează sub forma unui
octet, disponibil într-un registru din memorie, poate lua forma subrutinei SPI_READ. Această
subrutină este perechea subrutinei SPI_WRITE din paragraful anterior, iar implementarea ei
trebuie să asigure parcurgerea următoarelor etape:
1. se pune SCK pe 0 logic
2. CONTOR = 8
4
PISO – Parallel In Serial Out
208
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
SPI_READ
bcf LATA, 1 ;pas 1 SCK = 0
movlw 8 ;pas 2 CONTOR = 8
movwf CONTOR
umple ;umple registrul de date
bsf LATA,1 ;pas 3 (a) generare impuls SCK=1 apoi SCK=0
bcf LATA,0
bcf STATUS, C ;sterg bit Carry (acesta va fi LSB daca SDI=0)
rlcf DATA_IN,F ;pas 3 (b) deplasare date la stanga
btfsc PORTA,RA2 ;salt daca SDI = 0
bsf DATA_IN,0 ;pas 3 (c) daca SDI ≠ 0 atunci LSB = 1
decfsz CONTOR,F ;pas 3 (d): CONTOR--
bra umple ;repeta pana la recepţia ultimului bit
return
209
COMUNICAŢII SERIALE
Protocolul serial descris prin exemplele anterioare poartă denumirea de SPI (Serial
Peripheral Interface) şi a devenit standardizat în cazul multor producători de microcontrolere.
În cazul familiei PIC18, protocolul SPI este implementat hardware sub forma unui modul
special, denumit MSSP, (en. Master Synchronous Serial Port = Port serial pentru comunicaţii
master sincrone) care poate funcţiona în două regimuri de lucru: SPI sau I2C. Existenţa unui
asemenea protocol a permis dezvoltarea unei game largi de echipamente periferice (memorii
EEPROM seriale, convertoare A/D, module de comunicaţii radio etc.) care pot fi interfaţate
direct cu microcontrolerul fără a necesita regiştri de deplasare adiţionali sau implementarea
unor rutine soft (de genul celor prezentate până acum) pentru realizarea comunicaţiei.
210
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
recepţionează tactul de sincronizare, în acest caz fiind vorba despre o comunicaţie de tip
slave-sincron. Indiferent că vorbim despre comunicaţie de tip master-sincron sau slave-
sincrom, transmisia sau recepţionarea de date nu este condiţionată de generarea tactului de
sincronizare. Astfel, de exemplu, un nod slave poate realiza atât transmisia cât şi recepţia,
într-o singură direcţie la un moment dat, chiar dacă nu este el sursa tactului de sincroniazare.
O alternativă la aceste tipuri de comunicaţie porneşte de la premisa că echipamentele
implicate în schimbul de date funcţionează la aceeaşi frecvenţă de eşantionare. Astfel, nu mai
există tact de sincronizare, comunicaţia serială fiind una de tip asincron în care părţile trebuie
să se pună de acord în privinţa vitezei de comunicare. Aceste viteze sunt standardizate, având
următoarele valori: 110,300,1200,2400,4800,9600,19200,38400,57600,115200bps. Pentru a
se putea asambla corect datele din fluxul serial de biţi se utilizează o informaţie cadru care
permite specificarea începutului şi sfârşitului unui octet. Astfel, datele transmise fizic pe linie
au formatul din Fig. 12.4. Bitul de start semnalează destinaţiei că urmează a se transmite alţi 8
/ 9 biţi de date (configurabil). După recepţionarea biţilor de date, bitul de stop permite
transferul datelor recepţionate în alţi regiştri pentru o prelucrare internă ulterioară.
Arhitectura modulului EUSART are la bază doi regiştri de deplasare, unul pentru
transmisie şi celălalt pentru recepţie. Aceştia sunt completaţi de bufferele de date asociate şi
regiştrii de stare. Pentru a activa modulul EUSART trebuie setat bitul SPEN (Serial Port
Enable) din registrul RCSTA[7].
Pinii utilizaţi de modulul EUSART sunt multiplexaţi cu pinii portului C. Astfel, pentru
a configura pinii RC6/TX/CK şi RC7/RX/DT/SDO în vederea realizării unor comunicaţii
seriale asincrone (TX, RX) sau sincrone (CK, DT), aceşti pini trebuie configuraţi în prealabil ca
pini de intrare. Modulul EUSART va reconfigura, în mod automat, direcţia acestor pini în
funcţie de nevoi. În Fig. 12.5 se prezintă denumirea utilizată pentru aceşti pini şi direcţia lor în
cazul celor trei tipuri de comunicaţie serială ce pot fi implementate cu ajutorul modulului
EUSART:
- comunicaţii seriale asincrone full-duplex (Fig. 12.5-a). Comunicaţia se poate realiza
simultan în ambele direcţii.
211
COMUNICAŢII SERIALE
Logica de transmisie se activează prin setarea bitului TXEN (Transmit Enable) din
registrul TXSTA[5]. Pentru a trimite un caracter acesta trebuie mutat în registrul TXREG
(Transmit Register) de unde va fi transferat către registrul de deplasare TSR (Transmit Shift
212
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Register)5. Dacă se doreşte realizarea unei comunicaţii pe 9 biţi se poate opta pentru acest
format de date prin intermediul bitului TX9 din registrul TXSTA[6]. Al nouălea bit de date
va fi bitul TX9D din registrul TXSTA[0] şi va trebui iniţializat înainte de a scrie octetul de
date în registrul TXREG. Datele din registrul TXREG vor fi transferate în registrul de deplasare
TSR numai după ce acesta din urmă va fi gol (adică când nu mai sunt date în curs de
transmitere).
Starea registrului de deplasare este indicată de bitul TRMT din registrul TXSTA[1],
iar golirea registrului TXREG va fi semnalizată prin setarea bitului indicator de întrerupere
TXIF din registrul PIR1[4]. Dacă se doreşte generarea unei întreruperi, atunci trebuie setat
şi bitul de validare corespunzător TXIE din registrul PIE1[4] (vezi Cap.9 – Sistemul de
întreruperi). Indiferent dacă întreruperea a fost validată sau nu, bitul TXIF va fi setat în mod
automat după realizarea transferului de date din TXREG în TSR, dar spre deosebire de biţii de
indicatori de întrerupere utilizaţi de alte periferice, bitul TXIF nu poate fi resetat manual din
program. Acesta va fi resetat automat după încărcarea unor noi date în registrul TXREG6.
Utilizatorul are la dispoziţie două variante pentru a determina dacă poate transmite
date noi. Fie interoghează bitul indicator de întrerupere TXIF (o testare care urmează imediat
după încărcarea datelor în TXREG poate conduce la rezultate neconcludente din cauza celor
două cicluri instrucţiune necesare pentru resetarea bitului TXIF), fie testează bitul TRMT
pentru a determina dacă datele au fost transmise fizic pe linie. Dacă se optează pentru
utilizarea întreruperii la transmisie aplicaţia poate asigura un flux de date continuu.
5
TSR este un registru intern care nu poate fi accesat din program
6
De fapt se va reseta după două cicluri instrucţiune de la încărcarea datelor în TXREG
213
COMUNICAŢII SERIALE
Dacă întreruperea de recepţie este activată prin setarea bitului RCIE din registrul PIE1[5]
şi sistemul de întreruperi este configurat cu atare (biţii GIE, PEIE) atunci se poate genera o
întrerupere la recepţia datelor. Citirea datelor disponibile în registrul RCREG determină
şteregerea automată a bitul indicator de întrerupere RCIF. Dacă după citire sunt date
disponibile în registrul RSR, acestea vor fi transferate automat în registrul RCREG şi se va
seta din nou bitul RCIF.
Dacă în acest timp se recepţionează un al treilea caracter, iar cei doi regiştri implicaţi
în recepţie sunt plini se va genera un semnal de eroare de suprascriere (en. Overflow error)
marcat prin setarea bitului de stare OERR din registrul RCSTA[1], iar datele vor fi pierdute.
Totuşi, registrul RCREG poate fi citit de două ori pentru a extrage cele două caractere
recepţionate. Pentru a reseta bitul de eroare OERR, logica de recepţie serială trebuie
dezactivată apoi activată din nou prin intermediul bitului CREN. Până nu se realizează acest
lucru nu se vor mai recepţiona alte date.
Eroarea de încadrare (Framing Error) marcată prin setarea bitului FERR din registrul
RCSTA[2] apare în situaţia în care blocul de recepţie a detectat un bit de start, iar după cei 8
biţi de date obţinuţi în urma deplasărilor efectuate în RSR nu se detectează nici un bit de
stop.
Ca şi în cazul recepţiei seriale se poate opta pentru recepţia celui de-al nouălea bit de
date. Acest lucru se face prin setarea bitului RX9 din registrul RCSTA[6], al nouălea bit de
date fiind disponbil în RX9D din registrul RCSTA[0].
214
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
În mod normal, acest bit de date suplimentar poate fi utilizat pentru implementarea
unui mecanism de adresare (vezi Cap. 12.3.7) sau a unui algoritm de testare a parităţii7.
Înainte de a configura recepţia sau transmisia serială trebuie să ne oprim atenţia asupra
vitezei de comunicare. Această etapă este cu atât mai importantă cu cât în cazul
comunicaţiilor asincrone viteza de comunicare trebuie să coincidă în ambele părţi.
Această viteză de comunicare se stabileşte prin configurarea generatorului de tact (en.
BRG = Baud Rate Generator) al modulului de comunicare serială. În acest sens se va
determina o valoare numerică n, a divizorului de frecvenţă, care va genera viteza de
comunicare dorită. Valoarea determinată poate fi una de 8 biţi, caz în care se va înscrie în
registrul SPBRG sau una de 16 biţi, caz în care se va înscrie în perechea SPBRGH:SPBRG.
Bitul BRG16 din registrul BAUDCON[3] este cel care controlează specificarea divizorului pe
8 sau 16 biţi. Alegerea utilizării unui BRG pe 8 sau 16 biţi depinde de eroarea maximă
tolerată dintre viteza dorită şi cea obţinută prin calcule. De regulă, bitul BRG16 este cuplat cu
un alt bit, BRGH din registrul TXSTA[2] pentru asigurarea unei erori mai mici pentru tactul
rezultat sau pentru atingerea unor viteze mici la frecvenţe de lucru mari.
În Tabelul 12.1 sunt centralizate formulele de calcul pentru vitezele de comunicare.
0 1 1 16 biţi/Comunicaţie asincronă
FOSC
1 0 X 8 biţi/Comunicaţie sincronă
4 ⋅ (n + 1)
1 1 X 16 biţi/Comunicaţie sincronă
7
Microcontrolerul nu are posibilitatea de a interpreta paritatea. Acest lucru trebuie făcut din program.
215
COMUNICAŢII SERIALE
216
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
După setarea bitului ABDEN, se şterge automat conţinutul BRG şi începe căutarea unui bit de
start. Pentru a putea calcula viteza de comunicare trebuie să se recepţioneze un octet cu
valoarea 55h8 (în ASCII caracterul ‘U’).
După recepţionarea celor 8 biţi de date, valoarea medie calculată pentru BRG este
depusă în perechea de regiştri SPBRGH:SPBRG, iar bitul ABDEN este şters automat. Din
păcate, nu toate combinaţiile de frecvenţă de lucru şi frecvenţă de comunicare pot fi detectate
cu succes de microcontroler. Din acest motiv, utlizarea detecţiei automate trebuie folosită cu
grijă, doar după o testare a plajei de viteze care pot fi detectate.[8]
Regiştrii de control TXSTA (Fig. 12.8) şi RCSTA (Fig. 12.9) permit configurarea
transmisiei şi recepţiei seriale şi cuprind totodată în structura lor o serie de biţi indicatori ai
stării comunicaţiei.
7 0
CSRC TX9 TXEN SYNC SENDB BRGH TRMT TX9D
Fig. 12.8. Registrul TXSTA: Transmit Status and Control
8
Se va calcula timpul scurs între doi biţi cu aceeaşi stare h’55’=b’01010101’
217
COMUNICAŢII SERIALE
7 0
SPEN RX9 SREN CREN ADDEN FERR OERR RX9D
Fig. 12.9. Registrul RCSTA: Receive Status and Control
218
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
7 0
ABDOVF RCIDL RXDTP TXCKP BRG16 - WUE ABDEN
Fig. 12.10. Registrul BAUDCON: Baud Rate Control
219
COMUNICAŢII SERIALE
Transmisia
Recepţia
; iniţializare
; configurare pini
BSF TRISC, 6
BSF TRISC, 7
; configurare viteza de transmisie 9600bps9
BSF TXSTA, BRGH ; BRGH=1
BCF BAUDCON, BRG16 ; BRG16=0
MOVLW d'129' ; SPBRG=129 ;
MOVWF SPBRG
9
Vezi rel. (12.3)
221
COMUNICAŢII SERIALE
; activare comunicaţie serială asincronă
BCF TXSTA, SYNC ; SYNC=0
; activare modul EUSART
BSF RCSTA, SPEN ; SPEN=1
; date cu polaritate neinversată
BCF BAUDCON, RXDTP
BCF BAUDCON, TXCKP
...
; transmisia
MOVLW ’A’ ;se transmite caracterul ‘A’
MOVWF TXREG
TEST_TX
BTFSS TXSTA, TRMT ;test sfârşit de transmisie
GOTO TEST_TX ;transmisie în desfăşurare
; când se ajunge în acest punct transmisia s-a realizat
...
; recepţia
TEST_RX
BTFSS PIR1, RCIF ;test recepţie
GOTO TEST_RX
; când se ajunge în acest punct s-au primit date
BCF PIR1, RCIF ;ştergere flag
MOVF RCREG, W ;copiere date în WREG
...
care urmează după adresă. Cei opt biţi de date care se trasnsmit serial utilizaţi în mesajele care
conţin adrese permit adresarea unui număr de până la 255 noduri slave, o adresă fiind
rezervată pentru transmiterea unor mesaje de tip broadcast.[7]
Pentru a facilita implementarea unor comunicaţii de acest fel, modulul EUSART poate
fi configurat pentru a seta bitul indicator de întrerupere RCIF doar atunci când al nouălea bit
de date recepţionat este 1 (RX9D = 1). Acest lucru se realizează prin setarea bitului ADDEN
(en. Address Detect Enable) din registrul RCSTA[3] şi bineînţeles activarea recepţiei pe 9
biţi (RX9=1).
În acest context orice recepţie a unui pachet având bitul 9 pus pe 0 va fi ignorată, iar
datele nu vor fi copiate în registrul de recepţie RCREG. La recepţia unui pachet care are bitul 9
setat, datele vor fi copiate din registrul de deplasare RSR în registrul de recepţie RCREG, iar
bitul RCIF va fi setat. Nodul slave va putea citi datele disponibile în RCREG, resetând astfel
şi bitul RCIF, iar dacă îşi va decodifica adresa va putea reseta bitul ADDEN şi toate pachetele
ulterioare vor putea fi citite în mod obişnuit. În acelaşi timp, nodul slave poate continua să
monitorizeze al nouălea bit RX9D, iar masterul poate termina conversaţia prin trimiterea unui
pachet de date care va avea bitul nouă setat.
223
COMUNICAŢII SERIALE
Toate nodurile vor recepţiona acest mesaj. În cazul fiecărui nod în parte mesajul
va fi copiat în registrul RCREG şi se va produce setarea bitului indicator de
întrerupere RCIF. Fiecare nod în parte va citi mesajul primit şi îl va compara cu
adresa proprie. Adresa va coincide doar în cazul nodului cu adresa 3. Acesta va
reseta bitul ADDEN. Toate celelalte noduri, care nu şi-au decodificat adresa vor
păstra setat bitul ADDEN.
După transmiterea mesajului de adresare, nodul master va formula un mesaj care
va conţine datele dorite. Al nouălea bit de date va fi în acest caz TX9D=0. Acest
mesaj are forma din Fig. 12.13.
8 7 0
0 Caracterul ‘A’
Fig. 12.13. Structura mesajului de date
De-a lungul timpului s-au dezvoltat numeroase standarde de comunicaţie create iniţial
pentru diferite cerinţe hardware care nu aveau nici o legătură cu microcontrolerele PIC.
Specificaţiile electrice ale portului serial sunt conţinute în standardul EIA (Electronics
Industry Association) RS232C. Acest standard a fost introdus în anul 1969, în era
modemurilor şi a liniilor telefonice şi definea interfaţa standard care permite realizarea unor
comunicaţii seriale între Echipamentele Terminale pentru Date – DTE (de exemplu PC-urile)
şi Echipamentele de Comunicaţii Date – DCE (de obicei modemuri).
224
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
În timp, utilizarea comunicaţiilor de tip RS232 s-a extins şi în afara domeniul pentru
care a fost dezvoltat iniţial standardul (interconectarea DTE-DCE). În consecinţă, realizarea
interfaţării dintre sistemele de calcul bazate pe microcontrolere PIC şi echipamentele care
respectă acest standard presupune anumite costuri privind complexitatea hardware şi cea
software a sistemului. De exemplu, conectarea unui microsistem bazat pe PIC la un PC prin
intermediul portului serial RS-232-C, presupune conformarea cu acest standard, iar acest
lucru nu se poate realiza direct, decât în prezenţa unui circuit adiţional (MAX232).
Astfel, în Fig. 12.15 se prezintă modul de realizare a conexiunii între un
microcontroler PIC şi portul serial al unui PC sau orice alt echipament dotat cu port serial
asincron RS232.
După cum se poate vedea din Fig. 12.15, dar şi din specificaţiile standardului amintite
anterior, nu se poate realiza legătura directă între microcontroler şi portul serial RS232 al PC-
ului. În acest context, se utilizează un circuit MAX232 care adaptează nivelele de tensiune de
pe pinii microcontrolerului (0V – 0 logic / 5V – 1 logic) la nivelele de tensiune de +12V
(pentru 0 logic), respectiv -12V (pentru 1 logic) cerute de standardul RS232.[20] Dacă
protocolul de comunicaţie nu necesită linii de control suplimentare, cum se întâmplă în cazul
multor aplicaţii, PC-ul poate fi “convins” că discută cu un echipament de tip DCE. Acest
lucru se realizează, prin conectarea pinului RTS cu pinul CTS şi prin conectarea pinilor DTR,
225
COMUNICAŢII SERIALE
Master-sincron
226
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
Slave-sincron
227
COMUNICAŢII SERIALE
Baud rate
Viteza de transmisie măsurată în biţi pe secundă
Termeni Bit de paritate
esenţiali Bit opţional, care se transmite după cei 8 biţi de date utilizat pentru
verificarea erorilor de comunicaţie. Dacă se optează pentru paritate pară,
nodul care transmite setează sau şterge bitul de paritate astfel încât suma
biţilor de 1 ai caracterului transmis să fie pară. În cazul parităţii impare,
bitul se specifică astfel încât suma biţilor de 1 să fie impară. La recepţie se
poate testa paritatea pentru a vedea dacă pe durata transmisiei s-a alterat
vreun bit de date.
Bit de start
Bit cu valoare logică 0 care indică faptul că în fluxul serial urmează biţi
de date.
Bit de stop
Bit cu valoarea logică 1 inserat în fluxul serial care face parte din
informaţia cadru care însoţeşte un octet de date. Are rolul de a asigura
receptorului timp suficient pentru a se pregăti pentru următorul pachet de
date.
BRG
en. Baud Rate Generator. Bloc în structura modulului EUSART care
generează tactul pentru comunicaţia serială
Comunicaţie serială asincronă
Comunicaţie full-duplex în care echipamentele implicate în schimbul de
date funcţionează la aceeaşi frecvenţă de eşantionare. Astfel, părţile
228
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
229
COMUNICAŢII SERIALE
230
Facultatea de Inginerie și
Tehnologia Informației
SISTEME CU MICROPROCESOARE
Pentru uz intern
Este interzisă copierea și distribuirea neautorizată a acestui material.
Introducere
Obiective
1.1 ARHITECTURA VON NEUMANN
1.2 ARHITECTURA HARVARD
1.3 MICROPROCESOR SAU MICROCONTROLER?
1.4 STRUCTURA INTERNĂ A MICROCONTROLERELOR
DIN FAMILIA PIC18F
Concluzii
Obiective
1.1 ARHITECTURA VON NEUMANN
1.2 ARHITECTURA HARVARD
1.3 MICROPROCESOR SAU MICROCONTROLER?
1.4 STRUCTURA INTERNĂ A MICROCONTROLERELOR
DIN FAMILIA PIC18F
Concluzii
12/7
Este interzisă copierea și distribuirea neautorizată a acestui material.
Obiective
Obiective
1.1 ARHITECTURA VON NEUMANN
1.2 ARHITECTURA HARVARD
1.3 MICROPROCESOR SAU MICROCONTROLER?
1.4 STRUCTURA INTERNĂ A MICROCONTROLERELOR
DIN FAMILIA PIC18F
Concluzii
Magistralele
căile de comunicaţie ale sistemului de calcul
colecţie de fire pe care informaţia circulă paralel
Magistralele
Magistrala de date
Magistrala de adrese
Magistrala de control
Magistralele
Exemplu: Capacitatea de adresare a unui microsistem este de
4kB. Câte linii de adresă va avea magistrala de adrese a
acestui sistem?
Magistralele
Exemplu: Capacitatea de adresare a unui microsistem este de
4kB. Câte linii de adresă va avea magistrala de adrese a
acestui sistem?
Memoria
spaţiu de stocare
datele şi instrucţiunile se găsesc în acelaşi spaţiu de memorie
locaţie (adresă) vs. conţinut
Avantaje
simplitatea arhitecturii
flexibilitatea sistemului
Dezavantaj
Accesul la datele din memorie nu se poate produce în acelaşi timp
cu extragerea instrucţiunii din memorie scade viteza de lucru
Obiective
1.1 ARHITECTURA VON NEUMANN
1.2 ARHITECTURA HARVARD
1.3 MICROPROCESOR SAU MICROCONTROLER?
1.4 STRUCTURA INTERNĂ A MICROCONTROLERELOR
DIN FAMILIA PIC18F
Concluzii
Avantaj
datele şi instrucţiunile pot fi accesate în acelaşi timp
Dezavantaj
creşte complexitatea arhitecturii interne
memorie unică
memorii separate
Obiective
1.1 ARHITECTURA VON NEUMANN
1.2 ARHITECTURA HARVARD
1.3 MICROPROCESOR SAU MICROCONTROLER?
1.4 STRUCTURA INTERNĂ A MICROCONTROLERELOR
DIN FAMILIA PIC18F
Concluzii
Microprocesor = UCP
De ce microcontrolere?
Exemplu: cum s-ar realiza citirea periodică la fiecare 5ms
a unui senzor conectat pe un bit al unui port?
Structura generală
Obiective
1.1 ARHITECTURA VON NEUMANN
1.2 ARHITECTURA HARVARD
1.3 MICROPROCESOR SAU MICROCONTROLER?
1.4 STRUCTURA INTERNĂ A MICROCONTROLERELOR
DIN FAMILIA PIC18F
Concluzii
Caracteristici PIC18
instrucţiuni pe 16 biţi
magistrală internă de 8 biţi
RISC = Reduced Instruction Set Computer
arhitectură Harvard
memorie program de tip flash
memorie de date adresabilă liniar
protocoale de comunicaţii diverse etc.
Execuţia instrucţiunilor
Execuţia instrucţiunilor
- - - N OV Z DC C
Registrul STATUS
C – Carry Z – Zero
OV – Overflow DC – Digit Carry
N – Negative
Obiective
1.1 ARHITECTURA VON NEUMANN
1.2 ARHITECTURA HARVARD
1.3 MICROPROCESOR SAU MICROCONTROLER?
1.4 STRUCTURA INTERNĂ A MICROCONTROLERELOR
DIN FAMILIA PIC18F
Concluzii
SISTEME CU MICROPROCESOARE
Pentru uz intern
Este interzisă copierea și distribuirea neautorizată a acestui material.
Cuprins
Obiective
Concluzii
Obiective
Concluzii
Obiective
Concluzii
Au 3 operanzi:
Registrul (f)
Destinaţia rezultatului (d)
Zona de memorie accesată (a)
Au 3 operanzi:
Registrul (f)
Destinaţia rezultatului (d)
Zona de memorie accesată (a)
Operandul f:
reprezintă adresa de 8 biţi a unui registru din memorie
Au 3 operanzi:
Registrul (f)
Destinaţia rezultatului (d)
Zona de memorie accesată (a)
Operandul d:
1 bit
indică destinaţia rezultatului operaţiei realizate de instrucţiune
d = 0 rezultatul WREG
d = 1 rezultatul f
Au 3 operanzi:
Registrul (f)
Destinaţia rezultatului (d)
Zona de memorie accesată (a)
Operandul a:
1 bit
indică modul de acces la registrul f
a = 0 registrul f se găseşte în Access Bank
a = 1 registrul f se găseşte într-un Bank specificat prin BSR
Au 3 operanzi:
Registrul (f)
Destinaţia rezultatului (d)
Zona de memorie accesată (a)
15 10 9 8 7 0
Utilizare: cod_operatie f, d, a
cod_operatie f, a
Au 3 operanzi:
Registrul (f)
Destinaţia rezultatului (d)
Zona de memorie accesată (a)
Au 3 operanzi:
Registrul (f)
Destinaţia rezultatului (d)
Zona de memorie accesată (a)
15 12 11 0
Au 3 operanzi:
Registrul (f)
Bitul din registru (b)
Zona de memorie accesată (a)
Au 3 operanzi:
Registrul (f)
Bitul din registru (b)
Zona de memorie accesată (a)
Operandul f:
reprezintă adresa de 8 biţi a unui registru din memorie
Au 3 operanzi:
Registrul (f)
Bitul din registru (b)
Zona de memorie accesată (a)
Operandul b:
3 biţi
poziţia bitului afectat de instrucţiune în registrul f
Au 3 operanzi:
Registrul (f)
Bitul din registru (b)
Zona de memorie accesată (a)
Operandul a:
1 bit
indică modul de acces la registrul f
a = 0 registrul f se găseşte în Access Bank
a = 1 registrul f se găseşte într-un Bank specificat prin BSR
Au 3 operanzi:
Registrul (f)
Bitul din registru (b)
Zona de memorie accesată (a)
15 12 11 9 8 7 0
Utilizare: cod_operatie f, b, a
Au un operand:
valoarea constantei (k)
15 8 7 0
Utilizare: cod_operatie k
Utilizare: cod_operatie n
cod_operatie n,{s}
cod_operatie s
cod_operatie
Obiective
Concluzii
Exemplu: ADDWF f, d, a
Exemplu: ADDWF f, d, a
Instrucţiuni Descriere
ADDWF f,d,a Adună WREG cu f
ADDWFC f,d,a Adună WREG cu f şi cu bitul de transport
SUBWF f,d,a Scade WREG din f
SUBWFB f,d,a Scade f din WREG cu bitul de împrunut
SUBFWB f,d,a Scade WREG din f cu bitul de împrumut
INCF f,d,a Incrementează f
DECF f,d,a Decrementează f
MULWF f,a Înmulţeşte f cu WREG
NEGF f,a Negare f
Exemplu: RLCF f, d, a
RLCF REG, W, 0
Exemplu: RLNCF f, d, a
RLNCF REG, W, 0
Exemplu: ANDLW k
ANDLW 0x0F
Instrucţiuni Descriere
ADDLW k Adună WREG cu literal
SUBLW k Scade WREG din literal
MULLW k Înmulţeşte WREG cu literal
ANDLW k ŞI logic între WREG şi literal
IORLW k SAU logic între WREG şi literal
XORLW k SAU-EXCLUSIV între WREG şi literal
BCF REG, 2, 0
Instrucţiuni Descriere
BCF f,b,a Resetează bitul b din registrul f
BSF f,b,a Setează bitul b din registrul f
BTG f,b,a Schimbă starea bitului b din registrul f
Instrucţiuni Descriere
BTFSC f,b,a Testează bitul b din reg. f, salt dacă este 0
BTFSS f,b,a Testează bitul b din reg. f, salt dacă este 1
MOVLW d’100’
MOVWF REG
Bucla_for
CLRF 0x00, 0
DECFSZ REG, F, 0
GOTO Bucla_for
Instrucţiuni Descriere
CPFSEQ f,a Compară f cu WREG, salt dacă f=WREG
CPFSGT f,a Compară f cu WREG, salt dacă f>WREG
CPFSLT f,a Compară f cu WREG, salt dacă f<WREG
TSTFSZ f,a Testează f, salt dacă f=0
INCFSZ f,d,a Incrementează f, salt dacă rezultatul = 0
INCFSNZ f,d,a Incrementează f, salt dacă rezultatul ≠ 0
DECFSZ f,d,a Decrementează f, salt dacă rezultatul = 0
DECFSNZ f,d,a Decrementează f, salt dacă rezultatul ≠ 0
Instrucţiuni Descriere
MOVWF f,a Mută WREG în f
MOVF f,d,a Mută f
MOVFF fs,fd Mută fs(sursa) în fd(destinaţie)
MOVLW k Mută literal în WREG
MOVLB k Mută literal (4 biţi) în BSR
LFSR f,k Mută literal (12 biţi) în FSR(f)
Obiective
Concluzii
Exemplu:
BSF REG, 4, 0
Exemplu: MOVLW D’200’
REG EQU 0X37
CPFSGT REG, 0
CONTOR EQU 0X00
GOTO setare
GOTO resetare
MOVLW D’71’
MOVWF REG, 0
setare
SETF REG, 0
MOVLW D’50’
GOTO sfarsit
MOVWF CONTOR, 0
resetare
Bucla_for:
CLRF REG, 0
INCF REG, F, 0
GOTO sfarsit
DECFSZ CONTOR, F, 0
GOTO Bucla_for
sfarsit
END
Este interzisă copierea și distribuirea neautorizată a acestui material.
Concluzii
SISTEME CU MICROPROCESOARE
Pentru uz intern
Este interzisă copierea și distribuirea neautorizată a acestui material.
Cuprins
Obiective
Concluzii
Obiective
Concluzii
Obiective
Concluzii
Scrierea unei valori în registrul PCL (ex. MOVWF PCL) transferă simultan şi
conţinutul regiştrilor tampon PCLATU:PCLATH în regiştrii PCU:PCH.
MOVF PCL,W
MOVWF TEMP
MOVLW d’24’
ADDWF TEMP,F Ce face acest cod ?
MOVLW 0
ADDWFC PCLATH,F
MOVLW 0
ADDWFC PCLATU,F
MOVF TEMP,W
MOVWF PCL
Apelul de subrutină
Regiştrii TOS vor conţine întotdeauna imaginea locaţiei din stivă spre care
indică STKPTR
7 0
PUSH / POP
Instrucţiuni de manipulare a indicatorului de stivă fără a produce saltul spre
sau revenirea dintr-o subrutină.
Obiective
Concluzii
MOVLW 0x02
MOVLB 0x02
MOVWF BSR
Access Bank
Zonă virtuală de memorie
Mapează primii 96 GPR şi 160 de SFR
Bitul de acces a din codul instrucţiunilor trebuie resetat (a=0)
nu mai trebuie schimbat bank-ul
Exemplu: accesul la reg. TRISA din Bank 15 şi la reg. 0x007 din Bank 0
MOVFF Fs, Fd
instrucţiune lungă (32 biţi)
Fs - adresa de 12 biţi a registrului sursă
Fd - adresa de 12 biţi a registrului destinaţie
mută conţinutul registrului sursă în registrul destinaţie
necesită 2 cicluri instrucţiune pentru execuţie
Exemplu:
Obiective
Concluzii
Memorie nevolatilă
Se utilizează pentru stocarea datelor permanente
Sunt disponibili 256 octeţi
Poate fi accesată indirect prin intermediul regiştrilor speciali:
EECON1, EECON2, EEDATA şi EEADR.
Obiective
Concluzii
SISTEME CU MICROPROCESOARE
Pentru uz intern
Este interzisă copierea și distribuirea neautorizată a acestui material.
Cuprins
Obiective
Concluzii
Obiective
Concluzii
Obiective
Concluzii
Exemplu:
Directiva CBLOCK:
Obiective
Concluzii
MOVLB 2
ADDWF 0x3A,W,1 001001 0 1 00111010
ADDWF 0x3A,F,1 001001 1 1 00111010
STERG_VECTOR:
CLRF H’00’
CLRF H’01’
CLRF H’02’
v.1 CLRF H’03’
CLRF H’04’
CLRF H’05’
CLRF H’06’
.... .....
CLRF H’5E’
CLRF H’5F’
STERG_VECTOR:
CLRF H’00’ - Lipsa de flexibilitate
CLRF H’01’
- Ştergerea tuturor regiştrilor
CLRF H’02’
v.1 CLRF H’03’
CLRF H’04’
GPR în acest fel ar ocupa
14% din totalul memoriei
program
CLRF H’05’
CLRF H’06’
.... .....
CLRF H’5E’
CLRF H’5F’
Obiective
Concluzii
MOVLW 0x00
MOVWF FSR0L sau LFSR FSR0, 0x200
MOVLW 0x02
MOVWF FSR0H
7 0
Exemplu: Să se reseteze
regiştrii din Bank-ul 0 mapaţi
în AccessBank
Adresarea indexată
Obiective
Concluzii
SISTEME CU MICROPROCESOARE
Pentru uz intern
Este interzisă copierea și distribuirea neautorizată a acestui material.
Cuprins
Obiective
5.1 MACROURI
5.2 SUBRUTINE
5.3 TABLOURI
Concluzii
Obiective
5.1 MACROURI
5.2 SUBRUTINE
5.3 TABLOURI
Concluzii
Obiective
5.1 MACROURI
5.2 SUBRUTINE
5.3 TABLOURI
Concluzii
argumente
Se recomandă:
Utilizarea directivei local pentru introducerea etichetelor din corpul
macroului
Numele date macrourilor să fie diferite de numele instrucţiunilor
DECFSZ CONTOR, F
My_macro
[…]
Avantaje:
creşterea clarităţii codului
reducerea dimensiunii codului la scriere
eficienţă ridicată la execuţia macroului
Dezavantaje:
Apariţia de erori subtile de programare
Creşterea dimensiunii codului compilat
Obiective
5.1 MACROURI
5.2 SUBRUTINE
5.3 TABLOURI
Concluzii
Cerinţe:
subrutina trebuie apelată folosind instrucţiunea CALL
punctul de intrare în subrutină (adresa primei instrucţiuni
din subrutină) trebuie marcat printr-o etichetă
această etichetă va fi numele subrutinei
punctul de ieşire din subrutină trebuie să fie o instrucţiune
de revenire din subrutină
Etichetă:
[INSTRUCTIUNE 1]
[INSTRUCTIUNE 2] Corpul subrutine
Numele subrutinei […]
RETURN sau RETLW sau RETFIE
Main:
[…]
CALL Setare_Port ;apelul subrutinei
[…]
GOTO Main
Rutina:
[…]
RETURN FAST ; restaurare valori salvate
; în stiva rapidă
Main:
[…]
CALL Rutina, FAST ; salvarea registrilor WREG,
[…] ; STATUS, BSR în stiva rapidă
Avantaje:
creşterea clarităţii codului
modularizarea aplicaţiilor
Se poate utiliza aceeaşi secvenţă de cod din puncte
diferite de program folosind salturi, fără includerea
codului la compilare
Dezavantaj:
Creşte timpul de execuţie
Obiective
5.1 MACROURI
5.2 SUBRUTINE
5.3 TABLOURI
Concluzii
Principiu:
Modificarea valorii PC pentru a executa instrucţiunea RETLW
corespunzătoare indexului dorit
Tabel:
ADDWF WREG,W ;WREG=index+index
MOVFF PCL,TEMP ;PCL→TEMP,PCH→PCLATH,PCU→PCLATU
ADDWF PCL, F ;PCL+2*index→PCL
RETLW d’101’ ;index 0
RETLW d’115’ ;index 1
RETLW d’90’ ;index 2
RETLW d’83’ ;index 3
RETLW d’85’ ;…
RETLW d’99’
RETLW d’150’
RETLW d’149’
Tabel:
ADDWF WREG,W
MOVFF PCL,TEMP
ADDWF PCL, F
RETLW d’101’ MOVLW d’3’
RETLW d’115’ CALL Tabel ;WREG=83
RETLW d’90’
RETLW d’83’
RETLW d’85’
RETLW d’99’
RETLW d’150’
RETLW d’149’
Tabel:
ADDWF WREG,W
MOVFF PCL,TEMP
ADDWF PCL, F
RETLW d’101’ MOVLW d’4’
RETLW d’115’ CALL Tabel ;WREG=85
RETLW d’90’
RETLW d’83’
RETLW d’85’
RETLW d’99’
RETLW d’150’
RETLW d’149’
Tabel:
ADDWF WREG,W
MOVFF PCL,TEMP
ADDWF PCL, F
RETLW d’101’ MOVLW d’5’
RETLW d’115’ CALL Tabel ;WREG=99
RETLW d’90’
RETLW d’83’
RETLW d’85’
RETLW d’99’
RETLW d’150’
RETLW d’149’
Principiu:
TBLPTR – adresa de 21 de biţi accesată
TABLAT – octetul accesat
Operatia Instructiune
Citire tabelară
TBLPTR nemodificat TBLRD*
TBLPTR post incrementat TBLRD*+
TBLPTR post decrementat TBLRD*-
TBLPTR pre incrementat TBLRD+*
Principiu:
Elementele se accesează folosind regiştrii de adresare (FSRn)
şi accesare conţinut (INDFn, POSTINCn, PREINCn,
POSTDECn, PLUSWn)
Stocare_Valori:
LFSR FSR0, 0x200
MOVLW d’101’ Return_Valoare:
MOVWF POSTINC0 LFSR FSR1,0x200
MOVLW d’115’ ADDWF FSR1L, F
MOVWF POSTINC0 MOVLW d’0’
[…] ADDWFC FSR1H, F
MOVLW d’150’ MOVF INDF1, W
MOVWF POSTINC0 RETURN
MOVLW d’149’
MOVWF POSTINC0
RETURN
Obiective
5.1 MACROURI
5.2 SUBRUTINE
5.3 TABLOURI
Concluzii