SISTEME CU MICROPROCESOARE note de curs
1
4. ADRESAREA MEMORIEI DE DATE
Cuprins
Introducere
Obiective
4.1 VARIABILE I NUME SIMBOLICE
4.2 ADRESAREA DIRECT
4.3 ADRESAREA INDIRECT
4.3.1 Regitri de adresare i accesare coninut
4.3.2 Adresarea indexat
Concluzii
Teste de autoevaluare
Bibliografie
Dicionar
Teste de evaluare
ADRESAREA MEMORIEI DE DATE
2
Introducere
Fiecare octet din memorie dispune de o adres unic. Majoritatea
instruciunilor microcontrolerului au ca operand adresa unei locaii de
memorie. Modurile de adresare indic felul n care se specific operanzii
unei instruciuni. Aceste moduri de adresare influeneaz flexibilitatea
obinerii adreselor accesate, dar i complexitatea operaiilor care pot fi
executate. Pentru a putea accesa ntreaga memorie RAM exist
disponibile mai multe modaliti de adresare asupra crora ne vom opri n
acest capitol.
Obiective
Dup parcurgerea acestui capitol cursantul va trebui:
- s utilizeze corect numele simbolice - s neleag rolul regitrilor de adresare i accesare coninut - s cunoasc diferena ntre adresarea direct i adresarea indirect - s poat implementa tablouri utiliznd adresarea indexat
4.1 VARIABILE I NUME SIMBOLICE
Noiunea 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 execuiei 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 erau cunoscute, n domeniul
microcontrolerelor, utilizatorul are control total asupra implementrii noiunii 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 soluie 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 soluie practic pentru implementarea variabilelor rmne cea a
memoriei RAM de date.
Acestea fiind zise, putem considera o variabil ca fiind un registru situat ntr-un
anumit bank (de la 0 la 15) i avnd o anumit adres (de la 0 la 255). Manipularea variabilei
se poate realiza fie utiliznd adresa fizic, fie prin ataarea unui nume simbolic adresei
respective.
SISTEME CU MICROPROCESOARE note de curs
3
Pentru exemplificare s considerm situaia n care dorim s stabilim direcia pinilor
portului B dup cum urmeaz: pinii RB intrri, iar pinul RB7 ieire. Codul care ar realiza acest lucru este dat mai jos:
MOVLW 0x7F MOVWF 0xF93
; secvena binar de iniializare n WREG ; RB7 ieire, RB intrri prin ; configurarea registrului TRISB
Chiar dac acest fragment de cod este corect, iar cu ajutorul comentariilor funcionarea
sa poate fi urmrit i neleas, nu este totui prea lizibil. O alternativ la acest cod, dar care
este identic din punct de vedere al asamblorului, poate fi urmtoarea:
TRISB EQU 0xF93 MOVLW 0x7F MOVWF TRISB
; registrul de configurare a direciei ; portului B de la adresa 0xF93 ; secvena binar de iniializare n WREG ; RB7 ieire, RB intrri prin ; configurarea registrului TRISB
Bineneles, cea de a doua variant este de preferat ntruct creterea claritii codului
conduce la reducerea erorilor i face programele mai uor de depanat i de modificat.
S considerm un alt exemplu n care o variabil aflat n bank-ul 0, la adresa 2,
trebuie iniializat cu o valoare. Cele dou fragmente de cod prezentate mai jos sunt
echivalente din punct de vedere al funcionalitii implementate.
MOVLW B10001010 MOVWF 0x02
VAR EQU 0x02 MOVLW B10001010 MOVWF VAR
n cele dou exemple considerate, ataarea 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 nite nume. Directiva EQU nseamn EQUivalent to i este o pseudoinstruciune care nu produce cod main suplimentar, ci
permite doar transmiterea unei informaii de la program ctre asamblor.
Astfel, directiva TRISB EQU 0xF93 informeaz asamblorul c n instruciunile care utilizeaz numele TRISB ca operand, la compilare, acesta va fi nlocuit cu valoarea 0xF93. La fel se ntmpl i n cazul celui de-al doilea exemplu n care valoarea 0x02, care
reprezint o adres din memorie, are ataat numele simbolic VAR.
ADRESAREA MEMORIEI DE DATE
4
Cele dou exemple prezentate anterior surprind dou situaii n care se realizeaz
adresarea simbolic: prima n care se utilizeaz numele simbolic pentru a nlocui adresa unui
registru special (TRISB) n codul instruciunii 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 regitrilor 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 spaiul de memorie alocat SFR, deoarece modificarea necontrolat a acestor
regitri poate altera funcionarea microcontrolerului.
n programul urmtor se poate observa ataarea unor nume simbolice la
dou variabile i la dou constante, dar i utilizarea numelor simbolice
pentru a adresa doi regitri GPR (VAR1, VAR2) i un registru SFR (LATB), a crui nume simbolic a fost introdus prin directiva #include.
Exemplu
#include p18f4455.inc ;Seciune variabile VAR1 EQU 0x02 VAR2 EQU 0x03 ;Seciune constante CONST1 EQU B10001010 CONST2 EQU D20 ORG 0x800 MOVLW CONST1 MOVWF VAR1 MOVLW CONST2 MOVWF VAR2 INCF VAR1 MOVF VAR1, W ADDWF VAR2, F MOVFF VAR2, LATB END
; adresa de nceput ; a programului ;CONST1->VAR1 ;CONST2->VAR2 ;VAR1++ ;VAR1->WREG ;WREG+VAR2->VAR2 ;VAR2->LATB
Avnd n vedere c numele simbolice se ataeaz unor valori numerice, utilizarea
acestora trebuie realizat cu atenie deoarece valoarea numeric respectiv poate fi
considerat drept adres a unui registru sau o valoare constant n funcie de instruciunea n
care intervine numele simbolic considerat. Exemplul urmtor pune n eviden acest lucru.
SISTEME CU MICROPROCESOARE note de curs
5
Exemplu
X EQU 0x02 MOVLW X ADDWF X
; declarare nume simbolic ; X este constanta cu valoarea ; 0x02 ; X este adresa 0x02 a unui ; registru GPR
De multe ori, apare situaia n care se dorete alocarea unui numr mare de variabile
sau utilizarea unor nume simbolice care au ataate o serie de valori n ordine cresctoare. n
acest context se poate utiliza un bloc de nume simbolice n felul urmtor:
CBLOCK 0x00 VAR1 VAR2 VAR3 VAR4 VAR5 ENDC
;valoare de start ;VAR1=0 ;VAR2=1 ;VAR3=2 ;VAR4=3 ;VAR5=4
Utilizarea unui bloc de simboluri se realizeaz identic cu utilizarea numelor simbolice
declarate prin EQU. De fapt, directiva CBLOCK permite stabilirea valorii unui simbol, urmnd ca valorile celorlalte s fie consecutive
4.2 ADRESAREA DIRECT
n cazul adresrii directe (Fig. 4.1) cmpul alocat adresei n codul instruciunii conine
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 spaiu de adresare limitat,
deoarece lungimea cmpului de adres este mai mic dect lungimea cuvntului.
Fig. 4.1. Adresarea direct
n cazul instruciunilor scurte ale microcontrolerului PIC18F4455 lungimea cmpului
de adres este de 8 bii (vezi formatul instruciunilor din Capitolul 2) i ocup octetul inferior
al codului instruciunii. Practic, prin aceti 8 bii se pot accesa doar 256 de locaii de memorie
ADRESAREA MEMORIEI DE DATE
6
distincte. Pentru a extinde capacitatea de adresare pn la cei 12 bii necesari pentru formarea
adresei complete se utilizeaz bitul 8 al instruciunilor, denumit bit de acces a. Dac acest bit este 0 atunci pot fi accesate adresele din domeniul 0x000-0x07F (96 de regitri GPR) i
0xF80-0xFFF (160 de regitri 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 bii necesari.
Majoritatea instruciunilor ce utilizeaz adresarea direct au posibilitatea de a plasa
rezultatul operaiei implementate n registrul de lucru WREG sau napoi n memoria RAM la adresa specificat n instruciune. Bitul 9 din codul instruciunii, denumit bit de destinaie al
rezultatului d specific locul n care se va regsi rezultatul.
n continuare se prezint cte un exemplu pentru adresarea direct prin Access Bank,
respectiv pentru adresarea direct prin Bank-uri, n care adresa fizic a locaiei de memorie
accesate este specificat n mod explicit n codul instruciunii.
Exemplu
Instruciunile ADDWF 0x2C, w, 0 ADDWF 0x2C, f, 0
sunt codificate binar sub forma: 001001 0 0 00101100
respectiv 001001 1 0 00101100
i n ambele cazuri coninutul de la adresa 0x2C din Access Bank (a=0) este adunat cu coninutul registrului de lucru WREG. Prima instruciune plaseaz rezultatul operaiei n WREG (d=0), iar cea de-a doua instruciune suprascrie data de la adresa 0x2C (d=1).
Exemplu
Selecia bank-ului de lucru 2 se face cu instruciunea MOVLB 2. Instruciunile
ADDWF 0x2C, w, 1 ADDWF 0x2C, f, 1
sunt codificate binar sub forma: 001001 0 1 00101100
respectiv 001001 1 1 00101100
SISTEME CU MICROPROCESOARE note de curs
7
i n ambele cazuri se acceseaz coninutul de la adresa 0x22C (locaia 2 din Bank-ul 2) care este adunat cu coninutul registrului de lucru WREG. Prima instruciune plaseaz rezultatul operaiei n WREG (d=0), iar cea de-a doua instruciune suprascrie data de la adresa 0x2C a Bank-ului 2 (d=1).
Dup cum s-a vzut n exemplele anterioare cei opt bii de adres ai operandului sunt
specificai n mod explicit, fiind parte integrant a instruciunii i nu pot fi modificai n
timpul execuiei programului. Chiar dac aparent aceasta este modalitatea de a localiza exact
o adres n memoria de date, exist situaii n care aceast variant de adresare este restrictiv,
dup cum se va vedea din exemplul urmtor.
Se va analiza cazul unei seciuni de cod care trebuie s tearg (reseteze) un
set de regitri din memorie aflai la adrese consecutive n Bank-ul 0 de la
0x020 la 0x07F. CLEAR_ARRAY:
CLRF H020 CLRF H021 CLRF H022 CLRF H023 CLRF H024 CLRF H025 CLRF H026 .... .....
CLRF H07E CLRF H07F
; terg registrul 32 ; terg registrul 33 ; fiecare instruciune CLRF ; ocup doi octei n memoria ; program ; terg registrul 33 ; etc. ; terg registrul 126 ; terg registrul 127. ; Am terminat!
Exemplu
Stilul de programare din acest exemplu, dei funcioneaz, dovedete lipsa
de flexibilitate a adresrii directe, prin utilizarea instruciunii CLRF de 96 de ori, care, de fiecare dat realizeaz exact aceali lucru, dar asupra unei
locaii de memorie diferite.
Dac am fi pui n situaia de a terge coninutul tuturor regitrilor GPR (7
Bank x 256 = 1792 regitri GPR), utiliznd aceeai metod, ar fi necesare
1792 de apeluri ale instruciunii CLRF. Avnd n vedere c memoria program a microcontrolerului PIC18F4455 este de 24kB, atunci poriunea
de cod care realizeaz aceast sarcin, relativ simpl, ar ocupa 14% din
totalul memoriei program.
ADRESAREA MEMORIEI DE DATE
8
4.3 ADRESAREA INDIRECT
n exemplele prezentate pn acum, partea de adres a instruciunilor a fost
ntotdeauna constant, fiind parte integrant a instruciunii (ex. MOVWF 0x20) i, n consecin, fiind fixat permanent n memoria program. n multe situaii, aceast abordare se
dovedete inflexibil, iar o adres variabil ar fi mult mai util. Adresarea indirect permite
accesarea locaiilor din memoria de date RAM fr a utiliza o adres fix n instruciuni.
Marea majoritate a procesoarelor utilizeaz, ntr-o form sau alta, adresarea indirect,
n care unul sau mai muli regitri interni sunt utilizai pentru a stoca adresa operandului din
memorie. Aceti regitri de adres sunt utilizai ca pointeri ctre datele din memorie.
Diferena fundamanetal fa de cazul adresrii directe const n faptul c aceti regitri
pointer pot fi modificai n timpul execuiei programului, altfel spus adresa spre datele
accesate poate fi modificat. n acest fel, ea nu mai este fixat permanent n memoria program
ci devine variabil.
De fapt, utilizarea adresrii indirecte este asemntoare cu utilizarea pointerilor din
limbajul C, unde exist o notaie pentru referirea adresei (variabila pointer), i o alt notaie
pentru accesarea coninutului (utilizarea operatorului *). n cazul microcontrolerului PIC cele
dou notaii vor fi nlocuite de un set de regitri speciali utilizai pentru referirea adresei (vor
ndeplini rolul variabilelor pointer) i de regitri speciali utilizai pentru accesarea coninutului
spre care indic pointerii.
4.3.1 Regitri de adresare i accesare coninut
Microcontrolerul PIC18F4455 implementeaz perechi de regitri FSR (en. File Select Registers) utilizai pentru adresarea memoriei. n total exist trei asemenea perechi: FSR0, FSR1 i FSR2 avnd funcionaliti identice. n Fig. 4.2 se prezint structura regitrilor FSR0. Celelalte perechi de regitri ofer funcionaliti identice, i n afara numelui, aceti regitri nu se deosebesc cu nimic unii de alii.
Regitrii FSRn vor fi utilizai pentru a stoca adresele absolute, reprezentate pe 12 bii, ale locaiilor de memorie accesate. Posibilitatea utilizrii a 12 bii de adres permite accesarea
ntregii memorii RAM, fr a ine cont de existena bank-urilor.
Pentru a putea stoca adresele de 12 bii ale locaiilor de memorie, regitrii FSRn sunt formai din doi regitri de 8 bii: FSRnH i FSRnL, unde n{0,1,2}. Registrul FSRnL stocheaz octetul inferior al adresei, iar registrul FSRnH stocheaz semi-octetul superior al adresei.
SISTEME CU MICROPROCESOARE note de curs
9
7 4 0 7 0 - - - - Cei 4 bii superiori ai adresei octetul inferior al adresei
FSR0H FSR0L Fig 4.2. Structura FSR0 format din perechea FSR0H:FSR0L
Regitrii FSRnH i FSRnL sunt accesibili prin instruciuni uzuale de manipulare a regitrilor, dup cum se poate vedea i din secvena de cod urmtoare, care ncarc n
perechea de regitri FSR0 valoarea 0x200, reprezentnd adresa de 12 bii a locaiei 0x200 din memorie.
MOVLW 0x00 MOVWF FSR0L MOVLW 0x02 MOVWF FSR0H
Setul de instruciuni al microcontrolerului PIC18F4455 include o instruciune care
permite modificarea ambilor regitri simultan, ntr-un singur pas. Astfel, instruciunea LFSR (en. Literal to FSR) stocheaz n perechea FSRnH:FSRnL valoarea dat ca argument.
De exemplu, instruciunea urmtoare are acelai efect ca i secvena de cod anterioar:
va stoca adresa 0x200 n perechea de regitri FSR0: LFSR FSR0, 0x200
Accesarea coninutului de la adresele stocate n FSRn se face prin intermediul regitrilor INDFn (en. Indirect File Operands). Astfel, fiecrei perechi de regitri FSR i corespunde un registru INDFn (dat de indexul n{0,1,2}) (vezi Fig. 4.3)
7 0 Coninutul adresei stocate in FSR0H:FSR0L INDF0
Fig. 4.3. Structura registrului INDF0 corespunztor FSR0 (FSR0H:FSR0L)
Modul n care se realizeaz adresarea indirect, folosind regitrii de adresare i
accesare coninut este evideniat, pentru cazul utilizrii FSR0 i INDF0, n Fig. 4.4.
ADRESAREA MEMORIEI DE DATE
10
Fig. 4.3. Adresarea indirect
Regitrii INDFn sunt utilizai n instruciunile uzuale de manipulare a regitrilor, dup cum se poate vedea i n Fig. 4.4 sau n exemplul urmtor..
Utilizarea unei instruciuni avnd registrul INDF1 ca operand. Coninutul locaiei ECCh se va aduna la registrul de lucru, iar rezultatul va fi stocat la adresa ECCh Registrul FSR1 stocheaz adresa de 12 biti ECCh INDF1 conine iniial data care se gsete n memorie la adresa ECCh, iar ulterior rezultatul operaiei efectuate
Fig. 4.4. Utilizarea instruciunilor pentru realizarea adresrii indirecte
Exemplu
Se realizeaz stocarea adresei 200h n registrul de adres FSR0 prin utilizarea instruciunii LFSR, iar apoi se realizeaz o serie de operaii folosind registrul INDF0.
; incarc n FSR0 adresa 0x200
LFSR FSR0, 0x200 ; adun coninutul registrului de lucru WREG ; cu coninutul de la adresa 0x200 i pune ; rezultatul operaiei la adresa 0x200
ADDWF INDF0, F
SISTEME CU MICROPROCESOARE note de curs
11
; incrementeaz coninutul de la adresa 0x200 ; i pune rezultatul la adresa 0x200
INCF INDF0, F ; mut coninutul adresei 0x200 la adresa 0x00
MOVFF INDF0, 0x00
n continuare se va relua exemplul de la sfritul paragrafului 4.2, dar de aceast dat
iniializarea respectiv se va realiza n cadrul unei bucle folosind adresarea indirect.
Exemplu
Se va analiza cazul resetrii unui un set de regitri din memorie aflai la
adrese consecutive n Bank-ul 0 de la 0x020 la 0x07F utiliznd adresarea indirect. Acest lucru se poate realiza prin intermediul unei bucle de tip for n
care la fiecare iteraie se reseteaz cte o locaie de memorie. Diagrama din
Fig. 4.5 descrie acest algoritm.
Fig. 4.5. Utilizarea unei bucle pentru a terge un vector de date
Implementarea pas cu pas a acestui program parcurge urmtoarele etape:
1. Se iniializeaz regitrii FSR0 cu adresa primului element al vectorului, registrul de la adresa 0x020
2. Prin intermediul lui INDF0 se terge coninutul de la aceast adres 3. Se incrementeaz adresa din FSR0 4. Se verific dac pointerul a ajuns la capt. n cazul de fa se verific
dac s-a ajuns la adresa 0x080. Dac nu s-a ajuns la captul
ADRESAREA MEMORIEI DE DATE
12
vectorului se face salt la pasul 2.
5. Se continu programul
Algoritmul prezentat poate fi vizualizat n Fig. 4.6. Structura liniar a
programului implementat n paragraful 4.2 este dezvoltat acum sub forma
unei bucle prezentat prin sgeile colorate n nuane de gri care permite
pargurgerea vectorului prin incrementarea pointerului FSR0 la fiecare trecere prin bucl. La un moment dat pointerul va depi domeniul de adrese
considerat, iar programul va trece la urmtoarea seciune de cod
implementat.
Fig. 4.6. Parcurgerea vectorului
Seciunea de cod care implementeaz acest algoritm este urmtoarea:
LFSR FSR0, 0x20 MOVLW 0x80 Bucla_for:
CLRF INDF0 INCF FSR0L,F CPFSEQ FSR0L GOTO Bucla_for
; iniializare FSR0 ; adresa final ; terg registrul ; incrementez adresa ; verific condiia de ; oprire i fac salt la ; iteraia urmtoare dac ; FSR0L0x80
Codul de mai sus produce acealai rezultat ca i cel realizat utiliznd
adresarea direct, dar n loc de 96 de instruciuni utilizeaz doar 6.
Parcurgerea unui vector de date reprezint o operaie suficient de frecvent utilizat
nct microcontrolerul este prevzut cu patru moduri suplimentare de a realiza adresarea
indirect pentru fiecare din cei trei pointeri FSRn.
SISTEME CU MICROPROCESOARE note de curs
13
4.3.2 Adresarea indexat
Utilizarea regitrilor FSRn i INDFn pentru parcurgerea unui tablou de date implementat n memorie necesit instruciuni de incrementare la fiecare pas a regitrilor de
adres FSRnH i FSRnL. n plus, dac aceti regitri sunt incrementai prin instruciuni uzuale, un overflow al registrului FSRnL nu duce la incrementarea automat a registrului FSRnH.
Astfel, pentru a rezolva aceast problem, fiecare pereche de regitri FSRn este prevzut cu patru operanzi adiionali care completeaz funcionalitatea oferit de operandul
INDFn i permit realizarea adresrii indexate. Asemenea lui INDFn, aceti operanzi sunt de fapt nitre regitri virtuali al cror coninut poate fi accesat doar cu ajutorul perechii FSRn asociate, i n plus implementeaz o anumit operaie asupra adresei stocate n FSRn-ul corespunztor n momentul n care sunt accesai.
Cele cinci moduri de a realiza adresarea indirect invocate prin intermediul regitrilor
de accesare a coninutului disponibili pentru fiecare din cei trei regitri de adresare FSRn sunt enumerate n continuare:
INDFn: acceseaz coninutul de la adresa stocat n FSRn POSTDECn: acceseaz coninutul de la adresa stocat n FSRn, apoi
decrementeaz automat cu 1 aceast adres
POSTINCn: acceseaz coninutul de la adresa stocat n FSRn, apoi incrementeaz automat cu 1 aceast adres
PREINCn: incrementeaz cu 1 adresa din FSRn, apoi acceseaz coninutul noii adrese
PLUSWn: adun valoarea (de la -127 la 128) coninut n registrul de lucru WREG la valoarea din FSRn, apoi acceseaz coninutul de la adresa nou obinut
Exemplu
Un exemplu de utilizare al acestor regitri este urmtorul:
; iniializarea FSR0 cu adresa 0x100 LFSR FSR0, 0x100
; F[100h]=0, FSR0++ => FSR0 = 0x101
CLRF POSTINC0 ; F[101h]=0xFF, FSR0-- => FSR0 = 0x100
SETF POSTDEC0, F
ADRESAREA MEMORIEI DE DATE
14
; F[101h] = 0x00 (overflow), FSR0++ => FSR0 = 0x101
INCF PREINC0, F
n general, adresarea indexat este utilizat la implementarea tablourilor, oferind prin
regitrii virtuali un acces secvenial rapid la datele din memoria RAM. Urmtorul exemplu
reia seciunea de cod utilizat pentru iniializarea regitrilor din memorie cuprini ntre
adresele 0x020 la 0x07F.
Exemplu
Prin nlocuirea registrului INDF0 cu POSTINC0 se realizeaz n mod automat incrementarea adresei din FSR0, dup ce aceasta a fost utilizat. n aceste condiii, codul obinut este mai avantajos din dou puncte de vedere:
- nu se mai utilizeaz instruciunea INCF. n acest fel codul devine mai scurt i timpul de execuie se reduce cu durata a 96 de cicluri
instruciune;
- incrementarea realizat prin utilizarea lui POSTINC0 se aplic ntregii adrese de 12 bii, lucru care nu se ntmpla n cazul
instruciunii INCF. Astfel, codul obinut este urmtorul:
LFSR FSR0, 0x200 MOVLW 0x80 Bucla_for:
CLRF POSTINC0 CPFSEQ FSR0L GOTO Bucla_for
; iniializare FSR0 ; adresa final ;terg registrul, FSR0++ ;verific condiia de ;oprire i fac salt la ;iteraia urmtoare dac ; FSR0L0x80
Concluzii
Metodele de adresare cuprind modurile prin care se pot specifica adresele
n cadrul instruciunilor. n acest capitol s-au prezentat dou metode
principale de adresare a memoriei RAM de date a microcontrolerului
PIC18F4455: adresarea direct, respectiv adresarea indirect.
Adresarea direct se poate realiza prin Access Bank sau prin Bank-uri i
utilizeaz o adres fix de opt bii, menionat explicit n codul
instruciunii. Adresarea indirect utilizeaz regitrii de adresare FSRn i mai multe moduri de a accesa coninutul de la adresa stocat n FSRn prin
SISTEME CU MICROPROCESOARE note de curs
15
intermediul regitrilor virtuali INDFn, POSTINCn, POSTDECn, PREINCn i PLUSWn. Utilizarea numelor simbolice poate mbunti substanial codul utilizator
prin nlocuirea unor valori numerice cu denumiri specificate de utilizator.
Dac aceste denumiri sunt asociate unor adrese, atunci pe lng cele dou
metode de adresare amintite, putem vorbi i despre o adresare simbolic.
1. Ce este un nume simbolic?
2. Care este diferena ntre directivele EQU i CBLOCK? 3. Ce rol au regitrii FSR i INDF? 4. Care este diferena ntre adresarea direct i adresarea indirect?
5. Ce nelegei prin adresare simbolic?
6. Scriei o poriune de cod care adun coninutul de la adresele
0x212 i 0x315 i stocheaz rezultatul n WREG. Scrii codul n dou variante n care s utilizai adresarea direct, apoi adresarea
indirect
7. Scriei o poriune de cod care incrementeaz corect (prin overflow)
regitrii FSR0.
Teste de autoevaluare
8. Scriei o poriune de cod care iniializeaz Bank-ul 3 cu valori
cresctoare, ncepnd cu valoarea 0.
[1] Baruch Zoltan Arhitectura calculatoarelor, Universitatea Tehnic
din Cluj Napoca, Editura TODESCO, Cluj Napoca, 2000
[2] Sid Katzen The Essential PIC18 Microcontroller, Springer Verlag
London, 2010
[3] Genge Bela, Haller Piroska Proiectarea sistemelor dedicate i
ncorporate cu microcontrolerul PIC, Editura universitii Petru
Maior din Tg. Mure, 2008
[4] Microchip PIC18F2455/2550/4455/4550 Data Sheet, Microchip
Technology Inc. 2006
Bibliografie
[5] www.microchip.com
ADRESAREA MEMORIEI DE DATE
16
Dicionar
Access Bank
Zon virtual de memorie prin intermediul creia se pot accesa primii 96
de regitri GPR din Bank 0 i cei 160 de regitri SFR din Bank 15.
Bank
Zon de memorie format din 256 de octei utilizat ca diviziune a
memoriei RAM de date.
BSR
Bank Select Register. Registru de selecie a Bank-urilor
CBLOCK
Directiv ce permite declararea unui bloc de nume simbolice ce iau valori
consecutive
Directiv
Pseudo-instruciune adresat asamblorului
EQU
Directiv ce permite ataarea de nume simbolice unei valori numerice
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.
Nume simbolic
Denumire ataat unei valori numerice. Poate fi interpretat ca variabil
sau constant.
Pointer
Variabil ce conine adrese. n cazul microcntrolerului, ia forma unui
registru de adresare FSR. POSTINC
Post-incrementare. Acceseaz coninutul apoi incrementeaz adresa
POSTDEC
Post-decrementare. Acceseaz coninutul apoi decrementeaz adresa
PREINC
Pre-incrementare. Incrementeaz adresa apoi acceseaz coninutul.
SISTEME CU MICROPROCESOARE note de curs
17
SFR
Special Function Registers. Regitri speciali
Variabil
Locaie de memorie care are ataat un nume simbolic