Sunteți pe pagina 1din 8

2.

ORGANIZAREA MEMORIEI UNUI MICROCONTROLER


2.1. Despre memoria unui microcontroler
Obiectivul declarat al acestui tutorial este acela de a prezenta elemente eseniale ale
limbajului de programare C pentru microcontrolere. Citind acest capitol, care are un evident
coninut hardware, studentul care de regul dorete s devin programator, este justificat s-
i pun ntrebri de felul urmtor!
"e ce trebuie s cunoatem i elemente de hardware, precum memoria unui
microcontroler, atunci c#nd nvm C $
%u se poate s ti s programezi n C un microcontroler fr s ti i cum este
acesta fcut$
&spunsul este unul singur! nu putem programa un microcontroler fr a-i cunoate
elemente eseniale ale structurii ! 'ste foarte important cunoaterea microcontrolerului,
i n special a felului n care este organizat memoria sa, pentru a nelege corect modul de
lucru cu variabile, cu pointeri, cu stringuri i cu funcii care apeleaz stringuri.
(icrocontrolerele din familia )*C au o arhitectur +arward, adic ele au zona de date
separat i zona de program, fiecare din aceste zone fiind deservite de c#te o magistral de
date. )entru a prezenta concret elemente ale structurii, ne vom referi n continuare la
microcontrolerul )*C ,-./00, a crui structur este prezentat n figura 1.
)rimul lucru pe care trebuie s-l remarcm este prezena a 1 zone de memorie, toate aflate
n interiorul chip-ului, i marcate cu rou n figura 1 !
memoria &2( (RAM file register) organizat n cuvinte de cte / bii3
memoria '')&O( (Data EEPROM) organizat n cuvinte de cte / bii3
memoria )&O4&2( (FA!" Program Memor#) organizat n cuvinte de cte
,5 bii.
(ai trebuie s mai reinem i prezena mai multor 6periferice6 printre care!
7 porturi de intrare ieire 8*9O:, conectate fizic la pinii capsulei microcontrolerului3
convertor analog - numeric 829":3
1 circuite de temporizare 8;imer:3
port de comunicaie serial sincron
port de comunicaie serial asincron
;oate perifericele au c#te o adres fizic i pot fi accesate 8citite sau scrise dup caz: de
ctre unitatea central, pe durata rulrii programului nscris n FA!" Program Memor#$
2ccesul la periferice se face prin aceiai magistral de date de / bii, care acceseaz i
memoria &2(. (ajoritatea perifericelor sunt conectate la pinii microcontrolerului, pentru
a intra n legtur informaional i electric, cu lumea e<terioar acestuia.
= Ioan P. MIHU
)entru a nu avea un numr mare de pini, acelai pin poate fi programat la un moment dat!
s fie! intrare 8digital sau analogic:, ieire digital sau n stare de nalt impedan3
s ndeplineasc o anume funcie! *9', cloc>, .
.igura 1. ?tructura general a microcontrolerului )*C,-./00
2.2. Memoria RAM
(emoria &2( (RAM file register) este cea n care se afl %aria&ilele programului pe
care-l vom scrie. Organizarea acestei zone de memorie 8harta memoriei: este prezentat n
figura 5. Constatm e<istena a dou categorii!
@ona &egitrilor ?peciali (!pecial Function Registers). 2cetia sunt folosii de
ctre unitatea central i de ctre periferice, pentru a controla activitatea hardware
8electric: a microcontrolerului.
ANSI-C pentru microcontrolere 1
@ona variabilelor alocate prin program. Aariabilele de orice tip pe care le vom
declara pe parcursul scrierii programului, vor fi plasate n zonele ncercuite
('eneral purpose registers) din memoria &2( a microcontrolerului. %u e<ist
alte zone n care se pot afla variabile.
.igura 5. Organizarea memoriei &2(, pentru )*C,-./00
"in analiza informaiilor prezentate n figura 5, rezult c#teva concluzii legate de numrul
i dimensiunea variabilelor pe care le vom declara!
- "in totalul de 7,= 8,..h: octei e<isteni n &2(, spaiul total pe care-l putem
aloca variabilelor alocate prin program este (oar (e )*+,-+,-+,- . //* octei,
5 Ioan P. MIHU
restul fiind destinai regitrilor speciali. 2ltfel spus am putea crea un program n
care s avem cel mult 11- variabile de tip char.
- "ac avem variabile de tip tablou, dimensiunea ma<im a acestora nu poate
depii dimensiunea permis a ban>ului n care o declarm. ?pre e<emplu am
putea crea un program n care s avem patru variabile tablou, ale cror dimensiuni
ma<ime vor pute fi!
unsigned char <BC-D3
unsigned ban>, char EB/FD3
unsigned ban>= char zB/FD3
unsigned ban>1 char wB/FD3
- Gn fiecare din ban>urile = i 1, mai e<ist c#te ,- octei care ns nu pot fi accesai
prin variabile declarate, ci numai prin pointeri. Cu toate acestea, n foile de catalog
ale microcontrolerului i aceti octei sunt contabilizai ca fc#nd parte din
memoria &2(, astfel c microcontrolerul )*C ,-./00, (ispune (e //*+/0./*,
octei de memorie &2(
- *at deci c atunci c#nd crem un program, trebuie s gestionm cu mare atenie
dimensiunea i locul n care plasm variabilele.
- )e parcursul scrierii programului, %aria&ilele se apelea1 numai prin numele lor
fr a mai preci1a i &an2ul i a(resa la care se afl. 2cest lucru este un mare
avantaj fa de programele scrise in limbaj de asamblare unde trebuie s fim foarte
ateni ca de fiecare dat c#nd utilizm o variabil s precizm n ce ban> se gsete.
- %u scpm ns de problema accesului la variabile din ban>uri diferite atunci c#nd
acestea sunt apelate prin pointeri. )entru a apela prin adres o variabil din ban>F
sau ban>, avem nevoie de un singur octet, fiindc aa cum se observ din figura 5,
aceste dou ban>-uri ocup zona de la FFh, p#n la ..h adic =7- locaii. Gn
schimb, pentru a apela prin adres variabile din ban>= sau ban>1, un singur octet
nu ajunge. )robabil c soluia pe care o sugerai imediat este aceea ca orice
variabil de tip pointer s aib rezervai doi octei. %u s-a fcut aa, probabil din
motive ce in de istoria dezvoltrii microcontrolerelor, la primele fiind suficient un
octet, deoarece nu aveau dec#t un singur ban> de &2(.
- )entru rezolvarea problemei e<ist dou soluii.
o .olosirea pointerilor de tip 6const6. 2cetia au alocai doi octei i pot
accesa orice ban>. "ezavantajul este c nu pot fi folosii dec#t pentru a
citi variabile aflate la adresele pe care le pointeaz.
o .olosirea pointerilor de tip 6far6. 2cetia pot accesa adrese din orice ban>,
i pot fi folosii at#t pentru a citi c#t i pentru a scrie la adresa respectiv.
- "ac la compilarea programului apar mesaje de eroare sau de atenionare trebuie
citit cu atenie documentaia de programare a microcontrolerului cu care se
lucreaz.
2.. Memoria EE!ROM
(emoria '')&O( este cea n care se afl toate constantele programului pe care-l vom
scrie. Constantele de orice tip pe care le vom declara pe parcursul scrierii programului, se
vor afla numai n '')&O(, nee<ist#nd alte zone n care acestea se pot afla. "e aici c#teva
concluzii legate de numrul i dimensiunea constantelor pe care le vom declara.
ANSI-C pentru microcontrolere 7
- (emoria '')&O( a unui )*C ,-./00 are (imensiunea (e 03* octei. Gn
concluzie nu putem avea mai mult de =7- constante a c#te un octet.
- Memoria EEPROM este ne%olatil. Aalorile nscrise n ea nu se terg la
4ntreruperea tensiunii, sau la resetarea microcontrolerului.
2a cum am mai precizat, gestiunea variabilelor alocate prin program, i care se gsesc n
memoria &2(, este foarte uoar! at#t pentru citire c#t i pentru scriere, %aria&ilele se
apelea1 numai prin numele lor fr a mai preci1a i a(resa la care se afl$
%u acelai lucru se nt#mpl cu datele pe care le vom scrie i citi din memoria '')&O( a
microcontrolerului. )entru citire trebuie folosii urmtorii regitri!
''2"& &egistrul n care trebuie specificat adresa de la care vom citi data
'')4" &egistrul care specific adresa de nceput a zonei '')&O(
''"2;2 &egistrul n care se citete valoarea
&" Hit care la setare va iniia ciclul de citire
*at un e<emplu de funcie care returneaz un octet de la o adres '')&O( specificat
unsigned c"ar &eadHEte.rom'')&O(8const unsigned char a##ress:
I
unsigned char readJvalue3 99 Aariabila pentru a retine valoarea citita
''2"& K address3 99 Citeste de la adresa aceasta
'')4" K F3 99 )ointeaEa la inceputul '')&O( memorE
&" K ,3 99 *nitiaEa un ciclu de citire
readJvalue K ''"2;23 99 )reia octetul din registrul de date
return readJvalue3 99 &eturneaza octetul read bEte
L
?crierea unui octet este i mai laborioas. *at regitri i biii folosii la scriere!
''2"& &egistrul n care trebuie specificat adresa la care vom scrie data3
'')4" &egistrul care specific adresa de nceput a zonei '')&O(3
''"2;2 &egistrul n care se depune octetul ce se va nscrie apoi n '')&O(3
M&'% Hit pentru validarea scrierii n '')&O(3
M& Hit care la setare va iniia ciclul de scriere n '')&O(3
''CO%= &egistru de control al scrierii n '')&O(
''*. Hit care semnalizeaz terminarea unui ciclu de scriere.
)e durata scrierii!
trebuie blocate alte ntreruperi pentru a nu fi perturbat procesul de scriere3
trebuie ateptat p#n la terminarea complet a procesului de scriere.
*at un e<emplu de funcie care scrie un octet la o adres '')&O( specificat
void MriteHEte;o'')&O(8unsigned char #ata, const unsigned char a##ress:
I
''2"& K address3 99 2dresa la care se scrie
''"2;2 K data3 99 "ata care se scrie
M&'% K ,3 99 Aalideaza scrierea in '')&O(
4*' K F3 99 *nvalideaza intreruperile pe durata scrierii
''CO%= K F<773 99 Configureaza ''CO%= pentru scriere
''CO%= K F<223 99 Configureaza ''CO%= pentru scriere
M& K ,3 99 *nitiaza ciclul de scriere
while8N''*.:3 99 2steapta pina se termina scrierea
M&'% K F3 99 ?tergere soft a bitului M&'% 8validare scriere:
''*. K F3 99 ?tergere soft a bitului ''*. 8terminare scriere:
L
- Ioan P. MIHU
Gn concluzie!
- @ona de memorie '')&O( a unui microcontroler fiind nevolatil, poate fi folosit
pentru memorarea unor date importante. )entru a putea utiliza aceste date, trebuie
s reinem adresa la care le-am scris.
- ;ot ntr-o zon de memorie '')&O( sunt nscrise i valori care nu pot fi
modificate, precum! data fabricaiei, etc.
- (emoria de tip '')&O( se poate e<tinde n afara chip-ului microcontrolerului,
cu aa numite 6chip-uri de memorie6. 2cestea au de regul memorie nevolatil de
tip '')&O( i se folosesc atunci c#nd trebuie salvate un volum mare de date
eseniale.
2.$. Memoria !ROGRAM
(emoria )&O4&2( este o memorie de tip ROM 8&ead OnlE (emorE:, n care se nscrie
codul e<ecutabil, cel rezultat dup compilare. 2cest cod este de regul un fiier cu e<tensia
6.he<6. 2cesta se nscrie n microcontroler o singur dat la nceput, cu a5utorul unui
programator. "up ce acest cod e<ecutabil este nscris n memoria program, se zice c
6microcontrolerul este programat6. ;ermenul folosit pentru soft-ul aflat n memoria
program a unui microcontroler este de firm7are. %ici un bit din coninutul aceste memorii
nu este modificat pe durata rulrii aplicaiei. "up ce microcontrolerul este programat i
este montat n circuitul electonic dedicat aplicaiei, atunci c#nd este rulat aplicaia
respectiv din memoria program sunt citite una dup alta cuvintele care reprezint pentru
mircocontroler instruciuni ce urmeaz a fi efectuate. (emoria program nu este organizat
6pe octei6, ci pe cuvinte a cror lungime depinde de tipul microcontrolerului. Gn funcie de
acest criteriu, microcontrolerele din familia )*C se clasific n!
Haseline processor - au instruciunile pe ,= bii. ?unt microcontrolerele de tip
)*C,=O
(idrange processor - au instruciunile pe ,5 bii. ?unt microcontrolerele de tip
)*C,5. 8'<emplu )*C,-./00:
+igh-end processor - au instruciunile pe ,- bii. ?unt microcontrolerele de tip
)*C,-.
'vident, cu c#t este mai lung cuv#ntul 8instruciunea: din memoria program, el poate
gestiona activiti mai comple<e la nivelul unitii centrale a microcontrolerului, i implicit
la nivel hard. Consecina imediat este aceea c microcontrolerele av#nd instruciuni lungi,
au performane superioare.
"in punct de vedere al caracterului &O( al memoriei program, e<ist dou categorii de
microcontrolere )*C!
cu memorie de tip PROM. 2cestea pot fi programate o singur dat, dup care
urmeaz s fie montate pe placa pe care vor rula aplicaia pentru care au fost
programate. 'le nu se mai pot 6reprograma6, n ipoteza c la un moment dat
aplicaia ar trebui modificat. .iind microcontrolere ieftine, sunt indicate pentru
realizarea de produse de serie mare. Gn aceast categorie sunt incluse
microcontrolerele care conin litera 6C6 n denumire, ca de e<emplu! )*C,-C/5,
etc.
cu memorie de tip EEPROM. 2cestea pot fi reprogramatede mai multe ori, fiind
indicate pentru e<perimente sau dezvoltri de aplicaii. Gn aceast categorie sunt
ANSI-C pentru microcontrolere 0
incluse microcontrolerele care conin litera 6.6 n denumire, ca de e<emplu!
)*C,-./5, )*C,-./00, etc. Pa acestea se folosete termenul de memorie FA!"
pentru memoria program.
2lte observaii utile legate de memoria program
"imensiunea memoriei .P2?+ la P89 :*F,;; este (e ,2 (:FFF)$ "eci nu avem
voie s scriem un fiier .c dup a crui compilare fiierul 6.he<6 rezultat, s fie mai
mare de />N 'ste o limitare care nu trebuie s ne sperie, fiindc chiar i aplicaiilor
6serioase6, le sunt suficieni cei /> de memorie .P2?+. Pa alte tipuri de
microcontrolere dimensiunea memoriei .2?+ este mult mai mare, ca de e<emplu
)*C ,/.<<, care are =7-Q de memorie program, care permite crearea de aplicaii
6foarte serioase6. Oricum dimensiunea limitat a memoriei program, oblig
programatorul s aib n vedere dimensiunea codului .he< rezultat. O alt msur
pentru generarea de fiiere .he< de lungime minim este compilarea fiierelor c, cu
opiunea! 64lobal optimisation levelKC6.
2a cum se observ n figura 7, memoria program este organizat pe mai multe
pagini, 5 n cazul lui )*C ,-./00. 2cest lucru este transparent pe durata scrierii
programului.
.igura 7. Organizarea memoriei program 8.P2?+: la )*C ,-./00
(erit s mai revenim puin asupra modului n care se programeaz un microcontroler.
Gnscrierea fizic 8electric: a fiierului e<ecutabil 6.he<6 n memoria program se face cu
/ Ioan P. MIHU
ajutorul unui programator. 2cesta este un montaj electronic conectat pe R?H sau pe
interfaa serial a calculatorului n care se afl fiierului .he<. 2cestea pot fi!
)rogramatoare care au un soclu 6gol6, n care se introduce microcontrolerul cruia
urmeaz s-i fie nscris programul n memoria program. "up nscriere,
microcontrolerul se scoate (in soclu iar apoi se montea1 pe placa pentru care a
fost proiectat aplicaia nscris n el. "ezavantajul unui astfel de procedeu este
acela c dac se lucreaz la dezvoltarea unui program cu un grad de comple<itate
mai mare, care trebuie modificat de multe ori, aceasta oblig la
montarea9demontarea de multe ori a microcontrolerului n programator, operaii
prin care se pot distruge pinii acestuia.
)rogramatoare 6n circuit6. 2cestea sunt recomandate dezvoltrii aplicaiilor care
necesit multe modificri i ncercri pe durata realizrii lor. Gn acest caz, se
realizeaz placa 8circuitul: pe care microcontrolerul este montat (efiniti% prin
lipire. )rogramatorul se conecteaz prin intermediul unui conector montat pe plac
la doi pini 8?"2 i ?CP: ai microcontrolerului, dedicai pentru comunicaii seriale
*=C i care pot fi folosii pentru programare. )rogramarea 6n circuit6 se poate la
r#ndul ei face pe una din urmtoarele dou ci!
Gnscrierea serial direct conect#nd programatorul la pinii ?"2 8?erial
CPoc>:i ?CP 8?erial "ata: ai microcontrolerului.
Gnscrierea serial folosind pinii ;< i &< protocolului serial &?=1=. )entru
aceasta este ns nevoie de un program ajuttor, numit &ootloa(er. 2cesta se
ncarc iniial n microcontroler, folosind un programator clasic. "up aceea
microcontrolerul se monteaz definitiv prin lipire pe plac iar nscrierea n
continuare a programului se face fr programator, folosind interfaa serial a
calculatorului, i un program de transmisie serial, precum utilitarul
+iperterminal. "ei se gsete n memoria program, bootloader-ul nu
influeneaz deloc aplicaia, fiindc el este ncrcat la sf#ritul memoriei
.P?+, iar dimensiunea sa este mic, de apro<imativ =7F cuvinte.