Sunteți pe pagina 1din 18

SISTEME CU MICROPROCESOARE.

MICROCONTROLERUL PIC18F4455
81


5. STRUCTURI DE PROGRAM



Cuprins
Introducere
Obiective
5.1 MACROURI
5.2 SUBRUTINE
5.3 TABLOURI
5.3.1 Implementarea tablourilor utiliznd instruciuni
microprocesor
5.3.2 Implementarea tablourilor utiliznd instruciuni
dedicate
5.3.3 Implementarea tablourilor utiliznd adresarea
indirect
Concluzii
ntrebri de autoevaluare
Termeni eseniali












STRUCTURI DE PROGRAM
82

Introducere
n limbaj de asamblare, codul dezvoltat este greu de urmrit i modificat.
Pentru a realiza programe scalabile i uor lizibile, codul i datele trebuie
grupate. Structurarea codului folosind macrouri i subrutine reprezint o
bun practic de programare, aceste structuri formnd baza unor limbaje
de nivel nalt precum C-ul. De asemenea, gruparea datelor n structuri
denumite tablouri poate mbunti codul realizat


Obiective
Dup parcurgerea acestui capitol cursantul va trebui:
- s neleag diferena dintre macrouri i subrutine
- s neleag diferena ntre tablourile implementate n memoria
program i cele implementate n memoria RAM de date
- s implementeze corect structurile de program prezentate
- s structureze codul programelor realizate


5.1 MACROURI

Asamblorul utilizat permite programatorului s-i defineasc propria sa secven de
instruciuni sub forma unei macro instruciuni. Ulterior aceste macro instruciuni pot fi
utilizate asemenea instruciunilor obinuite din setul de instruciuni al microcontrolerului. De
exemplu, codul urmtor definete un macro care permite selectarea Bank-ului de lucru cu
numrul 2.
Bank2 MACRO
MOVLW 2
MOVWF BSR
ENDM

Perechea de directive MACRO-ENDM se utilizeaz pentru a delimita o seciune de cod
format din instruciuni native ale microcontrolerului, care ulterior vor fi nlocuite prin apelul
macroului. Apelul coincide cu utilizarea denumirii macroului, n cazul de fa Bank2, n
codul programului. Macrourile ofer o claritate n plus programelor ntruct chiar i cele mai
simple seturi de instruciuni pot fi nlocuite cu o expresie familiar programatorului.
n limbajul C, macrourile (cunoscute i sub denumirea de macrodefiniii sau
macroinstruciuni) sunt definiii care nlocuiesc constante, variabile sau expresii, fiind
declarate cu ajutorul directivei #define. n cadrul asamblorului considerat, macrourile sunt
secvene de instruciuni care nlocuiesc un apel al macroului.[8]

SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
83
Sintaxa general utilizat pentru definirea unui macro este:
Etichet MACRO [ARG1, ARG2, ]
[INSTRUCIUNE 1]
[INSTRUCIUNE 2]
[]
ENDM

n exemplul prezentat anterior, macroul de selectare a Bankului 2 nu utiliza nici un fel
de operand. Asemenea instruciunilor obinuite i macrourile pot avea unul sau mai muli
operanzi.

S analizm cazul unei macro-instruciuni, denumit Movlf (Move literal
to file register) utilizat pentru iniializarea direct a unui registru cu o
valoare. Deoarece o asemenea instruciune nu exist n setul de instruciuni
al microcontrolerului, rmne n sarcina noastr s o definim.
Astfel, macroul Movlf poate fi definit n felul urmtor:

Exemplu
Movlf MACRO Literal, Destinatie ;operanzi

PUSH ;salvare WREG & STATUS
MOVWF TOSL ;in stiva hardware
MOVFF STATUS, TOSH

MOVLW Literal ;Literal->WREG
MOVWF Destinatie ;WREG->Destinatie

MOVF TOSL,W ;restaurare WREG & STATUS
MOVFF TOSH, STATUS
POP

ENDM

Dac programatorul ar dori s iniializeze registrul de la adresa 0x20 cu
valoarea 0x55, atunci macroul definit anterior ar putea fi utilizat n felul
urmtor:
Movlf 0x55, 0x20
Deoarece instruciunile cuprinse n macro pot afecta regitrii WREG i
STATUS, iar acest lucru poate influena rezultatele operaiilor din afara
macroului, macroul definit anterior este prevzut cu cteva instruciuni care
salveaz coninutul regitrilor WREG i STATUS n stiva hardware, nainte
de a muta constanta n WREG i apoi n registrul destinaie. La finalul
macroului valorile celor doi regitri sunt refcute din stiv.
STRUCTURI DE PROGRAM
84
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 aceleai cu cele ale instruciunilor
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 aprea din cauza denumirii etichetelor din
exteriorul macroului sau din cauza mai multor apeluri ale aceluiai macro.
Ceea ce este specific macrourilor este faptul c fiecare apel al acestora echivaleaz cu
o inserare a setului de instruciuni din corpul macroului la adresa de apel. Folosirea acestor
structuri se preteaz de regul n situaii n care acestea nu conin multe instruciuni i
integrarea altor structuri (cum ar fi cele cu salt) ar duce la o cretere a timpului de execuie.
Utilizarea frecvent a macrourilor poate conduce la dificulti n depanarea
programelor, mai ales atunci cnd o simpl macro instruciune poate ascunde un numr de
efecte secundare asupra unor regitri GPR i SFR sau asupra unor bii 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 instruciuni de salt condiionat peste apelul macroului:
DECFSZ CONTOR, F
My_macro
[]
Deoarece apelul macroului este de fapt o colecie de instruciuni care formeaz corpul
macroului, saltul de mai sus va fi de fapt n interiorul macroului, avnd consecine
neprevzute.

Printre avantajele pe care le aduce utilizarea macrourilor n programe se pot aminti:
- creterea claritii codului prin posibilitatea redenumirii unor seturi de instruciuni
folosind expresii familiare programatorului;
- reducerea dimensiunii codului la scriere prin definirea de macrouri pentru seturi de
instruciuni care se repet;
- eficien ridicat la execuia setului de instruciuni inclus n macro ntruct acestea
sunt inserate n cod la compilare, nefiind necesar efectuarea unui salt, sau apel de
subrutin.

Dezavantajele care rezult din utilizarea macrourilor vizeaz:
- apariia unor erori subtile de programare datorate ignorrii coninutului macroului (ex.
modificarea unor zone nedorite de memorie)
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
85
- creterea n dimensiuni a codului compilat, deoarece fiecare apel al macroului
nlocuiete de fapt un grup de instruciuni care sunt inserate la adresa de apel a
macroului la compilare.[8]


5.2 SUBRUTINE

Pentru a executa aceleai instruciuni de mai multe ori fr a recurge la reinserarea
codului, se pot folosi subrutine. n cadrul limbajelor de asamblare, subrutinele iau forma unor
instruciuni cuprinse ntre o etichet i o instruciune de revenire din subrutin.
n utilizarea subrutinelor se impune respectarea urmtoarelor cerine privind sintaxa i
modul de utilizare:
- subrutina trebuie apelat folosind instruciunea CALL;
- punctul de intrare n subrutin (adresa primei instruciuni din subrutin) trebuie marcat
printr-o etichet. Aceast etichet va fi numele instruciunii.
- punctul de ieire din subrutin trebuie s fie o instruciune de revenire din subrutin.
Astfel, sintaxa general utilizat pentru definirea unei subrutine ia forma urmtoare:
Etichet:
[INSTRUCIUNE 1]
[INSTRUCIUNE 2]
[]
RETURN sau RETLW sau RETFIE

Utilizarea subrutinelor este n strns legtur cu stiva adreselor de revenire (vezi
Capitolul 3), iar apelul unei subrutine determin urmtoarea succesiune evenimente:
1. Indicatorul de stiv se incrementeaz;
2. Se salveaz pe stiv adresa de revenire din subrutin (valoarea numrtorului de
program). Adresa de revenire reprezint adresa instruciunii care urmeaz dup
CALL;
3. Se ncarc n numrtorul de program adresa instruciunii marcat de eticheta
subrutinei. Aceast instruciune corespunde primei instruciuni a subrutinei. Se
transfer astfel execuia ctre subrutin.
4. Se execut instruciunile din subrutin pn la ntlnirea instruciunii RETURN
5. La execuia instruciunii RETURN se stocheaz n numrtorul de program adresa de
revenire spre care indic indicatorul de stiv, apoi
6. Se decrementeaz indicatorul de stiv
7. Se execut instruciunile din program existente dup CALL.[6,8]
STRUCTURI DE PROGRAM
86
Analiznd succesiunea evenimentelor produse de apelul unei subrutine putem constata
c paii 1 i 2 sunt echivaleni operaiei PUSH, iar pasul 6 corespunde operaiei POP (vezi
Capitolul 3).

Utilizarea subrutinelor este pus n eviden n exemplul urmtor.

Exemplu
Se analizeaz cazul unei subrutine care iniializeaz direcia pinilor portului
B dup cum urmeaz: pinii RB<6:0> intrri, iar pinul RB7 ieire.
GOTO Main

Setare_Port:
MOVLW 0x7F
MOVWF TRISB
RETURN

Main:
[]
CALL Setare_Port
[]

Exist situaii n care doar salvarea numrtorului de program, asigurat n mod
automat de stiva hardware, nu este suficient pentru revenirea programului la starea avut
naintea apelului de subrutin sau a apelului unei subrutine de tratare a ntreruperii.


Exemplu
S presupunem c ne aflm n mijlocul transferului unei constante cu
valoarea 0x55 din registrul de lucru WREG ntr-un registru GPR aflat la
adresa 0x20. Acest transfer se realizeaz din doi pai. Dac dup primul
pas se face apelul subrutinei Setare_Port la adresa 0x20 se va stoca
valoarea 0x7F necesar iniializrii portului, n loc de valoarea dorit
0x55.
GOTO Main

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)

SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
87
Aceai situaie se poate produce i n cazul apariiei unei ntreruperi n timpul
transferului (ntre pasul 1 i pasul 2) care va conduce la suspendarea programului i la
execuia unei rutine de tratare a ntreruperii.
Pentru a rezolva aceast problem, microcontrolerul PIC18F4455 este prevzut cu o
stiv temporar cu un singur nivel (en. Fast Register Stack) n care se pot salva n mod
automat regitrii WREG, STATUS i BSR. Prin intermediul bitului s prezent n codul
instruciunilor CALL, RETURN i RETFIE utilizatorul poate specifica dac dorete salvarea /
restaurarea regitrilor respectivi.
Astfel, dac avem o subrutin, denumit Rutina_Exemplu, n care se modific
coninutul registrului WREG, atunci prin utilizarea bitului s=1 (s=FAST) la apelul
instruciunii RETURN se va reface valoarea WREG cu cea salvat n prealabil n stiva rapid.
Pentru ca apelul unei asemenea rutine s determine salvarea celor trei regitri n stiva rapid
instruciunea CALL va trebui s utilizeze bitul s=1.
GOTO Main

Rutina_Exemplu:
[]
RETURN FAST ; restaurare valori salvate
; n stiva rapid
Main:
[]
CALL Rutina_Exemplu, FAST ; salvarea regitrilor WREG,
[] ; STATUS, BSR n stiva rapid

n cazul ntreruperilor, cei trei regitri sunt salvai automat, ns utilizatorul poate opta
pentru restaurarea valorilor prin folosirea urmtoarei sintaxe a instruciunii de revenire din
subrutina de tratare a ntreruperii:
RETFIE FAST
Existena stivei rapide cu un nivel permite salvarea i refacerea contextului n cazul
existenei unor subrutine neimbricate. n cazul subrutinelor imbricate, ns, se recomand
salvarea manual a acestor trei regitri n nite locaii de memorie prevzute de programator
special pentru acest lucru, iar apoi refacerea regitrilor respectivi nainte de ieirea din
subrutin.
Toate instruciunile disponibile pentru utilizarea subrutinelor i variantele lor sunt
prezentate n Tabelul 5.1.[6,15]



STRUCTURI DE PROGRAM
88
Tabel 5.1. Instruciuni asociate subrutinelor
Operaia Format instruciune Descriere
Apel Transfer execuia ctre subrutin
de subrutin CALL n PC pus pe stiv, <n>PC
cu revenire rapid CALL n, 1 Idem, salveaz WREG, STATUS, BSR n stiva rapid
relativ RCALL offset PC pus pe stiv, PCoffsetPC
Revenire Transfer execuia ctre apelant
din subrutin RETURN PC scos din stiv
rapid din subrutin RETURN 1 Idem, restaureaz WREG, STATUS, BSR din stiva
rapid
cu literal n WREG RETLW k Idem, k n WREG
din ntrerupere RETFIE Revenire cu bitul GIE (INTCON<7>) setat
din ntrerupere rapid RETFIE 1 Idem, restaureaz WREG, STATUS, BSR din stiva
rapid

Utilizarea subrutinelor aduce o serie de avantaje cum ar fi:
- creterea claritii codului surs
- permite modularizarea aplicaiilor dezvoltate
- posibilitatea execuiei aceleiai secvene de cod din puncte diferite de program
folosind salturi, fr includerea codului, aa cum se ntmpl n cazul macrourilor.

Ca principal dezavantaj se poate meniona creterea timpului de execuie ca urmare a
efecturii celor dou salturi: la adresa de nceput a subrutinei, respectiv la adresa de revenire.


5.3 TABLOURI

Pentru gruparea datelor n structuri denumite tablouri, se pot folosi instruciuni
microprocesor, instruciuni tabelare sau adresarea indirect. Metoda utilizat depinde de locul
n care va fi stocat tabloul, fiind permis stocarea datelor att n memoria program ct i n
memoria de date. Toate aceste metode vor fi prezentate n acest paragraf.
Majoritatea aplicaiilor implementate pe microcontrolere utilizeaz pentru codul surs
doar o parte a memoriei program disponibile. De exemplu, dac o aplicaie utilizeaz 10kByte
de cod executabil, spaiul de memorie program rmas disponibil, 14kByte, este irosit. Exist
posibilitatea, la familia de microcontrolere PIC18, de a stoca date cu caracter semi-permanent
n memoria program. n mod normal aceste date sunt scrise n memoria program n acelai
timp cu codul executabil. Anumite microcontrolere permit chiar scrierea datelor n memoria
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
89
program n timp ce execuia este suspendat. Totui, 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 instruciunilor obinuite.
n cazul anumitor microcontrolere s-a ocolit aceast restricie impus de arhitectur
prin implementarea instruciunii RETLW care permite realizarea de subrutine care pot ntoarce
n registrul de lucru WREG constante de opt bii din memoria program. Aceast soluie este
costisitoare din punct de vedere al memoriei utilizate deoarece fiecare constant de opt bii
este stocat sub forma unei instruciuni de 16 bii. 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 instruciuni 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.

5.3.1 Implementarea tablourilor utiliznd instruciuni microprocesor

Aceast metod presupune stocarea valorilor tabloului n memoria program i poate fi
folosit n situaiile n care valorile respective nu se modific (tablou de constante). Metoda
implic instruciuni de manipulare a numrtorului de program i instruciunea RETLW.
Aceast instruciune este o instruciune de revenire din subrutin (vezi Tabel 5.1) care va
realiza n plus stocarea unei constante numerice de opt bii, specificat prin argumentul
instruciunii, n registrul de lucru WREG.
Cu toate c valorile tabloului nu se pot modifica (din cauza instruciunii RETLW),
acest metod are avantajul c permite stocarea unui numr mult mai mare de valori dect ar
fi posibil prin folosirea RAM-ului.


Exemplu
S analizm cazul unei subrutine care implementeaz un tabel compus din
opt elemente aleatoare. Accesul la valorile tabelului se realizeaz indexat
folosind ca variabil index registrul de lucru WREG. ntregul tablou
reprezint un set de instruciuni care va fi stocat n memoria program la
inscripionarea microcontrolerului. Ideea de baz a implementrii tabelului
const n modificarea valorii numrtorului de program pentru a se executa
instruciunea RETLW corespunztoare indexului dorit

STRUCTURI DE PROGRAM
90
TEMP EQU 0x00

GOTO Main

Tabel:
ADDWF WREG,W ;WREG=index+index
MOVFF PCL,TEMP ;PCLTEMP,PCHPCLATH,PCUPCLATU
ADDWF PCL, F ;PCL+2*indexPCL
RETLW d101 ;index 0
RETLW d115 ;index 1
RETLW d90 ;index 2
RETLW d83 ;index 3
RETLW d85 ;
RETLW d99
RETLW d150
RETLW d149

Main:
[]
MOVLW d3 ;accesarea valorii cu indexul 3
CALL Tabel ;WREG=83
[]

n cazul subrutinei Tabel prima instruiune ADDWF WREG,W are rolul de
a dubla valoarea indexului, care este justificat de cei 2 octei necesari
pentru reprezentarea instruciunii RETLW n memoria program. Astfel
pentru a returna valoarea de la un anumit index, mai nti indexul respectiv
este dublat, dup care rezultatul este adunat la numrtorul de program.
Instruciunea care se va executa dup ADDWF PCL,F va avea adresa
PC+Index*2, unde PC conine adresa primei instruciuni RETLW.
Prezena instruciunii MOVFF PCL,TEMP are doar rolul de a efectua o
citire a PCL pentru a produce transferul coninutului PCH i PCU n regitrii
tampon asociai (PCLATH, PCALTU) pentru iniializarea acestora. Acest
lucru este necesar deoarece operaia ADDWF PCL, F va determina
transferul invers (regitri tampon PC), iar dac regitrii tampon nu au
fost n prealabil iniializai atunci se pot realiza salturi neprevzute n
memorie.[8]

Dei este corect, aceast variant de implementare a tablourilor trebuie folosit cu
precauie i avut grij la dimensiunea tabloului i la adresa sa de nceput a acestuia n
memoria program, deoarece modificarea valorii PCL pentru a accesa instruciunea RETLW
corespunztoare indexului dorit nu se rsfrnge i asupra celorlali doi regitri ai
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
91
numrtorului de program. Astfel, depirea cu o unitate a valorii maxime a PCL nu conduce
la incrementarea automat a valorii registrului superior PCH, respectiv PCU.
O variant mai complet a implementrii aceluiai tablou se prezint n exemplul
urmtor.

Exemplu
S analizm cazul unei subrutine care implementeaz acelai tabel compus
din opt elemente. Accesul la valorile tabelului se realizeaz indexat prin
intermediul registrului de lucru WREG. Ideea de baz a implementrii
tabelului const n modificarea valorii numrtorului de program pentru a se
executa instruciunea RETLW corespunztoare indexului dorit. Se asigur
modificarea corect a tuturor celor trei regitri ai numrtorului de program.

TEMP EQU 0x00

GOTO Main

Tabel:
ADDWF WREG,W ;WREG=index+index
MOVFF PCL,TEMP ;PCLTEMP,PCHPCLATH,PCUPCLATU
ADDLW d16 ;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 ;TEMPPCL,PCLATHPCH,PCLATUPCU
RETLW d101 ;index 0
RETLW d115 ;index 1
RETLW d90 ;index 2
RETLW d83 ;index 3
RETLW d85 ;
RETLW d99
RETLW d150
RETLW d149

Main:
[]
MOVLW d3 ;accesarea valorii cu indexul 3
CALL Tabel ;WREG=83
[]

n cazul acestei variante a subrutinei Tabel este necesar un salt calculat
peste 16 adrese de memorie program pentru a accesa prima instruciune
RETLW corespunztoare indexului 0. Cele 16 adrese sunt ocupate de 6
instruciuni scurte i o instruciune lung n care se realizez incrementarea
prin bitul de transport a regitrilor PCLATH i PCLATU, i actualizarea PC.
STRUCTURI DE PROGRAM
92
5.3.2 Implementarea tablourilor utiliznd instruciuni dedicate

O alt variant de implementare a tablourilor n memoria program o reprezint
folosirea instruciunilor tabelare ale microcontrolerelor PIC18. Acestea ofer posibilitatea
citirii memoriei program octet cu octet i scrierea acesteia prin blocuri de minim 32 de octei.
Astfel, pentru a citi i scrie memoria program sunt prevzute dou operaii care permit
procesorului s mute octei ntre memoria program i memoria de date RAM:
Citirea tabelar: TBLRD
Scrierea tabelar: TBLWT
Operaiile de scriere i citire mut datele ntre cele dou spaii de memorie la nivel de
octet prin intermediul unui registru de 8 bii (TABLAT) mapat n zona SFR a memoriei RAM
de date.
Registrul folosit pentru adresarea octeilor din memoria program este TBLPTR (en.
Table Pointer register). ntruct capacitatea de adresare a memoriei program este de pn la
2MByte pentru a putea forma adresa de 21 de bii necesar adresrii fiecrui octet, TBLPTR
este format din trei regitri speciali: Table Pointer Upper Byte, Table Pointer High Byte,
Table Pointer Low Byte (TBLPTRU:TBLPTRH:TBLPTRL)
Aceti regitri sunt utilizai de instruciunile TBLRD i TBLWT pentru accesarea
datelor din memoria program. Operaiile de citire tabelar extrag datele din memoria program
i le plaseaz n memoria de date RAM (Fig. 5.1). n registrul special de 8 bii TABLAT se
transfer un octet din memoria program la execuia unei instruciuni de citire tabelar. Adresa
octetului citit trebuie introdus n prealabil n TBLPTR prin intermediul celor 3 regitri de
adres.


Fig.5.1. Citirea tabelar. Utilizarea instruciunii TBLRD*

Operaia de scriere tabelar realizeaz transferul de date ntre memoria de date RAM i
memoria program prin blocuri de minim de 32 de octei. Aceste operaii sunt folosite intern
pentru a incrca o serie de regitri necesari programrii memoriei Flash. Deoarece, registrul
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
93
TABLAT are dimensiunea de un octet, instruciunea TBLWT va trebui executat de 32 de ori
pentru fiecare operaie de programare a memoriei. Avnd n vedere faptul c operaia de
scriere tabelar dispune de un grad mai ridicat de complexitate se recomand cititorului s
consulte documentaia tehnic (foaia de catalog) a microcontrolerului PIC18F4455, seciunea
6.5 Writing to Program Flash Memory.
Instruciunile tabelare TBLRD i TBLWT ofer i posibilitatea modificrii automate a
regitrilor de adresare TBLPTR printr-o singur instruciune. Formele acestor instruciuni i
operaiile asociate se prezint n Tabelul 5.2.[6,15]

Tabel 5.2. Instruciuni tabelare
Operaia Instruciune Descriere
Citire tabelar Citete n TABLAT octetul din memoria program de la adresa
stocat nTBLPTR
TBLPTR nemodificat TBLRD* <TBLPTR>[TABLAT]
TBLPTR post incrementat TBLRD*+ <TBLPTR>[TABLAT], TBLPTR++
TBLPTR post decrementat TBLRD*- <TBLPTR>[TABLAT], TBLPTR--
TBLPTR pre incrementat TBLRD+* TBLPTR++, <TBLPTR>[TABLAT]
Scriere tabelar Scrie n memoria program de la adresa stocat n TBLPTR
octetul din TABLAT
TBLPTR nemodificat TBLWT* [TABLAT]<TBLPTR>
TBLPTR post incrementat TBLWT*+ [TABLAT]<TBLPTR>, TBLPTR++
TBLPTR post decrementat TBLWT*- [TABLAT]<TBLPTR>, TBLPTR--
TBLPTR pre incrementat TBLWT+* TBLPTR++, [TABLAT]<TBLPTR>


Exemplu
Se consider stocarea unei secvene de bii n memoria program i citirea
aceasteia folosind instruciunea TBLRD*.[8]
O asemenea aplicaie necesit ncrcarea unui tabel n memoria program.
Acest lucru se realizeaz cu ajutorul directivei db (Data Byte) urmat de o
secven de octei care definesc elementele tabloului.
Imediat dup tablou urmeaz codul executabil. Subrutina Init_Adresa
nu face altceva dect s copieze n TBLPTR adresa de nceput a tabelului.
Se poate observa utilizarea celor trei operatori low, high i upper pentru
extragerea octeilor corespunztori ai adresei marcate de eticheta Tablou.
Ulterior elementele tabloului pot fi accesate pe rnd folosind
postincrementarea sau se poate specifica o seciune de cod care permite
citirea valorii de pe o anumit poziie a tabloului.

STRUCTURI DE PROGRAM
94
; stocarea irului de valori
Tablou:
db 0x12, 0x13, 0x90, 0x20, 0x18, 0x23, 0x11

; Rutin de iniializare a regitrilor de adresare
Init_Adresa:
MOVLW low Tablou
MOVWF TBLPTRL
MOVLW high Tablou
MOVWF TBLPTRH
MOVLW upper Tablou
MOVWF TBLPTRU
RETURN

; Apelul rutinei de iniializare
CALL Init_Adresa

; Accesarea elementelor folosind postincrementarea
TBLRD*+
MOVF TABLAT, W

; Accesul la elementul de la indexul 3
MOVLW d3
ADDWF TBLPTRL, F
MOVLW d0
ADDWFC TBLTRH, F
MOVLW d0
ADDWFC TBLTRU, F
TBLRD*
MOVF TABLAT, W

Dac se modific manual valorile din regitrii de adres trebuie avut grij
la depirea valorii 255, cnd trebuie modificat i registrul imediat superior.
Acest lucru se poate vedea n seciunea de cod corespunztoare accesului la
elementul cu indexul 3 al tabelului unde s-a realizat incrementarea prin bitul
de transport a regitrilor TBLPTRH i TBLPTRU.

Cu ajutorul instruciunilor de scriere i citire tabelar, utilizatorul poate construi
aplicaii de tip Boot-loader sau poate implementa tablouri modificabile a cror dimensiune
este limitat doar de dimensiunea memoriei program.[8]






SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
95
5.3.3 Implementarea tablourilor utiliznd adresarea indirect

Adresarea indirect ofer posibilitatea accesrii unei locaii de memorie RAM fr
precizarea unei adrese fixe n instruciune. Folosind aceast metod, se pot implementa
tablouri de variabile, ce pot fi modificate pe parcursul execuiei programului (prin folosirea
RAM-ului ca zon de stocare).
Microcontrolerele PIC fac posibil adresarea indirect prin implementarea unui set de
regitrii speciali de adresare FSRn (en. File Select Register) i a unor regitri de accesare a
coninutului INDFn (en. Indirect File Operands) de la adresa stocat n FSR. De asemenea,
patru operanzi adiionali implementai sub forma regitrilor virtuali POSTINCn, POSTDECn,
PREINCn i PLUSWn permit realizarea unei adresri indexate util la accesarea i
parcurgerea elementelor unui tablou. (pentru detalii suplimentare vezi Capitolul 4)


Exemplu
Se consider implementarea unui tablou cu opt elemente n memoria RAM
de date folosind adresarea indirect.
n acest scop se construiete subrutina Stocare_Valori utilizat pentru
stocarea valorilor tabloului n memorie. Aceste valori vor fi accesate prin
rutina de returnare a unei valori Return_Valoare de pe o anumit
poziie a tabelului. Indexul valorii dorite trebuie ncrcat n registrul de
lucru WREG, rezultatul fiind returnat tot n acest registru.[8]

GOTO Main

Stocare_Valori: ; stocarea valorilor
LFSR FSR0, 0x200
MOVLW d101
MOVWF POSTINC0
MOVLW d115
MOVWF POSTINC0
MOVLW d90
MOVWF POSTINC0
MOVLW d83
MOVWF POSTINC0
MOVLW d85
MOVWF POSTINC0
MOVLW d99
MOVWF POSTINC0
MOVLW d150
MOVWF POSTINC0
MOVLW d149
MOVWF POSTINC0
RETURN
STRUCTURI DE PROGRAM
96
Return_Valoare: ; returnarea valorii
LFSR FSR1,0x200
ADDWF FSR1L, F
MOVLW d0
ADDWFC FSR1H, F
MOVF INDF1, W
RETURN

Main:
[]
CALL Stocare_Valori

; accesarea valorii cu indexul 3
MOVLW d3
CALL Return_Valoare ;WREG=83

[]




Concluzii
Macrourile i subrutinele reprezint soluii utile n ceea ce privete
structurarea codului n scopul realizrii unor programe scalabile i uor
lizibile. Datele, la rndul 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.


1. Discutai modul de utilizare al stivei hardware pentru salvarea
regitrilor WREG i STATUS.
2. Ce alte soluii ai putea gsi pentru salvarea contextului?
3. Care este principiul de funcionare al instruciunii RETLW?
Dai un exemplu de utilizare al acestei instruciuni.
4. Care este diferena ntre macrouri i subrutine?
5. Cum se implementeaz un tabel n memoria program, dac se
dorete accesul la elementele sale cu instruciunea TBLRD*.
6. Scriei un macro care realizeaz adunarea a dou valori numerice
stocate n prealabil la adresele 0x00 i 0x01 n memorie i pune
rezultatul n registrul de lucru.

ntrebri de
autoevaluare
7. Scriei o subrutin care realizeaz adunarea a dou valori numerice
stocate n prealabil la adresele 0x00 i 0x01 n memorie i pune
SISTEME CU MICROPROCESOARE. MICROCONTROLERUL PIC18F4455
97
rezultatul n registrul de lucru.
8. Ce diferene exist ntre cele dou metode de implementare a
tablourilor n memoria program?
9. Cum se realizeaz citirea tabelar?



Termeni
eseniali
Adresare indirect
Metoda de adresare n care accesul la locaiile din memoria de date RAM
se face fr a utiliza o adres fix n instruciuni
Directiv
Pseudo-instruciune adresat asamblorului
FSR
File Select Register. Registru de adresare. Conine o adres absolut (12
bii) din memorie. Este format din FSR0H:FSR0L
GPR
General Purpose Registers. Regitri de uz general
INDF
Indirect File Operand. Registru de accesare coninut. Permite accesul la
data stocat n memorie la adresa coninut n FSR.
Macro
Seciune de cod format din instruciuni native ale microcontrolerului,
care ulterior vor fi nlocuite prin apelul macroului
Memorie de date
Spaiu de stocare temporar (RAM) pentru datele cu care lucreaz
programul
Memorie program
Spaiu de stocare pentru program
PC
Program Counter. Numrtor de program. Conine adresa instruciunii
urmtoare din memorie. Are dimensiunea de 8 bii i poate fi accesat prin
intermediul regitrilor PCL, PCLATH i PCLATU
SFR
Special Function Registers. Regitri speciali
Stiva rapid
Spaiu de stocare temporar, care nu poate fi accesat direct, utilizat pentru
STRUCTURI DE PROGRAM
98
salvarea regitrilor WREG, STATUS i BSR la apelul de subrutine sau
rutine de tratare a ntreruperilor
Stiva hardware
Stiva adreselor de revenire. Spaiu de memorie n care se salveaz
adresele de revenire n cazul apelurilor de subrutin
Subrutin
Structur de organizare a programelor care ia forma unor instruciuni
cuprinse ntre o etichet i o instruciune de revenire din subrutin.
Unitate independent de program, plasat n memorie n alt zon dect
programul principal
TABLAT
Registrul folosit pentru accesul la octetul de date din memoria program a
crui adres este stocat n TBLPTR
Tablou
O colecie de date de acelai tip aranjate continuu n memorie
TBLPTR
Registrul folosit pentru adresarea octeilor de date din memoria program.
Este format din trei octei stocai n TBLPTRU:TBLPTRH:TBLPTRL
TOS
Top of stack. Regitrii de la vrful stivei (TOSU:TOSH:TOSL) care
conin imaginea datelor din stiv spre care indic indicatorul de stiv

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