Documente Academic
Documente Profesional
Documente Cultură
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