c04-adresarea memoriei

17
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 Regiştri de adresare şi accesare conţinut 4.3.2 Adresarea indexată Concluzii Teste de autoevaluare Bibliografie Dicţionar Teste de evaluare

Transcript of c04-adresarea memoriei

  • 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