Microcontrolere CISC și RISC. Arhitecturi și principii de programare [622123]

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
1
Capitolul 1

MICROCONTROLERE . PREZENTARE GENERALĂ

În acest capitol se prezintă principalele caracteristici ale
arhitecturilor microcontrolerelor, clasificarea lor și domenii de utilizare.
Microcontrolerul este partea inteligentă dintr -un sistem înglobat ,
care reprezintă un mic calculator dedicat cu răspuns în timp real.
Sistemele înglobate sunt miniaturizate, fiabile și la pre ț redus .
Caracteris tica lor principală fiind realiz area unei anume sarcini cu
răspuns cât mai bun în timp real. Microcontrolerele au apărut din dorin ța
de minimizare a spa țiului de lucru, astfel că periferice externe unită ții de
procesare au fost minimizate într -o singură capsulă.
Defini ție: MICROCONTROLERUL este un circuit integrat care
concentrează într -o singură capsulă atât unita tea centrală de procesare,
memoria cât și dispozitivele de comunicare cu ex teriorul cum ar fi port
serial, paralel, convertoare analog digitale, digital anlogi ce, oscilator,
etc. (Fig 1.1) .
Memoriile sunt celulele de bază din componen ța unui
microcontroler ului. Cele mai mici unită ți de memorie sunt denumite
registre, cu timp mic de acces. Acestea se află în unitatea centrală de
procesare și ajută la programarea perifericelor microcontrolerului și la
creșterea vitezei de execu ția a instruc țiunilor. A doua un itate de
memorie care are un timp de acces mic, după registre este memoria
ascunsă (cache), având capacitate de stocare mai mare fiind utilizată

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
2
pentru a cre ște viteza de execu ție și pentru a avea un răspuns în timp
real foarte bun.

Fig. 1.1. Sche ma gen erală a unui microcontroler

O clasificare a memoriei interne a microcontrolerelor se face după
conținutul ei. Memoria internă poate fi de date, dacă memorează
operanzi, de program, dacă are înregistrat programul ce se execută și
memoria temporară sau stiv ă în care se înregistrează valori ce urmează
a mai fi folosite. În general adresele memoriilor sunt con ținute în registre
dedicate. De exemplu adresa memoriei program este con ținută în
registrul numărător de program al cărui con ținut se incrementează
autom at după execu ția instruc țiunii, adresa memoriei de date are
registre dedicate pentru înregistrarea ei tocmai pentru a fi mai simplu de
apelat. Adresa memoriei stivă se decrementează după ap elare,
conținutul ei este de asemenea înregistrat în registre dedic ate.
Denumirile acestor registre sunt diferite func ție de producător dar s -a
încercat păstrarea unor denumiri standard.
Interfa ța cu perifericele , în general, are următoarele blocuri: lin ii de
intrare/ie șire, registre specifice de date, control și stare, m agistrale de

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
3
comunicare internă și circuite specifice de interfa ță. Linia de
intrare/ie șire implementează func ții speciale înlocuind unitatea centrală
de toate aspectele specifice de comandă și control în procesul
respectiv.

Fig. 1 .2 Schema bloc de int erfațare cu perifericele

Dispozitivele I/O (Fig.1.2) conduc opera ții generale de
comunicar e (transfer serial sau paralel de date), func ții generale de timp
(numărare de evenimente, generare de impulsuri), opera ții de conversie
analog/numerică, func ții de protec ție, func ții speciale de comandă, etc.
Parte din resurse acoperă func țiile de control propriu -zis, iar o parte
asigură func țiile necesare aplica țiilor în timp real (sistemul de
întreruperi, timer).
Unitatea centrală de prelucrare, "creierul", este împăr țită în două
blocuri unitatea centrală de execu ție și unitatrea de intrefa ță cu
magistrala care are func ția de aducere a instruc țiunilor. Unitatea de
execu ție, care decodifică și execută instruc țiunile, con ține unitatea
logico -aritmetică (ALU) . Unita tea de Logică Aritmetică – execută

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
4
opera țiile rezultate din decodarea instruc țiunilor (Fig.1.3.), o peranzii fiind
aduși în registre acumulator. În urma execu ției sunt afecta ți indicatori de
bit din registrele de stare . Unitatea centrală de procesare conect ează
toate păr țile microcontrolerului într -un întreg.

Fig. 1.3 . Unitate logico -aritmetică. Schemă bloc generală

Arhitecturi Von Neuman și Harvard
Deosebirea între cele două arhitecturi constă în modul în care
memoria sistemului este împăr țită. Arhitect ura Harvard (realizată de IBM
în 1944 pentru un calculator furnizat Universită ții Harvard) presupune o
memorie pentru date și o memorie pentru cod. Cele două sunt distince
și conectate cu procesorul prin intermediul a două ansamble de
magistrale diferite. Fiecare ansamblu este format din magistrala de date
și magistrala de adrese, a șa cum se arătă în Fig 1.4, în partea stânga.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
5

Figura 1 .4. Tipuri de arhitecturi: Harvard și von Neumann [3]

Arhitectura von Neumann (propusă de matematicianul John von
Neuma nn în 1945) presupune o memorie comună atât pentru date cât și
pentru cod. Avantajul arhitecturii Harvard constă în accesul simultan la
cele două memorii pe durata unui singur ciclu ma șină și deci
posibilitatea efectuării unor opera ții de adunare și înmul țire (MAC) tot pe
durata unui ciclu ma șină.

Rolul microcontrolerelor :
• Controlul și comanda proceselor prin achizi ția și prelucrarea
datelor
• Memorarea rezultatelor intermediare sau finale
• Comunicarea cu periferice externe și cu utilizatorul

Microprocesor ↔ Microcontroler
Microprocesorul se poate defini ca fiind un circuit logic programabil
de către utilizator, într -o singură capsulă și cu func ție de calcul , fiind
creierul sistemului electronic .
Microcontrolerul se poate defini ca un circuit logic, programab il, cu o
structură adaptată pentru rezolvarea unei largi game de aplica ții de timp
real. Este folosit ca procesor orientat pe aplica ții, fiind, în general, inclus
în echipamentul pe care îl co mandă .

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
6
Timpul de preluc rare este mai mic la microprocesoare dar
mărimea sistemelor care folose sc microcontrolere este mai mică.
Microcontrolerele sunt utilizate mai des în aplica ții industriale fiind
implementate pe plăci de dezvoltare sau de aplica ții. Plă cile de
dezvoltare au un sistem de operare inclus, microcontrol erul putând fi
încărcat cu programe cu diverse aplica ții. Platformele de aplica ții
folosesc microcontrolerul într -o singură execu ție, acesta fiind încărcat cu
programul executabil în memoria nevol atilă.
Atât microprocesorale cât și microcontrolerele au ar hitecturi de tip CISC
sau RISC metodele de cre ștere a vitezei de calcul fiind mai avansate la
microprocesoare dar acestea a u început să folosite și la
microcontrolere. În cazul microcontrolerelor , la creșterea vitezei de
calcul contribuie și optimizarea arhitecturilor blocurilor periferice incluse
în circuit.
Ce trebuie s ă con țină arhitectura unui microcontroler complex?
Pe lângă bl ocurile componente definite în F ig.1.1, microcontrolerul mai
poate con ține:
• sistem de conversie analog numerică sau numeric analogică
• circuit de impulsuri modula te în durată (PWM )
• comparator analogic
• memorie de date nevolatilă
• circute de captură/comparare
• ceas de gardă (timer de tip watchdog)
• interfa ță serială de comunica ții
• interfa ță I2C
• interfa ță serială periferică (SPI)
• port USB

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
7
• metode soft pentru reducerea consumului propriu (metode:
așteptare (STAND -BY), inactiv ("IDLE") sau oprit ("HALT",
"POWER DOWN") ).

Resursele de comunicare între blocurile componente sunt
magistralele. M agistral a este un grup de linii cu caracteristic i comune
funcționale, logice și electrice și cu posibilitatea de a permite
conectarea directă la ea a mai multor blocuri . Func ție de tipul de semnal
transmis există magistrală de adrese, de date și de comandă și control .
• Magistrala de adrese este unidire cțională indicând celula de
memorie sau dispozitivul de comunicare. Capacitatea memoriei este
dată de numărul de linii de magistrală dacă memoria este liniară.
• Magistrala de date este bidirec țională și stabile ște mărimea
valorii înregistrate.
• Magistrala de comandă și control este bidirec țională : indică
opera țiile ce urmează a fi executate în urma decodificării instruc țiunii,
poate elibera resursele sistemului, indică timpul de răspuns, etc..
Domeniile de utilizare ale microcontrolerelor sunt: robotică,
mecatronică, electronică medicală, aeronautică, automobile,
electrotehnică, etc. Aceste dispozitive fiind utilizate în aproape toate
aplica țiile care necesită sisteme de: comand ă, control, supraveghere,
prelucrare în timp real.
Dezvoltarea și evolu ția micro controlerelor este în strânsă legă tură cu
imitarea comportamentului din mediul înconjurător. Dorin ța oamenilor de
a creea produse care realizează sarcini asemănătoare cu cele din
natură a dus a dezvoltarea de algoritmi complec și pentru adaptarea
sistemului iar din nevoia de a avea răspuns în timp real cât mai rapid a
dus la dezvoltarea de arhitecturi complexe.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
8
Exemple de sisteme care folosesc microcontrolere:

Fig.1. 5. Imitarea gesturilor a început utilizând mecanica [1]

Fig. 1. 6. Evolu ția robo ților umanoizi [2]

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
9
Motivele evolu ției arhitecturii microcontrolerelor sunt cerin țele de pe
piață și dezvoltarea tehnologiei:
• Nevoia de r ăspuns în timp real care a dus la perfec ționarea
blocurilor din arhitectură
• Nevoi a de mai multă memorie pentru algoritmi evoluați
• Numărul de dispozitive externe cu care comunică
microcontrolerul a crescut ceeea ce a dus la construirea mai multor
porturi d e intrare/ie șire și de comunicare
• Alimentarea de la surse portabile a impus consum redus de
energie de aceea au apărut mai multe moduri de alimentare ale
blocurilor componente
• Dorin ța de precizie a dus la dezvoltarea de convertoare cât mai
performante
• Nevoia de supraveghere și comandă de la distan ță a dus la
apari ția unei stive TCP/IP și porturi de ie șire de tip USB, Bluetooth, etc.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
10

Fig. 1.7 . Sisteme da Vinci pentru opera ții laparoscop [ 2]

• Clasificarea microcontrolerelor se poate realiza func ție de:
• Arhitectură (Harvard sau Von Neuman)
• Lungimea cuvântului de date
• Mărimea magistralei de adrese
• Puterea de calcul dorită (timp de răspu ns, frecven ța de
lucru )
• Aplicabilitate (dedicate sau de uz general)
• Tip de instruc țiuni (CISC sau RISC)

Compara ții CISC și RISC la microcontrolere:
• CISC – Set complex de instruc țiuni
– un set de peste 80 instructiuni, multe din ele complexe si
specializate

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
11
– instruc țiunile sunt diferite între ele: unele operează numai cu
anumite spa ții de adrese sau registr e, altele permit numai anumite
moduri de adresare, etc. Pentru programator ul care folose ște limbaj de
asamblare există unele avantaje prin utilizarea unei singure instruc țiuni
compl exe în locul mai multor instruc țiuni simple (analog macro –
instruc țiunilor clasice).
– Timp de execu ție și spa țiul ocupat de instruc țiuni diferit
– Organizarea memoriei liniară
– Set redus de registre de lucru
– Multe moduri de adresare
– Arhitectură Von -Neuman
– Nu există conceptul de paralelizare
• RISC – Set redus de instruc țiuni – concept de realizare a unită ții
centrale de execu ție, care a început sa fie utilizat cu suc ces și la
construc ția microcontrolerelor.
– Viteză de calcul crescută;
– Micro-circuit mai simplu
– Caracteristicile asociate de obicei unui CPU RISC sunt:
– arhitectura Harvard
– viteză sporit ă de execu ție prin paralelizare
– memoria organiza tă în fi șiere de lucru
– set de instruc țiuni ortogonal (simetric): fiecare
instruc țiune operează cu orice spa țiu de adrese (memorie) sau registru,
instruc țiunile nu prezint ă combina ții speciale, excep ții, restric ții sau
efecte colaterale.
– Moduri de adresare redus
– Registre interne mai multe ca la CISC

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
12
Familii de microcontrolere
Firmele produc ătoare de m icrocontrolere au realizat aceste
dispozitiv e studiind cerin țele pie ții pentru optimizarea produselor. Prima
firmă, producătoare este INTEL cu 8048 (Intel MCS -48 – www.intel.com
) – părintele microcontrolerelor pe 8 bi ți. A doua genera ție este 8051 pe
8 biți, apărut acum 20 ani și care este încă folosit și studiat. Au apărut
zeci de variante ale microcontrolerului 8051, produse de diver și
fabrican ți (Philips, Infineon, Atmel, Dallas, Temic, etc ). S-a dezvolt at
această famili e în sensul trecerii la o arhitectură similară (în mare), dar
pe organizată pe 16 bi ți, cu performan țe îmbunătă țite ca viteză de
prelucrare: familia XA51 eXtended Arhitecture de la Philips și familia
80C251 (Intel). Genera ția a treia este 80C196 (Intel MCS -96) –
microcontroler pe 16 bi ți. Destinat ini țial unor aplica ții din industria de
automobile, are o arhitectură von Neumann, cu un spa țiu de adresare
de 64KBytes, o unitate de intrări/ie șiri numerice de mare viteză
(destinată ini țial controlului injec ției la un motor cu ardere internă) , ieșiri
PWM, convertor analog numeric, timer watchdog. Există multe variante,
ultimele cronologic : 80C186, 80C188 (Intel, AMD, ș.a.). Acestea sunt
derivate din clasicele 8086/88 prin includerea pe acela și microcircuit a 2
canale DMA, 2 numărătoare/timere, un sistem de întreruperi și un
controler pentru DRAM.
O altă firmă producătoare de microcontrolere Motorola . Ca exemple se
menționează:
68HC05 – pe 8 biți derivat din microprocesorul M6800 , destinat
în mod special unor aplica ții din industria automobil ului.
68HC11, 68HC12, 68HC16 (Freescale) 68HC11 unul din cele
mai complexe microcontrolere pe 8 bi ți, are un spa țiu de adrese unic de
64Ko, blocuri periferice ca : EEPROM, OTP, CAN, PWM, etc. Prezintă

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
13
ca particularitate existen ța unui program de încărcare r ezident
(bootstrap loader în ROM intern) cu care, la reset, un segment în
memoria RAM externă poate fi încărcat cu cod program prin intermediul
portului serial.
Variantele evoluate sunt de fapt microcontrolere de 16 bi ți:
"super 68HC11", numit 68HC12 bazat pe o nouă unitate
centrală numită CPU12 , care reprezintă extensia la 16 bi ți a arhitecturii
HC11 .
683xxx (Freescale) Microcontrolere pe 32 de bi ți analog lui
M68020 ( CPU32 ), denumit și "procesoare integrate". Putere de calcul
comparabilă sau mai mare ca la Intel 80386.
Alte familii de microcontorolere cunoscute pe pia ță sunt :
Familia Microchip cu PIC (Microchip – www.microchip.com) .
Primul microcontroler din această familie (PIC1650) a apărut acum 20
de ani. Este o familie de microcontrolere care s-a dezvolta t și sunt
disponibile actualmente sub forma a 6 serii: PIC10, PIC12, PIC14,
PIC16, PIC17 și PIC18. Au fost primele microcontrolere de 8 bi ți cu
arhitectură RISC: PIC16C5x avea un set de doar 33 instruc țiuni.
Arhitectura este de tip Harvard și, ca o particularitate, dimensiunea
cuvântului pentru program este de 12, 14 sau 16 biți, cuvântul de date
fiind 8 biți.
Familia Atmel cu AVR (Atmel – www.atmel.com ) – concurent ul
seriei PIC este familia numită AVR, a firmei ATMEL, familie apărută în
ultimii ani, oferă variante de microcontrolere oarecum asemănătoare ca
resurse cu familia PIC, la performan țe similare. Microcontrolerele din
această familie s unt bazate pe o arhitectură diferită, dar unitatea
centrală este tot de tip RISC, cu cuvântul de date de 8 biți, dimensiunea
cuvântului de program este de 16 bi ți.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
14
National Semiconductors cu COP4(00) și COP8(00) COP4 este
un microcontroler pe 4 bi ți, categorie de microcontrolere care ocupă un
segment relativ important al pie ții. Printre caracteristici putem enumera :
memorie ROM local până la 2K, memorie RAM local 32×4 până la
160×4, Microwire, numărătoare/timere, tensiune de alimentare 2.3 -6V,
număr mic de pini.
Zilog Z8 – derivat al microprocesorului Z80, reprezintă un
compozit al mai multor arhitecturi diferite. Nu este compatibil cu setul de
instruc țiuni și nici cu perifericele standard Z80. Are trei spa ții de adrese:
program, date și un masiv de registre. Resurse locale tipice: UART,
timere, DMA, sistem de întreruperi cu până la 37 de surseTMS370
(Texas Instruments – www.ti.com ) Microcontrolerul standard pe 8 bi ți al
firmei TI realizat în multe variante (de ordinul zecilor), prezintă unele
asemănări cu 8051 (memoria de date locală, stiva, modurile de
adresare). O varietate extrem de mare a resurselor loc ale.
Texas Instruments – oferă și o familie de microcontrolere de 16
biți cu arhitectura RISC, cu posibilitatea controlului compromisului viteză
de calcul/consum propriu, destinată aplica țiilor portabile ( și nu numai),
denumită MSP 430. Cu un spa țiu de ad resare de 64Ko, are diverse
variante de realizare a memoriei interne de program (OTP, FLASH),
resurse diverse (printre care și o interfa ța pentru un sistem de afi șare
LCD).
AMD SC 3/4/5xx, Elan – deosebit de performante realizate în jurul
unei unită ți centrale de tip 386/486. Permit practic, doar prin adăugarea
de memorie externă, ob ținerea unui sistem de calcul compatibil PC,
destinat unor aplica ții de control încapsulate -integrate ("embedded PC").
Infineon 80C16x – Unul din microcontrolerele de 16 bi ți foarte
utilizat în Europa. Arhitectură deosebit de performantă a CPU, de tip

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
15
RISC, are diverse variante, cu resurse complexe: 80C165, 80C166,
80C167, etc.
Alte familii de microcontrolere Fujitsu Microelectronics
(www.fme.fujitsu.com) – oferă familii deosebi t de puternice de
microcontrolere pe 8 bi ți (FMC -8), 16 bi ți (FMC -16) sau 32 , sunt
orientate pe aplica țiile din industria de automobile sau din electronica de
consum.
ARM (Advanced RISC Machine) – este de fapt o unitate centrală
de 32 de bi ți (sau de 16/32 biți) care face parte din categoria structurilor
IP (“Intelectual Property”). Cele mai cunoscute și răspândite variante de
nuclee sunt ARM7 și ARM9, cu implementările lor simplificate numite
ARM7T, ARM9T (T -“Thumb”).

Familii de microcontrolere clasificat e după arhitectură și set de
instruc țiuni:
•CISC
• Compatibile 8051 (Intel MCS -51)
• MOTOROLA 8 bi ți
• HitachiH8
• Texas InstrumentsTMS 370
• Compatibile x86
•RISC
• PIC
• Atmel
• ARM

Dezvoltarea și testarea aplica țiilor

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
16
Fiecare tip de microcontroler are un set de instruc țiuni specific și
compilator dedicat. Programele realizate sunt depanate și testate prin:
• Simulatoare – program e care execută codul microcontrolerului.
Acesta implementează un microcontroler virtual – folosind un calculator
gazdă (cum ar fi un PC). Programul se poate execut ă pas cu pas,
conținutul variabilelor și registrelor poate fi vizualizat și modificat .
Programul rulează mai încet decât pe mașina reală. De regulă există
mijloace pentru evaluarea vitezei de execu ție a codului simulat (ca
număr d e cicluri ma șină sau de stări). Ideal, acesta ar trebui să permită
și simularea completă a comunicării cu toate perifericele
microcontrolerului .
• Programele de depanare – programe (denumite uneori în
română și programe "monitor") care rulează pe ma șina țintă
(microcontrolerul) oferind facilită ți de depanare similare simulatorului.
Interfa ța cu utilizatorul este realizată prin intermediul unui sistem gazdă
(PC) și/sau a unui terminal alfanumeric, conectate prin intermediul unui
port serial. Utilizează o parte din resursele microcontrolerului: Se
utilizează de regulă împreună cu un sistem de dezvoltare (sau
evaluare) , care este un sistem minimal realizat în jurul
microcontrolerului pe care rulează depanatorul, dar având resurse
suficiente pentru a permite tes tarea și depanarea aplica țiilor uzuale.
• Emulatoarele In Circuit (ICE -In Circuit Emulators ) – este un
sistem dedicat care înlocuie ște microcontrolerul , se conectează în locul
acestuia în sistemul pentru care se dezvoltă aplica ția, în acela și timp
sunt dispo nibile toate facilită țile descrise anterior . Permit un control total
al ma șinii țintă (în timp real), fără a folosi nimic din resursele acesteia (la
variantele cele mai costisitoare). Exemple de astfel de interfe țe ar fi:

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
17
JTAG/ICE – In Circuit Emulation – la multe familii de microcontrolere,
BDM (Background Debug Monitor) – pentru Freescale/Motorola .
 Simulatoarele de sistem – o categorie aparte de simulatoare
destinate simulării c ât mai complete a sistemu lui și a aplica ției în
ansamblu. Simularea întregii s cheme electrice a sistemului, integrează
un simulator SPICE.
– Proteus VSM (Virtual System Modelling) al firmei Labcenter
Electronics (http://www.labcenter.co.uk/)
– UMPS (Universal Microprocessor Program Simulator) al firmei
Virtual Microdesign ( www.vmdesign.com ).
– Proteus 7.7 este o interfa ță de modelare virtuală, sau VSM
(Virtual System Modelling), care combină simularea unui circuit la care
se ata șează componentele auxiliare (spre exemplu semafoare, led -uri,
memorii) și modele de microprocesoare. Acesta este mijlocul ideal
pentru proiectan ți de a -și testa designul proiectului înainte de a realiza
un prototip real pe placa de test.
 Nucleele (sistemele de operare) de timp real (Real Time
kernel, Real Time Operating Syste m-RTOS) – ușurează realizarea
aplica țiilor în timp real, dar aceasta nu înseamnă că ele se vor executa
în timp real, aceasta depinzând de modul în care este utilizat acest
program la nivel de sistem . Microcontrolerul este considerat un
dispozitiv intelige nt care are implementat algoritmi de adaptarea a
"comportamentului" sistemului la mediul înconjurător. La noile genera ții
de microcontrolere existen ța Bootloader aduce microcontrolerul la
performan ța unui calculator. Memoria de tip FLASH u șurează scrie rea
în această memorie de program fără a utiliza un circuit de programare
extern .

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
18
Moduri de adresare
Modurile de adresare se referă la felul în care apelează operanzii
unei instruc țiuni. Acestea influen țează numărul referin țelor la memorie
pentru ob ținere a operanzilor, complexitatea calculului adreselor și
flexibilitatea opera țiilor care pot fi efectuate.
Memoria poate fi liniară sau logică. Adresa liniară poate fi apelată direct
prin adresa fizică iar cea logică este împăr țită în segmente sau pagini.
Astfel că se formează două tipuri de adrese: adresa segment sau
pagină și adresa efectivă. Printr -un artificiu de calcul al celor două
adrese se formează adresa fizică. Motivul împăr țirii memorie în
segmente sau pagini este ca numărul de linii de magistrală de adresă
este mai mic decât numărul de bi ți de adresă. Astfel că numărul de
segmente este diferit dar ele au acelea și adrese efective. Memoria
poate fi comparată cu un tabel în care numărul curent este adresa iar
conținutul tabelului este loca ția de date. Nu este obligatoriu ca numărul
de bi ți pe care este scrisă adresa să fie egal cu numărul de bi ți pe care
se scrie con ținutul de date.

Nota ții : AE- adresă efectivă
AF – adresă fizică
X – conținut de memorie

Adresarea imediată – cel mai simplu mod de adresare al memorie.
Operandul este scris în câmpul instruc țiunii.
Adresarea directă – codul instruc țiunii con ține adresa efectivă a
operandului, nu este necesar un calcul al adresei. Dezavantajul este că
numărul de bi ți pe care este scrisă adresa este diferit de cel pe care
este scrisă instruc țiunea.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
19
Adresarea indirectă – adresa memoriei apelată este scrisă indirectă
într-un registru sau într -o loca ție de memorie . Deoarece mărimea
adresei este mai mare decât marimea registrului sau a loca ției de
memori e, se scriu în separat adresa segmentului și adresa efectiva
astfel că se realizează mai multe apeluri de memorie pentru înscrierea
adresei fizice . Dezavantajul acestui mod este că memoria este apelată
de mai multe ori , odată pentru scrier ea adresei în reg istre și apoi pentru
găsirea operandului cu ajutorul adresei înscrise.
Adresarea registrelor – este similară cu adresarea directă, cu
deosebirea că în locul adresei de memorie se scrie numele registrului
sau adresa acestuia.
Adresarea cu deplasament – este o combina ție între adresarea prin
registru și cea indirectă. Codul instruc țiunii va con ține adresa de bază și
numărul de loca ții cu care se face saltul.
Adresarea relativă – adresa de bază este considerată adresa
instruc țiunii în curs de execu ție con ținută în registrul numărător de
program iar adresa cu care se face saltul este con ținută într -un registru.
Adresarea indexată – în acest caz valoarea cu care se face saltul este
înregistrat într -un registru index, adresa de bază fiind con ținută în
câmpul de adresă.
AE=A+(R)
Adresarea stivei – este indirectă prin intermediul unui registru dedicat
numit indicator de stivă care con ține, în cazul adresei logice, adresa
efectivă. A dresa de bază este con ținută într -un alt registru. Adresarea
stivei este de fapt o adresare implicită, instruc țiunile cu stiva nu con țin o
referin ță la memorie.
Formatul instruc țiunilor – ne spune des pre păr țile componente ale
unei instruc țiuni. O instruc țiune codificată trebuie să con țină un cod de

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
20
opera ție, unul sau mai mul ți operan zi defini ți implicit sau explicit și
eventual se indică modul de adresare.
În acest capitol s -a prezentat microcontrolerul în general, urmând
în celelate capitolele detalierea microcontrolerelor pe dispozitive
concrete.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
21
Capitolul 2

MICROCONTROLERE CISC ȘI RISC

Se particularizează microcontrolerele de tip CISC și RISC pe
famili ile Intel și Microchip realizându -se compara ții la nivel de organizare
a memoriei, set de instruc țiuni și moduri de adresare. Un
microcontrolere de tip CISC cu arhitectură de tip Von Neuman prezentat
în continuare este 8051 , varianta lui mai dezvoltată fiind 80 C552.
Varianta de microcontroler RISC descrisă, spre compara ție cu 8051,
este PIC16F84 și dispozitive mai evoluate din aceea și familie.

2.1. Microcontr olerul Intel 8051
Microcontrolerul 8051 cu arhitectură Von Neuman, de tip CISC,
are un set de 80 instruc țiuni. Timpul de execu ție și spa țiul ocupat de
instruc țiuni diferă func ție de tipul de instruc țiune.

2.1.1. Caracterisctici ale microcontrolerului 805 1 [3]
Microcontrolerul 8051 este unul din cele mai cunoscute și utilizate
dispozive, caracteristicile sale sunt prezentate în multe lu crări, de aceea
sunt prezintate succint în continuare:
• Tensiunea de alimentare de 5V±10%
• Consum în curent de: 16 mA în mod ul normal, 3,7 mA în modul
Idle și 50 mA în modul Power Down.
• Magistrale pe 8 biți;

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
22
• Capacitatea memoriei ROM este de 4 K o și a memoriei RAM de
128 octe ți;
• Procesor boolean;
• Unitate aritmetica si logica (ALU) ;
• Porturi paralele în număr de 4 (8 pini fiecare) de intrare/ ie șire
cu func ții multiple;
• Comunica re cu o memorie externă de date sau program de
capacitate 64 Ko;
• Conține două numărătoare/ temporizatoare, independente;
• Port serial UART full duplex;
• Un s et de instruc țiuni orientat pe aplica ții în timp rea l,
instruc țiuni simple și rapide;
• Poate gestiona cinci surse de întreruperi, cu două nivele de
priorită ți;
• Are un oscilator intern, frecven ța de oscila ție este dată de
quartz ul extern (frecven ța de oscila ție uzuală este de 11,059
MHz).

Schema bloc simplif icată este prezentată în Fig.2.1., se
eviden țiază principalele blocuri componente din arhitectura
microcontrolerului 8051.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
23

Fig.2.1. Schema bloc simplificată a microcontrolerului 8051 [3]

2.1.2. Organizarea memoriei la m icrocontrolerul 8051
Comunicarea în interiorul microcontrolerului se realizează prin 8
linii de magistrale de: date, adrese și control. Con ținutul unei loca ții de
memorii de date sau de program este de un octet iar adresa este
reprezentată pe doi octe ți. Loca ția de memorie fiind cea mai m ică celulă
de memorare care poate fi adresată direct sau indirect. La 8051
memoria de date este separată de cea de program , ceea ce duce la
creșterea vitezei de prelucrare , având totu și magistrale de acces
comune . Acest microcontroler poate adresa 64Ko de memorie externă
(program sau date).
Memoria internă a microcontrolerului este de două tipuri: ROM și
RAM.
Memoria internă ROM are 4 Ko și ocupă zona 0000 – 0FFFH din spa țiul
de adresare pentru memoria de program. Memoria de program poate fi

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
24
doar citită , fiind doar 4Ko interni, restul fiind externi iar pentru adresarea
lor se fol osește semnalul PSEN (Program Store Enable). Adresa
memoriei program este transmisă mai întâi prin porturile P0 si P2 pe
magistrala de adrese. Portul P0 poate deveni port de date, octetul de
adresă mai pu țin semnificativ A0 -A7 este memorat în latch la activarea
semnalului ALE (semnal de selec ție circuit STB) . Semnalul /PSEN
devine activ și informa ția din memoria de program este transmisă pe
magistrala de date fiind recep ționată prin portul P0 (Fig.2.2) .

Fig. 2.2. Accesarea memorie i program externe

Adresarea memoriei program este liniară, adresa curentă fiind
înregistrată în registrul PC (Program Counter) care se incrementează
singur după execuția instrucțiunii curente. Valoarea cu care se
incrementează este dată de spa țiul ocupat de instruc țiune în memoria
de cod. Dacă pinul EA este 1 logic se accesează memoria internă dacă
este 0 logic se accesează cea externă.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
25

Fig. 2.3. Memoria de date și de program la 8051 [3]

Harta mem oriei de date este prezentată în Figura 2. 4. Adresele
pentru accesarea memoriei de date sunt con ținute în registrul DPTR ,
reperzentat pe doi octe ți ce port fi accesa ți individual (DPH, DPL) . Zona
de adresare 0000h -00FFh se poate accesa cu registrele R0 sau R1 din
zona de registre cu func ții speciale. Validarea memoriei de date externă

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
26
se realizează cu semnalele /WR (scriere) și /RD (citire) generate de
microcontroler.
Memor ia de date de tip RAM are capacitatea de 128 octe ți și
ocupă zona 0000 – 00FFH din spațiul de adresare pentru memoria de
date (Fig. 2.3.). Zona 00 – 1FH este divizată în 4 blocuri de câte 8 octe ți
notate cu Blocul 0 –3, fiecare având 8 registre R0 -R7. Selec ția blocului
de lucru curent se face de programator prin intermediul rangurilor RS1
și RS0 din registrul de stare al programului, PSW ("Program Status
Word") [3,4,5] .
După ini țializare, unitatea centrală, CPU, începe execu ția de la
adresa 0000 iar registrele R0 -7 se suprapun peste Blocul 0. Stiva este
reprezentată în B locul 1. Astfel reg istrul care con ține adresa (SP – Stack
Pointer) va avea adresa de început la 07H. La depunerea în stivă, SP
va fi incrementat, spre deosebire de microprocesoare unde la
depunerea în stivă SP este decrementat. Se recomandă încărcarea în
SP a unei valori car e să corespundă unei loca ții din zona de date RAM.
Zona 00 – 1FH poate fi accesată direct, prin intermediul unei
adrese sau prin adresare de registru.
Zona 20H – 2FH din RAM -ul intern este denumită zonă adresabilă pe
bit, pentru c ă fiecare din cei 128 bi ți poate fi adresat individual. Există
două modalită ți de a adresa bi ții din această zonă. Una folose ște adresa
lor: 00 – 7FH, cu 00 pentru bitul 0 de la loca ția 20H și 7FH pentru bitul 7
de la loca ția 2FH. Cealaltă se referă la octe ții 20H – 2FH. Astfel bi ții 00 –
07 pot fi adresa ți ca 20.0 – 20.7, bi ții 08 – 0FH ca 21.0 – 21.7 etc.
Zona 30H – 7FH este zonă de memorie RAM de uz general. Se
recomandă plasarea stivei în această zonă. Zona de registre cu func ții
speciale (SFR) (Tabelul 2.1.) conține un grup de registre interne, cu

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
27
funcții speciale. Ele sunt adresabile în mod direct iar registrele ale căror
adrese se termină în 0 sau 8 pot fi adresate și la nivel de bit.
FF

30

Zonă de memorie RAM de date

2F

20
Zonă adresabilă pe bit

1F
18 Bloc 3 (R0 -R7)
17
10 Bloc 2 (R0 -R7)
0F
08 Bloc 1 (R0 -R7)
07
00 Bloc 0 (R0 -R7)
Fig. 2. 4. Zona de memorie RAM internă [3]

Acc – registrul acumulator, folosit cu simbolul A.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
28
B: este un registru cu rol predeterminat în instruc țiunile de înmul țire și
împărțire. Pentru celelalte instruc țiuni, poate fi utilizat ca registru
general.
SP ("Stack Pointer"): este indicatorul de stivă. Este incrementat înaintea
unei depuneri în stivă prin intermediul instruc țiunilor CALL sau PUSH.
După ini țializare este încărcat cu valoarea 07H deci stiva începe de la
adresa 08H. Poate fi încărcat, prin program, cu orice valoare.
PSW ("Program Status Word"): este registrul de stare al programului.
Conține indicatorii de condi ții cu următoarele semnifica ții:
P ("Parity"): indicator de paritate; va fi 1 dacă numărul de 1 din
acumulator este impar.
PSW.1 : rezervat.
OV ("Overflow"): indicator de depă șire; se folose ște atunci când se
lucrează cu operanzi cu semn și indică apari ția unui transport/ împrumut
în/ din rangul de semn ceea ce înseamnă depă șirea domeniului de
valori care poate fi încărcat într -un registru pe 8 bi ți.
RS1, RS0 : biți de selec ție a blocului din memoria RAM internă care se
suprapune peste grupul de registre R0 -7, conform tab. 3.4.
F0: indicator la dispozi ția utiliza torului.
AC ("Auxiliary Carry"): indicatorul de transport sau împrumut auxiliar;
indică un transport sau un împrumut între cei doi biți ai rezultatului unei
opera ții de adunare sau scădere între 2 operanzi în cod BCD.
CY ("Carry"): indicatorul de transport sau împrumut; indică apari ția unui
transport/ împrumut din/ în rangul cel mai semnificativ al acumulatorului
ca urmare a unei opera ții de adunare/ scădere, ceea ce înseamnă
depă șirea capacită ții registrului.
DPH, DPL ("Data Pointer High, Low"): sunt regis tre pe câte 8 bi ți care
formează DPTR ("Data Pointer Register"), DPH este octetul mai

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
29
semnificativ și DPL octetul mai pu țin semnificativ . DPTR este folosit la
adresarea indirectă a unei loca ții din memoria externă și poate fi
accesat ca registru pe 16 bi ți sau ca 2 registre pe 8 bi ți.
TH0, TL0 ("Timer 0 Counter"): sunt două registre care memorază
rezultatul numărării pe câte 8 bi ți care alcătuiesc împreună un
numărător pe 16 bi ți pentru număto rul/ temporizatorul 0.
TH1, TL1 ("Timer 1 Counter"): la fel ca TH0 și TL0
SBUF ("Serial Data Buffer"): este registru folosit la transferul serial
pentru transmisia sau recep ția datelor, pe 2 ote ți.
P0, P1, P2, P3 : sunt registrele ce corespund porturilor P0, P1, P2
respectiv P3. Dacă un port este ie șire și se scrie 1 sau 0 în tr-un rang din
registrele P0 – P3
IP, IE, TMOD, TCON, SCON, PCON: sunt registre de control
Microcontrolerul 80C51 are 2 registre, în CPU, care nu sunt cu func țiuni
speciale și nu pot fi adresate de programator. Acestea sunt:
PC ("Program Counter "): este un numărător pe 16 bi ți care este
incrementat la fiecare citire de octet din memoria de program; el con ține
adresa loca ției de memorie în care se află următorul octet din
instruc țiune.
IR ("Instruction Register"): este un registru pe 8 bi ți în car e se depune
octetul din instruc țiune adus în vederea decodificării sale.
Accesarea memoriei de date sau cod externe se realizează prin
instruc țiuni dedicate cu mnemonice ca MOVX sau MOVC.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
30
Tabel 2.1. Registrele cu func ții speciale din zona SFR a
microc ontrolerului 8051 [3]
Registr
u Adresă de bit
b7 b6 b5 b4 b3 b2 b1 b0 Adresă
de
registru
B
ACC
PSW
IP
P3
IE
P2
SBUF
SCON
P1
TH1
TH0
TL1
TL0
TMOD
TCON
PCON
DPH
DPL
SP
P0 F7
E7
D7
BF
B7
AF
A7

9F
97

8F

87 F6
E6
D6
BE
B6
AE
A6

9E
96

8E

86 F5
E5
D5
BD
B5
AD
A5

9D
95

8D

85 F4
E4
D4
BC
B4
AC
A4

9C
94

8C

84 F3
E3
D3
BB
B3
AB
A3

9B
93

8B

83 F2
E2
D2
BA
B2
AA
A2

9A
92

8A

82 F1
E1
D1
B9
B1
A9
A1

99
91

89

81 F0
E0
D0
B8
B0
A8
A0

98
90

88

80 F0H
E0H
D0H
B8H
B0H
A8H
A0H
99H
98H
90H
8DH
8CH
8BH
8AH
89H
88H
87H
83H
82H
81H
80H

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
31
2.1.3. Moduri de adresare
La programarea microcontrolerului 8051 se pot utiliza mai multe
moduri de adresare a le datelor în cadrul instruc țiunilor [3,4,5].

1. Adresarea directă – adresa unde se găse ște valoarea căutată sau ce
urmează a fi memorată este specificată direct în codul instruc țiunii.
Acest mod de adresare permite accesarea memoriei de date internă și a
regiștrilor cu func ții speciale.
Exemplu: MOV A,1 00h
Mută în acumulator valoarea de la adresa 10 0h.

2. Adresarea indirectă – adresa loca ției ce urmează a fi accesată este
specificată într -un registru. Prin acest tip de adresare se poate accesa
memoria RAM de da te internă și externă.
Exemplu: MOV R1,1 00h
MOV A, @R1
Mută în acumulator valoarea de la adresa 10 0h, adresa fiind păstrată în
registrul R1.
Notă – @ înaintea unui registru indică adresă .

3. Adresarea de valori imediate – operandul este spe cificat în codul
instruc ținii
Exemplu: MOV A,#1 00h
Mută în acumulator valoarea 1 00h.
Notă – la semnul # specifică o constantă

4. Adresarea de registru – operandul folosit se află înregistrat într -un
registru.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
32
Exemplu: MOV R7 ,#100h
MOV A,R 7
Mută în acumulator valoarea 10 0h după ce aceasta a fost stocată în
registrul R 7.
Atenție! MOV R7 ,100h
MOV A,R 7
Mută în acumulator valoarea aflată la adresa 1 00h (prima linie con ține o
adresare directă nu de valoare imediată ca și în cazul an terior)
Aten ție! Nu toate tipurile de adresare pot fi folosite în cazul tuturor
instruc țiunilor. În tabelele cu descrierea instruc țiunilor există 4 coloane
numite DIR, IND, REG, IMM care dacă în dreptul unei instruc țiuni con țin
un X specifică faptul că ace l tip de adresare (i.e. directă, indirectă, de
registru și respectiv de valoare imediată) este permisă la folosirea
respectivei instruc țiuni.

2.2. Microcontrolerului PIC 16F84
Microcontrolerul PIC are arhitectură RISC de tip Harvard, ca o
particularitate, dimensiunea cuvântului pentru program este de 12, 14
sau 16 bi ți, cuvântul de date fiind de 8 biți [6, 7, 8] . Noutatea introdusă
de familia de microcontrolere Microchip este tipul de memorie internă de
tip flash. Memoria FLASH (Electrically Erasable Progr ammable Read –
Only Memory (EEPROM)), se programează și se șterge la nivel de
blocuri de memorie și are avantajul că este nevolatilă, are viteză mare
de citire , rezistentă la șocurile mecanice.

2.2.1. Caracteristici generale
La nivel de instruc țiuni, deoare ce are arhitectură tip RISC numărul
de instruc țiuni este de 35, de dimensiune un cuv ânt [6]. Toate

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
33
instructiunile sunt executate într -un ciclu cu excep ția instruc țiunilor
JUMP și BRANCH . Conform datelor de catalog , PIC16F84 ajunge la
rezultate de 2:1 în c ompresia cod și 4:1 în viteză, comparativ cu alte
microcontrolere de 8 bi ți din clasa sa.
Viteza de operare în cc. – 20 MHz intrare de clock
– 200 ns ciclu instruc țiune
Memoria program are capacitate de 1024 cuvinte pe 14 bi ți adică
1Kcuvânt , capacitate a memoriei de date RAM de 68 octe ți și 64 octe ți
de EEPROM . Instruc țiunea este reprezentat ă pe 14 -biți, magistrala de
instruc țiuni având 14 linii ;
Octe tul de date este reprezentat pe 8 -biți
Zona de regist re cu func ții speciale (SFR) situate în memoria
RAM are 15 registre
Stiva are 8 nivele
Moduri le de adresare sunt direct, indirect și relativ
Sursele de întreruperi sunt în număr de 4
– pin extern RB0/INT
– la depa șirea timer -ului se activează TMR0
– întreruperi pe sarcina de la PORTB<7:4> , la schimbarea
nivelului logic
– întrerupere la scrierea complet ă a memoriei de date
EEPROM
Pinii cu control individual sunt în număr de 13 aceștia pot fi
multiplexa ți cu alte func ții ale dispozitivului, unul dintre pini fiind pentru
comanda directă a unui LED . Bitul TMR0 are rolul de a aciva :
timer/numarator pe 8 -biti cu 8 -biti prescaler programabil . Pentru
creșterea siguran ței în func ționare familia PIC16 are integrat un circuit
de protec ție care generează un RESET la scăderea tensiunii de

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
34
alimentare (Brown -Out Reset ). Acest circuit poate fi validat sau invalidat
cu un bit de comandă . Familia de microcontrolere PIC 16 a evoluat
având implementat în interior comparatoare, convertoare ADC și DAC,
USART, I2C, SPI, PWM etc. Schema bloc a microcontrolerului
PIC16F84 este prezentată în Fig.2.5 .

Fig. 2. 5. Schema bloc simplificată a microcontrolerului PIC 16F84 [6 ]

Memoria s tivă a microcontroller -ului este mai deosebită, respectiv
este implementată într -o zonă specială a memoriei interne și are
maximum 8 nivele nefiind pe rmisă citirea sau înscrierea acesteia prin
adresare directă . Instruc țiunile folosite pentru lucrul cu stiva sunt CALL,
GOTO, RETURN, RETFIE și RETLW putem introduce, respectiv
extrage informa ții la nivelul stivei .
Observa ție : Nu este prevăzut nici un indi cator de depă șire a
dimensiunii stivei, ceea ce poate duce la grave erori atunci când
numărul de apeluri sau de instruc țiuni GOTO este mai mare de 8 .
Instruc țiunile procesorului au o lă țime de 14 bi ți și ele includ atât codul

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
35
respectiv cât și operanzii af erenți acestuia, respectiv adresa registrului
din zona registrului fi șier și/sau indexul bitului corespunzător loca ției
respective.

Fig. 2. 6. Schema bloc detaliată a microcontrolerului 16F84 conform
datelor de catalog (redesenat după [9])

2.2.2. Organizarea memoriei la PIC16F84
Microcontrolerul PIC16F84 ar e o arhitectură Harvad, memorii de
date și program separate. Memoria de date este de tip EEPROM și
RAM cu registre generale ( GPR ) iar cea de program este FLASH.
Mărimea memoriei program este de 1024 loca ții cu lățime de 14 bi ți,

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
36
locațiile zero și patru fiind rezervate pentru reset și pentru vectorul
întrerupere. Memoria de date EEPROM are confo rm caracteristicilor
microcontrolerului, 64 de loca ții de opt bi ți care nu -și pierd informa ția la
oprirea sursei de alimentare . Această memorie poate fi adresată indirect
prin regis trele EEADR și EEDATA. Scrierea inform ației în memorie are
o procedură stri ctă pentru a preveni scrierea eronată. În registrul
EEADR se scrie adresa iar data, de la adresa trimisă va fi ci tită sau
scrisă prin registrul EEDATA.
Memoria de date RAM are un spa țiu de 68 de loca ții de la adresa
0x0C la 0x4F unde se găsesc registre c u scop general, registrele cu
funcții speciale fiind localizate în primele 12 loca ții împăr țite în 2 bancuri
0 și 1. Bancurile se pot selecta cu bi ții RP0 și RP1 din registrul
STATUS.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
37

Fig. 2.7 . Organ izarea memoriei la PIC 16 F84 [6, 9 ]

Loca țiile neim plementate se citesc cu 0. Bancul 0 se selectează prin
punerea în zero a celor doi bi ți RP0 și RP1 iar Bancul 1 prin combina ția
RP0 pe 1 logic iar RP1 pe 0 logic. Tabelul cu registre din zona SFR a
memorie RAM este prezentat în Anexa 1

Registru l STATUS – poate fi o destina ție pentru orice instruc țiune, cu
oricare alt registru.

IRP RP1 RP0 /T0 /PD Z DC C

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
38
C (Carry) – bit de t ransfer care este afectat la opera ții aritmetice adunare,
scădere și transfer. Poate fi scris sau citit.
DC (Digit Carry) DC – bit d e transfer de la bitul 4 spre 5 în cadrul
registrului acumulator. Este afectat la acelea și opera ții ca și C. Poate fi
scris sau citit.
Z (Zero ) – bit care indică un rezultat al opera țiilor aritmetice zero, atunci
este în 1 logic. Poate fi scris sau citit.
PD (Power -down ) – Bit ce indică alimentarea microcontrolerul ui, după
fiecare reset obi șnuit și după executarea instruc țiunii CLRWDT.
Instruc țiunea SLEEP îl resetează când microcontrolerul intră în regimul
consum redus. Setarea lui repetată este posibilă pr in reset sau prin
pornirea sau oprirea sursei. Starea poate fi triggerată de asemenea de
un semnal la pinul RB0/INT, de o schimbare la portul RB, de terminarea
scrierii în EEPROM -ul de date intern, și de watchdog de asemenea.
Poate fi doar citit.
TO (Time -out) – bit ce indică depă șirea watchdog -ului. Bitul este resetat
când watchdog -ul ajunge la sfâr șit semnalând că ceva nu este în ordine
și este setat la alimentare sau după rularea instruc țiunilor CLRWDT și
SLEEP . Poate fi doar citit.
RP1:RP0 (Register Ba nk Select ) – biți pentru selec ția bancurilor de
registre din memoria RAM. Ace ști doi bi ți sunt partea superioară a
adresei la adresarea directă. Pentru că instruc țiunile ce adresează
memoria direct au doar șapte bi ți, ei au nevoie doar de încă un bit
pentr u a adresa cei 256 octe ți adică câ ți are PIC16F84. Poate fi citi și
scris.
IRP (Register Bank Select ) – bit de selec ție a adreselor folosit la
adresarea indirectă a memoriei RAM . Poate fi scris și citit.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
39
Registrul de Contorul de Program (PC) – este un re gistru de 13 bi ți
specific pentr u adresarea si aducerea instruc țiunilor , conține adresa
instruc țiunii ce se execută. Prin incrementarea sau schimbarea sa (ex.
în caz de salturi) microcontrolerul execută instruc țiunile de program pas –
cu-pas. Acest registru poate fi apelat pe 8 și 5 bi ți prin intermediul lui
PCL și PCH (12:8). PCH nu poate fi accesat direct ci prin intermediul
registrului PLATH.

Stiva – este pe 8 nivele a 13 bi ți cu rolul de a memora temporar valorile
registrelor în cazul unui salt sau într erupere.

Programarea microcontrolerului – pentru a programa o memorie de
program, microcontrolerul trebuie să fie setat pentru un mod de lucru
special prin aducerea pinului MCLR la 13.5V, iar sursa de tensiune Vdd
trebuie să fie stabilizată între 4.5V și 5.5V. Memoria program poate fi
programată serial folosind doi pini 'data/clock' ce trebuie să fie mai întâi
separa ți de liniile montajului, ca să nu apară erori în timpul programării.

2.2.3. Moduri de adresare memorie
În cazul memorie RAM adresarea poat e fi directă sau indirectă.
Adresarea d irectă a memorie RAM se r ealizează printr -o adresă de 9
biți. Această adresă este ob ținută prin conectarea celui de -al șaptelea
bit al adresei directe a unei instruc țiuni cu doi bi ți (RP1, RP0) din
registrul STATUS (Fig.2.8) .
Adresarea i ndirectă a memoriei RAM – se realizează cu bitul IRP și
registrul FSR. Loca ția adresată este accesată prin registrul INDF care
de fapt conține o adresă indicată de FSR. Orice instruc țiune care
folosește INDF ca registru l ei, acceseaz ă datele indicate de un registru

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
40
FSR. De exemplu un registru cu scop general (GPR) la adresa 0Ch
conține o valoarea 23. Prin scrierea unei valori 0Ch în registrul FSR
vom ob ține un registru indicator la adresa 0Ch, iar prin citirea din
registrul INDF, vom obține valoarea 23, ceea ce înseamnă că am citit
din primul registru valoarea lui fără accesarea lui directă (dar prin FSR
și INDF Fig.2.9. ). Modul acesta de adresare nu are nici un avantaj fa ță
de adresarea directă, dar este util pentru a rezolva problem e care cer
doar adresarea indirectă. Bitul IRP selectează bancul.

Fig. 2. 8. Adresarea Directă a memoriei RAM [6]

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
41

Fig. 2.9 . Adresarea indirectă a memoriei RAM [6]

Numărătorul de program
Numă rătorul de programe (PC) este reprezentat pe 13 bi ți,
spec ific pentru adresarea și aducerea instruc țiunilor poate fi impartit in
PCL care poate fi scris sau citit, și PCH (12:8) biți care nu este citit sau
scris direct . Dacă PC este modificat sau un test de condi ție este
adevarat, instruc țiunea ce se execut ă nece sita 2 cicluri, al doilea ciclu
fiind executat ca un NOP. Toate actualizarile registrului PCH trec prin
PLATH .

Setul de instruc țiuni
Programarea microcontrolerelor se realizează în limbaj de
asamblare sau C. Mnemonicele limbajului de asamblare sunt specif ice
familiei de microcontrolere, particularizate pentru fiecare tip de

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
42
microcontroler. Instruc țiunile sunt împăr țite pe clase, func ție de rolul lor
în execu ție. Microcontrolerele de tip CISC având un număr mai mare de
instruc țiuni are și un număr mai mare de tipuri (clase) pe când la cele de
tip RISC instruc țiunile și clasele sunt mai pu ține, inclusiv numărul de
instruc țini este mai mic dec ât la CISC. De accea numărul de pa și
(instruc țiuni) pentru realizarea unui proces la CISC este mai mic decât
la RISC. Programele realizate în C sunt mai scurte, existând func ții
dedicate perifericelor fiecărei familii de microcontrolere. Compilarea
programelor este realizată cu compilatoare specifice fi ecărei familii de
microcontrolere și pentru fiecare tip de microcont roler. Pașii de aducere
a instruc țiunii din memoria program în unitatea centrală de procesare
(Fig. 2.10 ) sunt: UCP trimite adresa prin PC și se aduce instruc țiunea,
ce urmează a fi executată, în registrul de instruc țiuni IR.

Fig. 2. 10. Schema bloc priv ind calea urmată de instruc țiunii până la
UCP

Setul de instruc țiuni la microcontrolerul 8051

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
43
La microcontrolerul 8051 instruc țiunile sunt împăr țite în următoarele
tipuri, care sunt apoi detaliate în tabele.
1. Instruc țiuni de transfer de date în memoria in ternă de date, de
program, stiva
2. Instruc țiuni de transfer de date în memoria externă
3. Instruc țiuni aritmetice
4. Instruc țiuni logice pe bit și octet
5. Instruc țiuni de lucru cu subrutinele
6. Instruc țiuni de salt condi ționat și necondi ționat

Instruc țiunile sunt ex ecutate în unul sau doi cicli ma șină, ca
desfă șurare în timp iar ca desfă șurare în spa țiu sunt instruc țiuni scrise
pe unul sau doi octe ți.
Un ciclu ma șină este împăr țit la acest tip de microcontrolere în șase
perioade egale de execu ție, notate de la S1 la S6. Fiecare din aceste
perioade necesită pentru execu ție 2 perioade de ceas. Un ciclu ma șină
este format din 6 păr ți a câte 2 perioade de ceas deci este nevoie de 12
perioade de ceas. În cazul în care avem un ceas de 12 MHz, reiese că
timpul de execu ție pe ntru o instruc țiune scurtă este de 1 μsec, iar pentru
una lungă este de 2 μsec [3, 4] .
Tabelele de mai jos conțin pe coloane, în ordine, mnemonica (adică
forma sub care trebuie să fie scrisă instruc țiunea în cadrul programului),
opera ția efectuată, tipuril e de adresare posibile (după cum este explicat
mai sus) și, pe ultima coloană, durata instruc țiunii în microsecunde
pentru un ceas de 12 MHz.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
44
Tabelul 2.2. Instruc țiuni de transfer de date în memoria internă [3]
Instruc țiu
ni Descrierea formală a
instruc țiunii 1 2 3 4 Flaguri
afectate Nr cicli Nr octe ți
MOV A,s

Transfer
de date
între
registre și
acumulator (A) ←(s) x x x X – 1 1
MOV d, A

Transfer
de date
între
registre și
acumulator (d) ←(A) x x x – – 1 1
MOV d,s

Transfer
de date
între
registre (d) ← (s) x x x X – 2 2
MOV
DPTR,#dat
a16 (DPTR) ←data16 – – – X – 3 3

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
45

Încărcare
constantă
în registre
MOV
d,#data8

Transfer
constantă
în registru (d) ←data8 – – – X – 1 1
MOV adr,
#data8

Transfer
constantă
în memorie (adr) ←data8 – – – X – 1 1
MOV @d,s

Transfer
indirect a
conținutulu
i registrului
s în
memorie la
adresa
indicată în
registrul d ((d)) ←s – x – – – 1 1

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
46
PUSH s

Salvare
conținut
registru în
stivă (SP)←(SP)+1,
((SP))←(s) x – – – – 2 2
PUSH PC

Salvare în
stivă
conținut
PC (SP)←(SP)+2,
(((SP)+1 )↑(SP))←(PC) – – – – – 1 1
POP d

Salvare în
registru din
stivă (d)←((SP)),
(SP) ←(SP) -1 x – – – – 2 2
POP PC

Salvare în
registru PC
a
conținutulu
i stivei (PC)←((SP)+1)↑(SP))
(SP)←(SP) -2 – – – – – 1 1
XCH A,s

Interschim(A) ↔(s ) x x x – – 1 1

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
47
bare
conținut
registre
XCHD
A,@Ri

Interschim
bare
conținut
acumulator
cu
memoria (A) ↔(R i) – x – – – 1 1

Tabelul 2. 3. Instruc țiuni de transfer de date din memoria program
externă [3]
Instruc țiuni Descrierea
formală a
instruc țiunii Adresare
indexată Flaguri
afectate Nr cicli Nr octe ți
MOVC A,@A+DPTR

Citește con ținutul
memorie program cu
registrul DPTR în
registrul acumulator (A)←((A)+(DPTR)) x 3 1
MOVC A,@A+PC

Citește con ținutul (A)←((A)+(PC)) x 3 1

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
48
memorie program cu
registrul PC în registrul
acumulator

Tabelul 2.4 . Instruc țiuni aritmetice pe octet [3]
Instruc țiuni Descrierea formală
a
instruc țiunii 1 2 3 4 Flaguri
afectate Nr. octe ți Nr. cicli
ADD A, s

Adunarea dintre
conținutul unui
registru și
conținutul
acumulator (ACC) ←(ACC) + (s) x x x x Cy,A
C,OV 1 1
ADD A,R i

Adunarea dintre
conținutul unui
registru din
bancul de registre
cu con ținutul
acumulator (ACC) ←(ACC) + (R i) x – x – Cy,A
C,OV
1 1
ADD A,#data8

Adunarea unei
constante la (ACC) ←(ACC) +
data8 x – x – Cy,A
C,OV
1 1

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
49
conținutul
acumulatorului
ADD A,@Ri

Adunarea
conținutului unei
locații de memorie
la acumulator (ACC) ←(ACC) +
((Ri)) – x – – Cy,A
C,OV
1 1
ADDC A, s
Adunarea
conținutului unui
registru cu
acumulatorul și cu
bitul de transport
Cy (ACC) ←(ACC)+(s)+
(CY) x x x x Cy,A
C,OV 1 1
SUBB A, s

Scăderea
conținutului unui
registru din
registrul
accumulator (ACC) ←(ACC) – (s) –
(CY) x x x x Cy,A
C,OV
, S, Z 1 1
INC A

Incrementarea cu
1 a con ținutului (ACC) ←(ACC) + 1
– – x – – 1 1

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
50
acumulator
INC s

Incrementarea cu
1 a con ținutului
unui reg istru (s) ←(s) + 1 x x x – – 1 1
INC DPTR

Incrementarea cu
1 a con ținutului
registrului DPTR (DPTR) ←(DPTR) +
1
– – x – – 1 3
DEC A
Decrementare cu
1 a con ținutului
acumulatorului (ACC) ←(ACC) – 1
– – – – – 1 1
DEC s

Decrementare cu
1 a con ținutulu i
unui registru (s) ←(s) – 1 x x x – – 1 1
MUL AB

Înmul țirea dintre
conținuturile
registrelor A și B (B) ↑(A) ←(B) * (A)
x x – x Cy,
OV,
S 1 5
DIV AB
(A) ←(A) div (B),
(B) ←(A) mod (B) x x – x Cy,
OV, 1 5

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
51
Împăr țirea
conținutului
registrului B la
conținutul
registrului A S
DA A

Ajustarea
zecimală a
conținutului
registrului A x x – – Cy,
OV 1 1

Tabelul 2. 5. Instruc țiuni de lucru cu variabile booleene [3]
Instruc țiuni Descrierea formală
a instruc țiunii 1 2 3 4 Flaguri
afectate Nr cicli Nr octe ți
ANL A,Rn (A) ←(A) Λ(Rn) x x x x x 1 1
ANL A,direct (A) ←(A) Λdirect x x x x x 1 2
ANL A,@Ri (A) ←(A) Λ((Ri)) x x x x x 1 1
ANL direct,A direct ←direct Λ(A) x x x x x 1 2
ANL A,#data (A) ←(A) Λ#data x x x x x 1 2
ORL A,Rn (A) ←(A) V(Rn) x x x x x 1 1
ORL A,direct (A) ←(A) V direct x x x x x 1 2
ORL A,@Ri (A) ←(A) Λ((Ri)) x x x x x 1 1
ORL direct,A direct ←direct V (A) x x x x x 1 2
ORL A,#data (A) ←(A) V #data x x x x x 1 2

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
52
XRL A,Rn (A) ←(A) mod(Rn) x x x x x 1 1
XRL A,direct (A) ←(A) mod direct x x x x x 1 2
XRL A,@Ri (A) ←(A) mod((Ri)) x x x x x 1 1
XRL direct,A direct ←direct mod
(A) x x x x x 1 2
XRL A,#data (A) ←(A) mod#data x x x x x 1 2
XRL A,Rn (A) ←(A) mod(Rn) x x x x x 1 1
CLR A (A) ←0 x x x x x 1 1
CPL A (A) ←/A x x x x x 1 1
RL A (An+1) ←(A n)n=0-6,
(A0) ←(A 7) x x x x x 1 1
RLC A (An+1) ←(A n)n=0-6,
(A0) ←(C)
(C) ←(A 7)
x x x x Cy 1 1
RR A (An) ←(A n+1)n=0-6,
(A7) ←(A 0) x x x x x 1 1
RRC A (An) ←(A n+1)n=0-6,
(A7) ←(C)
(C) ←(A 0)
x x x x Cy 1 1
SWAP A (A3-0)↔(A 7-4) x x x x x 1 1
INSTRUC țIU
NI PE BIT
ANL C,bit

șI logic între (C) ←(C)&bit x x x x Cy 1 1

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
53
Cy și un bit
ANL C,/bit

șI între Cy și
un bit negat (C) ←(C)&/bit x x x – Cy 1 1
ORL C,bit

SAU între Cy
și un bit (C) ←(C)Λbit x x x x Cy 2 2
ORL C,/bit
SAU între Cy
și un bit
negat (C) ←(C) Λ/bit – – – x Cy 3 3
MOV,bit,C

Transfer
valoare bit în
Cy (C) ←bit x – – – Cy 2 2
Mov C,/bit
Transferul
valorii unui bit
negat în Cy (C) ←/bit x – – – Cy 2 2
CLR C
ștergere Cy (C) ←0 x x x – Cy 1 1
CLR bit
ștergere bit bit ←0 x – – – 1 1
SETB C (C) ←1 – – – – Cy – –

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
54
Setare Cy
SETB bit
Setare bit bit ←1 – – – – – – –
CPL C
Complement
Cy (C)←NOT(C) – – – – Cy – –
CPL bit
Complement
pe bit bit←NOT bit – – – – – – –

Tabelul 2.6. Instruc țiuni de salt necondi ționat [3]
Instruc țiuni Descrierea formală a
instruc țiunii 1 2 3 4 Flaguri
afectate Nr. octe ți Nr. cicli
ACALL adr11 (SP)←(SP)-2,
((SP)+1)↑((SP)) ←(PC
)
(PC)←(PC) șI
1111100000000000
SAU 00000↑adr11 x – – – –
2 3
LCALL adr16 (SP)←(SP)+2,
((SP)+1)↑(SP)) ←(PC)
(PC)←adr16 x – – – –
3 4
RET (PC) ← ((SP)+1)
↑((SP)) x – – – –
1 4

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
55
(SP) ← (SP)+2
RETI (PC) ← ((SP)+1)
↑((SP))
(SP) ← (SP)+2 x – – – –
1 4
AJMP adr11 (PC)←(PC) șI
1111100000000000
SAU00000↑ adr11
x – – – –
2 3
LJMP adr16 (PC) ← adr16 x – – – – 3 4
SJMP rel (PC) ←(PC )+rel – x – – – 2 3
JMP
@A+DPTR (PC) ← ((A)+(DPTR)) x x – – –
1 3

Tabelul 2 .7. Instruc țiuni de salt condi ționat [3]
Instruc țiuni Descrierea formală
a instruc țiunii 1 2 3 4

Flaguri
afectate Nr octe ți Nr cicli
JC rel Dacă Cy=1
(PC) ← (PC)+rel x – – – –
2 3
JNC rel Dacă Cy=0
(PC) ← (PC)+rel x – – – –
2 3
JB bit,rel Dacă bit=1
(PC) ← (PC)+rel x – – – –
3 4
JBC bit,rel Dacă bit=0
(PC) ← (PC)+rel x – – – –
3 4

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
56
JZ rel Dacă (ACC) = 0
(PC) ← (PC)+rel – – – – –
2 3
JNZ rel Dacă (ACC) ≠ 0 (PC)
← (PC)+rel – – – – –
2 3
CJNE
A,Rx,rel Dacă (ACC)≠ (Rx)
(PC) ← (PC)+rel – – – – –
3 4
CJNE
A,#X,rel Dacă (A)≠((PC)+1)
(PC) ← (PC)+rel – – – – –
3 4
DJNZ Rn,rel Dacă (Rn)← 0
(Rn)← (Rn)–1;
(PC)← (PC)+rel x – x – –
2 3
NOP Așteaptă – – – – – 1 1

Nota ții utile:
A. Notarea modului de adresare în tabelele cu instruc țiuni:
1 – adresare directă
2 – adresare indirectă
3 – adresare la registru
4 – adresare imediată
B. Nota ții utilizate în descrierea formală a instruc țiunii
s – registru sursă
d – registru destina ție
() – se referă la con ținutul unui registru
(( )) – se referă la con ținutul loca ției de memorie al cărei adresă se
află memorată într -un registru
data8 – constantă reprezentată pe 8 bi ți
data16 – constantă reprezentată pe 16 bi ți

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
57
← – asignare
↑ – concate narea.
O compara ție între microcontrolerele de tip CISC și RISC privind setul
de instruc țiuni va fi realizată între cele două tipuri 8051 cu PIC16F84.
Instruc țiunile l a microcontrolerul PIC16F84 s unt clasificate după :
1. Instruc țiuni octet -orientate
Aceste a au stuctura de forma :
13 8 7 6 0
Optcode d f(fișier#)
d = 0 pentru destina ție w (acumulator)
d = 1 pentru destina ție f
f = adresa registru fi șier identificator din harta memoriei pe 7
biți
Aceste instruc țiuni desemnează în general opera ții pe care UAL trebuie
să le execute; Pentru opera ții diadice, operanzii sunt acumulatorul
implicit și loca ția de memorie. Falg-ul d specifică registrul destina ție în
care se memorează rez ultatul opera ției sau al transferului, dacă acesta
este 0, atunci rezultatul este re ținut în reg istrul w, dacă nu el este re ținut
în registrul f din File Register .

2. Instrucțiuni bit -orientate
13 10 9 7 6
0
Optcode d f(fișier#)
b = specifică bit de adresă , este reprezentat pe 3 bi ți
f = adresa registru fi șier identificator din harta memoriei pe 7
biți

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
58
3. Instrucțiuni literale și de control

13 8 7 0
Optcode k

k = valoare imediată ce este inclusă în corpul instruc țiunii pe 8
biți

13 11 10 0
Optcode K
K = valoare imediată ce este inclusă în corpul instruc țiunii pe 11 bi ți
Dimensiunea unei instruc țiuni este de 14 bi ți. Toate instruc țiunile
ocupând acela și spa țiu de memorie iar timpul de execu ție fiind de 1
maxim 2 cicli ma șină.

Tabelul 2.7. Instruc țiuni de transfer de date
Mnemonică Descr iere
formală Timp
execu ție Indicatori
condi ție
MOVF f,d (d)←(f) 1 Z
MOVWF f (f) ←(w) 1 Z
MOVLW K (w) ←K 1 –
CLRF f (f) ←0 1 Z
CLRW (w) ←0 1 Z
SWAPF f,d f(7 :4)→(3 :0)
f(3 :0)→(7 :4) 1 –

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
59
Tabelul 2.8. Instruc țiuni aritmetice și logice
Mnemonică Descr iere formală Timp
execu ție Indicatori
condi ție
ANDWF f,d Dacă d=1 (f )←(f)˄(w)
Dacă d=0 (w)←(f) ˄ (w) 1 Z
ANDLW k (w) ←(w)Ʌk 1 Z
ADDWF f,d Dacă d=1 (f)←(f)
+(w)
Dacă d=0 (w)←(f)+(w) 1 C, DC, Z
ADDLW k (w)←k+(w) 1 C, DC, Z
SUBWF f,d Dacă d=1 (f)← (w) -(f)
Dacă d=0 (w)←(w) -(f) 1 C, DC, Z
SUBLW k (w)←(w) -k 1 C, DC, Z
IORWF f,d Dacă d=1 (f)←(f) ˅(w)
Dacă d=0 (w)←(f) ˅ (w) 1 Z
IORLW k (w) ←(w) ˅ k 1 Z
XORWF f,d Dacă d=1 (f)←(f)XOR(w)
Dacă d=0 (w)←(f) XOR (w) 1 Z
XORLW k (w) ←(w) XOR k 1 Z
DEC f,d Dacă d =1 (f)←(f) -1
Dacă d=0 (w)←(f) -1 1(2) –
INC f,d Dacă d=1 (f)←(f)+1
Dacă d=0 (w)←(f) +1 1(2) –
RLF f,d (f.0)←(C)
(C)←(f.7) 1 C
RRF f,d (f.7)←( C)
(C)←(f.0) 1 C

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
60
COMF f,d Dacă d=1 (f)←/(f)
Dacă d=0 (w)←/(f) 1 Z

Tabelul 2.9.Instruc țiuni pentru opera ții pe bit
Mnemonică Descriere formală Timp
execu ție Indicatori
condi ție
BCF f,b (f.b)←0 1 –
BSF f,b (f.b)←1 1 –

Tabelul 2.10. Instru cțiuni de direc ționare a unui bit de program
Mnemonică Descriere formală Timp
execu ție Indicatori
condi ție
BTFSC f,b Dacă (f.b)==0 salt 1(2) –
BTFSS f,b Dacă (f.b)==1 salt 1(2) –
DECFSZ f,d Dacă d=1 (f)←(f) -1, salt dacă
Z=0
Dacă d=0 (w)←(f) -1, salt
dacă Z=0 1(2)
INCFSZ f,d Dacă d=1 (f)←(f)+1, salt
dacă Z=0
Dacă d=0 (w)←(f) +1, salt
dacă Z=0 1(2)
GOTO
eticheta (PC)←ad resa etichetă 2
CALL
eticheta stivă←(PC)
(PC)←adresa etichetă 2
RETURN (PC)← adresa stivă 2

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
61
RETLW k (w)← k
(PC)←TOS 2
RETFIE (GIE)←1
(PC)←adresă din stivă 2

Tabelul 2.11. Instruc țiuni diverse
Mnemonică Descriere formală Timp
execu ție Indicat ori
condi ție
NOP – 1 –
CLRWDT (WDI)←0
(IQ)←1, (PD)←1 1 /TO,/PD
SLEEP (WDI)←0
(IQ)←1, (PD)←0 1 /TO,/PD

Exemplu: Etapele de execu ție a instruc țiunii MOVLW (Fig.2.8.)
1. Încărca re adresă memorie program în PC;
2. Aducerea instruc țiunii în registrul de instruc țiuni (IR) ;
3. Decodificarea instruc țiunii în blocul de decodare și control
(IDC) ;
4. Transmisia comenzilor către blocurile de alimentare, oscilator,
watchdog și blocul de execu ție, de către blocul de comandă și
control (IDC). Comenzile depind de optcodul instruc țiunii;
5. Constanta con ținută de instruc țiune este transmis ă către ALU
prin intermediul MUX (comandat in mod corespunzator de catre
IDC);
6. ALU transmite operandul la iesire (la comanda IDC) și registrul
W încarcă rezultatul ALU.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
62

Fig. 2.11 . Pașii de execu ție a instruc țiunii MOVLW

2.2.4. Porturile de intrare/ie șire
Prin port se în țelege un grup de pini ai unui microcontroler ce pot fi
accesa ți simultan din interior sau exterior. Există un registru în interiorul
unui microcontroler conectat la pinii microcont rolerului. Starea bi ților din
componen ța registrului este transmisă la pini în nivele logice de
tensiune. Porturile sunt cele mai simple și utilizate dispozitive de
intrare/ie șire. Microcontrolerul le folose ște pentru a monitoriza sau
controla alte compone nte sau aparate. Pinii microcontrolerului au mai
multe func ții de aceea trebuie seta ți. Inițializarea lor se realizează în
registrele de configurare. Selectând una din func ții ce lelalte sunt
dezactivat e. Fiecare linie a portului poate fi folosită independe ntă ca

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
63
intrare sau ca ie șire. Se particularizează în continuare porturile la PIC
16F84.
La PIC16F84 pentru a defini un pin ca intrare sau ca ie șire, trebuie
scrisă combina ția corectă în registrul TRIS. Dac ă în bitul ce are aceea și
poziție cu numărul pinulu i este scris "1" logic în registrul TRIS, acel pin
este pin de intrare, iar dac ă este valabil contrariul, este un pin de ie șire.
Fiecare port are un registrul TRIS. Astfel, portul A are TRISA la adresa
85h, iar portul B are TRISB la adresa 86h. La PIC16F84 PORTA are 5
pini. Al cincilea pin al portului A are func ție duală. La acel pin se află de
asemenea o intrare externă pentru timer -ul TMRO. Una din aceste două
opțiuni este aleasă prin setarea sau resetarea bitului TOCS. Acest pin
permite timer -ului TMRO s a-și crească starea fie de la oscilatorul intern
fie prin impulsuri externe la pinul RA4/T0CKI.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
64

Fig. 2.12. Structura pinilor RA3 -0 [6]

PORTB are 8 pin i, registrul adecvat pentru direcț ia datelor este
TRISB la adresa 86h. Setarea unui bit în registrul T RISB define ște pinul
portului corespunzător ca pin de intrare, și resetarea unui bit în registrul
TRISB, define ște pinul portului corespunzător ca pin de ie șire. Fiecare
pin la PORTB are un rezistor slab intern pull -up (scoatere) (rezistor care
defineș te o linie la unu logic) care poate fi activat prin resetarea celui
de-al șaptelea bit RBPU în registrul OPTION. Acești rezistori 'pull -up' se
închid automat când pinul portului este configurat ca o ie șire. Când
porne ște microcontrolerul, 'pull -up'-ii sunt dez activa ți.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
65

Fig.2.12. Structura pin RA4 multiplexat cu TMR0 (T0CS din OPTION)
[6]

Pinii RB7:RB4 pot cauza o întrerupere, care se întâmplă când starea
lor se schimbă de la unu logic la zero logic și invers. Numai pinii
configura ți ca intrare pot cauza a ceastă întrerupere să se întâmple.
Opțiunea de întrerupere cu rezistorii 'pull -up' fac mai u șoară rezolvarea
problemelor.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
66

Fig.2.13. Structura pinilor RB7:RB4 [6]

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
67

Fig.2.14. Structura pinilor RB3:RB0 [6]

Dacă nu este ata șat nimic la pin, rezisten ța internă de pull -up va
determina citirea unui unu logic la pin. Dacă linia este for țată exterior în
zero logic, etajul va genera curent prin rezisten ța de pull -up, iar
informa ția citită va fi un zero logic.

2.3. Compara ții privind instruc țiunile la microc ontrolerele CISC și
RISC . Particularizare pe 8051 și PIC16F84
Microcontrolerul de tip CISC, 8051 are instruc țiuni dedicate pentru
lucrul cu stiva (PUSH și POP, RETURN, IRET, CALL) pe când cel de tip
RISC, PIC16F84 folose ște instruc țiuni precum CALL, GOTO, R ETURN,

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
68
RETFIE și RETLW, cu care putem introduce sau extrage date la nivelul
stivei.
La PIC16F84, sunt 8 nivele de stivă și nu este prevăzut indicator de
depă șire a dimensiunii ceea ce poate genera eroare dacă numărul de
apeluri ale acesteia sunt mai mari d e 8.
Din tabelele cu instruc țiuni de mai sus se observă că numărul de
instruc țiuni de transfer de date la PIC16F84 este de 4 ceea ce măre ște
numărul de instruc țiuni în cadrul unui program pentru ace st tip de
microcontroler și în general pentru RISC.
La tipul de instruc țiuni aritmetico -logice pentru PIC 16F84 nu există
instruc țiuni în care să folosească bitul de transport și lipsesc cele care
realizează înmul țirea și împăr țirea ceea ce măre ște mult programul și
timpul de execu ție. Microcontrolerele de tip RISC au blocuri dedicate
pentru ultimele opera ții, realizate prin logica cablată, astfel că timpul de
execu ție a acestor instruc țiuni este la fel ca al celorlalte. De asemenea
la instruc țiunile de test pe bit pentru PIC 16F84 avem doar două
acestea verifi când un bit din filierele din zona GPR.
Un alt tip de instruc țiuni sunt de comparare care la PIC16F84
folosesc incrementarea sau decrementarea con ținutului unui fi șier,
conținut care se compară cu valoarea 0, realizându -se saltul pentru
instruc țiunea ce ur mează a fi executată. La microcontrolerul 8051, sunt
instrud țiuni de comparare a con ținutului a două registre sau a unui
registru cu o constantă saltul realizându -se la o adresă specificată în
cadrul instruc țiunii.
Microcprocesoarele de tip RISC au evolua t foarte mult viteza de
calcul a instruc țiuniloe se apropie de cea a microprocesoarelor existând
instruc țiuni dedicate de lucru în pipeline (paralel). Viteza de lucru a

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
69
crescut prin realizarea de blocuri dedicate pentru execu ția instruc țiunilor
complicate rapid aproape la fel ca cele simple [4].
Datorită setului redus de instruc țiuni la PIC16F84, mai ales a
numărului mic de instruc țiuni de lucru cu memoria modurile de adresare
sunt pu ține.
Programarea microcontrolerelor în C este mai simplă, multe din
funcții și instruc țiuni fiind acelea și pentru toate tipurile de
microcontrolere. O deosebire majoră poate fi în declarerea variabilelor
la spa țiul alocat și spa țiul de lucru pentru aceea și variabilă func ție de
familia de microcontrolere.
În capitolele următoare se vor prezenta programme realizate atât în
asamblor cât și în C pentru cele două tipuri de microcontrolere studiate.

Programarea în C a microcontrolerelor
Noțiuni de bază
Moduri de definire a variabilelor
A. Const – data este doar citită
B. Static – variabil ă accesibilă unită ții de compilare curente. Este activă
global și inițializată cu zero
C. Auto –variabila există doar când procedura este activă. Aceasta este
by defaut, și este necesar să se utilizeze AUTO.
D. Double – este un cuvânt rezervat dar n u este un tip de data suportat.
E. Extern – variabilî utilizată de mai multe unită ți de compilare. Nu este
alocată memorare, se face suprapunere de date la fiecare utilizare. Este
o variabilă globală.
F. Register – este utilizată ca o calificare, nu are ef ect
G._ fixed(n) – crează un număr zecimal unde n indică numărul de
zecimale

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
70
H. Unsigned – datele sunt ântotdeauna positive. Este un tip de date by
defaut, nu e specificat.
I. Signed – data poate fi pozitivă sau negative.
J. Volatile – arată compilatorului ca variabila poate fi schimbată la orice
punct al execu ției.
K. Void – indică o variabilă a cărui tip este nespecificat în locul în care
este cerut tipul
L. _readonly – doar citită

Tipuri de variabile și spațiul de memorie ocupat de fiecare
Short int ( int1) 1 bit 0 sau 1
Int (int 8) 8 biți 0 la 255
Long int (int16) 16 bi ți 0 la 65553
Int32 32 bi ți 0 la 4294967295
Char 8 biți 0 la 255
float 32 bi ți ±3×10-38 la ±3×1038

Directive de preprocesare

#DEFINE id text sau #DEFINE id(x,y…) text – înlocui ește un string cu un
id dat cu un test care este folosit în program

#DEVICE chip options – tipul microcontrolerului este specificat din lista
de dispozitive suportate de compilator

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
71
#ERROR text – forțează compilatorul să genereze o eroare în locul
unde a ceastă directive apare îm fi șier. Textul poate include macrouri ce
pot fi afi șate.

#fill_rom value – specifică data cu care se umple zona de memorie
nefolosită. Dacă se unesc mai multe unită ți de compilare, această
directivă trebuie fi utilizată la fel în fiecare unitate.

#INCLUDE " filename " – include calea pentru informa ții. Fișierul a cărui
nume este specificat prin filename este copiat la compilare în program .

#INT_xxxx – indică o func ție de întrerupere. Func ția de întrerupere nu
trebuie să aibă al ți parametric. Compilatorul salvează/reîncarcă
registrele cheie.

#LOCATE id=x – alocă unei variabile o adresă. Dacă variabila C nu a
fost definită înainte, ea va fi definită ca int8. Variabila este id iar adresa
este notată cu x.

#ORG start, end sau #ORG se gment – fixează programul, func ția în
anumită zonă de memorie ROM fixată prin start și end (acestea fiind
adrese). Prin segment se specifică adresa de început.

#RESERVE address sau #RESERVE address, address, address sau
#RESERVE start:end – specifică sp atial memoriei RAM ce se rezervă
pentru a fi utilizat de compilator. Această directive trebuie să apară după
#DEVICE.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
72
#TYPE standard -type=size sau #TYPE default=area – tratează SHORT
ca un bit , INT ca 8 bi ți, și LONG ca 16 bi ți. Prin TYPE se redefines
dimensiunile variabilelor. Prin standard -type avem short, int, long, or
default de dimensiuni ( size) 1,8,16, or 32, prin area se în țelege o
regiune de memorie definite înainte de #TYPE folosind directive de
adresă.

#pragma – directive utilizată să men țină c ompatibilitatea între
compilatoarele C. Compilatorul acceptă directive înaintea oricărei
comenzi de pre -procesare.

#inline -implementează func ția în linie
#priority -setează priorită țile de întrerupere . Cea mai mare prioritate este
pusă prima pe listă.

#use delay(clock=….) -directivă care specifică frecven ța
microcontrolerului .

Func ții des întâlnite
Output_low() -setează pinii portului pe nivel scăzut de tensiune
Output_high ()-setează pinii portului pe nivel înalt de tensiune

Delay_us() -întârziere de un nu măr specificat de µs

În ANEXA 7 și 8 sunt prezentate cuvintele cheie din C cât și operatorii .

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
73
Capitolul 3

SISTEMUL DE ÎNTRERUPERI

Dispozitivele periferice din interiorul microcontrolerului pot fi testate
în timpul execu ției unui proces prin dou ă metode , prin pooling – adică
este testat un bit indicator dedicat acelui dispozitiv care î și schimbă
starea la terminarea execu ției sarcinii sau prin întreruperi. A doua
metodă a fost introdusă pentru cre șterea vitezei de calcul, executându –
se în paralel mai multe sarcini în cadrul aceluia și microcontroler.
Sistemul de întreruperi este utilizat pentru comutarea din programul
principal , într-o rutina de întrerupere atunci când un dispozitiv periferic a
terminat procesul de execu ție, unitat ea centrală de pr ocesare executâ nd
programul principal în timp ce dispozitivul periferic î și execută sarcina.
Când se lucrează în întreruperi, microcontrolerul este aten ționat prin
setarea unui bit indicator de întreruperi generale și a unui bit indicator
dedicat periferic ului care urmează să execute sarcina . Ace ști biți se
regăsesc într -un registru al microc ontrolerului denumit de obicei registru l
de întreruperi. Dacă mai multe periferice lucrează în paralel și își
termină sarcina în acela și timp, microcontrolerul va face saltul la
întreruperea mai prioritară care este setată în rutina de ini țializare.
Microcontrolerele au registre de prioritate prin care programatorul poate
să seteze bi ții de prioritate indicând prin ace știa la care rutină de
întrerupere face saltul în ca zul terminării în paralel a sarcinilor. Perioada
apari țiilor întreruperilor în timp real este programabilă .
Ce înseamnă întrerupere din punct de vedere al programului? În
momentul declan șării unei întreruperi se opre ște programul principal,

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
74
după execu ția instruc țiunii în curs de execu ție și se va realiza un salt la
o adresă, specificată de furnizorul microcontrolerului, unde se va găsi o
subrutină de întrerupere. În momentul în care se face acest salt, adresa
programului principal și eventual con ținutul uno r registre sunt salvate
automat în stivă pentru a fi recuperate după revenirea din zona de
întreruperi care se face la execu ția instruc țiunii. Dacă este necesar ca
anumite registre să fie salvate în stivă, se vor utiliza instruc țiuni de lucru
cu stiva spec ifice fiecărei familii de microcontrolere, dacă acestea
există. Când se realizează saltul la vectorul de întrerupere specificat,
numărătorul de program este încărcat cu această adresă. Fiecare
microcontroler are specificat în datele de catalog un tabel de vectori de
întreruperi care con ține adrese și coresponden țele lor din punct de
vedere al perifericelor, unde se va realiza saltul în cazul în care acesta
cere o întrerupere.
Întreruperile pot fi mascabile sau nem ascabile. Întreruperile
namascabile nu pot fi neglijate de catre unitatea centrală de procesare
și sunt tratate atunci câ nd apar în timp ce întreruperile mascabile pot fi
neglijate în tratare dacă au fost dezactivate.
În continuare se vor particulariza întreruperile pentru cele două tipuri
de și microcontrolere 8051 și PIC16F84. În finalul capitolului se va
realiza o compara ție între cele două sisteme de întreruperi re alizate
pentru microcontrolerele CISC și RISC.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
75

Pașii de execu ție a unei întreruperi [24]

3.1. Întreruperi la microcontrolerul 8051
Microcontrolerul 8051 are cinci surse de întreruperi provenite de la
timer/numărător 0 și 1, port serial și de la cei doi pini externi INT0 și
INT1 [3]. Validarea întreruperilor se realizează prin bitul EA de
întreruperi generale (Fig.3.1 .). În schema bloc din Fig. 3.1. biții care
trebuie programa ți sunt reprezenta ți ca întrerupătoare iar cei care î și
schimbă starea la generearea întreruperii provenită de la perifericul
indicat în partea de ini țializare a programului sunt indicate în căsu țe.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
76

Fig.3.1. Sche ma bloc a sistemului de întreruperi la microcontrolerul
8051

Activarea întreruperii se realizează prin program, în zona de
inițializare. Se vor seta bi ții indicatori pentru întreruperi generale și cei
specifici perifericelor utilizate care vor lucra în în treruperi. Chiar dacă
biții indicatori de întreruperi sunt seta ți iar bitul general (EA) nu este
activ atunci microcontrolerul nu va lucra în întreruperi. Acești biți
indicatori, care semnalează microcontrolerului că va lucra în întreruperi
și de la cine v or fi aceste întreruperi, se găsesc în registrul indicator de
întreruperi IE (Interrupt Enable) (Tabelul 3.1.).

Tabelul 3.1. Registrul indicator de întreruperi IE, prezentarea
poziției biților indicatori de întreruperi
EA – – ES ET1 EX1 ET0 EX0

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
77
EA – bit de întreruperi generale, dezactivează/activează toate
întreruperile. Dacă EA = 0 întreruperile sunt dezactivate iar dacă EA = 1
se activează întreruperile.
– Rezervat
– Rezervat
ES – bit indicator de întreruperi pentru portul serial. Dacă ES = 0,
întreruperea pentru portul serial este dezactivată.
ET1 – bit indicator de întreruperi pentru timer/numărător1. Dacă ET1 = 0
întreruperea pentru timerul 1 este dezactivată.
EX1 – bit indicator de întreruperi pentru portul serial. Dacă EX1 = 0,
întreruperea externă 1 este dezactivată.
ET0 – bit indicator de întreruperi pentru timer/numărător0. Dacă ET0 = 0
întreruperea pentru timerul 0 este
EX0 – bit indicator de întreruperi pentru întreruperi externe. Dacă EX0 =
0, întreruperea externă 0 este dezactivată.
Dacă sunt două periferice care cer întreruperi în acela și timp,
microcontrolerul va rezolva întreruperea produsă de perifericul mai
prioritar. Acest lucru se semnalează prin program , în zona de ini țializare
activâ nd sau nu bi ții indicatori de prioritate din registrul indicator de
întreruperi (Tabelul 3.2.) .

Tabelul 3.2. Bi ții indicator de prioritate din cadrul registrului IP
X X X PS PT1 PX1 X X

– Rezervat
– Rezervat
– Rezervat

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
78
PS – Stabile ște nivelul de prioritate pentru întreruperea de port serial.
PS = 1. Îl programează la cel mai înalt nivel de prioritate.
PT1 – Stabile ște nivelul de prioritate pentru întreruperea de la Timer 1,
PT1 = 1. Îl programează la cel mai înalt nivel de prioritate.
PX1 – Stabile ște nivelul de prioritate pentr u întreruperea externă 1, PX1
= 1. Îl programează la cel mai înalt nivel de prioritate.
PT0 – Activează sau dezactivează nivelul de prioritate al întreruperii
pentru Timerul 0, PT0 = 1. Îl programează la cel mai înalt nivel de
prioritate.
PX0 – Stabile ște nivelul de prioritate pentru întreruperea externă 0, PX0
= 1. Îl programează la cel mai înalt nivel de prioritate.
Microcontrolerul are un tabel al nivelelor de prioritate (Tabelul 3.3.)

Tabelul 3.3. Prezintă nivelele de prioritate din interiorul
microc ontrolerului
Sursă Prioritate în înteriorul
nivelului
IE0 cea mai înaltă
TF0
IE1
TF1
RI + TI cea mai scăzută

Microcontrolerului 8051 are un tabel al vectorilor de întreruperi în care
se specifică adresele la care se face saltul în cazul une i cereri de
întrerupere. Dacă zona alocată pentru scrierea subrutinei nu este

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
79
suficient de mare, se va pune o instruc țiune de salt într -o altă zonă de
memorie unde se află mai mult spa țiu (JMP etichetă).

Tabelul 3.4. Tabelui vectorilor de întreruperi
Sursă Adresă vector
IE0 0003H (pin3.2)
TF0 000BH
IE1 0013H (pin3.3)
TF1 001BH
RI + TI 0023H
RESET 0000H (pin9)

Se observă, din tabelul de mai sus, că spa țiul de memorie alocat
pentru scrirea unei subrutine de întreruperi este de patru octeți.
Această zonă de memorie este rezervată și programatorul nu are voie
să o folosească. Revenirea dintr -o subrutină de întreruperi se realizează
cu instruc țiunea RETI. Care înseamnă încărcarea numărătorului de
program (PC) cu adresa salvată în stivă și incrementarea numărătorului
de program al stivei pentru a -l pregăti pentru o nouă s alvare. Sursele
externe de întrerupere pot fi programate pentru a fi activate pe nivel sau
pe front, prin setarea sau ștergerea bi ților IT1 sau IT0 în registrul TCON.
Dacă ITx = 0, într eruperea externă x este declan șată prin detectarea
unui nivel LOW la pinul INTx. Dacă ITx = 1, întreruperea x este
declan șată pe front.
În acest mod, dacă e șantioanele succesive ale pinului ITx arată un
nivel HIGH într -un ciclu și LOW în ciclul următor, e ste setat flagul de

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
80
cerere a l întreruperii IEx din TCON. După aceasta bitul IEx solicită o
întrerupere.

Exemplu de pr ogramare în asamblor a subrutinei de întreruperi
provenită de la pinul extern

ORG 0 ;adresa de RESET
LJMP MAIN ;salt în programul princi pal
ORG 30H;adresa rutinei de întreruperi provenită prin schimbarea
;stării impulsului aplicat pe INT0 aici va fi scrisaă rutina de întrerupere
;corp program
RETI ; întoarcere în programul principal

3.2. Sistemul de întreruperi la PIC 16F84
Microcontrolerul PIC16F84 pune la dispozi ție o singur ă adres ă a
vectorului de întrerupere (0004h) având mai multe surse a vectorilor de
întreruperi , acestea putând fi activate sau dezactivate prin setarea
corespunzatoare a registrelor dedicate . Întreruperile pot fi mascabile
sau nemascabile având patru surse de întreruperi (Fig.3.2.)
– Externă pe bitul 0 al PORTB (pin RB0/INT)
– Depă șire Temporizator TMR0
– Generate la schimbarea nivelelor logice pe pinii externi RB7:RB4
– Încheierea ciclului de scriere în memoria EEPROM

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
81

Fig. 3.2. Schema bloc generală a sistemului de întreruperi la PIC16F84

Registrul dedicat întreruperilor aflat în zona de registre cu func ții
speciale este INTCON . Prin intermediul bi ților indicator prezen ți dă
posibilitatea utilizatorului să valideze sau invalideze atât decla șarea
întreruperilor de la diverse surse, cât și să valideze sau invalideze
întreruperile global e.

Observa ție generală – biții de stare prezen ți în structura registrului
INTCON sunt seta ți hard (prin mecanismul implementat în cadrul
microcontr oller-ului) și programatorul, în cadrul rutinei de servire a
întreruperilor, va trebui să -i reseteze, pentru a putea detecta următoarea
condi ție de decla șare a întreruperilor.

Tabelul 3.5.Prezentarea bi ților indicatori de întreruperi din reg istrul
INTCON
GIE EEIE TOIE INTE RBIE TOIF INTF RBIF

Descrierea bi ților indicatori întreruperi din INTCON

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
82
• GIE (Global Interrupt Enable ) – bit de întreruperi generale,
care prin setarea lui și a bitului de întrerupere individual perifericului
permite validarea cererii ;
• EEIE (EEPROM Interrupt Enable ) – validează întreruperile la
opera țiile de scriere sau citire a EEPROM -ului intern ;
• TOIE (TMR0 Overflow Enable ) – validează întreruperile
corespunzătoare depă șirii la canalul temporizator/ numerator;
• INTE (External Interru pt Enable ) – validează întreruperile
datorate varia ției semnalului aplicat pe intrarea RB0 ;
• RBIE (B Register Interrupt Enable ) – validează întreruperile
datorate schimbării stării uneia dintre intrările portului RB7, RB6, RB5
sau RB4 al microcontroller -ului;
• TOIF (Timer Overflow Interrupt Flag ) – este setat hard la
apari ția stării “depă șire” a capacită ții numărătorului corespunzător
canalului 0, resetat în rest ;
• INTF (Interrupt Flag ) – setat hard la apari ția unei întreruperi la
nivelul liniei RB0, în rest r esetat ;
• RBIF (B Port Interrupt Flag ) – setat hard, atunci când una sau
mai multe linii ale portului B au schimbat starea, resetat în rest

La apari ția unei întreruperi numărătorul de program (PC) sare la
adresa 0004h iar bitul de întreruperi generale GIE este dezactivat.
Codul de deservire a l întreruperilor se termina cu instruc țiunea RETFIE,
care reface PC și seteaz ă la loc câmpul GIE activând întreruperile
nemascate . Revenirea din subrutina de întreruperi se face cu
instruc ținea RETFIE.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
83
3.3. Compara ții priv ind sistemul de întreruperi la CISC și RISC
În cazul microcontrolerului 8051, bi ții indicatori de întreruperi sunt în
registre dedicate perifericului respectiv pe când la PIC16F84 sunt în
acela și registru cu bi ți de setare a i întreruperii.
Modul de or ganizare a l vectorilor de întreruperi este diferită la 8051
există o tabelă a vectorilor de întreruperi pe când la PIC există o singură
adresă unde se face saltul .
Mnemonicele instruc țiunilor de revenire din subrutina de întreruperi
sunt diferite RETI (80 51) și RETFIE (PIC16F84).
Memoria s tivă la PIC16F84, este limitată la 8 nivele, astfel că nu pot
exista mai multe cereri.
Bitul de întreruperi generale se dezactivează la execu ția unei cereri
la PIC și se activează în subrutina de întreruper i. La 8051 acest bit
rămâne activ pe toată perioada.
Lucrul în întreruperi este util î n cazul în care se dore ște o cre ștere a
timpului de calcul.
În cazul programării în C a microcontrolerului 8051 , codul con ține o
funcție de întreruperi predefinită care se găse ște în librărie declarată cu
un număr. Număr ul indică perifericul de unde se a șteaptă întreruperea
(Tabelul 3.6.) . Lucrul în întreruperi este specificat microcontrolerului în
partea de ini țializare a programului [11] .

Programarea în C a întreruperilor
Întrer uperile programate în limbaj de asamblare folosesc instruc țiuni
și directive dedicate întreruperilor în cadrul cărora se specifică vectorul
de întrerupere și registrele al căror con ținut este memorat în stivă.
Programarea în C a întreruperilor se realizea ză cu func ții dedicate
tipului de microcontrolerului pe care compilatorul le găse ște în librărie.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
84
La microcontrolerul 8051, func țiile C de programare a întreruperilor
au cuvântul ″interrupt ″ în defini ție și denumirea pe rifericului cu număr
pentru a indica de unde se produce întreru perea. În Tabelul 3.6. sunt
prezentate codurile întreruperilor specifice microcontrolerului 8051.

Tabelul 3.6. Codul întreruperilor în p rogramarea întreruperilor în C la
8051
Întrerupere Nume Număr
External Interrupt 0 INT0 0
Timer Interrupt 0 TF0 1
External Interrupt 1 IE1 2
Timer Interrupt 1 TF1 3
Serial Comunication RI + TI 4

Exemplu de func ții declarate în C pentru lucru în întreruperi la 8051

Void serial0() interrupt 4 //declarare func ție întreruperi la port seria l
{corp program}

Void timer0() interrupt 1 // declarare func ție întreruperi la timer0
{corp program}
Se observă că în C nu există o instruc țiune de revenire din întreruperi.
Acest lucru se realizează la întâlnirea sfâr șitului func ției.

La microcontroler ul PIC16F84 există directive, funcții și variabile
predefinite care activează sau nu lucrul în întreruperi [ 12,13 ]. Toate

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
85
conțin cuvântul ″interrupts″ pentru a indica faptul că această func ție se
referă la o întrerupere.
Exemple de func ții în C pentru vali darea sau invalidarea
întreruperilor
Func ția de activare a întreruperilor forma generală:
enable_interrupts( nivel)
– nivel este o constantă definită în fi șierul *.h din librăria
microcontrolerului care con ține tabelul vectorilor de întrerupere

clear_interru pts(); șterge întreruperile
enable_interrupts(GLOBAL); activează întreruperile globale
enable_interrupts(INT_TIMER0); activează întreruperea produsă de
numărător 0
Dezactivarea întreruperilor se realizează cu func ția a cărei formă
generală este: disabel_int errupts(nivel)
disable_interrupts(GLOBAL); // dezactivează toate întreruperile
disable_interrupts(INT_RDA); // dezactivează întreruperi de la RS232
ștergerea unui bit indicator care s -a activat în urma producerii unei
întreruperi se realizează cu func ția clear_interrupt( nivel) . În acest caz
prin nivel se în țelege bitul indicator al blocului activat pentru a lucr a în
întreruperi.
Activarea frontului impulsului pe care se produce întreruperea provenită
de la pinii externi se realizează prin func ția ext_int _edge() .

Tabelul 3.6. Directive preprocesor folosite pentru programarea în
întreruperi la PIC16F84
#DEVICE Indică compilatorului să genereze pentru priorităr țile

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
86
HIGH_INTS= întreruperilor
#INT_XXX
fast Indică compilatorului că această întrerupere este de
prioritate maxima
Întreruperi relevante
#int_default Această directive specifică faptul că următoarea func ție
trebuie să fie chemată dacă o întrerupe re este trigherată,
dar nicio rutină nu este asociată cu această întrerupere
#int_global Directiv a specifică faptul că următoarea func ție trebuie să
fie apelată chiar dacă nu este o întrerupere
#int_xxx Directiva specifică faptul că următoarea func ție trebuie să
fie apelată unde xxx este întreruperea activat ă

Exemplu de utilizare a directivelor îm preună cu rutinele pe care le
apelează
#int_timer0
void timer0interrupt() //int_timer este asociată func ției următoare a
rutinei ce trebuie apelată

Din modalită țile de programare în C a microcontrolerelor prezentate mai
sus se observă că la PIC func țiile sunt mai complexe, librăriile fiind mai
mari. Exemple de programe în C pri vind întreruperile se prez intă la
capitolele în care sunt de taliate blocurile periferice din arhitectura
microcontrolerului .

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
87
Capi tolul 4

DISPOZIT IVE DE NUMĂRARE

4.1. Numărător/Temporizator. Prezentare generală
În acest capitol se descri u funcțiile și modurile de func ționare a le
blocurilor numărătoarelor/temporizatoarelor particularizând pe tipuri din
microcontrolere, iar în final se vor prezenta modurile de programare și
exemple a acestora folosind limbajul asamblor și C.
Diferen țe între numărător și temporizator
Numărător – dispozitiv de numărare a impulsurilor provenite de la pini
externi microcontrolerului .
Temporizator – dispozitiv de numărare a impulsurilor provenite de la
oscilatorul microcontrolerului .
Rezolu ția dispozitivului de numărare este dată de capacitatea
registrului dedicat pentru înregistrarea numărului de impulsuri.
Aceste dispozitive sunt construite să lucreze în întreruperi, fapt care se
specific ă în rutina de ini țializare.
În modulul de temporizare sunt implementate câteva mecanisme
care pun la dispozi ția utilizatorului func ții specifice :
– de comparare – permite controlul unor semnale de ie șire;
– de captură – de monitorizare a uno r semnale de intrare;
numărătoarele interne permit generarea de referin țe de timp interne,
necesare în bucle de întârziere, multiplexarea diferitelor sarcini
software, ș.a.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
88
– Timer -ul poate fi folosit practic pentru orice func ție de timp, inclusiv
generarea unor forme de undă sau conversii digital analogice , ceas
intern, sincronizare transmisiei sau rec epționării datelor .
Pentru aplica ții speciale în timp real s -au construit module timer cu
unitate aritmetică și logică proprie.

4.1.2. Func țiile temporizator ului
Captură la intrare (IC – input capture ) – se bazează pe posibilitatea de
a stoca valoarea numărătorului principal la momentul apari ției unui front
activ al unui semnal extern
– permite măsurarea lă țimii unui impuls sau a perioadei unui semnal.
– poate fi folosit și ca referin ță de timp pentru declan șarea altor
opera ții
Comparare la ie șire (OC – output compare ) – se compară la fiecare
impuls de ceas valoarea numărătorului principal cu cea a unui registru .
Func ția este folosită pentru a genera întârzieri sa u pentru a genera o
formă de undă cu valori dorite pentru frecven ță și pentru factorul de
umplere .
Întreruperi în timp real (RTI – real-time interrupt )
COP (computer operating properly ) ceas de gardă (watchdog ) –
folosit pentru a reseta sistemul în cazul în care din erori de programare
sau erori în desfă șurarea programului datorate perturba țiilor mediului
Acumulare de impulsuri (pulse accumulator ) – folosit pentru a
număra evenimentele ce apar într -un interval de timp determinat sau
pentru a măsura durata unui impuls

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
89
4.2. Blocul temporizare/numărare la microcontrolere CISC și RISC
Numărătorul contorizează impulsuri provenit e din oscilatorul intern
sau din exterior divizat cu un factor de regulă programabil. Blocul care
programează perioada impulsurilor se nume ște prescaler , factorul de
divizare a clock -ului este stabilit într -un registru asociat. Registrul
dedicat pentru înregistrarea numerelor este înscris cu 0 la reset sau la
pornirea microcontrolerului. Există un bit indicator pozi ționat de obicei
într-un registru neopera țional asociat modulului de numărare, care
indică depă șirea în cazul în care registrul de numărare este plin. Pentru
a autoriza generarea unei întreruperi este necesar să fie setat un flag de
autorizare .
În continuare se prezintă bl ocul de temporizare pentru microcontrolerele
8051 și PIC16F84.

4.2.1. Prezentarea blocului de numărare la microcontrolerul 8051
Microcontrolerul 8051 are două blocuri Temporizare/ Numărare:
Timerul 0 și Timerul 1 . Ambele pot conf igurate pentru a lucra fie c a
temporizator sau ca numărătoare de evenimente . Aceste
temporizatoare au un bloc prescaler a cărui constantă de divizare este
fixată la 1/12 din frecven ța oscilatorului. Pinii externi care sunt utiliza ți
în cazul folosirii blocului ca numărător sunt T0, T1. Rata maximă de
numărare este 1/24 din frecven ța oscilatorului . Registre dedicate pentru
programarea blocului sunt TMOD si TCON . Există patru moduri de
funcționare a l numărătoarelor/temporizatoarelor.
Alegerea modului de func ționare ca temporizator sa u numărător
se face prin programarea registrul ui TMOD din SFR (Tabelul 3.1. ), cu
următoarea structură pentru numărătorul 1: GATE1, C/ -T1 – M11, M01

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
90
și pentru numărătorul 2: GATE2, C/ -T2 – M12, M02, unde: GATE –
gestionează controlul.
Când GATE=1, timer -ul este activat doar cât timp pinul nINT
corespunzător este în HIGH și bitul TR din r egistrul TCON este 1 .
C/-T – selectează operarea ca timer când este pe 0 sau numărător când
este 1. M1 și M0 selectează modul de lucru (Tabelul 3.2) .

Tabelul 4 .1. Registrul TMOD
MSB LSB
GATE T / C M1 M0 GATE T / C M1 M0
← TIMER 1 → ← TIMER 0 →

Tabel ul 4.2. Programarea modului de operare cu bi ții M0 și M1
M1 M0 Modul de lucru
0 0 Timer pe 13 bi ți (Mod 0)
0 1 Timer/numărător pe 16 bi ți (Mod 1)
1 0 TL0 este timer/număr ător pe 8 bi ți și TH0 este timer pe
8 biți (Mod 2)
1 1 Timer/numărător este 1 – oprit (Mod 3)

Registrul TCON este utilizat pentru : porni rea număr ării,
atenționarea în caz de depă șire a registrelor de înregistrare a numărării
și indicarea lucrul ui în întreruperi (Tabelul 3.3.) .

Tabelul 4 .3. Registrul TCON
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
91
Tabel ul 4.4. Detalierea func țiilor registrul ui TCON [3]
BIT SIMBOL FUNCȚIE
TCON.7 TF1 Flag de pășire Timer
1. Setat hardware,
șters hardware sau
software
TCON.6 TR1 Bit de START
dispozitiv de
numărare 1. Setarea
sau ștergere soft.
TCON.5 TF0 Flag depă șire Timer
0. Setat hardware și
șters hardware sau
software
TCON.4 TR0 Bit de START
dispozitiv de
numărare 0. Setarea
sau ștergere soft.
TCON.3 IE1 Flag front întrerupere
a dispozitivului 1 de
numărare 1. Setat
hardware când se
detectează frontul
unei întreruperi
externe, este șters
când s -a realizat
întreruperea.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
92
TCON.2 IT1 Bit de control al
întreruperii de tip 1.
Setat ș/ters software –
precizeaz ă frontul
pentru delan șarea
întreruperilor externe.
TCON.1 IE0 Flag front întrerupere
a dispozitivului 1 de
numărare 0. Setat
hardware când se
detectează frontul
unei întreruperi
externe. șters când s –
a procesat
întreruperea.
TCON.0 IT0 Bit control întrerupere
tip 0. Setat ș/ters
software – preciz ează
frontul pentru
delan șarea
întreruperilor externe.

Întreruperile de la Timer 0 și Timer 1 sunt indicate de TF0 și TF1,
care sunt seta ți la depă șire în registrele de memorare ale circuitelor
timer/nu mărător. Când se generează o întrerupere de timer, flagul care
o generează este șters hardware atunci când rutina de servire este
deservită. Un alt mod de a testa sfâr șitul sarcinii este prin pooling,
verificând bitul TFn (n poate fi 0 sau 1) .

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
93

Fig.4.1. Schema bloc a numărăto arelor/temporizato arelor de la
microcontrolerul 8051 [3]

Moduri de func ționare

Mod 0
Acest mod de func ționare este comun ambelor numărătoare. În acest
mod, sec țiunea de numărare este formată din TL1 (5 bi ți) și TH1 (8 bi ți).
Numără torul de 13 bi ți astfel format numără înainte. În acest mod,
registrul Timerului este configurat ca un registru de 13 bi ți. Cei trei bi ți
superiori din TL1 sunt nedetermina ți și trebuie ignora ți. Setarea flagului
de func ționare (TR1) nu șterge registrul. C ând numărătorul comută, din
starea "1" în starea "0", se setează flagul de întrerupere timer TF1.
Pornirea Timerului este activată când TR1 = 1 și GATE = 0 sau INT1 =
1 (setând GATE = 1 se permite timerului să fie controlat de către
intrarea externă INT1 p entru a facilita măsurarea lă țimii impulsurilor).

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
94

THx TLx
Notă: S -a notat cu x numărul dispozitivului de numărare. Acesta
poate lua valorile 0 sau 1.

Modul 1
Este asemănător cu M odul 0, cu excep ția faptului că registrul de
memorar e a numărătorului va lucra pe 16 bi ți.

THx TLx

Modul 2
Acest mod configurează registrul timer ca un numărător de 8 bi ți
(TL1) cu reîncărcare automată. Depă șirea din TL1 setează TF1 și
reîncarcă TL1 cu con ținutul TH1, care este introd us prin soft.

Fig. 4 .2. Reprezentarea schemei bloc a dispozitivului de numărare Mod
2 [3]
Modul 3
Temporizatorul 0 în M od 3 stabile ște TL0 și TH0 ca două
numărătoare separate . TL0 folose ște biții de control ai Temporizatorului

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
95
0: C/T, GATE, R0, INT0 și TF0. TH0 este blocat într -o func ție de
temporizator (ce numără cicluri ma șină) și preia pe ntru folosire TR1 și
TF1 de la temporizatorul 1. Astfel TH0 controlează întreruperea
provenită de la temporizatorul 1.

Fig.4 .3. Schem a bloc a dispozitivului de n umărare Mod 3 [3]

Modul de programare al acestui dispozitiv este simplă constând într –
o subrutină de ini țializare și una de repornire a numărătorului în cazul în
care a terminat de numărat. Dacă se utilizează
numărătorul/temporizatorul să numere un anumit număr de impulsuri, o
anumită perioadă de timp, acest lucru se realizează în următorul fel.

Notăm
Valoare= timp întîrzire /perioada unui ciclu de ceas
Valoare – reprezintă numărul de impulsuri care trebuiesc numărate
pentru a ob ține timpul dorit

Pentru a număra un număr de impulsuri se vor ini țializa cele două
registre dedicate THx și TLx. Având în vedere că cele două registre

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
96
permit să se numere 65535 de impulsuri daca se va lucre în Mod 1,
atunci valoarea cu c are se încarcă cele două regist re este ob ținută prin:

Valoare încărcare=65535 -Valoare – reprezintă valoare a reîncărcare
registr e THx,TLx

Exemplu
Să se genereze un timp de întârziere de 100 μs folosind Temporizatorul
0.
Etapele de programare
Inițializare registru TMOD
Inițializare TL0 și TH0
Start Timer (TR0=1)
Testare TF0 până este setat
Valoare= 0,01*11,0592*106/6=184 impulsuri
Valoare cu care se ini țializează cele două register este 65535 – 184 =
65351 = 0xFF47
Registrul TH0 va fi ini țializat cu valoarea FFh iar TL0 cu 47h.
Rutina în asamblor pentru programare tem porizator 0 care va lucre în
Mod1 este:

timer: MOV TMOD,#01H ; ini țializare TMOD
MOV TL0,#47H ; ini țializare TL0
MOV TH 0,#FFH ; ini țializare TH0
SETB TR0 ; start numărare
eticheta:JNB TF0,eticheta ; pooling pe TF0
CLR TR0 ; stop numărare
CLR TF0 ; ștergere TF0

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
97
RET
Aceea și rutină scrisă în C este:

void Delay(void)
{
TMOD = 0x01; inițializare TMOD
TL0 = 0x47; inițializare TL0
TH0 = 0xFF; inițializare TH0
TR0 = 1; start numărare
while(!TF0) // pooling pentru TF0
TR0 = 0;
TF0 = 0;
}

Programarea temporizatorului în C la 8051 nu necesită func ții complexe,
se vor folosi denumirile registrelor sau bi ților dedica ți pentru încărcarea
lor cu valorile cerute.
Pentru a autoriza lucrul în întreruperi se setează bitul indicator TFx și
bitul pentru autorizarea întreruperilor general EA. Corpul de program ce
se scrie la adresa vectorului de întrerupere este acela și cu cel de mai
sus.
Exemplu de programare a Temporizatorului 0 în întreruperi. Se
folose ște o variabilă contor pentru a indica numărarea până la 65536
cicli de ceas.

#include <reg52.h>
#include <stdio.h>

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
98
static unsigned long numara = 0; /* variabilă folosită doar în acest
program */

void timer0_ISR (void) interrupt 1
{
numara ++; /* Increment ează variabila contor
}
/*––– –––––––––––––-
Programul principal, se ini țializează Temporizatorul 0 să lucreze în
întreruperi care se produc e la fiecare depă șire de 65535
–––––––––––––––– */
void main (void)
{
TMOD = (TMOD & 0xF0) | 0x01; /* Set are numărător ca Temporizator */
ET0 = 1; /* validare întrerupere Temporizator 0 */
TR0 = 1; /* Start Temporizator 0 */
EA = 1; /* validare întreruperi generale */

while (1) /* buclă de execu ție infinită din care se va face saltul după
fiecare 65535 cicli */
{……..
/*Corp program */
} ……
}
Se observă numărul mic de instruc țini folosite pentru programarea
microcontrolerului în C.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
99
4.2.2. Prezentarea numărătorului microcontroler PIC16F84
Numărătorul este pilotat de un impuls provenit di n oscilatorul intern
sau din ex terior divizat cu un factor de regulă programabil . Factorul de
divizare a l impulsurilor de ceas este stabilit într -un registru dedicat,
valoarea numărată este memora tă în TMR0, resetat automat când
ajunge la FFFFh. N umărătorul este înscris cu 0 doar la reset iar în rest
este un registru care poate fi doar citit. Dacă conținutul din registrul
numărător comută din starea FFFFh în starea 0000h se seteaza flag -ul
TOF ( timer overflow ) aflat într -un registru neopera țional dedicat
modulului timer (Fig. 4 .4.). Pentru inițializarea lucrului în întreruperi este
necesar să fie setat un bit indicator de autorizare (TOI) . Registrul
INTCON de 16 bi ți permite citirea stării numărătorului .
Frecven ța de num ărare este direct propor ționala cu frecven ța
oscilatorului și poate f i modificată prin progra m. Semnalele pot proveni
de la fosc/4 sau din exterior acestea fiind validate a fi numarate dacă bi ții
din registrul O PTION, T0CS (1 –numără tor, 0 -Timer) și PSA sunt
inițializa ți conform specifica țiilor tehnice . Prescaleru l este un divizor pe 8
biti folosit dac ă PSA este 0 logic programat cu ajutorul biț ilor PS2, PS1,
PS0. Bitul TOSE – comandă incrementarea impulsurilor din exterior pe
front pozitiv sau negativ

Fig.4 .4. Schema bloc a dispozitivului de numărare/temporizare la
PIC16F84

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
100
Tabelul 4 .5. Alegerea factorului de divizare la dispozitivul de numărare
PS2 PS1 PS0 Factor
divizare
numărător Factor
divizare
ceas
gardă
0 0 0 1/2 1/1
0 0 1 1/4 1/2
0 1 0 1/8 1/4
0 1 1 1/16 1/8
1 0 0 1/32 1/16
1 0 1 1/64 1/32
1 1 0 1/128 1/64
1 1 1 1/256 1/128

Registrul OPTION este un registru de control utilizat care con ține bi ți
indicatori pentru ini țializarea dispozitivului de numărare.

Tabelul 4.6 . Structura registrului OPTION
RBPU# INTEDEG TOCS TOSE PSA PS2 PS1 PS0

RBPU#, (Pull up bits port B ) – când este pe 1 logic invalidea ză funcțiile
de pull-up pentru liniile portului B, iar pe 0 logic asigură func ția pull -up
INTEDG (Interrupt Edge Select ) – selectează frontu l, crescător sau
descrescător pentru producerea întreruperii. Pe 0 logic întreruperea se
produce pe front descrescător
TOCS (TMR0 Source Clock ) – selectează sursa impulsurilor ce sunt
numărate de către canalul 0 numărărtor/temporizator, setat permite
numărarea impulsurilor externe, aplicate la pinul RA4, resetat
selec tează frecven ța internă de ceas divizată cu 4.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
101
TOSE (TMR0 Source Edge Select ) – selectează frontul impulsurilor
numă rate. Când este pe 0 logic impulsurile se numără pe front pozitiv.
PSA, (Prescaler Assignemet Bit ) – selectează sursa pentru presacaler .
Când este pe 1 logic sursa este pentru WDT ( Watch Dog Timer ), iar pe
0 logic este pentru canalul TMR0.
PS2, PS1, PS0 – biți de selec ție a constantei de divizare a prescaler –
ului
Registrul INTCON con ține bi ții care se setează la declan șsrea unei
depă șiri a r egistrului de numărare și în acela și registru se află registr ul
pentru a inițializa dispozitivul să lucreze în întreruperi.
Bitul indicator GIE, (Global Interrupt Enable ) – permite , când este setat ,
validarea cereri lor de întrerupere ce apar dacă acestea a u fost validate
și individual, respectiv resetat inhibă orice cerere de întrerupere . Bitul
TOIE (TMR0 Overflow Enable ), setat validează întreruperile
corespunzătoare depă șirii la canalul temporizator/numărător, resetat
acestea sunt ignorate . La depă șirea numărării TOIF (Timer Overflow
Interrupt Flag ), este setat hard .
Biții de stare prezen ți în structura registrului INTCON sunt seta ți hard și
programatorul, în cadrul rutinei de servire a întreruperilor, va trebui să -i
reseteze, pentru a putea detecta urmă toarea condi ție de decla șare a
întreruperilor.

Rata întreruper e= frecven ța de ceas/4x(65536 -n)xprescalar

n=valoarea de reîncărcare a registrului de unde se porne ște numărarea.
Pentru programarea în C a dispozitivului temporizare/numărare sunt
disponibil e următoarele func ții în librăria timer.h .
setup_timer_0(mode) – setare sursă, prescalar pentru temporizator 0

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
102
set_timer0(value) sau set_rtcc(value) – inițializare temporizator
0/numerator 0. Valoarea va fi pe 8 sau 16 bi ți depinde de familia de PIC –
uri
value=get_timer0 – returnează val oarea numărată

4.2.3. Compara ții între numărătoarele de la 8051 și PIC
Cele două numărătoare func ționează pe acela și principiu dar la 8051
există mai multe moduri de func ționare pe când la PIC există
posibilitatea aleger ii frecven ței de divizare.
Modul de programare în asamblor este mai simplu la 8051 , datorită
setului complex de instruc țiuni dar în C, biblioteca de func ții pentru PIC –
uri este mai mare .

4.3. Alte tipuri de dispozitive de numărare

4.3.1. Ceas de gardă
Dispozitiv de numărare pentru protec ția soft a microcontrolerului,
ceasul de gardă introduce un RESET intern dacă programul nu este
executat corect din cauza perturba țiilor electrice din exterior.
Ceasul de gardă este de fapt un alt numărător liber unde pro gramul
nostru trebuie să scrie un zero ori de câte ori se execută corect. În caz
că programul are eroare în execu ție nu se va mai scrie zero iar
numărătorul se va reseta singur la atingerea valorii sale maxime.
Aceasta va duce la rularea programului din no u, și corect de această
dată pe toată durata.
Microcontrolerul 8051 nu are acest dispozitiv intern acesta găsindu -se la
un microcontroler din acee și familie, mai evoluat, 80552.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
103
PIC16F84 dispune de un canal temporizator/numărător ce poate
îndeplini func ția de ceas de gardă de 8 bi ți cu un prescaler de 5 bi ți.
Bitul PSA alege tipul de numărător pentru prescaler. Divizarea este
aleasă fun ție de valorile bi ților P S2, PS1 și PS0 (vezi Tabelul 4.4).

Fig.4.5. Schema bloc a ceasului de gardă [9]

Din schema bl oc se observă că e ste un Oscilator RC care lucrează
complet independent de celelalte componente. Detectează posibila
blocare a CPU și produce un RESET intern în caz de depă șire de 18ms
până la 2.3s . Nu necesită componen te externe pentru a funcțion a.
Dezact ivarea ceasului de gardă se face prin bitul WDTE pe 0 logic.
Instruc țiunea specială care trebuie executată periodic este CLRWDT
(Clear Watch Dog Timer) și SLEEP . În caz de depă șire a numărării bitul
/TO din registrul STATUS este activat, el fiind șters sof t.
La adresa 2007h se găse ște un registru a cărui bi ți pot fi configura ți
pentru func ționarea ceasului de gardă.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
104

CP CP CP CP PWRTE WDTE FOSC1 FOSC0

CP: bit de protec ție a programului
1 = protective dezactivată
0 = toată memoria program este protejată
bit 3 PWRTE : (Power -up Timer Enable)
1 = dezactivare a temporizatorului
0 = activare a temporizatorului
bit 2 WDTE : (Watchdog Timer Enable)
1 = activare ceas de gardă
0 = dezactivare ceas de gardă
bit 1-0 FOSC1:FOSC0 : biți de selec ție a oscilatorului
11 = oscilator RC
10 = oscilator HS
01 = oscilator XT
00 = oscilator LP

4.3.1.1. Modul SLEEP (Mod de consum redus) la PIC16F84
În acest mod unitatea centrală este oprită, dar t emporizatorul , ceasul
de gardă și sistemul de întreruperi continuă să func ționez e. O
întrerupere internă, una externă sau un RESET trezesc circuitul din
modul SLEEP . Dispozitivele pot fi puse î n starea de consum redus
(SLEEP) si apoi î n consum normal (trezite din SLEEP) . Instruc țiunea de
intrare în consum redus este SLEEP . Dacă este validat acest mod,
WDT este șters (dar ținut î n execu ție), bitul PD (STATUS.3) este șters,
și bitul TO (STATUS.4) este setat, oscilatorul este oprit și CPU nu
lucrează. Pinii de intrare/ie șire își men tin starea care o aveau înaintea

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
105
execu ției instruc țiunii SLEEP . În modul SLEEP, p entru consum redus,
toți pinii de intrare/ie șire sunt plasa ți la Vdd și VSS, fă ră curent din
exterior și ceasul extern este dezactivat . Pinul MCLR (de RESET hard)
este pus la nivel logic î nalt (VIHMC). Un Reset produs de WDT nu pune
MCLR î n nivel jos . Pinul T0CKI este la Vdd sau Vcc .
Se poate realiza trezirea după unul din evenimentele:
1. RESET extern pe pinul MCLR
2. Trezire prin ceas de gardă dacă este în func ționare
3. Întreru pere de la pinul RB0/INT, port B se schimb ă sau când
EEPRO M este plin
Perifericele nu pot genera întreruperi în timpul SLEEP, p ână când
semnalul Q de c eas nu este prezent . Primul eveniment (MCLR Reset)
va cauza un RESET dispozitivului. Urm ătoarele dou ă evenimente sunt
considerate ca o continuare a programului de execu ție. Biții /TO și /PD
pot fi utiliza ți să determine cauza RESET -ului. Bitul /PD este setat pe
powen -on și șters c ând se apelează SLEEP . Bitul /TO este șters dac ă
se întâmplă o depa șire a ceasului de gardă (si cauzează o trezire ).
Când se execută instr ucțiunea SLEEP, este adusă urmă toarea
instruc țiune (PC + 1 este pre -fetched)
Pentru trezirea dispozitivulu i printr -un eveniment de întrerupere,
întrerup erea corespunzatoare este setată . Trezirea se face funcție de
starea bitului GIE . Dacă bitul GIE este șters dispozitivul î și continu ă
execu ția de la instruc țiunea de dup ă SLEEP , dacă nu se execut ă
instruc țiunea de după SLEEP și apoi se sare la adreasa de întreruperi
0004h . Dacă întreruperea s -a produs înainte de SLEEP, SLEEP se
execut ă ca NOP .

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
106
Când se pro duce RESET la PIC16F84
Un RESET poate fi generat de una din următoarele surse:
-la conectarea tensiunii de alimentare, POR Power On Reset;
-un RESET extern /MCLR pe pinul GP3;
-un RESET când circuitul este în mod SLEEP pe /MCLR;
-de la ceasul de gardă în operare normală;
-de la ceasul de gardă în mod SLEEP;
-trezirea din mod SLEEP prin schimbarea stării unui pin extern.
Identificarea sursei de RESET se face prin pozi ționarea unor bi ți în
registrul de stare, registru al cărui con ținut nu se modifică prin RES ET.

Fig. 4.6. Schema bloc a surselor de RESET pentru PIC 16F84 [9]

Starea bi ților și pinilor după RESET se vor vedea din catalog.

4.3.2. Dispozitivul de modulare a impulsurilot (PWM)
Comanda motoarelor se realizează foarte simplu cu ajutorul
microcon trolerelor. Perioada de rota ție este stabilită prin program de

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
107
către utilizator. Perifericul din interiorul microcontrolerului care
realizează această func ție este PWM, dispozitiv de modulare a
impulsurilor în durată . Acesta este un dispozitiv de numărare, semnalul
PWM fiind un semnal periodic la care se poate modifica în mod
controlat factorul de umplere (Fig. 4.7.) . Modulele temporizatoare au
resursele necesare generării unui semnal cu factor de umplere variabil .

PWM este impulsul de modulare care ajută la controlul tensiunii de
ieșire prin varia ția factorului de umplere.

Fig. 4.7. Factorul de umplere a unui semnal de perioadă T1

Fig.4.8. Schema bloc generală a unui dispozitiv de modulare a
impulsurilor în durată

Pentru calcului factorului de umpl ere se folosesc următoarele nota ții:
T2 este timpul in care iesirea este pe 1 logic

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
108
T1 este suma dintre cele doua de mai sus
Factorul de umplere este F=T2/T1
Tensiunea de ie șire variază după rela ția Uieșire=FxU intrare
Registrul de prescalare generează cea sul pentru un numărător,
ceasul fiind programabit. Con ținutul numărătorului este comparat cu cel
al registrului PWM. Cât timp rezultatul compara ției este mai mic sau
egal, se va genera un unu logic la ie șirea PWM, dacă rezultatul
compara ției este mai mare, se va genera la ie șirea PWM un zero logic.
Dacă registrele comparate sunt de opt bi ți factorul de umplere poate fi
între 1/256 și 1. Un canal PWM odată programat va genera la ie șire
semnalul periodic continuu, fără interven ția unită ții centrale.

Exemplu de dispozitiv PWM la microcontrolerul 80552
Microcontrolerul 80C552 are două blocuri de generare a
impulsurilor modula te în durată și doi pini de ie șire /PWM0 și /PWM1 .

Fig. 4.9. Schema bloc a dispozitivului de modulare a impulsurilor la
80552 [13]

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
109
Registrele PWM0 și 1 con țin valori prestabilite, atâta timp cât valorile
impulsurilor numără toarelor sunt mai mici decât valorile prestabilite se
generează 0 logic la ie șire. Ecua ția prin care se stabile ște frecven ța de
repeti ție a semnalelor este:

fPWM=fosc/2*(1+PWMP)*255

Raportul dintre partea de semnal care este pe 0 logic și cea care este
pe 1 logic este de forma :

Nivel coborât /nivel înalt= PWM/(255 -PWM)

Exemplu de r ealizare a unei secven țe de program de generare a
impulsurilor modulate în durată, pe ntru 8051. S e folose ște
temporizatorul 0 ca bloc PWM care este programat să lucreze în
întrerupere. Pentru stabilirea factorului de umplere se folosesc registrele
de numărare TH0 și TL0 cu reîncărcare.

//Variabile globale
#define PWMPIN P1_0 /*se define ște pinul 0 a portului 1 ca pin de PWM

void pwm_init ial(){
TMOD = 0;
pwm_ factor= 160;
EA = 1;
ET0 = 1;
TR0 = 1;
}

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
110

void timer0() interrupt 1 { /*temporizator 0 lucrează în întreruperi
if(!F0) {
F0 = 1; // Start impuls pe 1 logic
PWMPIN = 1; //setare pin P1.0 ca PWM
TH0 = pwm_ factor; //încărcare registrul TH0
TF0 = 0; ștergere bit TF0 de întreruperi
return; //Return
}
else { // nivel 0 logic
F0 = 0; // ștergere bit F0
PWMPIN = 0; //Pin P1.0 pe 0
TH0 = 255 – pwm_fact or; //încărcare TH0
TF0 = 0; șterge bit întrerupere
return; //return
}

Alte dispozitive de numărare pot lucra în:
– Modul captură – la apari ția unui front pozitiv și/sau negativ la pinul
asociat acestuia, va captura valoarea numărătorului în registre alocate
acestuia (simultan se generează și o întrerupere)
– Modului temporizator comparator – va genera o întrerupere când
conținutul numărătorului este egal cu al registrelor de captură asociate.
Fiecare modul de numărare poate fi programat să genereze impulsuri
modulate în durată, frecven ța lor depinzând de sursa de numărare.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
111
Capitolul 5

COMUNICAREA SERIALĂ

Comunicarea microcontrolerelor cu mediul extern se realizează
serial, para lel, prin wi -fi, USB, et c. Modul de comunicare fără fir
folose ște de fapt tot dispozitivele de comunicare serial asincronă
(UART). Metodele de comunicare serială sunt asincrone prin portul
serial (UART) și sincron prin interfe țe seriale la căre sunt conectate
diverse dispozitive pentru a lucra în modul Master -Slave. În acest
capitol se prezintă metodele de comunicare serială la microcontrolerele
8051 și PIC 16F84 cu referire la alte tipuri de microcontrolere din
aceea și familie dacă acestea nu sunt prevăzute cu astfel de dispozitiv e
în arhitectură.
Magistralele seriale pot fi clasificate dup ă mai multe criterii :
– După modul de sincronizare :
– transfer sincron – se utilizează un semnal explicit de ceas
pentru specificarea momentului în care un bit de dată este valid
– trans fer asincron – nu se utilizează semnal de ceas
– După lungimea blocului de date transmis :
– transfer pe octet
– transfer pe bloc de octe ți
– După numarul de unită ți comunicante :
– transfer serial între două dispozitive
– transfer serial între mai multe dispozitive
– După direc ția de transfer

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
112
– transfer unidirec țional
– transfer bidirec țional

5.1. Portul serial la microcontrolerele CISC și RISC
5.1.1. Portul serial (UART) la microcontrolerul 8051
Unul din avantajele microcontrolerului 8051 este portul serial
(UART ) integrat – transmisia duplex . Pentru transmiterea/primirea
datelor este suficient de selectat prin program portul serial și rata de
comunicare între microcontroler ș i PC. Datele sunt primite/trimise î n
registrul SBUF . Pinii de transmisie respectiv recep ție sunt TxD și RxD
care sunt configura ți ca ie șire respectiv intrare [3,4].
Bufferul de date seriale. Bufferul de date seriale este format în
realitate din două registre separate, un transmi țător și un receptor. Când
data este transferată în SBUF, ea merge în registrul transmi țător și este
păstrată pentru transmisia serială. Când data este transferată din SBUF,
ea provine de la receptor.

Figura 5 .1. Reprezentarea registrului SBUF utilizat pentru salvarea
datelor

Inițializarea portului serial se realizează prin soft ut ilizând bi ții
registrului SCON. La ini țializare se stabilesc: modul de lucru, numărul
de bi ți utiliza ți în transmiterea datelor, paritatea.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
113

Figura 5 .2. Reprezentarea registrulu i SCON utilizat la ini țializare UART

Detalierea func țiilor îndeplinite de bi ții care compun registrul
SCON
A) Programarea modului serial cu bi ții SM0 și SM1

SM0 SM1 Mod
0 0 Mod 0
0 1 Mod 1
1 0 Mod 2
1 1 Mod 3

B) Stabilirea numărului de bi ți utiliza ți în compunerea pachet ului de date
transmise:
SM2 – activarea modului de lucru multiprocesor în modurile 2 și 3,
prin transmisia bitului special 9;
REN – activare/ dezactivare recep ție;
TB8 – transmisie bit paritate utilizat în modurile de lucru 2 și 3;
RB8 – recep ție bit de pa ritate utilizat în modurile de lucru 2 și 3;
TI – indicator de întrerupere a transmisiei;
RI – indicator de întrerupere a recep ției.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
114
Tabelul 5 .1. Reprezentarea modurilor de comunicare în func ție de
numărul de bi ți și viteza de transmisie
SM0 SM1 Mod Descriere Baud Rate
0 0 0 Registru de deplasare pe 8 bi ți 1/12 fosc
0 1 1 Pachet de date pe 8 -biți Determinat de
Timer 1
1 0 2 Pachet de date pe 9 -biți 1/32 fosc
(1/64 fosc)
1 1 3 Pachet de date pe 9 -biți Determinat de
Timer 1

Modul 0 – datele serial e sunt transferate în ambele sensuri prin pinii
RXD și TXD. Rata transferului este 1/12 din frecven ța de oscila ție.
Transmisia începe cu cel mai pu țin semnificativ bit (LSB) și se
realizează pe 8 bi ți.

Mode 1 – transmisie asincronă, pe 10 bi ți, se transmi t date prin TXD, se
recep ționează prin RXD în formatul 1 bit de S tart, 8 bi ți de date, 1 bit de
Stop, cu rata de transfer programabilă folosind Numărător/Temporizator
1.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
115

Fig. 5.3 . Stabilirea ratei de transfer la Modul 2 și 3

Mode 2 – ca modul 1, dar se transmite și un al 9 -lea bit de date care
poate fi bitul de paritate. Rata de transfer este egală cu frecven ța
oscilatorului divizată cu 32 sau cu 64 , func ție de starea bitului SMOD
(Fig.5.3 ). Diagrama de comunicare este 1 bit Start, 8 bi ți date, 1 bit de
paritate (RB8, TB8) și 1 bit de Stop.
Mode 3 este la fel ca modul 2, diferă rata de comunicare.
Rata de transmisie (Baud Rate ). Defini ție. Reprezintă numărul de
transmisii/recep ții pe secundă. În cazul în care este utilizat UART -ul,
rata de transmisi e depinde de: modul de lucru selectat, frecven ța
oscilatorului, starea registrului SMOD selectat din registrul SCON.
Formulele neces are sunt prezentate în Tabelul 5 .2.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
116
Tabelul 5. 2. Modul de selec ție a ratei de comunicare
Modul de lucru Baud Rate BitSM O
D
Mod 0 Fosc. / 12
Mod 1 2^SMOD/32* Fosc/ 12* (256 -TH1) BitSMO
D
Mod 2 Fosc. / 32, Fosc. / 64 1,0
Mod 3 2^SMOD/32* Fosc/ 12* (256 -TH1)

Timer 1 este utilizat ca generator de baud rate deoarece se pot modifica
ușor valorile ratei de transmisie. Pro cedura este simpla:
 Timer 1 – se setează pe modul întreruperi;
 Timer 1 – va lucra în modul cu reîncărcare
 Valoarea de reîncărcare depinde de rata de transfer cerută și
de frecven ța de oscila ție, se pot folosi valorile standard din
Tabelul 4.3. Valoarea de reîncărcare se scrie în TH1.

Tabelul 5 .3. Valoarea de încărcată în TH 1 pentru rata de transfer
Baud
Rate Fosc. (MHz) Bit
SM
OD 11.0592 12 14.7456 16 20
150 40 h 30 h 00 h 0
300 A0 h 98 h 80 h 75 h 52 h 0
600 D0 h CC h C0 h BB h A9 h 0
1200 E8 h E6 h E0 h DE h D5 h 0
2400 F4 h F3 h F0 h EF h EA h 0
4800 F3 h EF h EF h 1

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
117
4800 FA h F8 h F5 h 0
9600 FD h FC h 0
9600 F5 h 1
19200 FD h FC h 1
38400 FE h 1
76800 FF h 1

Terminarea transmisiei/recep ției la p ortul serial se poate verifica în
modul pooling sau în întreruperi. În primul mod se a șteaptă în buclă
transmiterea/receptionarea datelor, iar în modul întreruperi se continuă
programul principal până când s -a terminat transferul. Pentru lucrul în
întreruperi se select ează bitul EA, de întreruperi generale, și bitul ES de
întrerupere a portului serial (registrul IE). În momentul în care portul
serial cere o întrerupere se sare la adresa 23h. Întreruperea este
validată când RI sau TI sunt seta ți pe 1 logic. Ace știa vor f i reseta ți, soft,
în rutina de întrerupere. Pentru selectarea nivelului de prioritate a
întreruperii generate de portul serial se selectează bitul PS din registrul
IP.

Comunicarea cu calculatorul
Portul serial comunică cu calculatorul prin intermediul unu i convertor de
curent continuu care are rolul de a adapta tensiunea de 5 V care indică
1 logic la microcontroler cu cea de 12 V de la calculator.

• Semnalul 1 logic la 8051 este la 5V
• Semnalul 1 logic la calculator este de 12V
• Adaptarea semnalelor se real izează cu circuitul Max232

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
118

Fig. 5. 4. Circuitul de conversie c.c – c.c. Max232 [15]

Fig 5. 5. Formele de undă convertite

Pașii de programare a portului serial la 8051 pentru transmisia unui
caracter serial
1. regsitrul TMOD se încarcă cu valoarea 20H, indicând utilizarea
temporizatorului 1 în mod 2 (8 -bit auto -încărcare) pentru a stabili rata de
transmisie
2. registrul TH1 este încărcat cu valoarea din table, func ți de rata de
transmisie dorită
3. registrul SCON este încărcat cu valoarea 50H care repre zintă Mod 1
de lucru a portului serial
4. TR1 este setat în 1 logic pentru pornirea temporizatorului
5. bitul TI este șters soft

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
119
6. registrul SBUF este încărcat cu valoarea care reprezintă codul ASCII
al caracterului transmis
7. bitul TI este testat prin pooling pentru a afla când s -a terminat
transmisia
8. pentru a transfera un alt caracter se sare la pasul 5

 Exemplu de program care urmează pașii descri și mai sus

Program scris în asamblor
MOV TMOD,#20H ;temporizator 1 în mod 2
MOV TH1,# -6 ; rata de t ransmisie 4800
MOV SCON,#50H ;transmisie pe 8 bi ți, 1 bit de stop și validare REN
SETB TR1 ;start temporizator 1
x: MOV SBUF,#”A” ;cod ASCII litera A
stai: JNB TI, stai ;test bit TI
CLR TI ; ștergere TI pentru o nouă transmisier
SJMP x;salt pentru o nouă tr ansmisie

Acela și program de mai sus realizat în C
#include <reg51.h>
void main(void){
TMOD=0x20; // Temporizator 1, mod 2
TH1=0xFA; //4800 rata
SCON=0x50;
TR1=1;
while (1) {
SBUF=‘A’; //încărcare
while (TI==0);//test TI

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
120
TI=0;
}
}

 Exemplu de program sc ris în asamblor pentru lucurl în întreruperi al
portului serial

 Să se transmită în mod repetat caracterul “a” pe portul serial. Rata
de comunicare este de 9600bauds iar UART -ul lucrează în modul 1.
Frecven ța de lucru este de 11,0592MHz. Se va utiliza Tempor izatorul 1
pentru generarea semnalului de tact. Portul serial va lucra în întreruperi.

Org0
Jmp Start
Org 0023h ; adresa vectorului de întrerupere a portului serial
JMP serial
;******************************************************
;Inițializare trans misie
; ******************************************************
Start: MOV TMOD,#20h
MOV TH1,#0FDh
SETB TR1
MOV SCON, #50h
SETB EA
SETB ES
;******************************************************
;transmisie caracter “a”
;****************************** ************************

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
121
MOV SBUF,#´a´
JMP $
;******************************************************
;Subrutina de întreruperi
;******************************************************
serial: JNB TI,init
CLR TI
MOV SBUF,`a`
init: RETI
END

 Să se scrie un program în C pent ru tranmiterea mesajului DA,
folosind func ții de transmisie , portul serial nu va lucra în întreruperi .
Rata de transfer va fi stabilită la 9600 baud pe 8 -biți de date, 1 bit stop,
transmisia se va realiza continuu.

#include <reg51.h>
void SerTr (unsigned char);
void main(void)
{
TMOD=0x20; // Temporizator, mod 2
TH1=0xFD; //9600 baud
SCON=0x50;
TR1=1; //start temporizator
while (1) {
SerT r(‘D’);
SerTr (‘A’);

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
122
}
}
void SerT r(unsigned char x){
SBUF=x; // salvar ea valorii în registrul SBUF
while ( TI==0); //a șteaptă tran smisia
TI=0;
}

5.1.2. Portul seri al la microcontrolerul PIC 16F877
Microcontrolerul PIC16F84 nu are încorporat port serial de aceea se
va prezen ta acest dispozitiv la PIC16F877 . Microcontrolerul PIC16F8 77
este mai evoluat decât cel amintit mai sus având patru bancuri de
memorie a câte 128 loca ții și implicit mai multe registre în zona de
regsistre cu func ții speciale.
Portul seria l de la microcontrolerul PIC 16F 877 poate fi sincron sau
asincron. Poate lucra pe 8 sau 9 bi ți de date și poate fi configurat să
lucreze în trei moduri :
1) As incron (bidirec țional )
2) Sincron ca Master ( unidirec țional )
3) Sincron ca Slave ( unidirec țional )
Registrele utilizate în programarea acestui periferic sunt:
– Regis trul TXSTA – controlează starea transmisiei
– Registrul RCSTA – controlează starea recep ției
– Datele ce urmează a fi transmise sunt încărcate în registrul
TXREG iar cele care sunt recep ționate în RCREG.
– Registrul SPBRG este utilizat în alegerea ratei de tr ansmisie.
Portul serial în cazul acestui microcontroler poate lucra și în întreruperi.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
123
Modul de lucru asincron
Pinii utiliza ți pentru transmisie respectiv recep ția datelor sunt TX
(RC6) și RX ( RC7) din portul TRISC care trebuie configura ți ca ie șire
respective intrare. Validarea portului serial să lucreze în modul asincron
se realizează prin setarea bitului SPEN din registrul RCSTA și resetarea
bitului SYNC din registrul TXSTA. Modul de lucru pe 8 sau 9 bi ți este
dat de bitul TX9 din TXSTA respectiv RX9 din RCSTA. Când ace știa
sunt în 1 logic, se va lucra pe 9 bi ți când sunt pe 0 logic pe 8 bi ți.
Rata de transfer se poate stabili în două moduri, microcontrolerul având
două viteze de lucru una de viteză mare și alta scăzută. Valoarea dorită
(X) se introduc e în registrul SPBRG confrom cu formulele :

Baud Rate _viteză_mică = Fosc / (64 * (X + 1))
Baud Rate _viteză_mare = Fosc / (16 * (X + 1)).

Tipul de viteză se alege selectând bitul BRGH din registrul TXSTA.
Când este setat se lucrează pe viteză mare când nu , pe viteză mic ă.
Selectarea vitezei de lucru este arbitrar ă deoarece trebuie o bună
aproxima ție a valorilor dorite (Anexa 2) .

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
124

Fig. 5.6 . Schema portului serial de transmisie asincronă la PIC 16F877
(redesenat după [10])

Recep ția este validată prin set area bitului CREN din registrul RCSTA
(Fig.5.7 .). Modul de comunicare a datelor în modul asincron este LIFO,
cu secven ța de forma Start, data, Stop și cu bi ți de paritate generate
intern. Transmisia este validate prin setarea bitului TXEN din TXSTA
(Fig 5 .6.).

Fig. 5.7 . Schema bloc de recep ție a datelor pe portul serial asincron l a
PIC 16F877 (redesenat după [10] )

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
125
Data ce urmează a fi transmisă este scrisă în TXREG. Dacă se lucrează
pe 9 bi ți mai întâi este setat bitul de date TX9D și apoi se scrie o a ltă
parte în TXREG. Portul asincron poate lucra în întreruperi fiind prevă zut
cu bit de întrerupere la transmisie TXIF care este setat când registrul
TXREG este gol și așteaptă o nouă dată. Acesta nu poate fi resetat prin
program, el se resetează doar prin scrierea unei noi date în registrul
TXREG. El poate fi dezactivat doar prin dezactivarea bitului de
întreruperi la transmisie TXIE. Acela și procedeu este și la recep ție, bi ții
pentru întreruperi sunt RCIE pentru setarea întreruperii la recep ție și
bitul RCIF , din RCREG, setat cînd se recep ționează o nouă dată. Când
este setat modul de recep ție pe 9 bi ți mai întâi este citit bitul RX9D din
RCSTA și apoi RCREG. O altă caracteristică a lucrului pe 9 bi ți este
detectarea automată a adres ei utilizat ă în operar ea mai multor
dispozitive când adresa este pe 9 bi ți. Selectarea acestui mod de
operare se realizează prin setarea bitului ADDEN din RCSTA și a bitului
RCIE.
Portul este oprit când unitatea centrală intră în modul SLEEP. Pot
apare două tipuri de erori la recepți e. Una este de suprapunere a
datelor în mome ntul în care registrul RCREG nu a fost descărcat înainte
de a primi o altă dată, astfel că bitul OERR și CREN sunt setați. Dacă
se întâmplă acest lucru a treia dată este pi erdută. Acest lucru se poate
corecta printr -o nouă transmisie după ce bitul OERR și CREN este
șters prin program. Al doilea tip de eroare este o eroare de bloc
“Framing Error” indicată prin setarea bitului FERR” dacă un octet de
date este recep ționat când un bit de Stop ilegal indică fap tul că data
este ilegală. Acest tip de eroare nu invalidează procesul de recep ție și
nu necesită ștergere.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
126

Fig. 5.8 . Schema bloc a portului serial, func ția de detectarea adresei la
PIC16F877 (redesenat după [10])

Registrele utilizate cu bi ții dedica ți pentru programarea portului serial la
PIC16F877 sunt :

Registrul TXSTA de la adresa 98h
CSRC TX9 TXEN SYNC – BRGH TRMT TX9D

Registrul RCSTA de la adresa 18h
SPEN RX9 SREN CREN ADDEN FERR OERR RX9D

Registrul PIE 1 de la adresa 8Ch pentru programarea în treruperilor
PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

Registrul PIR1 de la adresa 8Ch pentru programarea întreruperilor

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
127
PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF

Toate regsitrele din memoria cu func ții special la PIC16F877 sunt
prezentate, conform datelor de catalog, în Anexa 3.

Modul de lucru sincron în mod Master
Ambele moduri de lucru sincrone, Master sau Slave, lucrează
unidirectional, datele neputând fi transmise sau recep ționate în acela ți
timp. Diferen ța dintre cele două moduri Slav e și Master este cine
generează impulsurile de ceas pentru sincronizare. În mod Master
acestea sunt generate de microcontroler iar în mod Slave
microcontrolerul le prime ște din exterior.Există multe asemănări între
cele două moduri de lucru sincrone, astfe l că se vor specifica doar
deosebirile dintre ele.
Generatoru l ratei de transmisie lucrează după un model și o formula
diferită de mo dul asincron. Bitul BRGH care influen țează viteza de lucru
nu mai este utilizat aici.
Rata de transfer este stabilită cu formula :

Rata = Fosc / (4 * (X + 1))

Unde X este valoarea scrisă în SPBRG, permi țând stabilirea unei viteze
mai ma ri de transfer.
Impulsurile de ceas sunt transmise pe pinul RC6 (CK) iar datele sunt
transmise pe pinul RC7 (DT).
În acest mod nu se poate ut iliza modul de detec ție a adresei, iar în
modul SLEEP portul este oprit.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
128
Pentru a ini țializa portul să lucreze în acet mod trebuie ca bi ții SYNC și
CSRC să fie seta ți. Bitul TXEN și CREN nu trebuie seta ți în acela și timp
deoarece modul de transmisie este unidirectional. La transmisie
TXEN= 1 și CREN=0 iar la recep ție TXEN =0 și CREN=1.

Modul de lucru sincron în mod SLAVE
În acest mod nu este necesar să fie ini țializat registrul SPBRG
deoarece nu se generează impuls de ceas. Ambii pini ai Portului C, RC6
și RC7, trebuie ini țializa ți ca intrări folosind TRISC. Pentru a se selecta
acest mod de lucru bitul CSRC trebuie șters. Opțiunea de rec epție a
unui singur octet este dezactivată. Lucrul în acest mod poate trezi
unitatea centrală din modul SLEEP.

Func ții C u tilizate în programarea USART -ului sunt:
Getc()
Putc()
Fgetc()
Puts()
Fgets()
Fputs()
Printf()
Kbhit()
Fprintf()
Set_uart_speed()
Assert()
Getchar()
Putchar()
Setup_uart()

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
129

Programe în C a portul ui USART la PIC16F877
 Se programez ă portul USART în mod asinc ron și se tran smite și
recep ționez ă date cu viteza de 1,2 KBauds .

Void main (void)
{
TRISB=0// PORT B intrare
PORTB=0 x0// transmisie la ie șiere
SBRG=51//valoare rata transfer din tabel
TXTA= 0x22 // inițializare transmisie
RCSTA=0 x90// inițializare pentru r ecep ție
TXREG=0x0//val oare pentru tran smisia informa ției
do
{
TEREG++// incremetare registru tampon
While ( !TRMT)// testare bit pentru ca data să fie pregătită
While (!RCIF)// test recep ție data
PORTB=RCREG// data recep ționată e transmisă în PORT B
}
While(1);
}

 Rutină în asamblor de transmisie date
–– Data este în (W) ––––––––
MOVWF TXREG ; trimite data

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
130
WAIT:
BTFSS PIR1,TXIF ; pooling
GOTO WAIT

 Rutină în asamblor de ini țializare USART să lucreze în întreruperi
MOVLW 0x80; USART pe 8 -Bit
MOVWF RCSTA ;
BANKSEL TRISC ; selec ție Bank 1
BCF TRISC,6 ; RC6 = ie șire
BSF TRISC,7 ; RC7 = Intrare
MOVLW D’12’ ; Setare Rată = 19200
MOVWF TXSTA
BSF PIE1,RCIE ; ini țializare întreruperi
BANKSEL PORTC ; Bancul 0
BSF INTCON,PEIE ; validare întreruper i periferic
BSF INTCON,GIE ; validare întreruperi globale
BSF RCSTA,CREN ;
BSF TXSTA,TXEN ; validare XMTR

Mod de configurare a portului serial la PIC16F877 folosind directiva use

#include <16F877.h >
#include <STDLIB.h>
#use rs232 (baud=19200, xmit=PIN_C6 , rcv=PIN_C7, Parity=N, Bits=8)
#use delay(clock = 19660800)

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
131
5.1.3. Compara ții privind arhitecturi ale portui serial la CISC și RISC
Modul de transmisie este mai evoluat la PIC avînd și posibilitatea de
a transmite sincron. Având în vedere că modul asincron se regăse ște la
amble microcontrolere se observă că la PIC sunt mai multe moduri de
lucru: transmisie pe 8 sau 9 bi ți, având și posibilitatea de detectare a
adresei. Modul de ini țializare este mai complex la PIC tocmai datorită
prezen ței mai multor modu ri de comunicare.
Datele recep ționate sunt transferate într -un registru tampon pentru a nu
se pierde. Tot la PIC există și metode de detec ție a erorilor realizate din
fabrica ție, având bi ți identificatori prevăzu ți pentru aceasta.
Programarea în C este as emănătoare pentru cele două microcontrolere
dar în asamblor programul la PIC este mai mare tocmai datorită setului
redus de instruc țiuni.

5.2. Interfa ța de trasmisie serială la RISC și CISC
Interfa ța de transmisie serială este realizată pentru comunicarea
datelor serială dar sincronă. Aceasta poate fi un port serial sincron
defini tă de firma Motorola SPI (Serial Peripheral Interface) sau o
interfa ță serială bidirec țională I2C dezvoltată de Philips, destinată
aplica țiilor de 8 bi ți, cunoscută și sub numele de TWI (Two Wire
Interface) . Interfa ța SPI realizează t ransmisia datelor pe trei fire iar
interfa ța serială I2C oferă posibilitatea de comunicare folosind două fire
unul pentru transmisia datelor SDA și celălalt pentru semnalul de ceas
SCL. Comunicarea se realizează între microcontroler și dispozitivele
externe cum ar fi memorii EEPROM, FLASH, senzori cu ie șiri digitale,
etc. (Fig. 5.9 .). Astfel că există dispozitive Master și dispozitive Slave
identificate cu ajutorul adreselor.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
132

Fig.5.9 . Conectarea di spozitivelor la liniile magistralei I2C

Interfa ța I2C este o magistrală serială pe două linii, oferind
posibilitatea conectării mai multor dispozitive Slave secundare pe
aceste două linii . Transmisia datelor se bazează pe un protocol simplu
de comunica ții specificate în catalogul fiecărui microcontroler .

5.2.1. Interfa ța serială I2C la microcontrolerul CISC 80552
Având în vedere că microcontrolerul 8051 nu are prevătut port I2C
se va descrie în continuare interfa ța I2C de la 80552 [16]. Cele două linii
de transmisie bidirec ționale sunt SDA și SCL, și sunt conectate la o
sursă de tensiune pozitivă printr -o sursă de curent sau printr -o
rezisten ță de pullup. Starea lor normală este pe 1 logic. Dispozitivele
conectate la I2C trebuie să aibă magistrala pe open drain sau open –
collector pentru a realiza func ția șI (AND) cablat (Fig.5.11 .).
Viteza de comunicare cu care sunt transferate datele pe I2C poate
varia de la 100Kbit/s, în modul rapid , sau până la 3.4Mbit/s în modul
foarte rapid. Fiecare dispozitiv conect at este recunoscut de o adresă
unică și poate opera ca dispozitiv receptor cât și emi țător. Linia SDA
respectiv SCL facilit ează detectarea col eziunilor, sincronizarea

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
133
semnalelor de ceas . Semnalele de ceas sunt întotdeauna generate de
dispozitivul principal , dispozitivele secundare pot ține magistarala în
starea 0 logic adică starea de a șteptare . Mesajele pe care se bazează
protocolul de comunica ție între dispozitive sunt reprezentate de
condi țiile START, STOP și alte condi ții. Emițătorii și/sau receptorii p ot
opera în mod master (dispozitiv principal) sau mod slave (dispozitiv
secundar), aceasta depinde dacă integratul a fost ini țializat de un
transfer de date sau simplu a fost adresat . I2C este o magistrală multi –
master, ceea ce înseamnă că poate controla d e mai multe circuite
integrate cu un Master .

Fig. 5.10 . Conectarea dispozitivelor la liniile SDA și SCL, s e observă
modul de realizare a func ției șI cablat (redesenat după [16])

Pinii dedica ți interfe ței I2C, la 80552 sunt P1.6 (SCL) și P1.7 (SDA) ca re
trebuie să fie inițializa ți pe valoare logică 1 pentru activare . La 80C552
interfa ța I2C este denumită SIO .
Caracteristici ale magistralei I2C la microcontrolerul 80552 (Schema
bloc Anexa 4)

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
134
• Permite vitezele de transfer Fast și High Speed ;
• Patru moduri de lucru: Master Transmitter , Master Receive ,
Slave Transmitter și Slave Receive ;
• Transferul între master și slave este bidirec țional;
• Asigură arbitrare simultană multimaster (fără un master
central), cu mai multe microcontre lere master emițători, fără al terarea
datelor pe magistrală ;
• Permite utilizarea I2C în scop uri de testare și diagnosticare ;
• Interfa ța între microcontro ler și I2C se realizează prin
intermediul a patru registre cu func ții speciale, și anume:
– S1CON – registru l de control, de 7 bi ți utili zat pentru
controlul următoarelor func ții: start și restart al unui transfer, terminarea
unui transfer, rata de transfer, recunoa șterea adreselor și emiterea
semnalului de acceptare (acknowledgment)
– S1STA – este registru l de stare, în structura interfe ței este
un decodor de stare care genereaz ă un cod unic de 5 bi ți pentru fiecare
stare a magistralei . Producătorul define ște 26 de stări în toate cele patru
moduri de lucru ale SIO1 . Fiecare cod de 5 bi ți generează adresa
subrutinei de tratare a întreruperii și este memorat în registrul de stare
S1STA, pe pozi ția celor mai semnificativi 5 bi ți, restul de trei bi ți, cei mai
puțin semnificativi sunt 0 în acest registru. Încărcarea celor 5 bi ți în
S1STA se produce atunci când este setat hardware flag -ul de
întrer upere, și rămâne stabil până când acest flag este resetat
software .
– S1DAT – registru l de date cate con ține cei 8 bi ți ce urmează
a fi transfera ți
– S1ADR – registru pentru memorarea adresei slave -ului pe 7
biți al 8 -lea, bitul CG are rol în recunoa șterea ad resei slave -lui.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
135
Pentru tran sferul de date, trebuie respecta ți pașii:
• Trimisia condi ției de START
• Transferul de date se execută bit cu bit pe durata unui tact de
pe linia SCL , bitul 7 este transmis primul, bitul 0 este transmis ultimul .
Data trebuie să fie stabilă pe toată durata unui puls
• Datele transferate sunt în pachete de 8 bi ți serial. Fiecare grup
de 8 biți este urmat de un bit ACK, care are valoarea 0 logic
• Pentru terminarea transferului este trimisă o condi ție de
STOP pe durata pulsului semnalului de tact (SCL este HIGH)
Pentru programarea interfe ței într -unul din cele patru moduri de lucru
este necesar să fie cunoscute:
• Func țiile fiecărui bit din structura ce lor patru registre din zona
SFR, c ele 26 coduri de stare ale busului, operațiile care tre buie
executate în fiecare din cele 26 stări .

Pachetul de date transferate de la Master către receptor începe cu
adresa Slave -ului, urmat de un număr de octe ți de date. Slave -ul
transmite un bit de confirmare după fiecare octet primit. Pachetul de
date tr ansmis de la Slave la Master începe cu octetul de adresă
transmis de Master. Slave -ul transmi țând un bit de confirmare și apoi
datele cerute de Master. În acest caz Master -ul trimite bit de confirmare
după fiecare octet pri mit. La sfâr șitul recep ționării octetului returnează
un “not acknowledge”

• Mod de lucru Master Transmitter : Un master transmite un
număr de octe ți unui slave receptor
• Mod de lucru Master Receiver : Un master recep ționează un
număr de octe ți de la un slave emițător

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
136
• Mod de lucru Slave Rece iver: Un slave recep ționează un
număr de octe ți de la un master emițător
• Mod de lucru Slave Transmitter : Un slave trimite un număr de
octeți către un master receptor

Exemplul unui pachet de date recep ționate de către Master

Exemplul unui pachet de date trimise de către Master

Coloanele ha șurate sunt date transmise de Master către Slave

Fig.5.1 1. Configurarea intrare/ie șire serial [17]

Rata de transfer a datelor se stabi lește conform setărilor bi ților CR2,
CR1, CR0 din registrul S1CON (Tabelul 5.4 .).
Tabelul 5.4 . Stabilirea ratei de transfer START Adresa Citire ACK Data ACK STOP
START Adresa Scriere ACK Data ACK STOP

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
137
CR2 CR1 CR0 Fosc [KHz] Divizor
6MHz 12MHz 16MHz
0 0 0 23 47 63 256
0 0 1 27 54 71 224
0 1 0 31 63 83 192
0 1 1 37 75 100 160
1 0 0 6,25 12,5 17 960
1 0 1 50 100 – 120
1 1 0 100 – – 60
1 1 1 0,25 <62,5 0,5<62,5 0,67<56 96x(256
reîncărcare
temporiz ator
1 mod2 )

Registrele utilizate în func ționarea interfe ței I2C din SFR sunt
prezentate mai jos conform [17 ].

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
138

Fig. 5.13 . Zona SFR la 80552 , registre utilizat e în programarea lui I2C
[17]

Funcționarea în întreruperi a portului se realizează prin setarea bițiilor
EA și ES1 din registrul IEN0. Bitul de stare care indică terminarea
sarcinii este SI din S1CON. Bi ții de Start și Stop sunt STA și STO din
registrul S1CON iar cel de confirmare este AA. Bitul de stare ENS1
validează sau nu portul SIO.

5.2.2. Interfa ța serială la PIC 16F87X
Microcontrolerul PI C16F877 are un port serial master sincron
(MSSP) care poate lucra în unul din modurile interfa ță serială sincronă
(SPI) sau interfa ța serială bidirec țională (I2C).
Interfa ța SPI are la bază un protocol de transmisie serială a datelor
pe trei fire: SDO, SDI și SCK. Acest protocol de transmisie este utilizat

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
139
pentru conectarea microco ntrolerului la carduri de memorii, decodoare
MP3, dispozitive de memorii sau alte aplica ții de viteză. În acest caz nu
este nevoie să fie trimisă adresa dispozitivului, aceasta este importantă
dacă sunt conectate mai multe dispozitive, ceea ce măre ște vite za de
comunicare. Dacă I2C permite conectare a maxim 1024 dispozitive la
SPI nu există o limită. Interfa ța SPI poate lucra în modul Master sau
Slave. Masterul este cel care stabile ște frecven ța de comunicare, la
fiecare impuls de ceas este transmisă sau re cepționată data. SPI este
prevăzută și cu pin de sele cția a dispozitivului (SS), fiecare dispozitiv cu
care comunică este prevăzut cu pini SDI, SDO, Clock și de selec ție
cunoscut ca pin de selc ție Slave. Pinul de selec ție poate fi programat
pentru a fi act iv pe front crescător sau descrescător funcție de cerin ța
dispozitivului conectat la microcontroler. Comunicarea pe SPI este
bidirec țională și recep ționarea și transmisia datelor se poate realiza în
acela și timp (Fig. 5.13).

Fig.5.13 . Modul de conectare a unui dispozitiv la microcontroler folosind
SPI

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
140
Tabelul 5.5. Starea pinilor interfe ței SPI în conexiunea Master -Slave
Pin SPI Stare pini Master Stare pini Slave
SDO (RC5) Ieșire Intrare
SDI (RC4) Intrare Ieșire
SCK (RC3) Ieșire Intrare
SS Ieșire Intrare

Pinii de comunicare sunt seta ți cu registrul TRISC.

Modul de lucru a l interfe ței SPI
La PIC 16F8777, registrele SSPSTAT și SSPCON sunt utilizate să
controleze modulul SPI. Registrul tampon este SSBUF pentru datele de
intrare/ ie șire. Pentru a i nițializa interfa ța serială SPI să lucreze în mod
Master se vor programa bi ții SSPM3 -SSPM0 din registrul SSPCON.

Tabel 5.6 . Programarea modurilor de lucru SPI
SSPM3 SSPM2 SSPM1 SSPM0 Func ția
SPI Frecven ța
0 0 0 0 Master Fosc / 4
0 0 0 1 Master Fosc / 16
0 0 1 0 Master Fosc / 64
0 0 1 1 Master Temporizator2/2
0 1 0 0 Slave

Interfa ța SPI poate fi ini țializată să lucreze în patru moduri diferite
dependente de palierul impulsului de ceas (0 sau 1) pe timpul

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
141
transmisie datei și a front ului crescător sau descrescător pe care se
realizează citirea unei noi date.
Pinul /SS (port A pinul 5) este configurat ca intrare/ie șire digitală din
registrul ADCON1 care se va prezenta la convertorul analog digital.
Polaritatea ceasului (CKP) – determină dacă impulsul de ceas este pe
front crescător sau descrescător în momentul transmiterii datei .
CKP=1 – ceasul va fi pe nivel crescător
CKP=0 – ceasul va fi pe nivel descrescător
Front ul ceasului (CKE) – stabile ște momentul e șantionării date lor, pe
front crescător sau d escrescător de ceas.
CKP = 0, CKE = 0 – Data este citită pe front crescător
CKP = 0, CKE = 1 – Data este citită pe front descrescător
CKP =1, CKE = 0 – Data este citită pe front descrescător
CKP = 1, CKE = 1 – Data este citită pe front crescător
Astfel pot fi considerate 4 moduri func ție de stări le descrise mai sus
(Tabelul 5.7 , Fig. 5.1 4)

Tabelul 5.7 . Moduri de lucru al SPI
MOD CKP CKE
0,0 0 1
0,1 0 0
1,0 1 1
1,1 1 0

Notă : Frecven ța maxima de lucru la PIC este 20MHz și ceasul de 5MHz

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
142

Fig. 5.14. Se prezintă sensul semnalelor când SPI lucrează pe mod
Master și Slave

Fig. 5.1 5. Modul Master, prezentarea diagramei semnalelor (copiat din
[19])

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
143

Fig.5.16 . Modul Slave, diagram semnalelor pentru CKE=0 și CKE=1 (din
[19])

Fig. 5.1 7. Schema bloc a interfe ței seriale SPI la PIC 16F877 (redesenat
după [19 ])

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
144

Datele sunt transmise mai întâi în registrul tampon SSPSR și apoi
salvate în SSPBUF. Deci există o dublă buferare ceea ce duce la o mai
bună păstrare a datelor. Pot apare erori de su prapunere a datelor la
primire, când vechile valori nu sunt copiate în registrul SSPBUF în
momentul în care se recep ționează altele.
Dacă microcontrolerul este în modul SLEEP, interfa ța poate primi sau
transmite date dacă este programată să lucreze în modu l Slave.
Bitul SSPIF este setat când se termină sarcina de citire/scriere din/în
registrul tampon.
Registre folosite în programarea interfe ței SPI sunt:
INTCON – registrul de întreruperi prezentat în Tabelul 3.5. (bi ții GIE,
PEIE sunt folosi ți pentru progr amarea dispozitivului SPI să lucreze în
întreruperi)
PIR1 – este registru ce con ține bi ții de semnalizare a întreruperilor. În
cazul de fa ță este folosit bitul SSPIF (vezi sec țiunea Portul Serial la PIC
16F877 sec ținea 5.1.2)
SSPBUF – registru tampon de tr ansmisie/recep ție a datelor
SSPCON – registru pentru programarea dispozitivului SPI
SSPSTAT – arată starea transferului de date, această informa ție este
dată prin detectarea bi ților de ST ART sau STOP, specifie că dacă
octetul recep ționat a fost de date sau adresă, dacă următorul octet este
de adresă pe 10 bi ți și dacă transferul este de scriere sau citire a unui
date.
SSPSR – registru l de deplasare al datelor în sau de la dispozitiv (nu este
accesibil direct)

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
145
SSPBUF și SSPSR crează o dublă buferare la recep ție, acesta permite
recep ționarea următorului octet înainte de a fi citit vechiul octet. După
transferul complet al octetului în SSPBUF, bitul SSPIF este setat.

Desc riea registrului SPPSTAT
R/W-0 R/W-0 R-0 R-0 R-0 R-0 R-0 R-0
SMP CKE D//A P S R//W UA BF

SMP: bit eșantion
SPI mod Master:
1 = data de intrare e șantiontă la sfâr șitul semnalului de ie șiere a datei
0 = data de intrare e șantionată la mijlocul semnalului de ie șire a datei
SPI mod Slave:
SMP trebuie șters când SPI este utilizat în mod Slave
În I2C mod Master sau Slave:
1 = dezactivarea controlului Slew rate pentru modul de viteză standard
(100 kHz și 1 MHz)
0 = activarea controlului slew rate fontru modul viteza mare (400 kHz)
CKE : selec ție front ceas pentru SPI (Tabelul 5.7 )
mod SPI:
pentru CKP = 0
1 = transmisie date pe front crescător al SCK
0 = transmisie date pe front descrescător al SCK
Pentru CKP = 1
1 = transmisie date pe front descrescător al SCK
0 = transmisie date pe front crescător al SCK
În modul I2C Master sau Slave :
1 = nivele de intrare conform pe SMBus spec

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
146
0 = nivele de intrare conform I2C specs
D/A: bit de Data/Ad resă (doar în mod I2C mode )
1 = Indic ă faptul că ultimul octet transmis/recep ționat a fost de date
0 = Indică faptul că ultimul octet transmis/recep ționat a fost de adresă
P: bit STOP ( doar mod I2C. Bit șters cînd dispozitivul MSSP este
dezactivat , SSPEN e ste șters)
1 = Indică că ultimul bit detectat a fost STOP (acest bit e ste ’0’ pe
RESET)
0 = ultimul bit detectat nu este STOP
S: bit START doar mod I2C. Bit șters cînd dispozitivul MSSP este
dezactivat, SSPEN este șters
1 = Indică că ultimul bit detectat a fost START (acest bit este ’0’ pe
RESET)
0 = ultimul bit detectat nu este START
R/W: bit de citire/scriere a informa ției (doar în I2C)
Acest bit păstrează infor mația bitului R/W urmând ultima adresă egală.
Acest bit este valid doar de la egalitatea adresei la următorul bit de
START, STOP sau de ne garea bitului ACK.
În modul I2C Slave:
1 = citire
0 = scriere
În mod I2C Master:
1 = Transmisia este î n progres
0 = Transmisia nu este în progres
Dacă MSSP este în modul repaos este indicate de SAU logic dintre
aces t bit și cu bi ții SEN, RSEN, PEN, RCEN, sau ACKEN.
UA: actualizare a dresă (doar pe 10 -biți mod I2C)
1 = indică actualizarea adresei din registrul SSPADD

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
147
0 = nu este nevoie ca adresă să fie actualizată
BF: bit care indică faptul că registrul tampon este plin
Rece pție (în mod SPI și I2C):
1 = recep ționare completă SSPBUF este plin
0 = recep ționare incomplete , SSPBUF este gol
Transmisie (doar în mod I2C):
1 = Transmisie în lucru (nu sunt inclu și biții ACK și STOP ), SSPBUF plin
0 =Data transmisă complet (nu sunt inclu și biții ACK și STOP), SSPBUF
gol
Descrierea registrului SSPCON
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0

WCOL – bit de dete cție a erorii în caz de suprapunere
Mod Master:
1 = scriere în SSPBUF când condi ția I2C conditions nu este validă
0 = nu este coliziune
Mod Slave:
1 = scriere în SSPBUF când transmite încă vechea data ( șters soft)
condi ția I2C nu este validă
0 = nu este coliziune
SSPOV : bit de indicare a suprapunerii la recep ție
Mod SPI:
1 = o nouă dată este recep ționată cînd SSPBUF are încă data veche .
Data din SSPSR este pierdută prin suprapunere.
Modul Slave – utilizatorul trebuie să cite ască S SPBUF, chiar dacă doar
data transmisă permite suprapunerea. Î n mod Master , bitul de

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
148
suprapunere nu este setat, până când fiecare opera ție este ini țializată
de scrierea în registrul SSPBUF. (Trebuie șters soft)
0 = N u este suprapunere.
În mod I2 C:
1 = un octet este recep ționat în timp ce SSPBUF este încărcat încă cu
octetul trecut.
SSPOV este pe stare de "nepăsare " în modul Transmi sie. (trebuie
șters soft)
0 = Nu este suprapunere.
SSPEN = bit de validare a portului serial sincron
În mod SPI, când este validat, ace ști pini trebuie să fie configura ți ca
intrări sau ie șiri
1 = validează portul serial și configurează SCK, SDO, SDI, și SS ca pini
ai portului serial
0 = D ezactivează portul serial și configurează pinii ca intrări/ie șiri
În mod I2C, când este validat, ace ști pini trebuie să fie configura ți ca
intrări sau ie șiri
1 = validează portul serial și configurează SDA, și SCL ca pini ai portului
serial
0 = Dezactivează portul serial și configurează pinii ca intrări/ie șiri
CKP : bit selec ție polarit atea ceasului
În mod SPI,
1 = starea de repaos pentru ceas este pe nivel înalt
0 = starea de repaos pentru ceas este pe nivel jos
În mod I2 C Slave,
SCK eliberează control ul
1 = validare ceas

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
149
0 = menține ceasul pe nivel scăzut (clock stretch), (folosit s ă asigure
timpul de setare a datei )
În mod I2 C Master,
Nu este folosit în acest mod

bit 3 -0 SSPM3:SSPM0: bit de selec ție a modului de lucru a portului
serial sincron

SSPM3 SSPM2 SSPM1 SSPM0 Func ție
Frecven ța
Mod SPI
0 0 0 0 Master Fosc /
4
0 0 0 1 Master Fosc /
16
0 0 1 0 Master Fosc /
64
0 0 1 1 Master , Temporizator2/2
0 1 0 0 Slave, pin SCK –ceas, SS
valid
0 1 0 1 Slave, pin SCK –ceas,SS
invalid
Mod I2C
0 1 1 0 Slave, adresa pe 7 bi ți
0 1 1 1 Slave, adresa pe 10 bi ți
1 0 0 0 Master , clock =
FOSC/(4* (SSPADD+1))

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
150
1 0 1 1 Master, (Slave repaos)
1 1 1 0 Master, adresa pe 7 bi ți cu
biți valizi de START, STOP
și întreruperi
1 1 1 1 Master, adresa pe 10 bi ți
cu bi ți valizi de START,
STOP și întreruperi
1001, 1010, 1100, 1101 = Rezervat

Descrierea registrului SSPCON2 utilizat la programarea portului I2C

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN

GCEN : bit de valid are a apelurilor generale (Doar în modul I2C Slave)
1 = validare întrerupere când o adresă generală (0000h) este
recep ționată în SSPSR
0 = adresa generală este invalidă
ACKSTAT : bit de confirmare stare (doar în mod I2C Master)
În modul transmisie Master :
1 = Confirmarea nu a fost recep ționată de la slave
0 = Confirmarea a fost recep ționată de la slave
ACKDT : bit de confirmare dată (doar în mod I2C Master)
În mod Master recep ție:
Valoarea va fi transmisă când utilizatorul ini țiază o secven ță de
confirmare la sfâr șitul recep ționării
1 = Nu este confirmare

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
151
0 = confirmare
ACKEN : bit validare confirmare secven ță (doar în mod I2C Master)
În mod Master recep ție:
1 = inițiază o secven ță de confirmare pe pinii SDA și SCL și transmite
bit de data ACKDT. șters automa t hard.
0 = pauză secven ța de confirmare
RCEN : bit de validare recep ție (doar în mod I2C Master)
1 = mod validare recp ție pentru I2C
0 = pauză recep ție
PEN: bit validare condi ție de STOP (doar în mod I2C Master)
SCK eliberează c ontrol:
1 = Ini țiază condi ție de STOP pe pinii SDA și SCL . șters automat hard.
0 = pauză condi ție STOP
RSEN : bit validare a condi ției de START repetat (doar în mod I2C
Master)
1 = Inițiază condi ție de START repetat pe pinii SDA și SCL. șters
automat hard.
0 = pauză condi ție START repetat
SEN: bit validare a condi ției de START (doar în mod I2C Master )
1 = Ini țiază condi ție de START pe pinii SDA și SCL. șters automat hard.
0 = pauză condi ție START

Func ții C aflate în librăria CCS pentru p rogramarea interfe ței SPI
Read_bank() – citire banc de date
Setup_spi() – inițializare SPI
Spi_read() – citire SPI
Spi_write() – scriere SPI
Spi_data_is_in()

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
152

 Exemplu de utilizare a func țiilor C de mai sus
void reset_ext_io(void) {
output_low(EXT_IO_RESET); //pin de RESET nivel scăzut
output_high( EXT_IO_RESET); //pin de RESET nivel înalt
setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16); // se
inițializează pe mijlocul semnalului de ceas, 10MHz
output_low(EXT_IO_CS); //select are pin ext_io chip pe nivel scăzut
spi_write(write_byte); // trimitere data
spi_write(0x00); //adresa de start

5.2.3. Portul I2C la microcontrolerul PIC 16F877
Al doilea mod de lucru al portului serial sincron (MSSP) al
microcontrolerului PIC 16F877 este portul I2C. Transmisia în ace st mod
se reali zează pe două fir e, SDA și SCL, nu se poate realiza recep ția și
transmisia datelor simultan , acest port func ționând după un protocol
stabilit de producător. Portul I2C poate lucra în mod Master sau Slave,
adresa fiind reprezentată pe 7 sau 10 bi ți. Portul este validat prin
setarea bitului SSPEN (SSPCON.5). Registrele utilizate în programarea
modulului I2C sunt
SSPCON – registrul de control
SSPCON2 – registrul de control 2
SSPSTAT – registrul de stare
SSPBUF – registrul tampon
SSPSR – registrul de înregistrare date (nu este accesibil direct)
SSPADD – registrul adresă

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
153
INTCON – registru pentru programarea lucurlui în întreruperi (GIE – bit
de întreruperi generale, PEIE -bit de validare întreruperi pentru scriere în
EEPROM)
PIR1 – registrul de validare întreruperi (SSPIF – indică t erminare
transfer)
PIE1 – registru cerere întreruperi (bitul SSPIE -cerere întreruperi de la
port I2C )
PIR2 – registru validare întreruperi (BCLIF bit validare întrerupere la
coliziune )
PIE2 -registru cereri întreruperi (BCLIE bit cerere întreruperi I2C la
coliziune )

Fiecare dispozitiv conectat la I2C are o adresă. Adresele unice
ale dispozitivelor sunt determinate de proiectantul sistemului, de obicei
ca parte a programulu i sursă pentru I2C. O adresă de dispozitiv are 7
biți conform standardului I2C (la I2C extins adresele pot fi de 10 bi ți).
Adresa 0000000 este utilizată pentru a semnala un apel general
("general call") sau emisie pentru magistrală ("bus broadcast"), care
poate fi folosită pentru a semnala / transmite simultan de către toate
dispozitivele. Adresele 11110XX sunt rezervate pentru schema extinsă
cu adresă pe 10 bi ți; există de asemenea și alte adrese rezervate.

Modurile de lucru selectate cu ajutorul bi ților SSPM3, SSPM2, SSPM1,
SSPM0 sunt:
Mod I2C Slave (adresa pe 7 bi ți)
Mod I2C Slave (adresa pe 10 bi ți)
Mod I2C Master, ceas=OSC/4(SSPADD+1)
Modul I2C firmwave (furnizate pentru compatibilitatea cu alte produse)

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
154
Înainte de a se selecta modul I2C pinii SDA și SCL sunt seta ți ca intrări.

Fig. 5.18 . Schema bloc a portului I2C a microcontrolerulu i PIC16F877
(redesanat după [ 19 ])

Bitul CKE din registrul STATUS setează nivelul pinilor SDA și SCL în
mod Master sau Slave. Dacă CKE =1 nivelul va fi conform magistralei
SMB iar dacă este 0 logic nivelul va fi conform specifca țiilor I2C.
Registrul SSPST AT dă informa ții despre starea transferului de date.
Aceste informa ții includ detectarea bi ților START (S) și STOP (P),
specificând dacă octetul recep ționat este dată sau adresă, dacă
următorul octet este o adresă pe 10 bi ți și dacă aceasta va fi un transf er
de date de scriere sau citire. Registru SSPBUF este un tampon în care

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
155
data transferată este scrisă sau citită. SSPSR transferă data în sau din
exterior. În recep ționarea datelor se crează o dublă salvare a datei
astfel că se poate reception următorul oc tet înainte de a fi citit anteriorul.
Când transferul este complet data este transferată în SSPBUF și bitul
indica tor SSPIF se setează automat. D acă se recep ționează un alt octet
înainte ca SSPBUF să fie citit se realizează o suprapunere ceea ce este
indicată prin setarea bitului SSPOV din regist rul SSPCON și bitul din
SSPSR este pierdut.
Registrul SSPAD con ține adresa modulului Slave. Dacă lucrează în
modul Slave pe adresă pe 10 bi ți, utilizatorul are nevoie să scrie primul
octetul de adresă (1111 0 A9 A8 0). Urmând apoi, după compararea
octetului trimis, să se scrie octetul de adresă mai pu țin semnificativ
(A7:A0).

Fig. 5.19 . Sem nalele de pe liniile SCL și SDA (http://www.best –
microcontroller -projects.com/i2c -tutorial.html)

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
156

Fig.5.20. Semnalele de START și STOP

Secven ța transferului de date de la Master la Slave și invers este la fel
ca la 80552.

Mod Slave
În modul Slave pinii SCL și SDA vor fi configura ți ca intrări. Când o
adresă este comparată sau o data este transferată după o adresă
recep ționată, hardul gen erează automat un impuls de confirmare (ACK)
și apoi SSPBUF este încărcat cu valoarea curentă din registrul SSSR.
Nu se transmite impulsul de confirmare (ACK) dacă bitul BF este setat
indicând regitrul tampon plin sau bitul SSPOV de suprapunere es te 1
înainte de recep ție sau transmisie.
Dacă BF este 1 valoarea din SSPSR nu se transferă în SSPBUF dar
bitul BF și SSPOV se setează. Tabelul de mai jos indică stă rile bi ților la
transferul datelor și când se transmite ACK. Desciere a biților utiliza ți
sunt descri și mai sus în prezentarea registrelor.

Secven ța transferului

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
157
Tabelul 5.8 . Tranferul de date în mod Slave, bi ți afectata ți (după [19])
Stare bi ți ca
date transfer și
recep ție SSPSR→
SSPBUF Generare
/ACK Setare
SSPIF
BF SSPOV
0 0 Da Da Da
1 0 Nu Nu Da
1 1 Nu Nu Da
0 1 Da Nu Da

La recep ționarea adresei pe 8 bi ți se va primi mai întâi bitul de Start și
apoi bi ții SSPSR <7:1> care vor fi compara ți cu cei din registrul
SSPADD pe front descrescător al lui SCL. Dacă valorile sunt egale și
biții BF și SSPOV sunt șterși, valoarea din SSPSR este încărcată în
SSPBUF pe front căzător, bitul BF este setat pe al 8 -lea impuls, front
căzător și se generează un impuls de confirmare ACK, iar pe al 9 -lea
impuls, front căzător se setează bitul SSPIF de întrerupe ri.
În cazul în care adresa este pe 10-biți, se repe ționează doi octet ți de
adresă. În octetul cel ma i semnificativ se specifică dacă adresa este pe
8 sau 10 bi ți.
Bitul R/W (SSPSTAT<2>) trebuie să specific e o scriere, astfel că
dispozitivul Slave va re cepționa al doilea octet de adresă. Bitul UA din
registrul SSPSTAT este utilizat în transferul adresei. Există posibilitatea
de a se transmite o adresă generală pentru o informa ție generală. În
acest caz toate dispozitivele vor răspunde cu un bit ACK. Aces t mod
este asemănător cu protocolul de transmisie adresă pe opt sau zece
biți. În acest caz to ți biții sunt 0 inclusiv cel de R/W. Acest mod este

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
158
recunoscut când bitul GCEN (registrul SSPCON2.7) este validat. În
modul 10 bi ți este utilizat și bitul UA pent ru a indica transferul pe doi
octeți ai adres ei. Dacă microcontrolerul se află în starea SLEEP,
modului I2C poate primi adresă sau date. După recep ție se produce o
întrerupere ceea ce treze ște microcontrolerul din modul SLEEP. După
un RESET se dezactivează modulul serial după terminarea transferului
curent.

Mod Master
Operarea în mod Master este suportat prin generarea întreruperii la
detectarea condi țiilor de START (S) și STOP(P). Aceste condi ții sunt
șterse prin RESET sau când modulul MSSP este dezactiv at. Controlul
magistralei I2C poate fi preluat când bitul P este 1 logic, magistrala fiind
în repaos când ambii bi ți P și S sunt pe 0 logic.
În modul Master, liniile SCL și SDA sunt manipulate hard. Întreruperile
se produc, bitul SSPIF este pe 1 logic dac ă:
 Există o condi ție de START
 Există o condi ție de STOP
 Este transmis un octet
 Este transmisă con firmare
 Este transmis un START repetat.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
159

Fig.5. 21. Schema bloc a modului I2C mod Master (desenat după [19])

Când modulul func ționează în mod multi -Master li nia SDA trebuie
supravegheată pentru arbitrare , se observă dacă nivelul semnalului este
cel a șteptat la ie șire.
Întreruperea se produce la una din condi țiile prezentate mai sus , inclusiv
și la transmisia unei adrese sau date. Modul Master este validat prin
setarea și ștergerea bi ților SSPM din SSPCON și setarea bitului
SSPEN.
Odată validat modul Master , există șase op țiuni de lucru:
 cere o condi ție de START pe SDA și SCL.
 cere un START repetat pe SDA și SCL
 scrie în SSPBUF ini țializând transmisia unei date/ adrese
 generează condi ție de STOP pe SDA și SCL

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
160
 configurează portul I2C p entru a recep ționa o dată
 generează o confirmare ACK la sfâr șitul octetului de date.
Modulul I2C în mod Master generează toate semnalele de ceas și
condi țiile de START și STOP. Transf erul se termină cu condi ția de
STOP sau START repetat. Dacă se transmite un S TART repetat se
transmite un alt pachet de date , magistrala nefiind eliberată.
Primul octet transmis de Master este cel de adresă, pe 7 bi ți unul fiind
de R/W.
Datele sunt transfe rate pe 8 bi ți, după recep ționare se prime ște un ACK,
START și STOP delimitând transferul serial (dacă R/W este 0 logic) .
Dacă R/W este 1 logic se recep ționează date pe SDA, linia SCL fiind
setată ca ie șire, după care se transmite un ACK. Bi ții START și STOP
indică începutul și sfâr șitul transmisiei.
Rata de transfer este generată pentru ceasul de pe SCL și poate fi de
100kHz, 400kHz, 1MHz. Blocul generator al ratei de transfer reîncarcă
valoarea con ținută pe cei mai pu țin semnificativi 7 bi ți din registru l
SSPADD. Generatorul începe numărarea odată cu scrierea pe SSPBUF
și se opre ște după ACK, pinul SCL rămâne în ultima stare. Bi ții din
SSPADD sunt încărca ți în numărătorul BRG, care numără descrescător
până la 0. BRG este decrementat de două ori pe ci clu instruc țiune. În
mod Master, BRG este reîncărcat automat.

Rata transfer=fosc/(4*(SSPAD+1))

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
161

Fig. 5.22. Bloc generator al ratei de transfer (redesenat după [19])

Modurile de lucru ale I2C sunt detaliate în catalogul microcontrolerului
pe care dorim să îl utilizăm. Acestea nu fac obiectul de studiu al acestei
lucrări.

Func ții C aflate în librăria CCS pentru programarea interfe ței I2C
I2c_start()
I2c_stop()
I2c_read()
I2c_write()
I2c_poll()

Exemplu de secven țe de program în C pentru programare I2C la PIC
16F877
 Func ție de ini țializare a I2C pentru transmisie date
void i2c_stop(void)
{

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
162
SDA = 0;
i2c_d elay();
SCL = 1;
i2c_d elay();
SDA = 1;
i2c_d elay();
}

 Func ție de ini țializare a I2C pentru transmisie date
void i2c_start(vo id)
{
SDA = 1;
i2c_d elay();
SCL = 1;
i2c_d elay();
SDA = 0;
i2c_d elay();
SCL = 0;
i2c_d elay();
}

5.3. Concluzii ale modurilor de transmisie serială
Probleme ale interfe ței SPI
Schema ceasulu i poate fi diferită între dispoz itive

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
163
Lungimea datei poate v aria de la un dispozitiv la altul.

Avantaje ale interfe ței SP I
– Foarte rapidă
– Protocol simplu de comunicare
– Interfe țe simple, unidirec ționale
– Permite transmisia biidrec țională a datelor simultan

Tabelul 5.9 . Compararea celor trei moduri de trans fer serial a datelor
SPI RS-232 I2C
Pini 3+1 2 2
Număr de
dispozitive nelimitat 2 1024
Biți în transferul
unei date 8 10(8bi ți
dată+START+STOP) 9 (8 bi ți
dată+ACK)
Terbuie să fie
transmisă adresa
dispozitivului
înainte de
transferul de
date? Nu Nu Da
Tip de ceas Doar Master Ambele Ceasul de
Master
poate
influen ța
Slave -ul
Data poate fi Da Da Nu

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
164
transferată
bidirectional
simultan?

Realizând o compara ție privind transmisia serial la 80552 și PIC 16F877
se obser vă că la al doilea microcontrol er portul ser ial este mai evoluat,
existâd o înregistrare a datelor transferate, un bloc generator al ratei de
transfer și mai ales două moduri de transfer SPI sau I2C. Fiecare mod
are mai multe registre pentru programarea modului de transfer iar viteza
de transfer est e mai mare la PIC16F877 decât la 80552.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
165
Capitol ul 6

CONVERTOR ANALOG DIGITAL

Dispozitivele de preluare a datelor din mediu au ie șiri analogice sau
digitale. Datele analogice trebuiesc prelucrate astfel încât să poată fi
înregistrate în memorii. Dispozitivele de conversie a semnalelor
analogice în digitale sunt convertoarele.
Covertorul analog digital este un dispozitiv periferic
microcontrolerului care a dovedit performan țe deosebite în ultimii ani.
Dacă la început dispozitivul era ex tern microcontrolerului iar informa ția
era transmisă la pinii digitali ai microcontrolerului, acesta a fost
încorporat la început cu performan țe scăzute. Principiul de func ționare
se bazează pe logica programată, codul program începând cu etapa de
inițializa re a conver torului. Microcontrolerele au intrări digitale.
Selectarea intrării utilizate se realizează prin bi ți de selec ție care apar țin
registrului de comandă specific convertorului . Convertorul din
microcontroler este , în majoritatea cazurilor, cu aprox imații succesive,
tensiunea de referin ță fiind internă sau externă. Tensiunea de intrare
analogică trebuie să aibă valoare mai mică decât tensiunea de
alimentare a microcontrolerului. Rezolu ția poate fi selectată prin soft.
Rezultatul conversiei este înreg istrat în registre dedicate acestui
periferic. Există bi ți dedica ți de start conversie și biți care semnalizeză
microcontrolerul că s -a terminat conversia. Convertorul poate lucra sau
nu în întreruperi .

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
166
6.1. Convertorul analog digita l la microcontrolerul PIC16 F877
Convertorul analog digital implementat pe microcontrolerul
PIC16F877 are cinci intrări ceea ce perm ite conectarea a 28 dispozitive.
Intrările sunt analogice, convertorul generând un semnal digital al
nivelului analogic prin aproxima ții succesive . Rezo luția convertorului
este de 10 bi ți, valorile sunt înregistra te pe două registre. Modulul are
referin ță de tensiune de nivel maxim sau minim, care poate fi selectat
prin program combinând Vdd, Vss, RA2 și RA3. Când microcontrolerul
se află în mod SLEEP, co nvertorul func ționează folosind oscilatorul RC
intern. Pinii RA2 și RA3 au și func ția de referin ță externă pentru
convertor.
Registrele utilizate în programarea convertorului sunt:
• ADRESH – registrul în care se înregistrează rezultatul, octetul
mai semnifi cativ
• ADRESL – registrul în care se înregistrează rezultatul, octetul
mai pu țin semnificativ
• ADCON0 – registrul prin programarea căruia se controlează
opera țiile modulului
• ADCON1 – registrul dedicat cu ajutorul căruia se configurează
funcțiile pinilor microcontroelrului.
• PIR1 – registrul de validare întreruperi (ADIF – indică terminare
conversiei)
• PIE1 – registru cerere întreruperi (bitul ADIE -cerere întreruperi
convertor)
• TRISA – programare stare pini port A
• PORTA – programare port A
• TRISE – programare star e pini port E
• PORTE – programare port E

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
167

Descriere registru ADCON0
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 U-0 R/W-0
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO//DONE – ADCON

ADCS1:ADCS0: biți selec ție ceas conversie
00 = FOSC/2 (1,25MHz)
01 = FOSC/8 (5MHz)
10 = FOSC/32 (20MHz)
11 = FRC ( ceas derivate din modulul oscilator RC intern )
CHS2:CHS0 : bit selec ție canale anaologice
000 = channel 0, (RA0/AN0)
001 = canal 1, (RA1/AN1)
010 = canal 2, (RA2/AN2)
011 = canal 3, (RA3/AN3)
100 = canal 4, (RA5/AN4)
101 = canal 5, (RE0/AN 5)(1)
110 = canal 6, (RE1/AN6) (1)
111 = canal 7, (RE2/AN7) (1)
GO/DONE: bit de stare conversie
dacă ADON = 1 atunci :
1 = conversie în lucru (setează Start conversie )
0 = nu se realizează conversia (bit șters automat după terminarea
conversiei)
neimplement at: se cite ște ca 0
ADON : bit pornire conversie
1 = modulul realizează conversia
0 = conversia oprită

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
168
Descriere registru ADCON1
U-0 U-0 R/W-
0 U-0 R/W-0 R/W-0 R/W-0 R/W-0
ADFM – – – PCFG3 PCFG2 PCFG1 PCFG0

ADFM: bit de selec ție a format ului rezultat ului
1 = aliniat dreapta. Bi ții cei mai semnificativi în număr de 6 din ADRESH
sunt citi ți ca 0
0 = aliniat la stânga. Biții cei mai pu țin semnificativi în număr de 6 din
ADRESL sunt citi ți ca 0
Bit neim plement at:citit ca '0'
PCFG3:PCFG0 : biți de control a i configurării portului analog digital

Fig. 6.1. Moduri de salvare a le rezultatulu i conversiei (redesenat după
[19])

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
169
Tabel 6.1.Configurarea bi ților PCFG 3-0 pentru selectarea pinilor de
intrare analog digitali [19]

Registrele ADRESH:ADRESL conțin rezulta tul conversiei pe 10 bi ți.
După terminarea conversiei, rezultatul este salvat în cele două registre
și bitul GO/DONE este șters iar bitul ADIF este setat. După etapa de
inițializare a convertorului, trebuie selecta ți pinii după care se poate seta
bitul de Start conversie.
Etapele parcurse în programarea convertorului analog digital sunt:
1. Configurare pini/referin ță tensiune folosind ADCON1
2. Selec ție canal ca intrare (ADCON0)
3. Selec ție ceas conversie (ADCON0)
4. Start convertor (ADCON0)
5. Configurare vector întrerup ere (dacă se dore ște): – ștergere ADIF,
setare ADIE, setare PEIE, setare GIE
6. Așteptare pentru primire valoare conversie
7. Start conversie : setare GO/DONE
8. Așteaptă terminare a conversie i

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
170
a. Testare bit GO/DONE (pooling)
b. Salt întrerupere la finalizarea conversi ei
9. Citire rezultat din ADRESH:ADRESL , ștergere ADIF
10. Salt la punctu l 1 sau 2 pentru o nouă conversie

Fig.6. 2. Schema bloc a convertorului analog digital al microcontrolerului
PIC 16F877 (redesenat după [19])

Modulul convertorului lucrează și în timpul modului SLEEP. Acesta cere
o sursă de ceas RC (ADCS1:ADCS0 = 11). După selec ția sursei de
ceas, modulul a șteaptă un ciclu instruc țiune înainte de a începe
conversia. Aceasta permite execu ția instruc țiunii SLEEP, care elimină
toate zgomotele digitale de la conversie. Dacă se produce o întrerupere
la sfâr șitul conversiei, microcontrolerul este trezit din modul SLEEP.
Dacă se lucrează în pooling, ADON rămâne setat și modulul este închis.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
171
Dacă se alege o altă sursă de ceas, în modul SLEEP, conversia în curs
este oprită și modulul închis. Efectul RESET -ului aspura modulului de
conversie este următorul: toate registrele sunt for țate în starea lor de
reset conform catalogului, orice conversie fiind oprită. Pinii sunt
configura ți ca intrări analogice, valoarea din A DRES este modificată la
RESET .

Func ții din librăria C (CSS pentru PIC) pentru programarea convertorului
analog digital
Setup_vref() –setare tensiune de referin ță convertor
Setup_adc_ports() – setare pini
Setup_adc() -inițializare convertor
Set_adc_channel() -inițializare canale
Read_adc() -citire rezultat.

Exemplu de rutină scrisă în asamblor pentru ini țializarea convertor
movlw 0x00
banksel ADCON1
movwf ADCON1 ;PORT A este folosit ca intrare analogică
;rezultatul este aliniat la stânga ignorând ultimii 2 bi ți
banksel ADCON0
buclă
bsf ADCON0, GO ;start conversi e
btfsc ADCON0, GO ; așteaptă terminare conversie
goto buclă
bcf PIR1, ADIF ; ștergere bit semnalizare
movf ADRESH,0 ; salvare rezultat în ADRESH
return

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
172
Capitolul 7

MEMORII

7.1. Memoria EEPROM la microco ntrolerul PIC 16F84

Prezentare generală
Memoria EEPROM (sau E2PROM ), denumire provenită de la
Electrically Erasable Programmable Read-Only Memory, este un tip de
memorie nevolatilă folosită pentru a stoca date ce trebuie să persiste și
după întreruperea a limentării cu curent. Cea mai importantă
caracteristică a acestei memorii este faptul că nu e ste volatilă. Când
este necesar un spa țiu mai mare de stocare (întâlnit la stick-urile USB),
se folose ște din motive economice un alt tip de memorie EEPROM:
memorie flash .
Memoria EEPROM este formată dintr -o matrice de celule de memorie
care, la rândul lor, sunt formate din perechi de tranzistori ce au între ei
un strat sub țire de oxid izolator. Aceasta poate fi ștearsă și
reprogramată (rescrisă) în mod repetat prin aplicarea unei tensiuni mai
mari decât cea generată de circuitul extern sau intern .
Microcontrolerul PIC16F84 are în interiorul arhitecturii 64 octe ți de
date EEPROM în intervalul de adrese 00h to 3Fh (Capitolul 2 ). Memori a
de date EEPROM poate fi scrisă și citit ă în timpul opera țiilor, nu este
direct mapată în spa țiul registrului de fi șiere, fiind indirect accesată prin
SFR. Această memorie rezistă la 10,000,000 de cicluri de
scriere ș/tergere.

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
173
Regisitrele utilizate pentru programarea memoriei EEPROM sunt din
SFR :
• EECON1
• EECON2 (registru neimplementat fizic)
• EEDATA – stochează temporar 8 bi ți de date pentru
scriere/citire
• EEADR -înregistrează adresa loca ției EEPROM accesat ă
Cand dispozitivul este protejat, CPU poate continua s ă scrie sau s ă
citeasc ă date din EEPROM

Descriere r egistrul EECON1
U-0 U-0 U-0 R/W-1 R/W-1 R/W-x R/S-0 R/S-x
– – – EEIF WRERR WREN WR RD

RD – bit de control
Setarea acestui bit ini țializează transferul de date definit în EEADR la
registrul EEDATA. Pentru că timpul nu este esen țial în citirea datelor ca
la scriere, datele din EEDATA pot fi deja folosite în următoarea
instruc țiune.
• 1=initializează citirea
• 0=nu ini țializează citirea
WR – bit de control scrire
Setarea acestui bit ini țializează scrierea datelor din registrul EEDATA la
adresa specifcată prin registrul EEADR.
• 1=initializează scrierea
• 0=nu ini țializează scrierea
WREN – Permite scrie rea în EEPROM

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
174
Dacă acest bit nu a fost setat, microcontrolerul nu va permite scrierea în
EEPROM.
• 1=scriere permisă
• 0=scriere interzisă
WRERR – bit indicator de eroare s criere EEPROM
Acest bit este setat doar în caz că scrierea în EEPROM este întreruptă
de un semnal sau prin terminarea timpului din t emporizatorul watchdog
(dacă este activat).
1=a avut loc eroare
0=nu a avut loc eroare
EEIF – bitindicator întrerupere la s criere EEPROM
Bit folosit pentru a informa că scrierea datelor s -a terminat.
Când s -a terminat scrierea, acest bit va fi setat automat. Programtorul
trebuie să șteargă bitul EEIF în program pentru a detecta noua
terminare a scrierii.
1=scrierea terminată
0=scrierea încă neterminată, sau încă nu a început

 Exemple de program scrise în a samblor pentru scriere și citire
memorie EEPROM
1.ștergerea unui bloc de memorie de la adresa 20h-2Fh
movlw 0x20 ;ini țializare pointer adresă
movwf FSR ; în RAM
et:clrf INDF ; șterge INDF
incf FSR ;incrementeaza pointer
btfss FSR,4 ;este realizată ștergerea?
goto et ;NU, urmatoarea stergere

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
175
2.Citirea memorie de date EEPROM
Citirea loca ției de memorie se face prin scrierea in EEADR a adresei si
apoi se seteaza bitul de control RD (EECON1<0>) . Data se va află în
EEDATA în ciclul urmă tor și va fi stocată până la urmatoarea
citire/scriere

2.1.Exemplu l de citire EEPROM
BCF STATUS, RP0 ; Bank 0
MOVLW CONFIG_ADDR ;
MOVWF EEADR ; citire adresă
BSF STATUS, RP0 ; Banc 1
BSF EECON1, RD ; EE Read
BCF STATUS, RP0 ; Banc 0
MOVF EEDATA, W ; W = EEDATA
3.Scriere EEPRO M – Asemanator cu citirea data este memorata in
EEDATA, utilizatoru l va ini ția o secven ță de scriere a fiecarui bit
3.1.Exemplu l de scriere în EEPROM
BSF STATUS, RP0 ; Banc 1
BCF INTCON, GIE ; dezactivare INTs.
BSF EECON1, WREN ; validare scriere
MOVLW 55 h ;
;SECVENTA ceruta
BSF EECON1,WR ; Set bit WR, șters hardware
; incepe scrierea
BSF INTCON, GIE ; validare întrerupere
BSF INTCON,EEIE; întrerupere EEPROM
3.2. Exemplu de v erificare la scriere
BCF STATUS,RP0 ; Banc 0

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
176
; linii de program
; poate sari aici
MOVF EEDATA,W ; trebuie sa fie in Banc 0
BSF STATUS,RP0 ; Banc 1
READ
BSF EECON1, RD ; citeste valoarea scrisa
BCF STATUS, RP0 ; Banc 0
; Este valoarea scrisă (in W reg) și citește (în EEDATA) la
fel?
SUBWF EEDATA, W ;
BTFSS STATUS, Z ; este diferit de 0?
GOTO WRITE_ERR ; Nu , scrie eroare

Func ții C dedicate programării memoriei EEPROM
Read_eeprom()
Write_eeprom()
Read_program_eeprom()
Write _program_eeprom()

7.2. Memoria flash la microcontrolerul PIC16F XXX
Memoria flash este un tip de memorie nevolatilă cu a limentare
constantă ale cărei blocuri de memorie pot fi șterse și reprogramate.
Este o variantă a memoriei de tip EEPROM care, spre deosebire de
memoria flash , este ștearsă și programată la n ivel de bit, ceea ce o face
mai lentă. Numele de „memorie flash ” vine de la faptul că integratul este
organizat in a șa fel încât o opera ție de ștergere se face printr -o singură
acțiune sau „ flash ”. Memoria flash este folosită des pentru a memora
cod de control asemănător BIOS -ului calculatoarelor personale. Când

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
177
informa ția din BIOS trebuie modificată memoria poate fi scrisă la nivel
de bloc, ceea ce o face mai u șor de modificat. In schimb, flash –ul nu
este folosit ca RAM („Random Acces Memory ”), deoarece RAM -ul este
adresat la nivel de octet .
Microcontrolerul PIC16F84 are 1koctet de memorie flash pe 14 bi ți în
care stochează programe. Aceasta suportă 10,000 de cicluri de
ștergere/scriere.

Exemplu de programare a memoriei Flash AT45DB041B

Deoarece memoria AT45DB041B [ 20] are două buffere de memorie
RAM de 264 octe ți și 2048 de pagini de 264 octe ți de tip flash, func țiile
care realizează scrierea dat elor în memoria flash au fost adaptate
mecanismului de lucru descris in datele de catalog ale acestui tip de
memorie. Astfel scrierea în memoria flash se realizează după
următoarea secven ță de program:
a – scrie 264 octe ți în buffer 1 RAM
b – transmite co manda pentru scriere din buffer 1 RAM in FLASH
c – scrie 264 octe ți în buffer 2 RAM
d – transmite comanda pentru scriere din buffer 1 RAM in FLASH
e – reia secven ța de la punctul a.

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
178

Fig. 7.1. Arhitectura internă a memoriei flash AT45 DB041B
(redesanet după [20])

Tabelul 7.1. Adresele blocul ui de ștergere al memoriei [20 ]

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
179
Aplica ție
Se conectează memoria flash AT45DB041B la microcontrolerul PIC
conform schemei electrice din Fig. 7.2 . Com unicarea dintre cele două
dispoz itive se realizează prin int erfața serial. Se vor prezenta r utine de
lucru cu memoria externă scrise în programul asamblor. Din schemă se
poate observa că microcontrolerul este conectat și la calculator prin
intermediul portului serial.
RA4/AN4/SS/HLVDIN/C2OUT
VCCRC1/CCP20
R11
10k0OSC2
SCL
VCC1
U14 AT45DB041B
2 7
68 1
3
4 5SCLK GND
VCCSO SI
RESET
CS WPRB6VCCMCLR/VPP
R17 100kRB2/INT2/AN8
D4
R8
1kSCL
R18
100kSDA
R12
10kRB4/AN11quartzCRYSTALRA3/AN3/Vref +
RC1/CCP2D6
D1N4002
P1
CONNECTOR DB95
9
4
8
3
7
2
6
1C16
10uF
SCL
RC6/TXJ1
CON121
2
3
4
5
6
7
8
9
10
11
12
R9
10kAN1
SCK/SCLAVSS
SCL
C91nVCC
RC4/SDI/SDAAN0
R14
220
VCCVCC
RC4/SDI/SDARB5
00VSS=GND 0RB2/INT2/AN8
J7
CON21
2RB4/AN11
RC6/TXRC7/RX
SCK/SCL
C11VRL/AN2
VDD=VCC
OSC2
RC7/RXJ6
CON21
2AN1
RC0
D5R16
10kRB7
RB6
RB1/INT1/AN10U3 PIC16F83_P
1
2
3
4
5
6
7
8
9
10
11
12
13
14 15161718192021222324252627281
2
3
4
5
6
7
8
9
10
11
12
13
14 1516171819202122232425262728
U13 AT45DB041B
2 7
68 1
3
4 5SCLK GND
VCCSO SI
RESET
CS WPVCC
SCK/SCLAN0
R10
10k
C10 1nOSC1R15
10k
R13
180
RC6/TX
test
C130R19
10kC15
33p
VCCRA4/AN4/SS/HLVDIN/C2OUT
RC2/CCP1
VCC
00
RC7/RX
0RC5/SDO C14
33pOSC1RB0/INT0/FLT0/AN12
RC7/RX
VCC1RB7
RC5/SDORB4/KBI0/AN11VRL/AN2
RB1/INT1/AN10
SCK/SCL
RC5/SDORA3/AN3/Vref +
RB3/AN9/CCP2
U2
MAX2321
3
4
5
2
612
9
11
1013
8
14
716 15C1+
C1-
C2+
C2-
V+
V-R1OUT
R2OUT
T1IN
T2INR1IN
R2IN
T1OUT
T2OUT16 15RC2/CCP1RB0/INT0/FLT0/AN12RB3/AN9/CCP2
SDARB5
RC4/SDI/SDA
U15 74126
1
2
43
5
6
7 891011121314C1
A1
C2Y1
A2
Y2
GND Y3A3C3Y4A4C4VCC
RC0
C121n

Fig. 7.2. Schemă electrică de conectare a me moriei flash AT45DB041B
la microcontrolerul PIC16F83_P

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
180

Exemple de rutine de comunicare a microcon trolerului cu memoria
flash . În Anexa 5 se regăsesc adresele utile pe ntru scriere, citire,
ștergere memorie.
;Comenzi SPI pentru lucrul cu memoria AT45DB041B
;Codurile sunt preluate din specificatiile memoriei AT45DB041B
;*********************************************************************************
***************
spi_cread equ 0xe8 ;citeste continuu de la o adresa
spi_b1read equ 0xd4 ;citeste buffer 1
spi_b2read equ 0xd6 ;citeste buffer 2
spi_statusread equ 0xd7;citeste registru stare
spi_b1write equ 0x84;scrie in buffer 1
spi_b2write equ 0x87 ;scrie in buffer 2
spi_b1mwrite equ 0x88 ;scrie buffer 1 in flash
spi_b2mwrite equ 0x89 ;scrie buffer 2 in flash
spi_blockerase equ 0x50 ;stergere EEPROM in mod block
CS1_FLASH equ 0
CS2_FLASH equ 2
RESET_FLASH equ 1
SCK equ 3 ;PORTC<3> iesire SCK
SDI equ 4 ;PORTC<4> intrare SDI
SDO equ 5 ;PORTC<5> iesire SDO
SDA equ SDI
;******************************************* **************************************
****

Flash_initializare

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
181
movlw 0xFF; incarc contor32 cu 255
movwf contor32
movlw spi_b1write ; transmite cod operatie memorie erase bank
call SPI_OUT ;transmisie SPI
movlw 0xff ; transmite adresa
call SPI_OUT
andlw 0
call SPI_OUT
andlw 0; prima adresa a bank -ului mem ext de unde se incepe
stergerea
call SPI_OUT
;se introduce zero in bank1 a l mem oriei externe flash cod 84h
;datele sunt scrise in mem orie pana cand CS trece din low in hight
bucla_init_b1_256
andlw 0
call SPI_OUT
decfsz contor32,1; rezultat ramane in contor32
goto bucla_init_b1_256
;initializ are pana la 264 octeti din mem oria flash
movlw 0x09; reinitializare contor32 pana la 264 -255 octeti
movwf contor32
bucla_init_b1_8
andlw 0
call SPI_OUT
decfsz contor32,1
goto bucla_init_b1_8
call SPI_sfarsit

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
182
; se introduce zero in bank2 cod 87h
movlw 0xFF; incarc are contor32 cu 255
movwf contor32
movlw spi_b2write ; transm ite cod operatie memorie erase bank
call SPI_OUT ;transmisie SPI
movlw 0xff ; transmite adresa
call SPI_OUT
andlw 0
call SPI_OUT
andlw 0; prima adresa a bank -ului mem ext de unde se incepe
stergerea
call SPI_OUT
bucla_init_b2_25 6
addlw 0
call SPI_OUT
decfsz contor32,1; rezultat ramane in contor32
goto bucla_init_b2_256
;initializ are până la 264 octeti din mem oria flash
movlw 0x09; reinitializare contor p ână la 264 -256 octeti
movwf contor32
bucla_init_b2_8
andlw 0
call SPI_OUT
decfsz contor32,1
goto bucla_init_b2_8
call SPI_sfarsit

;stergere mem orie flash în mod bloc opcode 50h

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
183
movlw spi_blockerase; transmite cod operatie mem ext
call SPI_OUT
andlw 0
call SPI_OUT
andlw 0
call SPI_OUT
andlw 0
call SPI_OUT
call SPI_sfarsit
call ready_FLASH
call SPI_reset
movlw 0xff
movwf contor32; contorizează blocurile pentru ștergere

;**** inițializare memorie EEPROM
bucla_init_EEPROM
movlw spi_block erase; tra nsmite cod de ștergere în bloc a memoriei
call SPI_OUT
movf contor32,w
andlw 0x0f; transmite adresa care este pe 8 bi ți
call SPI_OUT
movf contor32,w; contor32 a
andlw 0x0f;
call SPI_OUT
movf contor32,w; contor32 a
andlw 0xf0
call SPI_OUT

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
184
andlw 0
call SPI_OUT;transmit octetul de stergere block (specificat de
contor32)
call SPI_sfarsit
call ready_FLASH
call SPI_reset
decfsz contor32,1
goto bucla_init_EEPROM
call SPI_inchis
return

;***rutina de verif icare starea READY a mem. ext. daca este pregatita
sa primeasca
;***o noua comanda sau este ocupata se sta in bucla pana SPI este
libera
ready_FLASH
bcf TRISC,SDO; PORTC iesire SDO pt transm pe SI
movlw spi_statusread; transmitere cod 0xd7 pt test are stare mem ext
call SPI_OUT
bsf TRISC,SDO;sel portc ca intrare SDO
call SPI_IN
andlw 0x80
btfsc STATUS,Z; daca buferul este 0 atunci se poate lucra cu mem
ext
goto ready_FLASH
return

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
185
;***rutina transmisie SPI
SPI_OUT
; movlw 0
; movwf BSR; set bank 0
movwf SSPBUF; o noua data la ie șire de transm isie la SPI
btfss PIR1,3 ; test intrerupere pt scriere date in EEPROM
goto $ -1; se sare la intrer unde se sterge flagul EEIF
bcf PIR1,3; sterg SSPIF
; movlw 0 1
; movwf BSR; set bank 1
return

;***rutina recep tie SPI
SPI_IN
; movlw 0
; movwf BSR; specific bancul 0
movwf SSPBUF;
btfss PIR1,3
goto $ -1
;bcf SSPCON1,6; se utilizeaz ă doar î n modul Slave
movf SSPBUF,0
bcf PIR1,3 ; dac ă nu se lucreaz ă în întreruperi
;movlw 01
;movf BSR,1; set bank 1
return

;***rutina terminare opera ție cu mem Flash
SPI_sfarsit

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
186
movlw 0
movf BSR
btfss mem1,0; daca mem1 e 0 se lucreaza cu mem 1
bsf PORTC,0,0; deselect CS mem ext 1
bsf PORTC ,2,0;deselect CS mem ext 2
btfss mem1,0; daca mem1 e 0 se lucreaza cu mem 1
bcf PORTC,0,0; select CS mem ext 1
bcf PORTC,2,0;select CS mem ext 2
nop
bcf PORTC,0; selecteaza mem flash
bcf TRISC,5,0; SDO selectat ca iesire (transmisie)
return

;***rutina RESET memorie flash
SPI_reset
movlw 0
movf BSR; set bank0
btfss mem1,0; daca mem1 e 0 se lucreaza cu mem 1
bcf PORTC,0,0; select CS mem ext 1 functie de val bitului mem
bcf PORTC,2,0;select CS mem ext 2
bcf PORTC,1,0; RESET este 0
nop
bsf PORTC,1,0; reset este 1
; movlw 01
; movf BSR; bank 1
bcf TRISC,5,0; iesuire SD0
; SDO iesire
return

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
187

;***rutina de închiere comunica ție SPI cu mem ext
SPI_inchis
bsf PORTC,0,0; deselect CS mem ext 1
bsf PORTC,2,0;deselect CS mem ext 2
bcf SSPCON1,5,0; invalidare mod lucru SPI prin SSPEN
bcf PIR1,SSPIF,0
return
;***Inițializare memorie flash
;******transmitere date prin SPI la mem ext 1 si 2 SPI mod Master,
;slave este memoria ext. transmit_SPI
INIT_SPI1; ini țializare SPI mem e xt 1
movlw b'01000000'; se selecteaz ă modul de lucru Master (mod0)
movwf SSPSTAT,0
movlw b'0011000';
movwf SSPCON1;validare SPI
clrf SPBRG
;****initializare mem ext 1
movlw b'11010100';ini țializare pini ie șire mem 1
movwf TRIS C; CS=0, Reset=1, SCK=1 si SDO=1,CS=1(mem ext)
nop
nop
nop
bcf PORTC,0,0
;****pinul /CS al mem. flash este conectat la PortC pin 0
bcf PORTC,1,0; reset mem ext 1 este conectat la PortC pin 1
nop
bsf PORTC,1,0; conectare meme e xt la sursa de alimentare

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
188
bsf PORTC,0,0; CS=0 invalidare comunicare cu mem oria externă
;****pinul /CS al mem flash este conectat la PortC pin 0
return
INIT_SPI2; initializare SPI mem ext 2
movlw b'01000000'; se selecteaz ă modul de lucru Master (mod0)
movwf SSPSTAT
movlw b'0011000'
movwf SSPCON1;validare SPI
clrf SPBRG
;****initializare mem ext 2
movlw b'11010001';ini țializare pini ie șire mem 2
movwf TRISC; CS=0, Reset=1, SCK=1 si SDO=1,CS=1(mem ext)
;pinul /CS al mem oriei flash este conectat la PortC pin 0
nop
nop
bcf PORTC,2,0; CS=0 validare comunicare cu mem orie externă 2
bcf PORTC,1 ; reset mem orie externă, conectat ă la PortC pin 1
nop
bsf PORTC,1,0; conectare mem orie externă la sursa de alimenta re
bsf PORTC,2,0; CS=0 validare comunicare cu mem ext 2
return

7.3. Lucrul cu pointerii l a nivel de loca ții de memorie
Un pointer este o variabilă care pastrează adresa unei date, nu
valoarea datei. Poate fi utilizat pentru referirea diferitelor d ate și structuri
de date. Schimb ând adresa memorată în pointer, pot fi manipulate
informa ții situate la diferite loca ții de memorie. Pointerii permit de
asemenea crearea de noi variabile în timpul execu ției programului, prin

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
189
alocare dinamica . În continuare se va prezenta modul de lucru cu
pointeri la nivel de memorie.

Tabelul 7.3 . Operatori specifici pointerilor
Nume Simbol Rol Utilizare
Operator de
referen țiere * Definirea de tipuri de dat ă
pointer tip * int*
float* int**
Operator de
referen țiere & “Extrage” adresa unei
variabile &a
Operator de
dereferen țiere * Accesea ză zona de memorie
indicată de un pointer *p

Exemplu
int* p, a, *q; ocupă 2 respectiv 4 octe ți
p = &a; p se încarcă cu adresa lui a
q = p; conținutul lui p este acela și cu al lui q
*q = 9; indică con ținutul lui a

Fig. 7.3. Modul de reprezentare a pointerilor la nivel de memorie

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
190

Valiabilele p și q (de la adresele 90 și 96) conțin adresa lui a (94) iar
pointer pe p indică con ținutul lui a (Fig.7.3).
Operatorul de atribuire = este fol osit numai între pointeri de acela ți tip
deoarece spa țiul de memorie alocat este acela și/
int *i, *j;
float *a, *b;
i = j;
a = b;
i = a;Fals
b = j;Fals

Unitate : dimensiunea zonei de memorie către care indică pointerul
– noțiunea e definită doar pentru point erii cu tip
int *p, a;
p = &a;
float *q, b;
q = &b

Exemplu de opera ții cu pointeri
int a[10], *p, *q;
p = &a[0];
p + 5
q = p + 5;

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
191
p = q – 2;
int c[10], *i, *j;
i = &c[0];
i + 5
j = i + 5;
i = j – 2;

Alocare a dinamic ă a memoriei
Se include librăria malloc.h (Visual C)
Func ții importante folosite în programarea la nivel de memorie al
microcontrolerelor
malloc
tip *p;
p = (tip*) malloc(dimensiune);
free
free(p);
Legătura între vectori și pointeri
Exemplu
int c[10];
int *i;

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
192
i = c;
c != i;
i = c + 6;
*(c+5) echivalent cu c[5]
*(i+5) echivalent cu i[5]
Legătura dintre matrice și pointeri
int a[5][5];
int **p;
p = a;
p[3][2]= *(*(p+3)+2)
a[3][2]= *(*(a+3)+2)

0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4

a=
p p+
3 a
+
3 *(a+
3)+2
Vectori aloca ți dinamic
Vector dinamic
Declarare
tip* p;
Alocare
p = (tip*) malloc( n * sizeof(tip));
Utilizare
p[i]
Eliberare (dezalocare)
free(p);

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
193

Referin țe bibliografice

1) http://en.wikipedia.org/wiki/Da_Vinci_Surgical_System
2) http://www.answers.com/topic/robot
3) Hnatiuc M., Mediul de dezvoltare EdSim51. Descriere și aplica ții, Ed.
Nautica, 2010, ISBN 978-606-8105 -10-9
4) Burileanu Corneliu , Microcontrolere – Note de curs
5) Crisp J., Introduction to Microprocessors and Microcontrollers;
Butterworth -Heinemann, 2003
6) Nebojsa Matic , Microcontrolere PIC on -line,
http://www.mikroelektronika.co.yu/romanian/pro duct/books/PICbook/pic
book.htm
7) Mitescu M., Susnea I., Microcontrollers in Practice , Springer, ISBN –
13 978 -3-540-25301 -3 Springer Berlin Heidelberg New York , 2005
8) Rotar D., Anghelu t A., Arhitectura sistemelor de calcul , Note de curs
Indrumar de laborator , Ed. Alma Mater Bacău , 2007
9) John Crisp , Introduction to Microprocessors and Microcontrollers ,
Elsevier, ISBN 0 7506 5989 0 , 2004
10) http://ww1.microchip.com/downloads/en/devicedoc/35007b.pdf
11) http://academic.csuohio.edu/simond/courses/eec417/ESPWithThe
PIC16F877.pdf
12) ***, 8051 v7.2C , Cross -Compiler User's Manual, A publication of
Altium BV, 2006 , http://www.tas king.com/support/8051/m_cc51_v7.2.pdf
13) Nigel Gardner, An introduction to progra mming The Microchip PIC
in CCS ,
http://www.teiser.gr/icd/staff/kalomiros/Mtptx/e -books/eBook%20 –
%20PIC%20Programming%20with%20C.pdf

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
194
14) http://www.nxp.com/documents/data_sheet/80C552_83C552.pdf
15) http://www.aggsoft.com/rs232 -pinout -cable/serial -cable –
connections.htm
16) http://www.ti.com/lit/ds/symlink/max232.pdf
17) http://www.nxp.com/documents/data_sheet/80C552_83C552.pdf
18) http://www.keil.com/dd/docs/datashts/philips/8xc5x2_ov.pdf
19) http://academic.csuohio.edu/simond/courses/eec417/ESPWithThe
PIC16F877.pdf
20) ***, PIC16F87X Data Book ,
http://ww1.microchip.com/downloads/en/devicedoc/30292c.pdf
21) ***, AT45DB041B DataSheets, http://www.atmel.com
22) http://www.ti.com/lit/ds/symlink/max232.pdf
23) http://www.aggsoft.com/rs232 -pinout -cable/serial -cable –
connections.htm
24) http://www.mikroe.com/chapters/view/14/chapter -1-world -of-
microcontrollers/

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
195

ANEXA 1

Tabelul cu registre din zona de registre cu func ții speciale (SFR) la
PIC1 6F84. Con form catalogului de la [9]

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
196
ANEXA 2

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
197
ANEXA 3

Zona de memorie cu registre cu func ții special la PIC16F877

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
198
ANEXA 4

Registre ale familiei 8051
Nume descri ere adres ă
– –––– ––
ACC acumulator E0
B registr u B F0
DPTR datapointer
DPH datapointer 83
DPL datapointer 82
IE validare întrerupere A8
IP prioritate întrerupere B8
P0 port 0 80
P1 port 1 90
P2 port 2 A0
P3 port 3 B0
PCON control alimentare 87
PSW segistru de stare D0
SBUF registru serial 99
SCON control serial 98
SP pointer stivă 81
TCON control temporizator 88
TH0 temporizator 0 nivel înalt 8C
TH1 temporizator 1 nivel înalt 8D
TL0 temporizator 0 nivel jos 8A
TL1 temporizator 1 nivel jos 8B
TMOD mod temporizator 89

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
199
IP

bit descri ere simbol
– –––– ––
B7 rezervat
B6 rezervat
B5 rezervat
B4 prioritate întrerupere port serial PS
B3 prioritate întrerupere temporizator 1 PT1
B2 prioritate întrerupere extern ă 1 PX1
B1 prioritate întrerupere temporizator 0 PT0
B0 prioritate întrerupere extern ă 0 PX0

IE

bit descri ere simbol
– –––– ––
B7 validare înteruperi EA
B6 rezervat
B5 rezervat
B4 validare întrerupere port serial ES
B3 validare întrerupere temporizator 1 ET1
B2 validare external întrerupere 1 EX1
B1 validare întrerupere temporizator 0 ET0
B0 validare întrerupere externă 0 EX0

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
200
PSW

bit descri ere simbol
– –––– ––
B7 flag transport CY
B6 flag transport auxiliar AC
B5 flag de stare general ă F0
B4 registru bit selecție banc 1 RS1
B3 registru bit selec ție banc 0 RS0
B2 flag depă șire OV
B1 definit de utilizator
B0 parity of accumulator P

TCON

bit descri ere simbol
– –––– ––
B7 flag depășire temporizator 1 TF1
B6 contro l temporizator 1 on/off TR1
B5 flag depășire temporizator 0 TF0
B4 control temporizator 0 on/off TR0
B3 flag întrerupere 1 IE1
B2 bit control întrerupere trigger 1 IT1
B1 flag întrerupere trigger 0 IE0
B0 bit control întrerupere 0 IT0

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
201
TMOD

bit descriere smbol
– –––– ––
B7 0 = t/c 1 validare via TR1 GATE
1 = t/c validare via INT1 + TR1
B6 temporizator = 0, counter = 1 T/C
B5 mod operare t/c 1 M1
B4 mod operare t/c 1 M0
B3 idem pentru t/c 0
B2 idem pentr u t/c 0
B1 idem pentru t/c 0
B0 idem pentru t/c 0

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
202
ANEXA 4

Schema bloc a interfe ței seriale I2C la 80552 [13 ]

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
203
ANEXA 5

Tabelele cu opera ții și adrese ale memorie flash AT45DB041B (date
de catalog)

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
204
ANEXA 6

Librăria ANSI C
<assert.h> <complex.h> <ctype.h>
<errno.h> <fenv.h> <float.h>
<inttypes.h> <iso646.h> <limits.h>
<locale.h> <math.h> <setjmp.h>
<signal.h> <stdarg.h> <stdbool.h>
<stdint.h> <stddef.h> <stdio.h>
<stdlib.h> <string.h> <tgmath.h>
<time.h> <wc har.h> <wctype.h>

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
205
ANEXA 7

Cuvinte cheie folosite pentru programarea în C
absolute data if return typedef
asm default inline rx typeid
at delete int sfr typename
auto do io short union
bit double long signed unsigned
bool else mutable sizeof using
break enum namespace static virtual
case explicit operator struct void
catch extern org switch volatile
char false pascal template while
class float private this
code for protected throw
const friend public true
continue goto register try

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
206
ANEXA 8
OPERATOR I, OPERA TII SI EXPRES II
Operator Operatie
+ Adunare
– Scădere
* Înmultire
/ Divizare
% Rest
ATRIBUIRE
Operator
Exemple
Expresie Echivalent
+= a += 2 a = a + 2
-= a -= 2 a = a – 2
*= a *= 2 a = a * 2
/= a /= 2 a = a / 2
%= a %= 2 a = a % 2
Operatori de incrementare/decrementare

Operator Exemplu Descri erea
++ ++a Variabla "a" increment ată cu 1
a++
– –b Variabl a "b" decrement ată cu 1
b–
OPERATORI DE RELATIONA RE
Operator descriere Exem ple
> Este mai mare decât b > a
>= Mai mare egal a >= 5
< Mai mic decât a < b
<= Mai mic egal a <= b
== egal a == 6
!= Nu este egal a != b

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
207
OPERATORI LOGIC I

Operator AND
&& Op1 Op2 Rezultat
0 0 0
0 1 0
1 0 0
1 1 1
Operator OR
|| Op1 Op2 Rezultat
0 0 0
0 1 1
1 0 1
1 1 1
Operator NOT
! Op1 Rezultat
0 1
1 0

OPERATOR I PE BIT

Operand Descriere Example
~ complement a = ~b
<< Deplasare stg a = b << 2
>> Deplasare dr a = b >> 2
& AND c = a & b
| OR c = a | b

^ EXOR c = a ^ b

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
208
Cum se folosesc operatorii. Prioritate
Priorit ate Operatori Asociativitate
mare () [] -> . de la stânga la
dreapta
! ~ ++ – +(unar ) -(unar ) *Pointer
&Pointer de la dreapta la
stânga
* / % de la stânga la
dreapta
+ – de la stânga la
dreapt a
< > de la stânga la
dreapta
< <= > >= de la stânga la
dreapta
== != de la stânga la
dreapta
& de la stânga la
dreapta
^ de la stânga la
dreapta
| de la stânga la
dreapta
&& de la stânga la
dreapta
|| de la dreapta la
stânga
?: de la dreapta la
stânga
scăzută = += -= *= /= /= &= ^= |= <= >= de la stânga la
dreapta

Microcontrolere CISC și RISC. Arhitecturi și principii de programare
209

Microcontrolere CISC și RI SC. Arhitecturi și principii de programare
210

Tiparul executat în
TIPOGRAFIA
UNIVERSIT ĂȚII MARITIME
Cons tanța

Similar Posts