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.