Sunteți pe pagina 1din 4

Cap.

5 Organizarea memoriei unui MC

5.1 Organizarea memoriei de program

Un exemplu se poate observa în Figura 5.1.


Indexul de program - PC, este organizat pe 13 biţi şi poate accesa un spaţiu de memorie de 8K x
14 însă, în exemplu, doar 1K x 14 (0000h - 03FFh) este implementat.
Vectorul Reset se află la adresa 0000h iar vectorul de înteruperi la adresa 0004h.
În Figura 5.1 se pot observa şi cele 8 nivele ale stivei (Stack).

Fig. 5.1 Exemplu de organizare a memoriei de program


Fig. 5.2 Exemplu de organizare a memoriei de date

5.2 Organizarea memoriei de date

Un exemplu se poate observa în Figura 5.2. Aceasta poate fi împărţită în 2 bancuri,


ambele conţinând registre de uz general (GPR - General Purpose registers) şi registre cu funcţii
speciale (SFR - Special Function registers)
SFR ocupă primele 32 de locuri ale fiecarui banc, 00h-1Fh si 80h-9Fh.
(1Fh = 31d, 1Fh reprezintă notaţia pentru numarul hexazecimal 1F iar
31d reprezintă notaţia pentru numarul zecimal 31)
GPR ocupă părţile de memorie cuprinse între 20h-5Fh (la bancul 0) şi
A0h-DFh (la bancul 1) şi reprezintă memoria RAM a MC.
Restul memoriei care se observă în figură este neimplementat.
Registrele cu funcţii speciale sunt folosite de ALU şi de funcţiile periferice pentru
controlul operaţiilor efectuate de MC (a se vedea un exemplu în Anexa 3). Aceste registre sunt
de tip SRAM.
În cele ce urmează vor fi prezentate detalii de organizare ale câtorva registre de tip SFR.

Registrul STATUS conţine (Figura 5.3):


• starea aritmetică a ALU
• biţii de selectie al bancului memoriei de date (SRAM)
• starea MC la RESET

Fig. 5.3 Registrul Status (exemplu)

Pentru o înţelegere intuitivă, fiecare bit al registrului are o abreviere iar în programul
utilizatorului el poate fi adresat direct sau prin
denumirea sa.

Câteva explicaţii asupra registrului:

- bit 0 = C, Carry/borrow - transport/împrumut este influenţat de utilizarea instrucţiunilor


ADDWF, ADDLW, SUBLW, SUBWF
Cand C = 1, înseamnă că a avut loc un transport de la bitul cel mai semnificativ (Most
Significant bit - MSB).
Cand C = 0, înseamnă că nu a avut loc transport de la MSB.

- bit 2 = Z, zero
Cand Z = 1, înseamnă că rezultatul unei operaţii aritmetice sau logice este zero.

- bit 3 = PD, Power-down - indicator de stare MC


PD = 1 imediat dupa alimentarea MC sau după execuţia instrucţiunii CLRWDT.
PD = 0 dupa execuţia instrucţiunii SLEEP.

- bit 4 = TO, Time-out - indicator de stare MC


TO = 1 după ce s-a alimentat MC, sau după execuţia instrucţiunilor CLRWDT sau SLEEP.
TO = 0 după ce a avut loc intrarea în funcţia WDT.

- bit 5 = RP0, pentru selectarea bancului de memorie


RP0 = 1, se lucrează cu bancul 1 (80h - FFh)
RP0 = 0, se lucrează cu bancul 0 (00h - 7Fh)
- deasupra fiecarui bit apar coduri ce reprezintă tipul sau (R = citire, W = scriere) şi valoarea sa
după alimentarea cu tensiune (0 sau 1; x înseamnă că valoarea este necunoscută)

Registrul OPTION este de tip citire/scriere (Figura 5.4) şi conţine biţi de control
pentru:
• factorii de divizare ai modulelor TMR0 si WDT
• sursa externă de întreruperi la pinul RA2/INT
• modulul TMR0
• legarea cu rezistenţe la VDD a pinilor PORTA

Fig. 5.4 Registrul Option (exemplu)

Iată câteva explicaţii:


- biţii 2-0 = PS2:PS0, Prescaler Select - selectează factorii de divizare conform Tabelului 5.1

Tab. 5.1 Stabilirea factorului de divizare

- bit 3 = PSA, Prescaler Assignment - alocarea factorului de divizare


Când PSA = 1, factorul este alocat modulului WDT.
Când PSA = 0, factorul este alocat modulului Timer0 (TMR0).

- bit 4 = T0SE, TMR0 Source Edge Select - selectează tipul tranziţiei unui semnal aplicat la
pinul RA2/T0CKI, pentru care se va realiza incrementarea unui registru al modulului TMR0
Când T0SE = 1, incrementarea se va face la tranziţia semnalului de
pe 1 pe 0.
Când T0SE = 0, incrementarea se va face la tranziţia semnalului de
pe 0 pe 1.

- bit 6 = INTEDG, Interrupt Edge Select - selectează tipul tranziţiei unui semnal aplicat la
pinul RA2/INT, pentru care se va genera o întrerupere
Când INTEDG = 1, întreruperea va fi generată la detecţia unui front crescător.
Când INTEDG = 0, întreruperea va fi generată la detecţia unui front descrescător.

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