Sunteți pe pagina 1din 210

Microcontrolere CISC i RISC.

Arhitecturi i principii de programare

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 rspuns n timp real.
Sistemele nglobate sunt miniaturizate, fiabile i la pre redus.
Caracteristica lor principal fiind realizarea unei anume sarcini cu
rspuns ct mai bun n timp real. Microcontrolerele au aprut din dorina
de minimizare a spaiului de lucru, astfel c periferice externe unitii de
procesare au fost minimizate ntr-o singur capsul.
Definiie: MICROCONTROLERUL este un circuit integrat care
concentreaz ntr-o singur capsul att unitatea central de procesare,
memoria ct i dispozitivele de comunicare cu exteriorul cum ar fi port
serial, paralel, convertoare analog digitale, digital anlogice, oscilator,
etc. (Fig 1.1).
Memoriile sunt celulele de baz din componena unui
microcontrolerului. Cele mai mici uniti 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
creterea vitezei de execuia a instruciunilor. A doua unitate de
memorie care are un timp de acces mic, dup registre este memoria
ascuns (cache), avnd capacitate de stocare mai mare fiind utilizat

1
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
pentru a crete viteza de execuie i pentru a avea un rspuns n timp
real foarte bun.

Fig. 1.1. Schema general a unui microcontroler

O clasificare a memoriei interne a microcontrolerelor se face dup


coninutul 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 coninute n registre
dedicate. De exemplu adresa memoriei program este coninut n
registrul numrtor de program al crui coninut se incrementeaz
automat dup execuia instruciunii, adresa memoriei de date are
registre dedicate pentru nregistrarea ei tocmai pentru a fi mai simplu de
apelat. Adresa memoriei stiv se decrementeaz dup apelare,
coninutul ei este de asemenea nregistrat n registre dedicate.
Denumirile acestor registre sunt diferite funcie de productor dar s-a
ncercat pstrarea unor denumiri standard.
Interfaa cu perifericele, n general, are urmtoarele blocuri: linii de
intrare/ieire, registre specifice de date, control i stare, magistrale de

2
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
comunicare intern i circuite specifice de interfa. Linia de
intrare/ieire implementeaz funcii speciale nlocuind unitatea central
de toate aspectele specifice de comand i control n procesul
respectiv.

Fig. 1.2 Schema bloc de interfaare cu perifericele

Dispozitivele I/O (Fig.1.2) conduc operaii generale de


comunicare (transfer serial sau paralel de date), funcii generale de timp
(numrare de evenimente, generare de impulsuri), operaii de conversie
analog/numeric, funcii de protecie, funcii speciale de comand, etc.
Parte din resurse acoper funciile de control propriu-zis, iar o parte
asigur funciile necesare aplicaiilor n timp real (sistemul de
ntreruperi, timer).
Unitatea central de prelucrare, "creierul", este mprit n dou
blocuri unitatea central de execuie i unitatrea de intrefa cu
magistrala care are funcia de aducere a instruciunilor. Unitatea de
execuie, care decodific i execut instruciunile, conine unitatea
logico-aritmetic (ALU). Unitatea de Logic Aritmetic execut
3
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
operaiile rezultate din decodarea instruciunilor (Fig.1.3.), operanzii fiind
adui n registre acumulator. n urma execuiei sunt afectai indicatori de
bit din registrele de stare. Unitatea central de procesare conecteaz
toate prile 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 mprit. Arhitectura Harvard (realizat de IBM
n 1944 pentru un calculator furnizat Universitii 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, aa cum se art n Fig 1.4, n partea stnga.

4
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Figura 1.4. Tipuri de arhitecturi: Harvard i von Neumann [3]

Arhitectura von Neumann (propus de matematicianul John von


Neumann n 1945) presupune o memorie comun att pentru date ct i
pentru cod. Avantajul arhitecturii Harvard const n accesul simultan la
cele dou memorii pe durata unui singur ciclu main i deci
posibilitatea efecturii unor operaii de adunare i nmulire (MAC) tot pe
durata unui ciclu main.

Rolul microcontrolerelor:
Controlul i comanda proceselor prin achiziia 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 ctre utilizator, ntr-o singur capsul i cu funcie de calcul, fiind
creierul sistemului electronic.
Microcontrolerul se poate defini ca un circuit logic, programabil, cu o
structur adaptat pentru rezolvarea unei largi game de aplicaii de timp
real. Este folosit ca procesor orientat pe aplicaii, fiind, n general, inclus
n echipamentul pe care l comand.

5
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Timpul de prelucrare este mai mic la microprocesoare dar
mrimea sistemelor care folosesc microcontrolere este mai mic.
Microcontrolerele sunt utilizate mai des n aplicaii industriale fiind
implementate pe plci de dezvoltare sau de aplicaii. Plcile de
dezvoltare au un sistem de operare inclus, microcontrolerul putnd fi
ncrcat cu programe cu diverse aplicaii. Platformele de aplicaii
folosesc microcontrolerul ntr-o singur execuie, acesta fiind ncrcat cu
programul executabil n memoria nevolatil.
Att microprocesorale ct i microcontrolerele au arhitecturi de tip CISC
sau RISC metodele de cretere a vitezei de calcul fiind mai avansate la
microprocesoare dar acestea au nceput s folosite i la
microcontrolere. n cazul microcontrolerelor, la creterea vitezei de
calcul contribuie i optimizarea arhitecturilor blocurilor periferice incluse
n circuit.
Ce trebuie s conin arhitectura unui microcontroler complex?
Pe lng blocurile componente definite n Fig.1.1, microcontrolerul mai
poate conine:
sistem de conversie analog numeric sau numeric analogic
circuit de impulsuri modulate n durat (PWM)
comparator analogic
memorie de date nevolatil
circute de captur/comparare
ceas de gard (timer de tip watchdog)
interfa serial de comunicaii
interfa I2C
interfa serial periferic (SPI)
port USB

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

Resursele de comunicare ntre blocurile componente sunt


magistralele. Magistrala este un grup de linii cu caracteristici comune
funcionale, logice i electrice i cu posibilitatea de a permite
conectarea direct la ea a mai multor blocuri. Funcie de tipul de semnal
transmis exist magistral de adrese, de date i de comand i control.
Magistrala de adrese este unidirecional indicnd celula de
memorie sau dispozitivul de comunicare. Capacitatea memoriei este
dat de numrul de linii de magistral dac memoria este liniar.
Magistrala de date este bidirecional i stabilete mrimea
valorii nregistrate.
Magistrala de comand i control este bidirecional: indic
operaiile ce urmeaz a fi executate n urma decodificrii instruciunii,
poate elibera resursele sistemului, indic timpul de rspuns, etc..
Domeniile de utilizare ale microcontrolerelor sunt: robotic,
mecatronic, electronic medical, aeronautic, automobile,
electrotehnic, etc. Aceste dispozitive fiind utilizate n aproape toate
aplicaiile care necesit sisteme de: comand, control, supraveghere,
prelucrare n timp real.
Dezvoltarea i evoluia microcontrolerelor este n strns legtur cu
imitarea comportamentului din mediul nconjurtor. Dorina oamenilor de
a creea produse care realizeaz sarcini asemntoare cu cele din
natur a dus a dezvoltarea de algoritmi compleci pentru adaptarea
sistemului iar din nevoia de a avea rspuns n timp real ct mai rapid a
dus la dezvoltarea de arhitecturi complexe.
7
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Exemple de sisteme care folosesc microcontrolere:

Fig.1.5. Imitarea gesturilor a nceput utiliznd mecanica [1]

Fig. 1.6. Evoluia roboilor umanoizi [2]


8
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Motivele evoluiei arhitecturii microcontrolerelor sunt cerinele de pe
pia i dezvoltarea tehnologiei:
Nevoia de rspuns n timp real care a dus la perfecionarea
blocurilor din arhitectur
Nevoia de mai mult memorie pentru algoritmi evoluai
Numrul de dispozitive externe cu care comunic
microcontrolerul a crescut ceeea ce a dus la construirea mai multor
porturi de intrare/ieire i de comunicare
Alimentarea de la surse portabile a impus consum redus de
energie de aceea au aprut mai multe moduri de alimentare ale
blocurilor componente
Dorina de precizie a dus la dezvoltarea de convertoare ct mai
performante
Nevoia de supraveghere i comand de la distan a dus la
apariia unei stive TCP/IP i porturi de ieire de tip USB, Bluetooth, etc.

9
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Fig. 1.7. Sisteme da Vinci pentru operaii laparoscop [2]

Clasificarea microcontrolerelor se poate realiza funcie de:


Arhitectur (Harvard sau Von Neuman)
Lungimea cuvntului de date
Mrimea magistralei de adrese
Puterea de calcul dorit (timp de rspuns, frecvena de
lucru)
Aplicabilitate (dedicate sau de uz general)
Tip de instruciuni (CISC sau RISC)

Comparaii CISC i RISC la microcontrolere:


CISC - Set complex de instruciuni
un set de peste 80 instructiuni, multe din ele complexe si
specializate
10
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
instruciunile sunt diferite ntre ele: unele opereaz numai cu
anumite spaii de adrese sau registre, altele permit numai anumite
moduri de adresare, etc. Pentru programatorul care folosete limbaj de
asamblare exist unele avantaje prin utilizarea unei singure instruciuni
complexe n locul mai multor instruciuni simple (analog macro-
instruciunilor clasice).
Timp de execuie i spaiul ocupat de instruciuni 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 instruciuni - concept de realizare a unitii
centrale de execuie, care a nceput sa fie utilizat cu succes i la
construcia microcontrolerelor.
Vitez de calcul crescut;
Micro-circuit mai simplu
Caracteristicile asociate de obicei unui CPU RISC sunt:
arhitectura Harvard
vitez sporit de execuie prin paralelizare
memoria organizat n fiiere de lucru
set de instruciuni ortogonal (simetric): fiecare
instruciune opereaz cu orice spaiu de adrese (memorie) sau registru,
instruciunile nu prezint combinaii speciale, excepii, restricii sau
efecte colaterale.
Moduri de adresare redus
Registre interne mai multe ca la CISC

11
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Familii de microcontrolere
Firmele productoare de microcontrolere au realizat aceste
dispozitive studiind cerinele pieii pentru optimizarea produselor. Prima
firm, productoare este INTEL cu 8048 (Intel MCS-48 - www.intel.com
) - printele microcontrolerelor pe 8 bii. A doua generaie este 8051 pe
8 bii, aprut acum 20 ani i care este nc folosit i studiat. Au aprut
zeci de variante ale microcontrolerului 8051, produse de diveri
fabricani (Philips, Infineon, Atmel, Dallas, Temic, etc). S-a dezvoltat
aceast familie n sensul trecerii la o arhitectur similar (n mare), dar
pe organizat pe 16 bii, cu performane mbuntite ca vitez de
prelucrare: familia XA51 eXtended Arhitecture de la Philips i familia
80C251 (Intel). Generaia a treia este 80C196 (Intel MCS-96) -
microcontroler pe 16 bii. Destinat iniial unor aplicaii din industria de
automobile, are o arhitectur von Neumann, cu un spaiu de adresare
de 64KBytes, o unitate de intrri/ieiri numerice de mare vitez
(destinat iniial controlului injeciei la un motor cu ardere intern), ieiri
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 acelai microcircuit a 2
canale DMA, 2 numrtoare/timere, un sistem de ntreruperi i un
controler pentru DRAM.
O alt firm productoare de microcontrolere Motorola. Ca exemple se
menioneaz:
68HC05 - pe 8 bii derivat din microprocesorul M6800, destinat
n mod special unor aplicaii din industria automobilului.
68HC11, 68HC12, 68HC16 (Freescale) 68HC11 unul din cele
mai complexe microcontrolere pe 8 bii, are un spaiu de adrese unic de
64Ko, blocuri periferice ca: EEPROM, OTP, CAN, PWM, etc. Prezint
12
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
ca particularitate existena unui program de ncrcare rezident
(bootstrap loader n ROM intern) cu care, la reset, un segment n
memoria RAM extern poate fi ncrcat cu cod program prin intermediul
portului serial.
Variantele evoluate sunt de fapt microcontrolere de 16 bii:
"super 68HC11", numit 68HC12 bazat pe o nou unitate
central numit CPU12, care reprezint extensia la 16 bii a arhitecturii
HC11.
683xxx (Freescale) Microcontrolere pe 32 de bii 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 aprut acum 20
de ani. Este o familie de microcontrolere care s-a dezvoltat i sunt
disponibile actualmente sub forma a 6 serii: PIC10, PIC12, PIC14,
PIC16, PIC17 i PIC18. Au fost primele microcontrolere de 8 bii cu
arhitectur RISC: PIC16C5x avea un set de doar 33 instruciuni.
Arhitectura este de tip Harvard i, ca o particularitate, dimensiunea
cuvntului pentru program este de 12, 14 sau 16 bii, cuvntul de date
fiind 8 bii.
Familia Atmel cu AVR (Atmel- www.atmel.com ) - concurentul
seriei PIC este familia numit AVR, a firmei ATMEL, familie aprut n
ultimii ani, ofer variante de microcontrolere oarecum asemntoare ca
resurse cu familia PIC, la performane similare. Microcontrolerele din
aceast familie sunt bazate pe o arhitectur diferit, dar unitatea
central este tot de tip RISC, cu cuvntul de date de 8 bii, dimensiunea
cuvntului de program este de 16 bii.
13
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
National Semiconductors cu COP4(00) i COP8(00) COP4 este
un microcontroler pe 4 bii, categorie de microcontrolere care ocup un
segment relativ important al pieii. Printre caracteristici putem enumera:
memorie ROM local pn la 2K, memorie RAM local 32x4 pn la
160x4, Microwire, numrtoare/timere, tensiune de alimentare 2.3-6V,
numr mic de pini.
Zilog Z8 - derivat al microprocesorului Z80, reprezint un
compozit al mai multor arhitecturi diferite. Nu este compatibil cu setul de
instruciuni i nici cu perifericele standard Z80. Are trei spaii de adrese:
program, date i un masiv de registre. Resurse locale tipice: UART,
timere, DMA, sistem de ntreruperi cu pn la 37 de surseTMS370
(Texas Instruments- www.ti.com ) Microcontrolerul standard pe 8 bii al
firmei TI realizat n multe variante (de ordinul zecilor), prezint unele
asemnri cu 8051 (memoria de date local, stiva, modurile de
adresare). O varietate extrem de mare a resurselor locale.
Texas Instruments - ofer i o familie de microcontrolere de 16
bii cu arhitectura RISC, cu posibilitatea controlului compromisului vitez
de calcul/consum propriu, destinat aplicaiilor portabile (i nu numai),
denumit MSP 430. Cu un spaiu de adresare de 64Ko, are diverse
variante de realizare a memoriei interne de program (OTP, FLASH),
resurse diverse (printre care i o interfaa pentru un sistem de afiare
LCD).
AMD SC 3/4/5xx, Elan - deosebit de performante realizate n jurul
unei uniti centrale de tip 386/486. Permit practic, doar prin adugarea
de memorie extern, obinerea unui sistem de calcul compatibil PC,
destinat unor aplicaii de control ncapsulate-integrate ("embedded PC").
Infineon 80C16x - Unul din microcontrolerele de 16 bii foarte
utilizat n Europa. Arhitectur deosebit de performant a CPU, de tip
14
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
RISC, are diverse variante, cu resurse complexe: 80C165, 80C166,
80C167, etc.
Alte familii de microcontrolere Fujitsu Microelectronics
(www.fme.fujitsu.com) - ofer familii deosebit de puternice de
microcontrolere pe 8 bii (FMC-8), 16 bii (FMC-16) sau 32, sunt
orientate pe aplicaiile din industria de automobile sau din electronica de
consum.
ARM (Advanced RISC Machine) - este de fapt o unitate central
de 32 de bii (sau de 16/32 bii) care face parte din categoria structurilor
IP (Intelectual Property). Cele mai cunoscute i rspndite variante de
nuclee sunt ARM7 i ARM9, cu implementrile lor simplificate numite
ARM7T, ARM9T (T-Thumb).

Familii de microcontrolere clasificate dup arhitectur i set de


instruciuni:
CISC
Compatibile 8051 (Intel MCS-51)
MOTOROLA 8 bii
HitachiH8
Texas InstrumentsTMS 370
Compatibile x86
RISC
PIC
Atmel
ARM

Dezvoltarea i testarea aplicaiilor

15
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Fiecare tip de microcontroler are un set de instruciuni specific i
compilator dedicat. Programele realizate sunt depanate i testate prin:
Simulatoare - programe 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,
coninutul variabilelor i registrelor poate fi vizualizat i modificat.
Programul ruleaz mai ncet dect pe maina real. De regul exist
mijloace pentru evaluarea vitezei de execuie a codului simulat (ca
numr de cicluri main sau de stri). Ideal, acesta ar trebui s permit
i simularea complet a comunicrii cu toate perifericele
microcontrolerului.
Programele de depanare - programe (denumite uneori n
romn i programe "monitor") care ruleaz pe maina int
(microcontrolerul) oferind faciliti de depanare similare simulatorului.
Interfaa 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 avnd resurse
suficiente pentru a permite testarea i depanarea aplicaiilor uzuale.
Emulatoarele In Circuit (ICE-In Circuit Emulators) - este un
sistem dedicat care nlocuiete microcontrolerul, se conecteaz n locul
acestuia n sistemul pentru care se dezvolt aplicaia, n acelai timp
sunt disponibile toate facilitile descrise anterior. Permit un control total
al mainii int (n timp real), fr a folosi nimic din resursele acesteia (la
variantele cele mai costisitoare). Exemple de astfel de interfee ar fi:

16
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
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 simulrii ct mai complete a sistemului i a aplicaiei n
ansamblu. Simularea ntregii scheme 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 ataeaz componentele auxiliare (spre exemplu semafoare, led-uri,
memorii) i modele de microprocesoare. Acesta este mijlocul ideal
pentru proiectani 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 System-RTOS) - uureaz realizarea
aplicaiilor n timp real, dar aceasta nu nseamn c ele se vor executa
n timp real, aceasta depinznd de modul n care este utilizat acest
program la nivel de sistem. Microcontrolerul este considerat un
dispozitiv inteligent care are implementat algoritmi de adaptarea a
"comportamentului" sistemului la mediul nconjurtor. La noile generaii
de microcontrolere existena Bootloader aduce microcontrolerul la
performana unui calculator. Memoria de tip FLASH uureaz scrierea
n aceast memorie de program fr a utiliza un circuit de programare
extern.

17
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Moduri de adresare
Modurile de adresare se refer la felul n care apeleaz operanzii
unei instruciuni. Acestea influeneaz numrul referinelor la memorie
pentru obinerea operanzilor, complexitatea calculului adreselor i
flexibilitatea operaiilor care pot fi efectuate.
Memoria poate fi liniar sau logic. Adresa liniar poate fi apelat direct
prin adresa fizic iar cea logic este mprit 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 mpririi memorie n
segmente sau pagini este ca numrul de linii de magistral de adres
este mai mic dect numrul de bii de adres. Astfel c numrul de
segmente este diferit dar ele au aceleai adrese efective. Memoria
poate fi comparat cu un tabel n care numrul curent este adresa iar
coninutul tabelului este locaia de date. Nu este obligatoriu ca numrul
de bii pe care este scris adresa s fie egal cu numrul de bii pe care
se scrie coninutul de date.

Notaii : AE- adres efectiv


AF adres fizic
X - coninut de memorie

Adresarea imediat cel mai simplu mod de adresare al memorie.


Operandul este scris n cmpul instruciunii.
Adresarea direct codul instruciunii conine adresa efectiv a
operandului, nu este necesar un calcul al adresei. Dezavantajul este c
numrul de bii pe care este scris adresa este diferit de cel pe care
este scris instruciunea.
18
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Adresarea indirect adresa memoriei apelat este scris indirect
ntr-un registru sau ntr-o locaie de memorie. Deoarece mrimea
adresei este mai mare dect marimea registrului sau a locaiei de
memorie, 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 scrierea adresei n registre i apoi pentru
gsirea 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 combinaie ntre adresarea prin
registru i cea indirect. Codul instruciunii va conine adresa de baz i
numrul de locaii cu care se face saltul.
Adresarea relativ adresa de baz este considerat adresa
instruciunii n curs de execuie coninut n registrul numrtor de
program iar adresa cu care se face saltul este coninut ntr-un registru.
Adresarea indexat n acest caz valoarea cu care se face saltul este
nregistrat ntr-un registru index, adresa de baz fiind coninut n
cmpul de adres.
AE=A+(R)
Adresarea stivei este indirect prin intermediul unui registru dedicat
numit indicator de stiv care conine, n cazul adresei logice, adresa
efectiv. Adresa de baz este coninut ntr-un alt registru. Adresarea
stivei este de fapt o adresare implicit, instruciunile cu stiva nu conin o
referin la memorie.
Formatul instruciunilor ne spune despre prile componente ale
unei instruciuni. O instruciune codificat trebuie s conin un cod de
19
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
operaie, unul sau mai muli operanzi definii implicit sau explicit i
eventual se indic modul de adresare.
n acest capitol s-a prezentat microcontrolerul n general, urmnd
n celelate capitolele detalierea microcontrolerelor pe dispozitive
concrete.

20
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Capitolul 2

MICROCONTROLERE CISC I RISC

Se particularizeaz microcontrolerele de tip CISC i RISC pe


familiile Intel i Microchip realizndu-se comparaii la nivel de organizare
a memoriei, set de instruciuni 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 80C552.
Varianta de microcontroler RISC descris, spre comparaie cu 8051,
este PIC16F84 i dispozitive mai evoluate din aceeai familie.

2.1. Microcontrolerul Intel 8051


Microcontrolerul 8051 cu arhitectur Von Neuman, de tip CISC,
are un set de 80 instruciuni. Timpul de execuie i spaiul ocupat de
instruciuni difer funcie de tipul de instruciune.

2.1.1. Caracterisctici ale microcontrolerului 8051 [3]


Microcontrolerul 8051 este unul din cele mai cunoscute i utilizate
dispozive, caracteristicile sale sunt prezentate n multe lucrri, de aceea
sunt prezintate succint n continuare:
Tensiunea de alimentare de 5V10%
Consum n curent de: 16 mA n modul normal, 3,7 mA n modul
Idle i 50 mA n modul Power Down.
Magistrale pe 8 bii;

21
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Capacitatea memoriei ROM este de 4 Ko i a memoriei RAM de
128 octei;
Procesor boolean;
Unitate aritmetica si logica (ALU);
Porturi paralele n numr de 4 (8 pini fiecare) de intrare/ ieire
cu funcii multiple;
Comunicare cu o memorie extern de date sau program de
capacitate 64 Ko;
Conine dou numrtoare/ temporizatoare, independente;
Port serial UART full duplex;
Un set de instruciuni orientat pe aplicaii n timp real,
instruciuni simple i rapide;
Poate gestiona cinci surse de ntreruperi, cu dou nivele de
prioriti;
Are un oscilator intern, frecvena de oscilaie este dat de
quartzul extern (frecvena de oscilaie uzual este de 11,059
MHz).

Schema bloc simplificat este prezentat n Fig.2.1., se


evideniaz principalele blocuri componente din arhitectura
microcontrolerului 8051.

22
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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

2.1.2. Organizarea memoriei la microcontrolerul 8051


Comunicarea n interiorul microcontrolerului se realizeaz prin 8
linii de magistrale de: date, adrese i control. Coninutul unei locaii de
memorii de date sau de program este de un octet iar adresa este
reprezentat pe doi octei. Locaia de memorie fiind cea mai mic 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
creterea vitezei de prelucrare, avnd totui 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 spaiul
de adresare pentru memoria de program. Memoria de program poate fi
23
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
doar citit, fiind doar 4Ko interni, restul fiind externi iar pentru adresarea
lor se folosete semnalul PSEN (Program Store Enable). Adresa
memoriei program este transmis mai nti prin porturile P0 si P2 pe
magistrala de adrese. Portul P0 poate deveni port de date, octetul de
adres mai puin semnificativ A0-A7 este memorat n latch la activarea
semnalului ALE (semnal de selecie circuit STB). Semnalul /PSEN
devine activ i informaia din memoria de program este transmis pe
magistrala de date fiind recepionat prin portul P0 (Fig.2.2).

Fig. 2.2. Accesarea memoriei program externe

Adresarea memoriei program este liniar, adresa curent fiind


nregistrat n registrul PC (Program Counter) care se incrementeaz
singur dup execuia instruciunii curente. Valoarea cu care se
incrementeaz este dat de spaiul ocupat de instruciune n memoria
de cod. Dac pinul EA este 1 logic se acceseaz memoria intern dac
este 0 logic se acceseaz cea extern.

24
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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

Harta memoriei de date este prezentat n Figura 2.4. Adresele


pentru accesarea memoriei de date sunt coninute n registrul DPTR,
reperzentat pe doi octei ce port fi accesai individual (DPH, DPL). Zona
de adresare 0000h-00FFh se poate accesa cu registrele R0 sau R1 din
zona de registre cu funcii speciale. Validarea memoriei de date extern
25
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
se realizeaz cu semnalele /WR (scriere) i /RD (citire) generate de
microcontroler.
Memoria de date de tip RAM are capacitatea de 128 octei i
ocup zona 0000 - 00FFH din spaiul de adresare pentru memoria de
date (Fig. 2.3.). Zona 00 - 1FH este divizat n 4 blocuri de cte 8 octei
notate cu Blocul 03, fiecare avnd 8 registre R0-R7. Selecia 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 iniializare, unitatea central, CPU, ncepe execuia de la
adresa 0000 iar registrele R0-7 se suprapun peste Blocul 0. Stiva este
reprezentat n Blocul 1. Astfel registrul care conine 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 ncrcarea n
SP a unei valori care s corespund unei locaii 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 bii poate fi adresat individual. Exist
dou modaliti de a adresa biii din aceast zon. Una folosete adresa
lor: 00 - 7FH, cu 00 pentru bitul 0 de la locaia 20H i 7FH pentru bitul 7
de la locaia 2FH. Cealalt se refer la octeii 20H - 2FH. Astfel biii 00 -
07 pot fi adresai ca 20.0 - 20.7, biii 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 funcii
speciale (SFR) (Tabelul 2.1.) conine un grup de registre interne, cu

26
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
funcii speciale. Ele sunt adresabile n mod direct iar registrele ale cror
adrese se termin n 0 sau 8 pot fi adresate i la nivel de bit.
FF

Zon de memorie RAM de date

30
2F
Zon adresabil pe bit
20
1F Bloc 3 (R0-R7)
18
17 Bloc 2 (R0-R7)
10
0F Bloc 1 (R0-R7)
08
07 Bloc 0 (R0-R7)
00
Fig. 2.4. Zona de memorie RAM intern [3]

Acc - registrul acumulator, folosit cu simbolul A.

27
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
B: este un registru cu rol predeterminat n instruciunile de nmulire i
mprire. Pentru celelalte instruciuni, poate fi utilizat ca registru
general.
SP ("Stack Pointer"): este indicatorul de stiv. Este incrementat naintea
unei depuneri n stiv prin intermediul instruciunilor CALL sau PUSH.
Dup iniializare este ncrcat cu valoarea 07H deci stiva ncepe de la
adresa 08H. Poate fi ncrcat, prin program, cu orice valoare.
PSW ("Program Status Word"): este registrul de stare al programului.
Conine indicatorii de condiii cu urmtoarele semnificaii:
P ("Parity"): indicator de paritate; va fi 1 dac numrul de 1 din
acumulator este impar.
PSW.1: rezervat.
OV ("Overflow"): indicator de depire; se folosete atunci cnd se
lucreaz cu operanzi cu semn i indic apariia unui transport/ mprumut
n/ din rangul de semn ceea ce nseamn depirea domeniului de
valori care poate fi ncrcat ntr-un registru pe 8 bii.
RS1, RS0: bii de selecie a blocului din memoria RAM intern care se
suprapune peste grupul de registre R0-7, conform tab. 3.4.
F0: indicator la dispoziia utilizatorului.
AC ("Auxiliary Carry"): indicatorul de transport sau mprumut auxiliar;
indic un transport sau un mprumut ntre cei doi bii ai rezultatului unei
operaii de adunare sau scdere ntre 2 operanzi n cod BCD.
CY ("Carry"): indicatorul de transport sau mprumut; indic apariia unui
transport/ mprumut din/ n rangul cel mai semnificativ al acumulatorului
ca urmare a unei operaii de adunare/ scdere, ceea ce nseamn
depirea capacitii registrului.
DPH, DPL ("Data Pointer High, Low"): sunt registre pe cte 8 bii care
formeaz DPTR ("Data Pointer Register"), DPH este octetul mai
28
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
semnificativ i DPL octetul mai puin semnificativ . DPTR este folosit la
adresarea indirect a unei locaii din memoria extern i poate fi
accesat ca registru pe 16 bii sau ca 2 registre pe 8 bii.
TH0, TL0 ("Timer 0 Counter"): sunt dou registre care memoraz
rezultatul numrrii pe cte 8 bii care alctuiesc mpreun un
numrtor pe 16 bii pentru numtorul/ 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 recepia datelor, pe 2 otei.
P0, P1, P2, P3: sunt registrele ce corespund porturilor P0, P1, P2
respectiv P3. Dac un port este ieire i se scrie 1 sau 0 ntr-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 funciuni
speciale i nu pot fi adresate de programator. Acestea sunt:
PC ("Program Counter"): este un numrtor pe 16 bii care este
incrementat la fiecare citire de octet din memoria de program; el conine
adresa locaiei de memorie n care se afl urmtorul octet din
instruciune.
IR ("Instruction Register"): este un registru pe 8 bii n care se depune
octetul din instruciune adus n vederea decodificrii sale.
Accesarea memoriei de date sau cod externe se realizeaz prin
instruciuni dedicate cu mnemonice ca MOVX sau MOVC.

29
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Tabel 2.1. Registrele cu funcii speciale din zona SFR a
microcontrolerului 8051 [3]
Registr Adres de bit Adres
u b7 b6 b5 b4 b3 b2 b1 b0 de
registru
B F7 F6 F5 F4 F3 F2 F1 F0 F0H
ACC E7 E6 E5 E4 E3 E2 E1 E0 E0H
PSW D7 D6 D5 D4 D3 D2 D1 D0 D0H
IP BF BE BD BC BB BA B9 B8 B8H
P3 B7 B6 B5 B4 B3 B2 B1 B0 B0H
IE AF AE AD AC AB AA A9 A8 A8H
P2 A7 A6 A5 A4 A3 A2 A1 A0 A0H
SBUF 99H
SCON 9F 9E 9D 9C 9B 9A 99 98 98H
P1 97 96 95 94 93 92 91 90 90H
TH1 8DH
TH0 8CH
TL1 8BH
TL0 8AH
TMOD 89H
TCON 8F 8E 8D 8C 8B 8A 89 88 88H
PCON 87H
DPH 83H
DPL 82H
SP 81H
P0 87 86 85 84 83 82 81 80 80H

30
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
2.1.3. Moduri de adresare
La programarea microcontrolerului 8051 se pot utiliza mai multe
moduri de adresare ale datelor n cadrul instruciunilor [3,4,5].

1. Adresarea direct adresa unde se gsete valoarea cutat sau ce


urmeaz a fi memorat este specificat direct n codul instruciunii.
Acest mod de adresare permite accesarea memoriei de date intern i a
regitrilor cu funcii speciale.
Exemplu: MOV A,100h
Mut n acumulator valoarea de la adresa 100h.

2. Adresarea indirect adresa locaiei ce urmeaz a fi accesat este


specificat ntr-un registru. Prin acest tip de adresare se poate accesa
memoria RAM de date intern i extern.
Exemplu: MOV R1,100h
MOV A, @R1
Mut n acumulator valoarea de la adresa 100h, adresa fiind pstrat n
registrul R1.
Not - @ naintea unui registru indic adres.

3. Adresarea de valori imediate operandul este specificat n codul


instrucinii
Exemplu: MOV A,#100h
Mut n acumulator valoarea 100h.
Not - la semnul # specific o constant

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


registru.
31
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Exemplu: MOV R7,#100h
MOV A,R7
Mut n acumulator valoarea 100h dup ce aceasta a fost stocat n
registrul R7.
Atenie! MOV R7,100h
MOV A,R7
Mut n acumulator valoarea aflat la adresa 100h (prima linie conine o
adresare direct nu de valoare imediat ca i n cazul anterior)
Atenie! Nu toate tipurile de adresare pot fi folosite n cazul tuturor
instruciunilor. n tabelele cu descrierea instruciunilor exist 4 coloane
numite DIR, IND, REG, IMM care dac n dreptul unei instruciuni conin
un X specific faptul c acel tip de adresare (i.e. direct, indirect, de
registru i respectiv de valoare imediat) este permis la folosirea
respectivei instruciuni.

2.2. Microcontrolerului PIC 16F84


Microcontrolerul PIC are arhitectur RISC de tip Harvard, ca o
particularitate, dimensiunea cuvntului pentru program este de 12, 14
sau 16 bii, cuvntul de date fiind de 8 bii [6, 7, 8]. Noutatea introdus
de familia de microcontrolere Microchip este tipul de memorie intern de
tip flash. Memoria FLASH (Electrically Erasable Programmable 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 instruciuni, deoarece are arhitectur tip RISC numrul
de instruciuni este de 35, de dimensiune un cuvnt [6]. Toate
32
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
instructiunile sunt executate ntr-un ciclu cu excepia instruciunilor
JUMP i BRANCH. Conform datelor de catalog, PIC16F84 ajunge la
rezultate de 2:1 n compresia cod i 4:1 n vitez, comparativ cu alte
microcontrolere de 8 bii din clasa sa.
Viteza de operare n cc. - 20 MHz intrare de clock
- 200 ns ciclu instruciune
Memoria program are capacitate de 1024 cuvinte pe 14 bii adic
1Kcuvnt, capacitatea memoriei de date RAM de 68 octei i 64 octei
de EEPROM. Instruciunea este reprezentat pe 14-bii, magistrala de
instruciuni avnd 14 linii;
Octetul de date este reprezentat pe 8-bii
Zona de registre cu funcii speciale (SFR) situate n memoria
RAM are 15 registre
Stiva are 8 nivele
Modurile de adresare sunt direct, indirect i relativ
Sursele de ntreruperi sunt n numr de 4
- pin extern RB0/INT
- la depairea 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 numr de 13 acetia pot fi
multiplexai cu alte funcii 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
creterea siguranei n funcionare familia PIC16 are integrat un circuit
de protecie care genereaz un RESET la scderea tensiunii de
33
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
alimentare (Brown-Out Reset). Acest circuit poate fi validat sau invalidat
cu un bit de comand. Familia de microcontrolere PIC 16 a evoluat
avnd 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 stiv a microcontroller-ului este mai deosebit, respectiv


este implementat ntr-o zon special a memoriei interne i are
maximum 8 nivele nefiind permis citirea sau nscrierea acesteia prin
adresare direct. Instruciunile folosite pentru lucrul cu stiva sunt CALL,
GOTO, RETURN, RETFIE i RETLW putem introduce, respectiv
extrage informaii la nivelul stivei.
Observaie : Nu este prevzut nici un indicator de depire a
dimensiunii stivei, ceea ce poate duce la grave erori atunci cnd
numrul de apeluri sau de instruciuni GOTO este mai mare de 8.
Instruciunile procesorului au o lime de 14 bii i ele includ att codul

34
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
respectiv ct i operanzii afereni acestuia, respectiv adresa registrului
din zona registrului fiier i/sau indexul bitului corespunztor locaiei
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 are 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.
Mrimea memoriei program este de 1024 locaii cu lime de 14 bii,

35
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
locaiile zero i patru fiind rezervate pentru reset i pentru vectorul
ntrerupere. Memoria de date EEPROM are conform caracteristicilor
microcontrolerului, 64 de locaii de opt bii care nu-i pierd informaia la
oprirea sursei de alimentare. Aceast memorie poate fi adresat indirect
prin registrele EEADR i EEDATA. Scrierea informaiei n memorie are
o procedur strict pentru a preveni scrierea eronat. n registrul
EEADR se scrie adresa iar data, de la adresa trimis va fi citit sau
scris prin registrul EEDATA.
Memoria de date RAM are un spaiu de 68 de locaii de la adresa
0x0C la 0x4F unde se gsesc registre cu scop general, registrele cu
funcii speciale fiind localizate n primele 12 locaii mprite n 2 bancuri
0 i 1. Bancurile se pot selecta cu biii RP0 i RP1 din registrul
STATUS.

36
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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

Locaiile neimplementate se citesc cu 0. Bancul 0 se selecteaz prin


punerea n zero a celor doi bii RP0 i RP1 iar Bancul 1 prin combinaia
RP0 pe 1 logic iar RP1 pe 0 logic. Tabelul cu registre din zona SFR a
memorie RAM este prezentat n Anexa 1

Registrul STATUS - poate fi o destinaie pentru orice instruciune, cu


oricare alt registru.

IRP RP1 RP0 /T0 /PD Z DC C

37
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
C (Carry)- bit de transfer care este afectat la operaii aritmetice adunare,
scdere i transfer. Poate fi scris sau citit.
DC (Digit Carry) DC bit de transfer de la bitul 4 spre 5 n cadrul
registrului acumulator. Este afectat la aceleai operaii ca i C. Poate fi
scris sau citit.
Z (Zero) bit care indic un rezultat al operaiilor aritmetice zero, atunci
este n 1 logic. Poate fi scris sau citit.
PD (Power-down) - Bit ce indic alimentarea microcontrolerului, dup
fiecare reset obinuit i dup executarea instruciunii CLRWDT.
Instruciunea SLEEP l reseteaz cnd microcontrolerul intr n regimul
consum redus. Setarea lui repetat este posibil prin 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 depirea watchdog-ului. Bitul este resetat
cnd watchdog-ul ajunge la sfrit semnalnd c ceva nu este n ordine
i este setat la alimentare sau dup rularea instruciunilor CLRWDT i
SLEEP. Poate fi doar citit.
RP1:RP0 (Register Bank Select) bii pentru selecia bancurilor de
registre din memoria RAM. Aceti doi bii sunt partea superioar a
adresei la adresarea direct. Pentru c instruciunile ce adreseaz
memoria direct au doar apte bii, ei au nevoie doar de nc un bit
pentru a adresa cei 256 octei adic ci are PIC16F84. Poate fi citi i
scris.
IRP (Register Bank Select) bit de selecie a adreselor folosit la
adresarea indirect a memoriei RAM. Poate fi scris i citit.

38
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Registrul de Contorul de Program (PC) - este un registru de 13 bii
specific pentru adresarea si aducerea instruciunilor, conine adresa
instruciunii ce se execut. Prin incrementarea sau schimbarea sa (ex.
n caz de salturi) microcontrolerul execut instruciunile de program pas-
cu-pas. Acest registru poate fi apelat pe 8 i 5 bii 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 bii cu rolul de a memora temporar valorile


registrelor n cazul unui salt sau ntrerupere.

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 nti
separai de liniile montajului, ca s nu apar erori n timpul programrii.

2.2.3. Moduri de adresare memorie


n cazul memorie RAM adresarea poate fi direct sau indirect.
Adresarea direct a memorie RAM se realizeaz printr-o adres de 9
bii. Aceast adres este obinut prin conectarea celui de-al aptelea
bit al adresei directe a unei instruciuni cu doi bii (RP1, RP0) din
registrul STATUS (Fig.2.8).
Adresarea indirect a memoriei RAM se realizeaz cu bitul IRP i
registrul FSR. Locaia adresat este accesat prin registrul INDF care
de fapt conine o adres indicat de FSR. Orice instruciune care
folosete INDF ca registrul ei, acceseaz datele indicate de un registru
39
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
FSR. De exemplu un registru cu scop general (GPR) la adresa 0Ch
conine o valoarea 23. Prin scrierea unei valori 0Ch n registrul FSR
vom obine un registru indicator la adresa 0Ch, iar prin citirea din
registrul INDF, vom obine valoarea 23, ceea ce nseamn c am citit
din primul registru valoarea lui fr 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 probleme care cer
doar adresarea indirect. Bitul IRP selecteaz bancul.

Fig. 2.8. Adresarea Direct a memoriei RAM [6]

40
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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

Numrtorul de program
Numrtorul de programe (PC) este reprezentat pe 13 bii,
specific pentru adresarea i aducerea instruciunilor poate fi impartit in
PCL care poate fi scris sau citit, i PCH (12:8) bii care nu este citit sau
scris direct. Dac PC este modificat sau un test de condiie este
adevarat, instruciunea ce se execut necesita 2 cicluri, al doilea ciclu
fiind executat ca un NOP. Toate actualizarile registrului PCH trec prin
PLATH.

Setul de instruciuni
Programarea microcontrolerelor se realizeaz n limbaj de
asamblare sau C. Mnemonicele limbajului de asamblare sunt specifice
familiei de microcontrolere, particularizate pentru fiecare tip de

41
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
microcontroler. Instruciunile sunt mprite pe clase, funcie de rolul lor
n execuie. Microcontrolerele de tip CISC avnd un numr mai mare de
instruciuni are i un numr mai mare de tipuri (clase) pe cnd la cele de
tip RISC instruciunile i clasele sunt mai puine, inclusiv numrul de
instrucini este mai mic dect la CISC. De accea numrul de pai
(instruciuni) pentru realizarea unui proces la CISC este mai mic dect
la RISC. Programele realizate n C sunt mai scurte, existnd funcii
dedicate perifericelor fiecrei familii de microcontrolere. Compilarea
programelor este realizat cu compilatoare specifice fiecrei familii de
microcontrolere i pentru fiecare tip de microcontroler. Paii de aducere
a instruciunii din memoria program n unitatea central de procesare
(Fig. 2.10) sunt: UCP trimite adresa prin PC i se aduce instruciunea,
ce urmeaz a fi executat, n registrul de instruciuni IR.

Fig. 2.10. Schema bloc privind calea urmat de instruciunii pn la


UCP

Setul de instruciuni la microcontrolerul 8051


42
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
La microcontrolerul 8051 instruciunile sunt mprite n urmtoarele
tipuri, care sunt apoi detaliate n tabele.
1. Instruciuni de transfer de date n memoria intern de date, de
program, stiva
2. Instruciuni de transfer de date n memoria extern
3. Instruciuni aritmetice
4. Instruciuni logice pe bit i octet
5. Instruciuni de lucru cu subrutinele
6. Instruciuni de salt condiionat i necondiionat

Instruciunile sunt executate n unul sau doi cicli main, ca


desfurare n timp iar ca desfurare n spaiu sunt instruciuni scrise
pe unul sau doi octei.
Un ciclu main este mprit la acest tip de microcontrolere n ase
perioade egale de execuie, notate de la S1 la S6. Fiecare din aceste
perioade necesit pentru execuie 2 perioade de ceas. Un ciclu main
este format din 6 pri a cte 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 execuie pentru o instruciune scurt este de 1 sec, iar pentru
una lung este de 2 sec [3, 4].
Tabelele de mai jos conin pe coloane, n ordine, mnemonica (adic
forma sub care trebuie s fie scris instruciunea n cadrul programului),
operaia efectuat, tipurile de adresare posibile (dup cum este explicat
mai sus) i, pe ultima coloan, durata instruciunii n microsecunde
pentru un ceas de 12 MHz.

43
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Tabelul 2.2. Instruciuni de transfer de date n memoria intern [3]
Descrierea formal a 1 2 3 4

Nr octei
afectate
Flaguri
Nr cicli
Instruciu
instruciunii
ni

MOV A,s (A) (s) x x x X - 1 1

Transfer
de date
ntre
registre i
acumulator
MOV d, A (d) (A) x x x - - 1 1

Transfer
de date
ntre
registre i
acumulator
MOV d,s (d) (s) x x x X - 2 2

Transfer
de date
ntre
registre
MOV (DPTR) data16 - - - X - 3 3
DPTR,#dat
a16

44
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

ncrcare
constant
n registre
MOV (d) data8 - - - X - 1 1
d,#data8

Transfer
constant
n registru
MOV adr, (adr) data8 - - - X - 1 1
#data8

Transfer
constant
n memorie
MOV @d,s ((d)) s - x - - - 1 1

Transfer
indirect a
coninutulu
i registrului
s n
memorie la
adresa
indicat n
registrul d

45
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

PUSH s (SP)(SP)+1, x - - - - 2 2
((SP))(s)
Salvare
coninut
registru n
stiv
PUSH PC (SP)(SP)+2, - - - - - 1 1
(((SP)+1)(SP))(PC)
Salvare n
stiv
coninut
PC
POP d (d)((SP)), x - - - - 2 2
(SP) (SP)-1
Salvare n
registru din
stiv
POP PC (PC)((SP)+1)(SP)) - - - - - 1 1
(SP)(SP)-2
Salvare n
registru PC
a
coninutulu
i stivei
XCH A,s (A) (s) x x x - - 1 1

Interschim

46
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

bare
coninut
registre
XCHD (A) (Ri) - x - - - 1 1
A,@Ri

Interschim
bare
coninut
acumulator
cu
memoria

Tabelul 2.3. Instruciuni de transfer de date din memoria program


extern [3]
Descrierea
afectate
Flaguri

Nr cicli

Nr octei
Adresare
indexat

Instruciuni formal a
instruciunii

MOVC A,@A+DPTR (A)((A)+(DPTR)) x 3 1

Citete coninutul
memorie program cu
registrul DPTR n
registrul acumulator
MOVC A,@A+PC (A)((A)+(PC)) x 3 1

Citete coninutul

47
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

memorie program cu
registrul PC n registrul
acumulator

Tabelul 2.4. Instruciuni aritmetice pe octet [3]


Descrierea formal 1 2 3 4

afectate
Flaguri
Nr. octei

Nr. cicli
Instruciuni a
instruciunii

ADD A, s (ACC) (ACC) + (s) x x x x Cy,A 1 1


C,OV
Adunarea dintre
coninutul unui
registru i
coninutul
acumulator
ADD A,Ri (ACC) (ACC) + (Ri) x - x - Cy,A
C,OV
Adunarea dintre
coninutul unui
1 1
registru din
bancul de registre
cu coninutul
acumulator
ADD A,#data8 (ACC) (ACC) + x - x - Cy,A
data8 C,OV
1 1
Adunarea unei
constante la

48
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

coninutul
acumulatorului
ADD A,@Ri (ACC) (ACC) + - x - - Cy,A
((Ri)) C,OV

Adunarea 1 1
coninutului unei
locaii de memorie
la acumulator
ADDC A, s (ACC)(ACC)+(s)+ x x x x Cy,A 1 1
Adunarea (CY) C,OV
coninutului unui
registru cu
acumulatorul i cu
bitul de transport
Cy
SUBB A, s (ACC) (ACC) - (s) - x x x x Cy,A 1 1
(CY) C,OV
Scderea , S, Z
coninutului unui
registru din
registrul
accumulator
INC A (ACC) (ACC) + 1 - - x - - 1 1

Incrementarea cu
1 a coninutului

49
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

acumulator
INC s (s) (s) + 1 x x x - - 1 1

Incrementarea cu
1 a coninutului
unui registru
INC DPTR (DPTR) (DPTR) + - - x - - 1 3
1
Incrementarea cu
1 a coninutului
registrului DPTR
DEC A (ACC) (ACC) - 1 - - - - - 1 1
Decrementare cu
1 a coninutului
acumulatorului
DEC s (s) (s) 1 x x x - - 1 1

Decrementare cu
1 a coninutului
unui registru
MUL AB (B) (A) (B) * (A) x x - x Cy, 1 5
OV,
nmulirea dintre S
coninuturile
registrelor A i B
DIV AB (A) (A) div (B), x x - x Cy, 1 5
(B) (A) mod (B) OV,

50
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

mprirea S
coninutului
registrului B la
coninutul
registrului A
DA A x x - - Cy, 1 1
OV
Ajustarea
zecimal a
coninutului
registrului A

Tabelul 2.5. Instruciuni de lucru cu variabile booleene [3]


Descrierea formal 1 2 3 4
afectate
Flaguri
Nr cicli
Nr octei
Instruciuni a instruciunii

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

51
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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
direct direct mod x x x x x 1 2
XRL direct,A
(A)
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
(An+1) (An)n=0-6, x x x x x 1 1
RL A
(A0) (A7)
(An+1) (An)n=0-6, x x x x Cy 1 1
(A0) (C)
RLC A
(C) (A7)

(An) (An+1)n=0-6, x x x x x 1 1
RR A
(A7) (A0)
(An) (An+1)n=0-6, x x x x Cy 1 1
(A7) (C)
RRC A
(C) (A0)

SWAP A (A3-0)(A7-4) x x x x x 1 1
INSTRUCIU
NI PE BIT
ANL C,bit (C) (C)&bit x x x x Cy 1 1

I logic ntre

52
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Cy i un bit
ANL C,/bit (C) (C)&/bit x x x - Cy 1 1

I ntre Cy i
un bit negat
ORL C,bit (C) (C)bit x x x x Cy 2 2

SAU ntre Cy
i un bit
ORL C,/bit (C) (C) /bit - - - x Cy 3 3
SAU ntre Cy
i un bit
negat
MOV,bit,C (C) bit x - - - Cy 2 2

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

53
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Setare Cy
SETB bit bit 1 - - - - - - -
Setare bit
CPL C (C)NOT(C) - - - - Cy - -
Complement
Cy
CPL bit bitNOT bit - - - - - - -
Complement
pe bit

Tabelul 2.6. Instruciuni de salt necondiionat [3]


Descrierea formal a 1 2 3 4
afectate
Flaguri
Nr. octei
Nr. cicli
Instruciuni instruciunii

(SP)(SP)-2, x - - - -
((SP)+1)((SP))(PC
)
ACALL adr11 2 3
(PC)(PC) I
1111100000000000
SAU 00000adr11
(SP)(SP)+2, x - - - -
LCALL adr16 ((SP)+1)(SP))(PC) 3 4
(PC)adr16
(PC) ((SP)+1) x - - - -
RET 1 4
((SP))

54
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

(SP) (SP)+2
(PC) ((SP)+1) x - - - -
RETI ((SP)) 1 4
(SP) (SP)+2
(PC)(PC) I x - - - -
1111100000000000
AJMP adr11 2 3
SAU00000 adr11

LJMP adr16 (PC) adr16 x - - - - 3 4


SJMP rel (PC) (PC)+rel - x - - - 2 3
JMP (PC) ((A)+(DPTR)) x x - - -
1 3
@A+DPTR

Tabelul 2.7. Instruciuni de salt condiionat [3]


Descrierea formal 1 2 3 4
Flaguri
Nr octei
Nr cicli
afectate
a instruciunii
Instruciuni

Dac Cy=1 x - - - -
JC rel 2 3
(PC) (PC)+rel
Dac Cy=0 x - - - -
JNC rel 2 3
(PC) (PC)+rel
Dac bit=1 x - - - -
JB bit,rel 3 4
(PC) (PC)+rel
Dac bit=0 x - - - -
JBC bit,rel 3 4
(PC) (PC)+rel

55
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Dac (ACC) = 0 - - - - -
JZ rel 2 3
(PC) (PC)+rel
Dac (ACC) 0 (PC) - - - - -
JNZ rel 2 3
(PC)+rel
CJNE Dac (ACC) (Rx) - - - - -
3 4
A,Rx,rel (PC) (PC)+rel
CJNE Dac(A)((PC)+1) - - - - -
3 4
A,#X,rel (PC) (PC)+rel
Dac (Rn) 0 x - x - -
DJNZ Rn,rel (Rn) (Rn)1; 2 3
(PC) (PC)+rel
NOP Ateapt - - - - - 1 1

Notaii utile:
A. Notarea modului de adresare n tabelele cu instruciuni:
1 adresare direct
2 adresare indirect
3 adresare la registru
4 adresare imediat
B. Notaii utilizate n descrierea formal a instruciunii
s registru surs
d registru destinaie
() se refer la coninutul unui registru
(( )) se refer la coninutul locaiei de memorie al crei adres se
afl memorat ntr-un registru
data8 constant reprezentat pe 8 bii
data16 constant reprezentat pe 16 bii

56
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
- asignare
- concatenarea.
O comparaie ntre microcontrolerele de tip CISC i RISC privind setul
de instruciuni va fi realizat ntre cele dou tipuri 8051 cu PIC16F84.
Instruciunile la microcontrolerul PIC16F84 sunt clasificate dup:
1. Instruciuni octet-orientate
Acestea au stuctura de forma :
13 87 6 0
Optcode d f(fiier#)
d = 0 pentru destinaie w (acumulator)
d = 1 pentru destinaie f
f = adresa registru fiier identificator din harta memoriei pe 7
bii
Aceste instruciuni desemneaz n general operaii pe care UAL trebuie
s le execute; Pentru operaii diadice, operanzii sunt acumulatorul
implicit i locaia de memorie. Falg-ul d specific registrul destinaie n
care se memoreaz rezultatul operaiei sau al transferului, dac acesta
este 0, atunci rezultatul este reinut n registrul w, dac nu el este reinut
n registrul f din File Register.

2. Instruciuni bit-orientate
13 10 9 7 6
0
Optcode d f(fiier#)
b = specific bit de adres, este reprezentat pe 3 bii
f = adresa registru fiier identificator din harta memoriei pe 7
bii

57
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
3. Instruciuni literale i de control

13 87 0
Optcode k

k = valoare imediat ce este inclus n corpul instruciunii pe 8


bii

13 11 10 0
Optcode K
K = valoare imediat ce este inclus n corpul instruciunii pe 11 bii
Dimensiunea unei instruciuni este de 14 bii. Toate instruciunile
ocupnd acelai spaiu de memorie iar timpul de execuie fiind de 1
maxim 2 cicli main.

Tabelul 2.7. Instruciuni de transfer de date


Mnemonic Descriere Timp Indicatori
formal execuie condiie
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) 1 -
f(3 :0)(7 :4)

58
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Tabelul 2.8. Instruciuni aritmetice i logice
Mnemonic Descriere formal Timp Indicatori
execuie condiie
ANDWF f,d Dac d=1 (f)(f) (w) 1 Z
Dac d=0 (w)(f) (w)
ANDLW k (w) (w) k 1 Z
ADDWF f,d Dac d=1 (f)(f) 1 C, DC, Z
+(w)
Dac d=0 (w)(f)+(w)
ADDLW k (w)k+(w) 1 C, DC, Z
SUBWF f,d Dac d=1 (f) (w)-(f) 1 C, DC, Z
Dac d=0 (w)(w)-(f)
SUBLW k (w)(w)-k 1 C, DC, Z
IORWF f,d Dac d=1 (f)(f) (w) 1 Z
Dac d=0 (w)(f) (w)
IORLW k (w) (w) k 1 Z
XORWF f,d Dac d=1 (f)(f)XOR(w) 1 Z
Dac d=0 (w)(f) XOR (w)
XORLW k (w) (w) XOR k 1 Z
DEC f,d Dac d=1 (f)(f)-1 1(2) -
Dac d=0 (w)(f) -1
INC f,d Dac d=1 (f)(f)+1 1(2) -
Dac d=0 (w)(f) +1
RLF f,d (f.0)(C) 1 C
(C)(f.7)
RRF f,d (f.7)(C) 1 C
(C)(f.0)

59
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

COMF f,d Dac d=1 (f)/(f) 1 Z


Dac d=0 (w)/(f)

Tabelul 2.9.Instruciuni pentru operaii pe bit


Mnemonic Descriere formal Timp Indicatori
execuie condiie
BCF f,b (f.b)0 1 -
BSF f,b (f.b)1 1 -

Tabelul 2.10. Instruciuni de direcionare a unui bit de program


Mnemonic Descriere formal Timp Indicatori
execuie condiie
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 1(2)
Z=0
Dac d=0 (w)(f) -1, salt
dac Z=0
INCFSZ f,d Dac d=1 (f)(f)+1, salt 1(2)
dac Z=0
Dac d=0 (w)(f) +1, salt
dac Z=0
GOTO (PC)adresa etichet 2
eticheta
CALL stiv(PC) 2
eticheta (PC)adresa etichet
RETURN (PC) adresa stiv 2

60
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

RETLW k (w) k 2
(PC)TOS
RETFIE (GIE)1 2
(PC)adres din stiv

Tabelul 2.11. Instruciuni diverse


Mnemonic Descriere formal Timp Indicatori
execuie condiie
NOP - 1 -
CLRWDT (WDI)0 1 /TO,/PD
(IQ)1, (PD)1
SLEEP (WDI)0 1 /TO,/PD
(IQ)1, (PD)0

Exemplu: Etapele de execuie a instruciunii MOVLW (Fig.2.8.)


1. ncrcare adres memorie program n PC;
2. Aducerea instruciunii n registrul de instruciuni (IR);
3. Decodificarea instruciunii n blocul de decodare i control
(IDC);
4. Transmisia comenzilor ctre blocurile de alimentare, oscilator,
watchdog i blocul de execuie, de ctre blocul de comand i
control (IDC). Comenzile depind de optcodul instruciunii;
5. Constanta coninut de instruciune este transmis ctre 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.

61
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Fig. 2.11. Paii de execuie a instruciunii MOVLW

2.2.4. Porturile de intrare/ieire


Prin port se nelege un grup de pini ai unui microcontroler ce pot fi
accesai simultan din interior sau exterior. Exist un registru n interiorul
unui microcontroler conectat la pinii microcontrolerului. Starea biilor din
componena registrului este transmis la pini n nivele logice de
tensiune. Porturile sunt cele mai simple i utilizate dispozitive de
intrare/ieire. Microcontrolerul le folosete pentru a monitoriza sau
controla alte componente sau aparate. Pinii microcontrolerului au mai
multe funcii de aceea trebuie setai. Iniializarea lor se realizeaz n
registrele de configurare. Selectnd una din funcii celelalte sunt
dezactivate. Fiecare linie a portului poate fi folosit independent ca
62
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
intrare sau ca ieire. Se particularizeaz n continuare porturile la PIC
16F84.
La PIC16F84 pentru a defini un pin ca intrare sau ca ieire, trebuie
scris combinaia corect n registrul TRIS. Dac n bitul ce are aceeai
poziie cu numrul pinului este scris "1" logic n registrul TRIS, acel pin
este pin de intrare, iar dac este valabil contrariul, este un pin de ieire.
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 funcie dual. La acel pin se afl de
asemenea o intrare extern pentru timer-ul TMRO. Una din aceste dou
opiuni este aleas prin setarea sau resetarea bitului TOCS. Acest pin
permite timer-ului TMRO sa-i creasc starea fie de la oscilatorul intern
fie prin impulsuri externe la pinul RA4/T0CKI.

63
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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

PORTB are 8 pini, registrul adecvat pentru direcia datelor este


TRISB la adresa 86h. Setarea unui bit n registrul TRISB definete pinul
portului corespunztor ca pin de intrare, i resetarea unui bit n registrul
TRISB, definete pinul portului corespunztor ca pin de ieire. Fiecare
pin la PORTB are un rezistor slab intern pull-up (scoatere) (rezistor care
definete o linie la unu logic) care poate fi activat prin resetarea celui
de-al aptelea bit RBPU n registrul OPTION. Aceti rezistori 'pull-up' se
nchid automat cnd pinul portului este configurat ca o ieire. Cnd
pornete microcontrolerul, 'pull-up'-ii sunt dezactivai.

64
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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


[6]

Pinii RB7:RB4 pot cauza o ntrerupere, care se ntmpl cnd starea


lor se schimb de la unu logic la zero logic i invers. Numai pinii
configurai ca intrare pot cauza aceast ntrerupere s se ntmple.
Opiunea de ntrerupere cu rezistorii 'pull-up' fac mai uoar rezolvarea
problemelor.

65
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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

66
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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

Dac nu este ataat nimic la pin, rezistena intern de pull-up va


determina citirea unui unu logic la pin. Dac linia este forat exterior n
zero logic, etajul va genera curent prin rezistena de pull-up, iar
informaia citit va fi un zero logic.

2.3. Comparaii privind instruciunile la microcontrolerele CISC i


RISC. Particularizare pe 8051 i PIC16F84
Microcontrolerul de tip CISC, 8051 are instruciuni dedicate pentru
lucrul cu stiva (PUSH i POP, RETURN, IRET, CALL) pe cnd cel de tip
RISC, PIC16F84 folosete instruciuni precum CALL, GOTO, RETURN,

67
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
RETFIE i RETLW, cu care putem introduce sau extrage date la nivelul
stivei.
La PIC16F84, sunt 8 nivele de stiv i nu este prevzut indicator de
depire a dimensiunii ceea ce poate genera eroare dac numrul de
apeluri ale acesteia sunt mai mari de 8.
Din tabelele cu instruciuni de mai sus se observ c numrul de
instruciuni de transfer de date la PIC16F84 este de 4 ceea ce mrete
numrul de instruciuni n cadrul unui program pentru acest tip de
microcontroler i n general pentru RISC.
La tipul de instruciuni aritmetico-logice pentru PIC 16F84 nu exist
instruciuni n care s foloseasc bitul de transport i lipsesc cele care
realizeaz nmulirea i mprirea ceea ce mrete mult programul i
timpul de execuie. Microcontrolerele de tip RISC au blocuri dedicate
pentru ultimele operaii, realizate prin logica cablat, astfel c timpul de
execuie a acestor instruciuni este la fel ca al celorlalte. De asemenea
la instruciunile de test pe bit pentru PIC 16F84 avem doar dou
acestea verificnd un bit din filierele din zona GPR.
Un alt tip de instruciuni sunt de comparare care la PIC16F84
folosesc incrementarea sau decrementarea coninutului unui fiier,
coninut care se compar cu valoarea 0, realizndu-se saltul pentru
instruciunea ce urmeaz a fi executat. La microcontrolerul 8051, sunt
instrudiuni de comparare a coninutului a dou registre sau a unui
registru cu o constant saltul realizndu-se la o adres specificat n
cadrul instruciunii.
Microcprocesoarele de tip RISC au evoluat foarte mult viteza de
calcul a instruciuniloe se apropie de cea a microprocesoarelor existnd
instruciuni dedicate de lucru n pipeline (paralel). Viteza de lucru a

68
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
crescut prin realizarea de blocuri dedicate pentru execuia instruciunilor
complicate rapid aproape la fel ca cele simple [4].
Datorit setului redus de instruciuni la PIC16F84, mai ales a
numrului mic de instruciuni de lucru cu memoria modurile de adresare
sunt puine.
Programarea microcontrolerelor n C este mai simpl, multe din
funcii i instruciuni fiind aceleai pentru toate tipurile de
microcontrolere. O deosebire major poate fi n declarerea variabilelor
la spaiul alocat i spaiul de lucru pentru aceeai variabil funcie de
familia de microcontrolere.
n capitolele urmtoare se vor prezenta programme realizate att n
asamblor ct i n C pentru cele dou tipuri de microcontrolere studiate.

Programarea n C a microcontrolerelor
Noiuni de baz
Moduri de definire a variabilelor
A. Const data este doar citit
B. Static variabil accesibil unitii de compilare curente. Este activ
global i iniializat cu zero
C. Auto variabila exist doar cnd procedura este activ. Aceasta este
by defaut, i este necesar s se utilizeze AUTO.
D. Double - este un cuvnt rezervat dar nu este un tip de data suportat.
E. Extern variabil utilizat de mai multe uniti 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 efect
G._ fixed(n) creaz un numr zecimal unde n indic numrul de
zecimale
69
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
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 execuiei.
K. Void indic o variabil a crui tip este nespecificat n locul n care
este cerut tipul
L. _readonly doar citit

Tipuri de variabile i spaiul de memorie ocupat de fiecare


Short int (int1) 1 bit 0 sau 1
Int (int8) 8 bii 0 la 255
Long int (int16) 16 bii 0 la 65553
Int32 32 bii 0 la 4294967295
Char 8 bii 0 la 255
-38 38
float 32 bii 3x10 la 3x10

Directive de preprocesare

#DEFINE id text sau #DEFINE id(x,y...) text nlocuiete 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

70
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
#ERROR text foreaz compilatorul s genereze o eroare n locul
unde aceast directive apare m fiier. Textul poate include macrouri ce
pot fi afiate.

#fill_rom value specific data cu care se umple zona de memorie


nefolosit. Dac se unesc mai multe uniti de compilare, aceast
directiv trebuie fi utilizat la fel n fiecare unitate.

#INCLUDE "filename" include calea pentru informaii. Fiierul a crui


nume este specificat prin filename este copiat la compilare n program.

#INT_xxxx indic o funcie de ntrerupere. Funcia de ntrerupere nu


trebuie s aib ali parametric. Compilatorul salveaz/rencarc
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 segment fixeaz programul, funcia 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 spatial memoriei RAM ce se rezerv
pentru a fi utilizat de compilator. Aceast directive trebuie s apar dup
#DEVICE.

71
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
#TYPE standard-type=size sau #TYPE default=area - trateaz SHORT
ca un bit , INT ca 8 bii, i LONG ca 16 bii. 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 nelege o
regiune de memorie definite nainte de #TYPE folosind directive de
adres.

#pragma directive utilizat s menin compatibilitatea ntre


compilatoarele C. Compilatorul accept directive naintea oricrei
comenzi de pre-procesare.

#inline-implementeaz funcia n linie


#priority-seteaz prioritile de ntrerupere. Cea mai mare prioritate este
pus prima pe list.

#use delay(clock=.)-directiv care specific frecvena


microcontrolerului.

Funcii des ntlnite


Output_low()-seteaz pinii portului pe nivel sczut de tensiune
Output_high()-seteaz pinii portului pe nivel nalt de tensiune

Delay_us()-ntrziere de un numr specificat de s

n ANEXA 7 i 8 sunt prezentate cuvintele cheie din C ct i operatorii .

72
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Capitolul 3

SISTEMUL DE NTRERUPERI

Dispozitivele periferice din interiorul microcontrolerului pot fi testate


n timpul execuiei unui proces prin dou metode, prin pooling adic
este testat un bit indicator dedicat acelui dispozitiv care i schimb
starea la terminarea execuiei sarcinii sau prin ntreruperi. A doua
metod a fost introdus pentru creterea vitezei de calcul, executndu-
se n paralel mai multe sarcini n cadrul aceluiai microcontroler.
Sistemul de ntreruperi este utilizat pentru comutarea din programul
principal, ntr-o rutina de ntrerupere atunci cnd un dispozitiv periferic a
terminat procesul de execuie, unitatea central de procesare executnd
programul principal n timp ce dispozitivul periferic i execut sarcina.
Cnd se lucreaz n ntreruperi, microcontrolerul este atenionat prin
setarea unui bit indicator de ntreruperi generale i a unui bit indicator
dedicat perifericului care urmeaz s execute sarcina. Aceti bii se
regsesc ntr-un registru al microcontrolerului denumit de obicei registrul
de ntreruperi. Dac mai multe periferice lucreaz n paralel i i
termin sarcina n acelai timp, microcontrolerul va face saltul la
ntreruperea mai prioritar care este setat n rutina de iniializare.
Microcontrolerele au registre de prioritate prin care programatorul poate
s seteze biii de prioritate indicnd prin acetia la care rutin de
ntrerupere face saltul n cazul terminrii n paralel a sarcinilor. Perioada
apariiilor ntreruperilor n timp real este programabil.
Ce nseamn ntrerupere din punct de vedere al programului? n
momentul declanrii unei ntreruperi se oprete programul principal,
73
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
dup execuia instruciunii n curs de execuie i se va realiza un salt la
o adres, specificat de furnizorul microcontrolerului, unde se va gsi o
subrutin de ntrerupere. n momentul n care se face acest salt, adresa
programului principal i eventual coninutul unor registre sunt salvate
automat n stiv pentru a fi recuperate dup revenirea din zona de
ntreruperi care se face la execuia instruciunii. Dac este necesar ca
anumite registre s fie salvate n stiv, se vor utiliza instruciuni de lucru
cu stiva specifice fiecrei familii de microcontrolere, dac acestea
exist. Cnd se realizeaz saltul la vectorul de ntrerupere specificat,
numrtorul de program este ncrcat cu aceast adres. Fiecare
microcontroler are specificat n datele de catalog un tabel de vectori de
ntreruperi care conine adrese i corespondenele 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 nemascabile. ntreruperile
namascabile nu pot fi neglijate de catre unitatea central de procesare
i sunt tratate atunci cnd 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 comparaie ntre cele dou sisteme de ntreruperi realizate
pentru microcontrolerele CISC i RISC.

74
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Paii de execuie a unei ntreruperi [24]

3.1. ntreruperi la microcontrolerul 8051


Microcontrolerul 8051 are cinci surse de ntreruperi provenite de la
timer/numrtor 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. biii care
trebuie programai sunt reprezentai ca ntreruptoare iar cei care i
schimb starea la generearea ntreruperii provenit de la perifericul
indicat n partea de iniializare a programului sunt indicate n csue.

75
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Fig.3.1. Schema bloc a sistemului de ntreruperi la microcontrolerul


8051

Activarea ntreruperii se realizeaz prin program, n zona de


iniializare. Se vor seta biii indicatori pentru ntreruperi generale i cei
specifici perifericelor utilizate care vor lucra n ntreruperi. Chiar dac
biii indicatori de ntreruperi sunt setai iar bitul general (EA) nu este
activ atunci microcontrolerul nu va lucra n ntreruperi. Aceti bii
indicatori, care semnaleaz microcontrolerului c va lucra n ntreruperi
i de la cine vor fi aceste ntreruperi, se gsesc n registrul indicator de
ntreruperi IE (Interrupt Enable) (Tabelul 3.1.).

Tabelul 3.1. Registrul indicator de ntreruperi IE, prezentarea


poziiei biilor indicatori de ntreruperi
EA - - ES ET1 EX1 ET0 EX0

76
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
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/numrtor1. 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/numrtor0. 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 acelai timp,
microcontrolerul va rezolva ntreruperea produs de perifericul mai
prioritar. Acest lucru se semnaleaz prin program, n zona de iniializare
activnd sau nu biii indicatori de prioritate din registrul indicator de
ntreruperi (Tabelul 3.2.).

Tabelul 3.2. Biii indicator de prioritate din cadrul registrului IP


X X X PS PT1 PX1 X X

Rezervat
Rezervat
Rezervat

77
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
PS - Stabilete nivelul de prioritate pentru ntreruperea de port serial.
PS = 1. l programeaz la cel mai nalt nivel de prioritate.
PT1 - Stabilete nivelul de prioritate pentru ntreruperea de la Timer 1,
PT1 = 1. l programeaz la cel mai nalt nivel de prioritate.
PX1 - Stabilete nivelul de prioritate pentru 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 - Stabilete 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


microcontrolerului
Prioritate n nteriorul
Surs
nivelului
IE0 cea mai nalt
TF0
IE1
TF1
RI + TI cea mai sczut

Microcontrolerului 8051 are un tabel al vectorilor de ntreruperi n care


se specific adresele la care se face saltul n cazul unei cereri de
ntrerupere. Dac zona alocat pentru scrierea subrutinei nu este

78
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
suficient de mare, se va pune o instruciune de salt ntr-o alt zon de
memorie unde se afl mai mult spaiu (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 spaiul de memorie alocat


pentru scrirea unei subrutine de ntreruperi este de patru octei.
Aceast zon de memorie este rezervat i programatorul nu are voie
s o foloseasc. Revenirea dintr-o subrutin de ntreruperi se realizeaz
cu instruciunea RETI. Care nseamn ncrcarea numrtorului de
program (PC) cu adresa salvat n stiv i incrementarea numrtorului
de program al stivei pentru a-l pregti pentru o nou salvare. Sursele
externe de ntrerupere pot fi programate pentru a fi activate pe nivel sau
pe front, prin setarea sau tergerea biilor IT1 sau IT0 n registrul TCON.
Dac ITx = 0, ntreruperea extern x este declanat prin detectarea
unui nivel LOW la pinul INTx. Dac ITx = 1, ntreruperea x este
declanat pe front.
n acest mod, dac eantioanele succesive ale pinului ITx arat un
nivel HIGH ntr-un ciclu i LOW n ciclul urmtor, este setat flagul de

79
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
cerere al ntreruperii IEx din TCON. Dup aceasta bitul IEx solicit o
ntrerupere.

Exemplu de programare n asamblor a subrutinei de ntreruperi


provenit de la pinul extern

ORG 0 ;adresa de RESET


LJMP MAIN ;salt n programul principal
ORG 30H;adresa rutinei de ntreruperi provenit prin schimbarea
;strii 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 dispoziie o singur adres a
vectorului de ntrerupere (0004h) avnd mai multe surse a vectorilor de
ntreruperi, acestea putnd fi activate sau dezactivate prin setarea
corespunzatoare a registrelor dedicate. ntreruperile pot fi mascabile
sau nemascabile avnd patru surse de ntreruperi (Fig.3.2.)
Extern pe bitul 0 al PORTB (pin RB0/INT)
Depire Temporizator TMR0
Generate la schimbarea nivelelor logice pe pinii externi RB7:RB4
ncheierea ciclului de scriere n memoria EEPROM

80
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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

Registrul dedicat ntreruperilor aflat n zona de registre cu funcii


speciale este INTCON. Prin intermediul biilor indicator prezeni d
posibilitatea utilizatorului s valideze sau invalideze att declaarea
ntreruperilor de la diverse surse, ct i s valideze sau invalideze
ntreruperile globale.

Observaie general - biii de stare prezeni n structura registrului


INTCON sunt setai hard (prin mecanismul implementat n cadrul
microcontroller-ului) i programatorul, n cadrul rutinei de servire a
ntreruperilor, va trebui s-i reseteze, pentru a putea detecta urmtoarea
condiie de declaare a ntreruperilor.

Tabelul 3.5.Prezentarea biilor indicatori de ntreruperi din registrul


INTCON
GIE EEIE TOIE INTE RBIE TOIF INTF RBIF

Descrierea biilor indicatori ntreruperi din INTCON

81
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
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
operaiile de scriere sau citire a EEPROM-ului intern ;
TOIE (TMR0 Overflow Enable) - valideaz ntreruperile
corespunztoare depirii la canalul temporizator/numerator;
INTE (External Interrupt Enable) - valideaz ntreruperile
datorate variaiei semnalului aplicat pe intrarea RB0;
RBIE (B Register Interrupt Enable) - valideaz ntreruperile
datorate schimbrii strii uneia dintre intrrile portului RB7, RB6, RB5
sau RB4 al microcontroller-ului;
TOIF (Timer Overflow Interrupt Flag) - este setat hard la
apariia strii depire a capacitii numrtorului corespunztor
canalului 0, resetat n rest;
INTF (Interrupt Flag) - setat hard la apariia unei ntreruperi la
nivelul liniei RB0, n rest resetat ;
RBIF (B Port Interrupt Flag) - setat hard, atunci cnd una sau
mai multe linii ale portului B au schimbat starea, resetat n rest

La apariia unei ntreruperi numrtorul de program (PC) sare la


adresa 0004h iar bitul de ntreruperi generale GIE este dezactivat.
Codul de deservire al ntreruperilor se termina cu instruciunea RETFIE,
care reface PC i seteaz la loc cmpul GIE activnd ntreruperile
nemascate. Revenirea din subrutina de ntreruperi se face cu
instrucinea RETFIE.

82
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
3.3. Comparaii privind sistemul de ntreruperi la CISC i RISC
n cazul microcontrolerului 8051, biii indicatori de ntreruperi sunt n
registre dedicate perifericului respectiv pe cnd la PIC16F84 sunt n
acelai registru cu bii de setare ai ntreruperii.
Modul de organizare al vectorilor de ntreruperi este diferit la 8051
exist o tabel a vectorilor de ntreruperi pe cnd la PIC exist o singur
adres unde se face saltul.
Mnemonicele instruciunilor de revenire din subrutina de ntreruperi
sunt diferite RETI (8051) i RETFIE (PIC16F84).
Memoria stiv la PIC16F84, este limitat la 8 nivele, astfel c nu pot
exista mai multe cereri.
Bitul de ntreruperi generale se dezactiveaz la execuia unei cereri
la PIC i se activeaz n subrutina de ntreruperi. La 8051 acest bit
rmne activ pe toat perioada.
Lucrul n ntreruperi este util n cazul n care se dorete o cretere a
timpului de calcul.
n cazul programrii n C a microcontrolerului 8051, codul conine o
funcie de ntreruperi predefinit care se gsete n librrie declarat cu
un numr. Numrul indic perifericul de unde se ateapt ntreruperea
(Tabelul 3.6.). Lucrul n ntreruperi este specificat microcontrolerului n
partea de iniializare a programului [11] .

Programarea n C a ntreruperilor
ntreruperile programate n limbaj de asamblare folosesc instruciuni
i directive dedicate ntreruperilor n cadrul crora se specific vectorul
de ntrerupere i registrele al cror coninut este memorat n stiv.
Programarea n C a ntreruperilor se realizeaz cu funcii dedicate
tipului de microcontrolerului pe care compilatorul le gsete n librrie.
83
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
La microcontrolerul 8051, funciile C de programare a ntreruperilor
au cuvntul interrupt n definiie i denumirea perifericului cu numr
pentru a indica de unde se produce ntreruperea. n Tabelul 3.6. sunt
prezentate codurile ntreruperilor specifice microcontrolerului 8051.

Tabelul 3.6. Codul ntreruperilor n programarea ntreruperilor n C la


8051
ntrerupere Nume Numr
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 funcii declarate n C pentru lucru n ntreruperi la 8051

Void serial0() interrupt 4 //declarare funcie ntreruperi la port serial


{corp program}

Void timer0() interrupt 1 // declarare funcie ntreruperi la timer0


{corp program}
Se observ c n C nu exist o instruciune de revenire din ntreruperi.
Acest lucru se realizeaz la ntlnirea sfritului funciei.

La microcontrolerul PIC16F84 exist directive, funcii i variabile


predefinite care activeaz sau nu lucrul n ntreruperi [12,13]. Toate

84
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
conin cuvntul interrupts pentru a indica faptul c aceast funcie se
refer la o ntrerupere.
Exemple de funcii n C pentru validarea sau invalidarea
ntreruperilor
Funcia de activare a ntreruperilor forma general:
enable_interrupts(nivel)
- nivel este o constant definit n fiierul *.h din librria
microcontrolerului care conine tabelul vectorilor de ntrerupere

clear_interrupts();terge ntreruperile
enable_interrupts(GLOBAL); activeaz ntreruperile globale
enable_interrupts(INT_TIMER0); activeaz ntreruperea produs de
numrtor 0
Dezactivarea ntreruperilor se realizeaz cu funcia a crei form
general este: disabel_interrupts(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 funcia clear_interrupt(nivel). n acest caz
prin nivel se nelege bitul indicator al blocului activat pentru a lucra n
ntreruperi.
Activarea frontului impulsului pe care se produce ntreruperea provenit
de la pinii externi se realizeaz prin funcia ext_int_edge().

Tabelul 3.6. Directive preprocesor folosite pentru programarea n


ntreruperi la PIC16F84
#DEVICE Indic compilatorului s genereze pentru prioritrile

85
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

HIGH_INTS= ntreruperilor
#INT_XXX Indic compilatorului c aceast ntrerupere este de
fast prioritate maxima
ntreruperi relevante
#int_default Aceast directive specific faptul c urmtoarea funcie
trebuie s fie chemat dac o ntrerupere este trigherat,
dar nicio rutin nu este asociat cu aceast ntrerupere
#int_global Directiva specific faptul c urmtoarea funcie trebuie s
fie apelat chiar dac nu este o ntrerupere
#int_xxx Directiva specific faptul c urmtoarea funcie trebuie s
fie apelat unde xxx este ntreruperea activat

Exemplu de utilizare a directivelor mpreun cu rutinele pe care le


apeleaz
#int_timer0
void timer0interrupt() //int_timer este asociat funciei urmtoare a
rutinei ce trebuie apelat

Din modalitile de programare n C a microcontrolerelor prezentate mai


sus se observ c la PIC funciile sunt mai complexe, librriile fiind mai
mari. Exemple de programe n C privind ntreruperile se prezint la
capitolele n care sunt detaliate blocurile periferice din arhitectura
microcontrolerului.

86
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Capitolul 4

DISPOZITIVE DE NUMRARE

4.1. Numrtor/Temporizator. Prezentare general


n acest capitol se descriu funciile i modurile de funcionare ale
blocurilor numrtoarelor/temporizatoarelor particulariznd pe tipuri din
microcontrolere, iar n final se vor prezenta modurile de programare i
exemple a acestora folosind limbajul asamblor i C.
Diferene ntre numrtor i temporizator
Numrtor - dispozitiv de numrare a impulsurilor provenite de la pini
externi microcontrolerului.
Temporizator - dispozitiv de numrare a impulsurilor provenite de la
oscilatorul microcontrolerului.
Rezoluia dispozitivului de numrare este dat de capacitatea
registrului dedicat pentru nregistrarea numrului de impulsuri.
Aceste dispozitive sunt construite s lucreze n ntreruperi, fapt care se
specific n rutina de iniializare.
n modulul de temporizare sunt implementate cteva mecanisme
care pun la dispoziia utilizatorului funcii specifice:
de comparare permite controlul unor semnale de ieire;
de captur de monitorizare a unor semnale de intrare;
numrtoarele interne permit generarea de referine de timp interne,
necesare n bucle de ntrziere, multiplexarea diferitelor sarcini
software, .a.

87
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Timer-ul poate fi folosit practic pentru orice funcie de timp, inclusiv
generarea unor forme de und sau conversii digital analogice, ceas
intern, sincronizare transmisiei sau recepionrii datelor.
Pentru aplicaii speciale n timp real s-au construit module timer cu
unitate aritmetic i logic proprie.

4.1.2. Funciile temporizatorului


Captur la intrare (IC - input capture) - se bazeaz pe posibilitatea de
a stoca valoarea numrtorului principal la momentul apariiei unui front
activ al unui semnal extern
permite msurarea limii unui impuls sau a perioadei unui semnal.
poate fi folosit i ca referin de timp pentru declanarea altor
operaii
Comparare la ieire (OC - output compare) - se compar la fiecare
impuls de ceas valoarea numrtorului principal cu cea a unui registru.
Funcia este folosit pentru a genera ntrzieri sau 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 desfurarea programului datorate perturbaiilor mediului
Acumulare de impulsuri (pulse accumulator) folosit pentru a
numra evenimentele ce apar ntr-un interval de timp determinat sau
pentru a msura durata unui impuls

88
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

4.2. Blocul temporizare/numrare la microcontrolere CISC i RISC


Numrtorul contorizeaz impulsuri provenite din oscilatorul intern
sau din exterior divizat cu un factor de regul programabil. Blocul care
programeaz perioada impulsurilor se numete 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 poziionat de obicei
ntr-un registru neoperaional asociat modulului de numrare, care
indic depirea n cazul n care registrul de numrare este plin. Pentru
a autoriza generarea unei ntreruperi este necesar s fie setat un flag de
autorizare.
n continuare se prezint blocul de temporizare pentru microcontrolerele
8051 i PIC16F84.

4.2.1.Prezentarea blocului de numrare la microcontrolerul 8051


Microcontrolerul 8051 are dou blocuri Temporizare/Numrare:
Timerul 0 i Timerul 1. Ambele pot configurate pentru a lucra fie ca
temporizator sau ca numrtoare de evenimente. Aceste
temporizatoare au un bloc prescaler a crui constant de divizare este
fixat la 1/12 din frecvena oscilatorului. Pinii externi care sunt utilizai
n cazul folosirii blocului ca numrtor sunt T0, T1. Rata maxim de
numrare este 1/24 din frecvena oscilatorului. Registre dedicate pentru
programarea blocului sunt TMOD si TCON. Exist patru moduri de
funcionare al numrtoarelor/temporizatoarelor.
Alegerea modului de funcionare ca temporizator sau numrtor
se face prin programarea registrului TMOD din SFR (Tabelul 3.1.), cu
urmtoarea structur pentru numrtorul 1: GATE1, C/-T1 - M11, M01

89
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
i pentru numrtorul 2: GATE2, C/-T2 - M12, M02, unde: GATE -
gestioneaz controlul.
Cnd GATE=1, timer-ul este activat doar ct timp pinul nINT
corespunztor este n HIGH i bitul TR din registrul TCON este 1.
C/-T - selecteaz operarea ca timer cnd este pe 0 sau numrtor cnd
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

Tabelul 4.2. Programarea modului de operare cu biii M0 i M1


M1 M0 Modul de lucru
0 0 Timer pe 13 bii (Mod 0)
0 1 Timer/numrtor pe 16 bii (Mod 1)
1 0 TL0 este timer/numrtor pe 8 bii i TH0 este timer pe
8 bii (Mod 2)
1 1 Timer/numrtor este 1 - oprit (Mod 3)

Registrul TCON este utilizat pentru: pornirea numrrii,


atenionarea n caz de depire a registrelor de nregistrare a numrrii
i indicarea lucrului n ntreruperi (Tabelul 3.3.).

Tabelul 4.3. Registrul TCON


TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

90
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Tabelul 4.4. Detalierea funciilor registrului TCON [3]
BIT SIMBOL FUNCIE
TCON.7 TF1 Flag depire Timer
1. Setat hardware,
ters hardware sau
software
TCON.6 TR1 Bit de START
dispozitiv de
numrare 1. Setarea
sau tergere soft.
TCON.5 TF0 Flag depire Timer
0. Setat hardware i
ters hardware sau
software
TCON.4 TR0 Bit de START
dispozitiv de
numrare 0. Setarea
sau tergere soft.
TCON.3 IE1 Flag front ntrerupere
a dispozitivului 1 de
numrare 1. Setat
hardware cnd se
detecteaz frontul
unei ntreruperi
externe, este ters
cnd s-a realizat
ntreruperea.

91
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

TCON.2 IT1 Bit de control al


ntreruperii de tip 1.
Setat/ters software
precizeaz frontul
pentru delanarea
ntreruperilor externe.
TCON.1 IE0 Flag front ntrerupere
a dispozitivului 1 de
numrare 0. Setat
hardware cnd se
detecteaz frontul
unei ntreruperi
externe. ters cnd s-
a procesat
ntreruperea.
TCON.0 IT0 Bit control ntrerupere
tip 0. Setat/ters
software precizeaz
frontul pentru
delanarea
ntreruperilor externe.

ntreruperile de la Timer 0 i Timer 1 sunt indicate de TF0 i TF1,


care sunt setai la depire n registrele de memorare ale circuitelor
timer/numrtor. Cnd se genereaz o ntrerupere de timer, flagul care
o genereaz este ters hardware atunci cnd rutina de servire este
deservit. Un alt mod de a testa sfritul sarcinii este prin pooling,
verificnd bitul TFn (n poate fi 0 sau 1).
92
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Fig.4.1. Schema bloc a numrtoarelor/temporizatoarelor de la


microcontrolerul 8051 [3]

Moduri de funcionare

Mod 0
Acest mod de funcionare este comun ambelor numrtoare. n acest
mod, seciunea de numrare este format din TL1 (5 bii) i TH1 (8 bii).
Numrtorul de 13 bii astfel format numr nainte. n acest mod,
registrul Timerului este configurat ca un registru de 13 bii. Cei trei bii
superiori din TL1 sunt nedeterminai i trebuie ignorai. Setarea flagului
de funcionare (TR1) nu terge registrul. Cnd numrtorul comut, din
starea "1" n starea "0", se seteaz flagul de ntrerupere timer TF1.
Pornirea Timerului este activat cnd TR1 = 1 i GATE = 0 sau INT1 =
1 (setnd GATE = 1 se permite timerului s fie controlat de ctre
intrarea extern INT1 pentru a facilita msurarea limii impulsurilor).

93
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

THx TLx
Not: S-a notat cu x numrul dispozitivului de numrare. Acesta
poate lua valorile 0 sau 1.

Modul 1
Este asemntor cu Modul 0, cu excepia faptului c registrul de
memorare a numrtorului va lucra pe 16 bii.

THx TLx

Modul 2
Acest mod configureaz registrul timer ca un numrtor de 8 bii
(TL1) cu rencrcare automat. Depirea din TL1 seteaz TF1 i
rencarc TL1 cu coninutul TH1, care este introdus prin soft.

Fig. 4.2. Reprezentarea schemei bloc a dispozitivului de numrare Mod


2 [3]
Modul 3
Temporizatorul 0 n Mod 3 stabilete TL0 i TH0 ca dou
numrtoare separate. TL0 folosete biii de control ai Temporizatorului

94
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
0: C/T, GATE, R0, INT0 i TF0. TH0 este blocat ntr-o funcie de
temporizator (ce numr cicluri main) i preia pentru folosire TR1 i
TF1 de la temporizatorul 1. Astfel TH0 controleaz ntreruperea
provenit de la temporizatorul 1.

Fig.4.3. Schema bloc a dispozitivului de numrare Mod 3 [3]

Modul de programare al acestui dispozitiv este simpl constnd ntr-


o subrutin de iniializare i una de repornire a numrtorului n cazul n
care a terminat de numrat. Dac se utilizeaz
numrtorul/temporizatorul s numere un anumit numr de impulsuri, o
anumit perioad de timp, acest lucru se realizeaz n urmtorul fel.

Notm
Valoare= timp ntrzire/perioada unui ciclu de ceas
Valoare reprezint numrul de impulsuri care trebuiesc numrate
pentru a obine timpul dorit

Pentru a numra un numr de impulsuri se vor iniializa cele dou


registre dedicate THx i TLx. Avnd n vedere c cele dou registre

95
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
permit s se numere 65535 de impulsuri daca se va lucre n Mod 1,
atunci valoarea cu care se ncarc cele dou registre este obinut prin:

Valoare ncrcare=65535-Valoare - reprezint valoarea rencrcare


registre THx,TLx

Exemplu
S se genereze un timp de ntrziere de 100 s folosind Temporizatorul
0.
Etapele de programare
Iniializare registru TMOD
Iniializare TL0 i TH0
Start Timer (TR0=1)
Testare TF0 pn este setat
6
Valoare= 0,01*11,0592*10 /6=184 impulsuri
Valoare cu care se iniializeaz cele dou register este 65535 184 =
65351 = 0xFF47
Registrul TH0 va fi iniializat cu valoarea FFh iar TL0 cu 47h.
Rutina n asamblor pentru programare temporizator 0 care va lucre n
Mod1 este:

timer: MOV TMOD,#01H ; iniializare TMOD


MOV TL0,#47H ; iniializare TL0
MOV TH0,#FFH ; iniializare TH0
SETB TR0 ; start numrare
eticheta:JNB TF0,eticheta ; pooling pe TF0
CLR TR0 ; stop numrare
CLR TF0 ; tergere TF0
96
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
RET
Aceeai rutin scris n C este:

void Delay(void)
{
TMOD = 0x01; iniializare TMOD
TL0 = 0x47; iniializare TL0
TH0 = 0xFF; iniializare TH0
TR0 = 1; start numrare
while(!TF0)// pooling pentru TF0
TR0 = 0;
TF0 = 0;
}

Programarea temporizatorului n C la 8051 nu necesit funcii complexe,


se vor folosi denumirile registrelor sau biilor dedicai pentru ncrcarea
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 acelai cu cel de mai
sus.
Exemplu de programare a Temporizatorului 0 n ntreruperi. Se
folosete o variabil contor pentru a indica numrarea pn la 65536
cicli de ceas.

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

97
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
static unsigned long numara = 0; /* variabil folosit doar n acest
program */

void timer0_ISR (void) interrupt 1


{
numara++; /* Incrementeaz variabila contor
}
/*------------------------------------------------
Programul principal, se iniializeaz Temporizatorul 0 s lucreze n
ntreruperi care se produce la fiecare depire de 65535
------------------------------------------------*/
void main (void)
{
TMOD = (TMOD & 0xF0) | 0x01; /* Setare numrtor ca Temporizator */
ET0 = 1; /* validare ntrerupere Temporizator 0 */
TR0 = 1; /* Start Temporizator 0 */
EA = 1; /* validare ntreruperi generale */

while (1) /* bucl de execuie infinit din care se va face saltul dup
fiecare 65535 cicli */
{..
/*Corp program*/
}
}
Se observ numrul mic de instrucini folosite pentru programarea
microcontrolerului n C.

98
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
4.2.2. Prezentarea numrtorului microcontroler PIC16F84
Numrtorul este pilotat de un impuls provenit din oscilatorul intern
sau din exterior divizat cu un factor de regul programabil. Factorul de
divizare al impulsurilor de ceas este stabilit ntr-un registru dedicat,
valoarea numrat este memorat n TMR0, resetat automat cnd
ajunge la FFFFh. Numrtorul este nscris cu 0 doar la reset iar n rest
este un registru care poate fi doar citit. Dac coninutul din registrul
numrtor comut din starea FFFFh n starea 0000h se seteaza flag-ul
TOF (timer overflow) aflat ntr-un registru neoperaional dedicat
modulului timer (Fig. 4.4.). Pentru iniializarea lucrului n ntreruperi este
necesar s fie setat un bit indicator de autorizare (TOI). Registrul
INTCON de 16 bii permite citirea strii numrtorului.
Frecvena de numrare este direct proporionala cu frecvena
oscilatorului i poate fi modificat prin program. Semnalele pot proveni
de la fosc/4 sau din exterior acestea fiind validate a fi numarate dac biii
din registrul OPTION, T0CS (1 numrtor, 0-Timer) i PSA sunt
iniializai conform specificaiilor tehnice. Prescalerul este un divizor pe 8
biti folosit dac PSA este 0 logic programat cu ajutorul biilor PS2, PS1,
PS0. Bitul TOSE comand incrementarea impulsurilor din exterior pe
front pozitiv sau negativ

Fig.4.4. Schema bloc a dispozitivului de numrare/temporizare la


PIC16F84
99
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Tabelul 4.5. Alegerea factorului de divizare la dispozitivul de numrare
PS2 PS1 PS0 Factor Factor
divizare divizare
numrtor 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 conine bii


indicatori pentru iniializarea dispozitivului de numrare.

Tabelul 4.6. Structura registrului OPTION


RBPU# INTEDEG TOCS TOSE PSA PS2 PS1 PS0

RBPU#, (Pull up bits port B) cnd este pe 1 logic invalideaz funciile


de pull-up pentru liniile portului B, iar pe 0 logic asigur funcia pull-up
INTEDG (Interrupt Edge Select) selecteaz frontul, cresctor sau
descresctor pentru producerea ntreruperii. Pe 0 logic ntreruperea se
produce pe front descresctor
TOCS (TMR0 Source Clock) - selecteaz sursa impulsurilor ce sunt
numrate de ctre canalul 0 numrrtor/temporizator, setat permite
numrarea impulsurilor externe, aplicate la pinul RA4, resetat
selecteaz frecvena intern de ceas divizat cu 4.
100
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
TOSE (TMR0 Source Edge Select) selecteaz frontul impulsurilor
numrate. Cnd este pe 0 logic impulsurile se numr pe front pozitiv.
PSA, (Prescaler Assignemet Bit) selecteaz sursa pentru presacaler.
Cnd este pe 1 logic sursa este pentru WDT (Watch Dog Timer), iar pe
0 logic este pentru canalul TMR0.
PS2, PS1, PS0 - bii de selecie a constantei de divizare a prescaler-
ului
Registrul INTCON conine biii care se seteaz la declansrea unei
depiri a registrului de numrare i n acelai registru se afl registrul
pentru a iniializa dispozitivul s lucreze n ntreruperi.
Bitul indicator GIE, (Global Interrupt Enable) permite, cnd este setat,
validarea cererilor de ntrerupere ce apar dac acestea au fost validate
i individual, respectiv resetat inhib orice cerere de ntrerupere. Bitul
TOIE (TMR0 Overflow Enable), setat valideaz ntreruperile
corespunztoare depirii la canalul temporizator/numrtor, resetat
acestea sunt ignorate. La depirea numrrii TOIF (Timer Overflow
Interrupt Flag), este setat hard.
Biii de stare prezeni n structura registrului INTCON sunt setai hard i
programatorul, n cadrul rutinei de servire a ntreruperilor, va trebui s-i
reseteze, pentru a putea detecta urmtoarea condiie de declaare a
ntreruperilor.

Rata ntrerupere= frecvena de ceas/4x(65536-n)xprescalar

n=valoarea de rencrcare a registrului de unde se pornete numrarea.


Pentru programarea n C a dispozitivului temporizare/numrare sunt
disponibile urmtoarele funcii n librria timer.h.
setup_timer_0(mode) setare surs, prescalar pentru temporizator 0
101
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
set_timer0(value) sau set_rtcc(value) iniializare temporizator
0/numerator 0. Valoarea va fi pe 8 sau 16 bii depinde de familia de PIC-
uri
value=get_timer0 returneaz valoarea numrat

4.2.3. Comparaii ntre numrtoarele de la 8051 i PIC


Cele dou numrtoare funcioneaz pe acelai principiu dar la 8051
exist mai multe moduri de funcionare pe cnd la PIC exist
posibilitatea alegerii frecvenei de divizare.
Modul de programare n asamblor este mai simplu la 8051, datorit
setului complex de instruciuni dar n C, biblioteca de funcii pentru PIC-
uri este mai mare.

4.3. Alte tipuri de dispozitive de numrare

4.3.1. Ceas de gard


Dispozitiv de numrare pentru protecia soft a microcontrolerului,
ceasul de gard introduce un RESET intern dac programul nu este
executat corect din cauza perturbaiilor electrice din exterior.
Ceasul de gard este de fapt un alt numrtor liber unde programul
nostru trebuie s scrie un zero ori de cte ori se execut corect. n caz
c programul are eroare n execuie nu se va mai scrie zero iar
numrtorul se va reseta singur la atingerea valorii sale maxime.
Aceasta va duce la rularea programului din nou, i corect de aceast
dat pe toat durata.
Microcontrolerul 8051 nu are acest dispozitiv intern acesta gsindu-se la
un microcontroler din aceei familie, mai evoluat, 80552.

102
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
PIC16F84 dispune de un canal temporizator/numrtor ce poate
ndeplini funcia de ceas de gard de 8 bii cu un prescaler de 5 bii.
Bitul PSA alege tipul de numrtor pentru prescaler. Divizarea este
aleas funie de valorile biilor PS2, PS1 i PS0 (vezi Tabelul 4.4).

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

Din schema bloc se observ c este un Oscilator RC care lucreaz


complet independent de celelalte componente. Detecteaz posibila
blocare a CPU i produce un RESET intern n caz de depire de 18ms
pn la 2.3s. Nu necesit componente externe pentru a funciona.
Dezactivarea ceasului de gard se face prin bitul WDTE pe 0 logic.
Instruciunea special care trebuie executat periodic este CLRWDT
(Clear Watch Dog Timer) i SLEEP. n caz de depire a numrrii bitul
/TO din registrul STATUS este activat, el fiind ters soft.
La adresa 2007h se gsete un registru a crui bii pot fi configurai
pentru funcionarea ceasului de gard.

103
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

CP CP CP CP PWRTE WDTE FOSC1 FOSC0

CP: bit de protecie 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: bii de selecie 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 temporizatorul, ceasul
de gard i sistemul de ntreruperi continu s funcioneze. 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). Instruciunea de
intrare n consum redus este SLEEP. Dac este validat acest mod,
WDT este ters (dar inut n execuie), bitul PD (STATUS.3) este ters,
i bitul TO (STATUS.4) este setat, oscilatorul este oprit i CPU nu
lucreaz. Pinii de intrare/ieire i mentin starea care o aveau naintea
104
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
execuiei instruciunii SLEEP. n modul SLEEP, pentru consum redus,
toi pinii de intrare/ieire sunt plasai la Vdd i VSS, fr 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 funcionare
3. ntrerupere de la pinul RB0/INT, port B se schimb sau cnd
EEPROM este plin
Perifericele nu pot genera ntreruperi n timpul SLEEP, pn cnd
semnalul Q de ceas nu este prezent. Primul eveniment (MCLR Reset)
va cauza un RESET dispozitivului. Urmtoarele dou evenimente sunt
considerate ca o continuare a programului de execuie. Biii /TO i /PD
pot fi utilizai s determine cauza RESET-ului. Bitul /PD este setat pe
powen-on i ters cnd se apeleaz SLEEP. Bitul /TO este ters dac
se ntmpl o depaire a ceasului de gard (si cauzeaz o trezire).
Cnd se execut instruciunea SLEEP, este adus urmtoarea
instruciune (PC + 1 este pre-fetched)
Pentru trezirea dispozitivului printr-un eveniment de ntrerupere,
ntreruperea corespunzatoare este setat. Trezirea se face funcie de
starea bitului GIE. Dac bitul GIE este ters dispozitivul i continu
execuia de la instruciunea de dup SLEEP, dac nu se execut
instruciunea 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.

105
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Cnd se produce RESET la PIC16F84
Un RESET poate fi generat de una din urmtoarele surse:
-la conectarea tensiunii de alimentare, POR Power On Reset;
-un RESET extern /MCLR pe pinul GP3;
-un RESET cnd 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 strii unui pin extern.
Identificarea sursei de RESET se face prin poziionarea unor bii n
registrul de stare, registru al crui coninut nu se modific prin RESET.

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

Starea biilor 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
microcontrolerelor. Perioada de rotaie este stabilit prin program de
106
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
ctre utilizator. Perifericul din interiorul microcontrolerului care
realizeaz aceast funcie este PWM, dispozitiv de modulare a
impulsurilor n durat. Acesta este un dispozitiv de numrare, 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 generrii unui semnal cu factor de umplere variabil.

PWM este impulsul de modulare care ajut la controlul tensiunii de


ieire prin variaia 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 umplere se folosesc urmtoarele notaii:


T2 este timpul in care iesirea este pe 1 logic

107
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
T1 este suma dintre cele doua de mai sus
Factorul de umplere este F=T2/T1
Tensiunea de ieire variaz dup relaia Uieire=FxUintrare
Registrul de prescalare genereaz ceasul pentru un numrtor,
ceasul fiind programabit. Coninutul numrtorului este comparat cu cel
al registrului PWM. Ct timp rezultatul comparaiei este mai mic sau
egal, se va genera un unu logic la ieirea PWM, dac rezultatul
comparaiei este mai mare, se va genera la ieirea PWM un zero logic.
Dac registrele comparate sunt de opt bii factorul de umplere poate fi
ntre 1/256 i 1. Un canal PWM odat programat va genera la ieire
semnalul periodic continuu, fr intervenia unitii centrale.

Exemplu de dispozitiv PWM la microcontrolerul 80552


Microcontrolerul 80C552 are dou blocuri de generare a
impulsurilor modulate n durat i doi pini de ieire /PWM0 i /PWM1.

Fig. 4.9. Schema bloc a dispozitivului de modulare a impulsurilor la


80552 [13]

108
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Registrele PWM0 i 1 conin valori prestabilite, atta timp ct valorile
impulsurilor numrtoarelor sunt mai mici dect valorile prestabilite se
genereaz 0 logic la ieire. Ecuaia prin care se stabilete frecvena de
repetiie 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 cobort/nivel nalt= PWM/(255-PWM)

Exemplu de realizare a unei secvene de program de generare a


impulsurilor modulate n durat, pentru 8051. Se folosete
temporizatorul 0 ca bloc PWM care este programat s lucreze n
ntrerupere. Pentru stabilirea factorului de umplere se folosesc registrele
de numrare TH0 i TL0 cu rencrcare.

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

void pwm_initial(){
TMOD = 0;
pwm_factor= 160;
EA = 1;
ET0 = 1;
TR0 = 1;
}
109
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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; //ncrcare 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_factor; //ncrcare TH0
TF0 = 0; terge bit ntrerupere
return; //return
}

Alte dispozitive de numrare pot lucra n:


- Modul captur la apariia unui front pozitiv i/sau negativ la pinul
asociat acestuia, va captura valoarea numrtorului n registre alocate
acestuia (simultan se genereaz i o ntrerupere)
- Modului temporizator comparator - va genera o ntrerupere cnd
coninutul numrtorului este egal cu al registrelor de captur asociate.
Fiecare modul de numrare poate fi programat s genereze impulsuri
modulate n durat, frecvena lor depinznd de sursa de numrare.

110
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Capitolul 5

COMUNICAREA SERIAL

Comunicarea microcontrolerelor cu mediul extern se realizeaz


serial, paralel, prin wi-fi, USB, etc. Modul de comunicare fr fir
folosete de fapt tot dispozitivele de comunicare serial asincron
(UART). Metodele de comunicare serial sunt asincrone prin portul
serial (UART) i sincron prin interfee seriale la cre sunt conectate
diverse dispozitive pentru a lucra n modul Master-Slave. n acest
capitol se prezint metodele de comunicare serial la microcontrolerele
8051 i PIC16F84 cu referire la alte tipuri de microcontrolere din
aceeai familie dac acestea nu sunt prevzute cu astfel de dispozitive
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
- transfer asincron - nu se utilizeaz semnal de ceas
- Dup lungimea blocului de date transmis :
- transfer pe octet
- transfer pe bloc de octei
- Dup numarul de uniti comunicante :
- transfer serial ntre dou dispozitive
- transfer serial ntre mai multe dispozitive
- Dup direcia de transfer
111
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
- transfer unidirecional
- transfer bidirecional

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 recepie sunt TxD i RxD
care sunt configurai ca ieire respectiv intrare [3,4].
Bufferul de date seriale. Bufferul de date seriale este format n
realitate din dou registre separate, un transmitor i un receptor. Cnd
data este transferat n SBUF, ea merge n registrul transmitor i este
pstrat pentru transmisia serial. Cnd data este transferat din SBUF,
ea provine de la receptor.

Figura 5.1. Reprezentarea registrului SBUF utilizat pentru salvarea


datelor

Iniializarea portului serial se realizeaz prin soft utiliznd biii


registrului SCON. La iniializare se stabilesc: modul de lucru, numrul
de bii utilizai n transmiterea datelor, paritatea.

112
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Figura 5.2. Reprezentarea registrului SCON utilizat la iniializare UART

Detalierea funciilor ndeplinite de biii care compun registrul


SCON
A) Programarea modului serial cu biii SM0 i SM1

SM0 SM1 Mod


0 0 Mod 0
0 1 Mod 1
1 0 Mod 2
1 1 Mod 3

B) Stabilirea numrului de bii utilizai n compunerea pachetului de date


transmise:
SM2 - activarea modului de lucru multiprocesor n modurile 2 i 3,
prin transmisia bitului special 9;
REN - activare/ dezactivare recepie;
TB8 transmisie bit paritate utilizat n modurile de lucru 2 i 3;
RB8 recepie bit de paritate utilizat n modurile de lucru 2 i 3;
TI - indicator de ntrerupere a transmisiei;
RI - indicator de ntrerupere a recepiei.

113
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Tabelul 5.1. Reprezentarea modurilor de comunicare n funcie de
numrul de bii i viteza de transmisie
SM0 SM1 Mod Descriere Baud Rate

0 0 0 Registru de deplasare pe 8 bii 1/12 fosc

Determinat de
0 1 1 Pachet de date pe 8-bii
Timer 1

1/32 fosc
1 0 2 Pachet de date pe 9-bii
(1/64 fosc)

Determinat de
1 1 3 Pachet de date pe 9-bii
Timer 1

Modul 0 - datele seriale sunt transferate n ambele sensuri prin pinii


RXD i TXD. Rata transferului este 1/12 din frecvena de oscilaie.
Transmisia ncepe cu cel mai puin semnificativ bit (LSB) i se
realizeaz pe 8 bii.

Mode 1 - transmisie asincron, pe 10 bii, se transmit date prin TXD, se


recepioneaz prin RXD n formatul 1 bit de Start, 8 bii de date, 1 bit de
Stop, cu rata de transfer programabil folosind Numrtor/Temporizator
1.

114
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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 frecvena
oscilatorului divizat cu 32 sau cu 64, funcie de starea bitului SMOD
(Fig.5.3 ). Diagrama de comunicare este 1 bit Start, 8 bii 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). Definiie. Reprezint numrul de
transmisii/recepii pe secund. n cazul n care este utilizat UART-ul,
rata de transmisie depinde de: modul de lucru selectat, frecvena
oscilatorului, starea registrului SMOD selectat din registrul SCON.
Formulele necesare sunt prezentate n Tabelul 5.2.

115
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Tabelul 5.2. Modul de selecie a ratei de comunicare
Modul de lucru Baud Rate BitSMO
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


uor valorile ratei de transmisie. Procedura este simpla:
Timer 1 - se seteaz pe modul ntreruperi;
Timer 1 - va lucra n modul cu rencrcare
Valoarea de rencrcare depinde de rata de transfer cerut i
de frecvena de oscilaie, se pot folosi valorile standard din
Tabelul 4.3. Valoarea de rencrcare se scrie n TH1.

Tabelul 5.3. Valoarea de ncrcat n TH1 pentru rata de transfer


Baud Fosc. (MHz) Bit
Rate 11.0592 12 14.7456 16 20 SM
150 40 h 30 h 00 h 0
OD
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

116
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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/recepiei la portul serial se poate verifica n


modul pooling sau n ntreruperi. n primul mod se ateapt n bucl
transmiterea/receptionarea datelor, iar n modul ntreruperi se continu
programul principal pn cnd s-a terminat transferul. Pentru lucrul n
ntreruperi se selecteaz 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 cnd RI sau TI sunt setai pe 1 logic. Acetia vor fi resetai, 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 unui 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 realizeaz cu circuitul Max232

117
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Fig. 5.4. Circuitul de conversie c.c c.c. Max232 [15]

Fig 5.5. Formele de und convertite

Paii de programare a portului serial la 8051 pentru transmisia unui


caracter serial
1. regsitrul TMOD se ncarc cu valoarea 20H, indicnd utilizarea
temporizatorului 1 n mod 2 (8-bit auto-ncrcare) pentru a stabili rata de
transmisie
2. registrul TH1 este ncrcat cu valoarea din table, funci de rata de
transmisie dorit
3. registrul SCON este ncrcat cu valoarea 50H care reprezint Mod 1
de lucru a portului serial
4. TR1 este setat n 1 logic pentru pornirea temporizatorului
5. bitul TI este ters soft
118
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
6. registrul SBUF este ncrcat cu valoarea care reprezint codul ASCII
al caracterului transmis
7. bitul TI este testat prin pooling pentru a afla cnd s-a terminat
transmisia
8. pentru a transfera un alt caracter se sare la pasul 5

Exemplu de program care urmeaz paii descrii mai sus

Program scris n asamblor


MOV TMOD,#20H ;temporizator 1 n mod 2
MOV TH1,#-6 ; rata de transmisie 4800
MOV SCON,#50H ;transmisie pe 8 bii, 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 transmisie

Acelai 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; //ncrcare
while (TI==0);//test TI
119
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
TI=0;
}
}

Exemplu de program scris 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.
Frecvena de lucru este de 11,0592MHz. Se va utiliza Temporizatorul 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
;******************************************************
;Iniializare transmisie
; ******************************************************
Start: MOV TMOD,#20h
MOV TH1,#0FDh
SETB TR1
MOV SCON, #50h
SETB EA
SETB ES
;******************************************************
;transmisie caracter a
;******************************************************
120
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
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 pentru tranmiterea mesajului DA,


folosind funcii de transmisie, portul serial nu va lucra n ntreruperi.
Rata de transfer va fi stabilit la 9600 baud pe 8-bii 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) {
SerTr(D);
SerTr(A);
121
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
}
}
void SerTr(unsigned char x){
SBUF=x; //salvarea valorii n registrul SBUF
while (TI==0); //ateapt transmisia
TI=0;
}

5.1.2. Portul serial la microcontrolerul PIC 16F877


Microcontrolerul PIC16F84 nu are ncorporat port serial de aceea se
va prezenta acest dispozitiv la PIC16F877. Microcontrolerul PIC16F877
este mai evoluat dect cel amintit mai sus avnd patru bancuri de
memorie a cte 128 locaii i implicit mai multe registre n zona de
regsistre cu funcii speciale.
Portul serial de la microcontrolerul PIC 16F877 poate fi sincron sau
asincron. Poate lucra pe 8 sau 9 bii de date i poate fi configurat s
lucreze n trei moduri :
1) Asincron (bidirecional)
2) Sincron ca Master (unidirecional)
3) Sincron ca Slave (unidirecional)
Registrele utilizate n programarea acestui periferic sunt:
- Registrul TXSTA - controleaz starea transmisiei
- Registrul RCSTA controleaz starea recepiei
- Datele ce urmeaz a fi transmise sunt ncrcate n registrul
TXREG iar cele care sunt recepionate n RCREG.
- Registrul SPBRG este utilizat n alegerea ratei de transmisie.
Portul serial n cazul acestui microcontroler poate lucra i n ntreruperi.

122
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Modul de lucru asincron
Pinii utilizai pentru transmisie respectiv recepia datelor sunt TX
(RC6) i RX (RC7) din portul TRISC care trebuie configurai ca ieire
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 bii este
dat de bitul TX9 din TXSTA respectiv RX9 din RCSTA. Cnd acetia
sunt n 1 logic, se va lucra pe 9 bii cnd sunt pe 0 logic pe 8 bii.
Rata de transfer se poate stabili n dou moduri, microcontrolerul avnd
dou viteze de lucru una de vitez mare i alta sczut. Valoarea dorit
(X) se introduce 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 selectnd bitul BRGH din registrul TXSTA.


Cnd este setat se lucreaz pe vitez mare cnd nu, pe vitez mic.
Selectarea vitezei de lucru este arbitrar deoarece trebuie o bun
aproximaie a valorilor dorite (Anexa 2).

123
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Fig. 5.6. Schema portului serial de transmisie asincron la PIC 16F877


(redesenat dup [10])

Recepia este validat prin setarea bitului CREN din registrul RCSTA
(Fig.5.7.). Modul de comunicare a datelor n modul asincron este LIFO,
cu secvena de forma Start, data, Stop i cu bii de paritate generate
intern. Transmisia este validate prin setarea bitului TXEN din TXSTA
(Fig 5.6.).

Fig. 5.7. Schema bloc de recepie a datelor pe portul serial asincron la


PIC 16F877 (redesenat dup [10])
124
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Data ce urmeaz a fi transmis este scris n TXREG. Dac se lucreaz
pe 9 bii mai nti este setat bitul de date TX9D i apoi se scrie o alt
parte n TXREG. Portul asincron poate lucra n ntreruperi fiind prevzut
cu bit de ntrerupere la transmisie TXIF care este setat cnd registrul
TXREG este gol i ateapt 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. Acelai procedeu este i la recepie, biii
pentru ntreruperi sunt RCIE pentru setarea ntreruperii la recepie i
bitul RCIF, din RCREG, setat cnd se recepioneaz o nou dat. Cnd
este setat modul de recepie pe 9 bii mai nti este citit bitul RX9D din
RCSTA i apoi RCREG. O alt caracteristic a lucrului pe 9 bii este
detectarea automat a adresei utilizat n operarea mai multor
dispozitive cnd adresa este pe 9 bii. Selectarea acestui mod de
operare se realizeaz prin setarea bitului ADDEN din RCSTA i a bitului
RCIE.
Portul este oprit cnd unitatea central intr n modul SLEEP. Pot
apare dou tipuri de erori la recepie. Una este de suprapunere a
datelor n momentul n care registrul RCREG nu a fost descrcat nainte
de a primi o alt dat, astfel c bitul OERR i CREN sunt setai. Dac
se ntmpl acest lucru a treia dat este pierdut. 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 recepionat cnd un bit de Stop ilegal indic faptul c data
este ilegal. Acest tip de eroare nu invalideaz procesul de recepie i
nu necesit tergere.

125
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Fig. 5.8. Schema bloc a portului serial, funcia de detectarea adresei la


PIC16F877 (redesenat dup [10])

Registrele utilizate cu biii dedicai 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 PIE1 de la adresa 8Ch pentru programarea ntreruperilor


PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

Registrul PIR1 de la adresa 8Ch pentru programarea ntreruperilor


126
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF

Toate regsitrele din memoria cu funcii 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 neputnd fi transmise sau recepionate n acelai
timp. Diferena dintre cele dou moduri Slave i Master este cine
genereaz impulsurile de ceas pentru sincronizare. n mod Master
acestea sunt generate de microcontroler iar n mod Slave
microcontrolerul le primete din exterior.Exist multe asemnri ntre
cele dou moduri de lucru sincrone, astfel c se vor specifica doar
deosebirile dintre ele.
Generatorul ratei de transmisie lucreaz dup un model i o formula
diferit de modul asincron. Bitul BRGH care influeneaz 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, permind stabilirea unei viteze


mai mari 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 utiliza modul de detecie a adresei, iar n
modul SLEEP portul este oprit.

127
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Pentru a iniializa portul s lucreze n acet mod trebuie ca biii SYNC i
CSRC s fie setai. Bitul TXEN i CREN nu trebuie setai n acelai timp
deoarece modul de transmisie este unidirectional. La transmisie
TXEN=1 i CREN=0 iar la recepie TXEN=0 i CREN=1.

Modul de lucru sincron n mod SLAVE


n acest mod nu este necesar s fie iniializat registrul SPBRG
deoarece nu se genereaz impuls de ceas. Ambii pini ai Portului C, RC6
i RC7, trebuie iniializai ca intrri folosind TRISC. Pentru a se selecta
acest mod de lucru bitul CSRC trebuie ters. Opiunea de recepie a
unui singur octet este dezactivat. Lucrul n acest mod poate trezi
unitatea central din modul SLEEP.

Funcii C utilizate n programarea USART-ului sunt:


Getc()
Putc()
Fgetc()
Puts()
Fgets()
Fputs()
Printf()
Kbhit()
Fprintf()
Set_uart_speed()
Assert()
Getchar()
Putchar()
Setup_uart()
128
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Programe n C a portului USART la PIC16F877


Se programez portul USART n mod asincron i se transmite i
recepionez date cu viteza de 1,2 KBauds.

Void main (void)


{
TRISB=0// PORT B intrare
PORTB=0x0// transmisie la ieiere
SBRG=51//valoare rata transfer din tabel
TXTA=0x22// iniializare transmisie
RCSTA=0x90// iniializare pentru recepie
TXREG=0x0//valoare pentru transmisia informaiei
do
{
TEREG++// incremetare registru tampon
While ( !TRMT)// testare bit pentru ca data s fie pregtit
While(!RCIF)// test recepie data
PORTB=RCREG// data recepionat e transmis n PORT B
}
While(1);
}

Rutin n asamblor de transmisie date


------ Data este n (W) -----------------------
MOVWF TXREG ; trimite data
129
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
WAIT:
BTFSS PIR1,TXIF ; pooling
GOTO WAIT

Rutin n asamblor de iniializare USART s lucreze n ntreruperi


MOVLW 0x80; USART pe 8-Bit
MOVWF RCSTA ;
BANKSEL TRISC ; selecie Bank 1
BCF TRISC,6 ; RC6 = ieire
BSF TRISC,7 ; RC7 = Intrare
MOVLW D12 ; Setare Rat = 19200
MOVWF TXSTA
BSF PIE1,RCIE ; iniializare ntreruperi
BANKSEL PORTC ; Bancul 0
BSF INTCON,PEIE ; validare ntreruperi 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)

130
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
5.1.3. Comparaii privind arhitecturi ale portui serial la CISC i RISC
Modul de transmisie este mai evoluat la PIC avnd i posibilitatea de
a transmite sincron. Avnd n vedere c modul asincron se regsete la
amble microcontrolere se observ c la PIC sunt mai multe moduri de
lucru: transmisie pe 8 sau 9 bii, avnd i posibilitatea de detectare a
adresei. Modul de iniializare este mai complex la PIC tocmai datorit
prezenei mai multor moduri de comunicare.
Datele recepionate sunt transferate ntr-un registru tampon pentru a nu
se pierde. Tot la PIC exist i metode de detecie a erorilor realizate din
fabricaie, avnd bii identificatori prevzui pentru aceasta.
Programarea n C este asemntoare pentru cele dou microcontrolere
dar n asamblor programul la PIC este mai mare tocmai datorit setului
redus de instruciuni.

5.2. Interfaa de trasmisie serial la RISC i CISC


Interfaa de transmisie serial este realizat pentru comunicarea
datelor serial dar sincron. Aceasta poate fi un port serial sincron
definit de firma Motorola SPI (Serial Peripheral Interface) sau o
interfa serial bidirecional I2C dezvoltat de Philips, destinat
aplicaiilor de 8 bii, cunoscut i sub numele de TWI (Two Wire
Interface). Interfaa SPI realizeaz transmisia datelor pe trei fire iar
interfaa serial I2C ofer posibilitatea de comunicare folosind dou fire
unul pentru transmisia datelor SDA i cellalt pentru semnalul de ceas
SCL. Comunicarea se realizeaz ntre microcontroler i dispozitivele
externe cum ar fi memorii EEPROM, FLASH, senzori cu ieiri digitale,
etc. (Fig. 5.9.). Astfel c exist dispozitive Master i dispozitive Slave
identificate cu ajutorul adreselor.

131
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Fig.5.9. Conectarea dispozitivelor la liniile magistralei I2C

Interfaa I2C este o magistral serial pe dou linii, oferind


posibilitatea conectrii mai multor dispozitive Slave secundare pe
aceste dou linii. Transmisia datelor se bazeaz pe un protocol simplu
de comunicaii specificate n catalogul fiecrui microcontroler.

5.2.1. Interfaa serial I2C la microcontrolerul CISC 80552


Avnd n vedere c microcontrolerul 8051 nu are prevtut port I2C
se va descrie n continuare interfaa I2C de la 80552 [16]. Cele dou linii
de transmisie bidirecionale 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 funcia 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 pn la 3.4Mbit/s n modul
foarte rapid. Fiecare dispozitiv conectat este recunoscut de o adres
unic i poate opera ca dispozitiv receptor ct i emitor. Linia SDA
respectiv SCL faciliteaz detectarea coleziunilor, sincronizarea
132
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
semnalelor de ceas. Semnalele de ceas sunt ntotdeauna generate de
dispozitivul principal, dispozitivele secundare pot ine magistarala n
starea 0 logic adic starea de ateptare. Mesajele pe care se bazeaz
protocolul de comunicaie ntre dispozitive sunt reprezentate de
condiiile START, STOP i alte condiii. Emitorii i/sau receptorii pot
opera n mod master (dispozitiv principal) sau mod slave (dispozitiv
secundar), aceasta depinde dac integratul a fost iniializat de un
transfer de date sau simplu a fost adresat. I2C este o magistral multi-
master, ceea ce nseamn c poate controla de mai multe circuite
integrate cu un Master.

Fig. 5.10. Conectarea dispozitivelor la liniile SDA i SCL, se observ


modul de realizare a funciei I cablat (redesenat dup [16])

Pinii dedicai interfeei I2C, la 80552 sunt P1.6 (SCL) i P1.7 (SDA) care
trebuie s fie iniializai pe valoare logic 1 pentru activare. La 80C552
interfaa I2C este denumit SIO.
Caracteristici ale magistralei I2C la microcontrolerul 80552 (Schema
bloc Anexa 4)

133
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
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 bidirecional;
Asigur arbitrare simultan multimaster (fr un master
central), cu mai multe microcontrelere master emitori, fr alterarea
datelor pe magistral;
Permite utilizarea I2C n scopuri de testare i diagnosticare;
Interfaa ntre microcontroler i I2C se realizeaz prin
intermediul a patru registre cu funcii speciale, i anume:
- S1CON registrul de control, de 7 bii utilizat pentru
controlul urmtoarelor funcii: start i restart al unui transfer, terminarea
unui transfer, rata de transfer, recunoaterea adreselor i emiterea
semnalului de acceptare (acknowledgment)
- S1STA este registrul de stare, n structura interfeei este
un decodor de stare care genereaz un cod unic de 5 bii pentru fiecare
stare a magistralei. Productorul definete 26 de stri n toate cele patru
moduri de lucru ale SIO1. Fiecare cod de 5 bii genereaz adresa
subrutinei de tratare a ntreruperii i este memorat n registrul de stare
S1STA, pe poziia celor mai semnificativi 5 bii, restul de trei bii, cei mai
puin semnificativi sunt 0 n acest registru. ncrcarea celor 5 bii n
S1STA se produce atunci cnd este setat hardware flag-ul de
ntrerupere, i rmne stabil pn cnd acest flag este resetat
software.
- S1DAT registrul de date cate conine cei 8 bii ce urmeaz
a fi transferai
- S1ADR registru pentru memorarea adresei slave-ului pe 7
bii al 8-lea, bitul CG are rol n recunoaterea adresei slave-lui.
134
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Pentru transferul de date, trebuie respectai paii:
Trimisia condiiei 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 bii serial. Fiecare grup
de 8 bii este urmat de un bit ACK, care are valoarea 0 logic
Pentru terminarea transferului este trimis o condiie de
STOP pe durata pulsului semnalului de tact (SCL este HIGH)
Pentru programarea interfeei ntr-unul din cele patru moduri de lucru
este necesar s fie cunoscute:
Funciile fiecrui bit din structura celor patru registre din zona
SFR, cele 26 coduri de stare ale busului, operaiile care trebuie
executate n fiecare din cele 26 stri.

Pachetul de date transferate de la Master ctre receptor ncepe cu


adresa Slave-ului, urmat de un numr de octei de date. Slave-ul
transmite un bit de confirmare dup fiecare octet primit. Pachetul de
date transmis de la Slave la Master ncepe cu octetul de adres
transmis de Master. Slave-ul transmind un bit de confirmare i apoi
datele cerute de Master. n acest caz Master-ul trimite bit de confirmare
dup fiecare octet primit. La sfritul recepionrii octetului returneaz
un not acknowledge

Mod de lucru Master Transmitter: Un master transmite un


numr de octei unui slave receptor
Mod de lucru Master Receiver: Un master recepioneaz un
numr de octei de la un slave emitor
135
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Mod de lucru Slave Receiver: Un slave recepioneaz un
numr de octei de la un master emitor
Mod de lucru Slave Transmitter: Un slave trimite un numr de
octei ctre un master receptor

Exemplul unui pachet de date recepionate de ctre Master

START Adresa Citire ACK Data ACK STOP

Exemplul unui pachet de date trimise de ctre Master

START Adresa Scriere ACK Data ACK STOP

Coloanele haurate sunt date transmise de Master ctre Slave

Fig.5.11. Configurarea intrare/ieire serial [17]

Rata de transfer a datelor se stabilete conform setrilor biilor CR2,


CR1, CR0 din registrul S1CON (Tabelul 5.4.).
Tabelul 5.4. Stabilirea ratei de transfer

136
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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
rencrcare
temporizator
1 mod2 )

Registrele utilizate n funcionarea interfeei I2C din SFR sunt


prezentate mai jos conform [17].

137
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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

Funcionarea n ntreruperi a portului se realizeaz prin setarea biiilor


EA i ES1 din registrul IEN0. Bitul de stare care indic terminarea
sarcinii este SI din S1CON. Biii 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. Interfaa serial la PIC16F87X


Microcontrolerul PIC16F877 are un port serial master sincron
(MSSP) care poate lucra n unul din modurile interfa serial sincron
(SPI) sau interfaa serial bidirecional (I2C).
Interfaa SPI are la baz un protocol de transmisie serial a datelor
pe trei fire: SDO, SDI i SCK. Acest protocol de transmisie este utilizat

138
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
pentru conectarea microcontrolerului la carduri de memorii, decodoare
MP3, dispozitive de memorii sau alte aplicaii de vitez. n acest caz nu
este nevoie s fie trimis adresa dispozitivului, aceasta este important
dac sunt conectate mai multe dispozitive, ceea ce mrete viteza de
comunicare. Dac I2C permite conectare a maxim 1024 dispozitive la
SPI nu exist o limit. Interfaa SPI poate lucra n modul Master sau
Slave. Masterul este cel care stabilete frecvena de comunicare, la
fiecare impuls de ceas este transmis sau recepionat data. SPI este
prevzut i cu pin de selecia a dispozitivului (SS), fiecare dispozitiv cu
care comunic este prevzut cu pini SDI, SDO, Clock i de selecie
cunoscut ca pin de selcie Slave. Pinul de selecie poate fi programat
pentru a fi activ pe front cresctor sau descresctor funcie de cerina
dispozitivului conectat la microcontroler. Comunicarea pe SPI este
bidirecional i recepionarea i transmisia datelor se poate realiza n
acelai timp (Fig. 5.13).

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


SPI

139
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Tabelul 5.5. Starea pinilor interfeei SPI n conexiunea Master-Slave
Pin SPI Stare pini Master Stare pini Slave
SDO (RC5) Ieire Intrare
SDI (RC4) Intrare Ieire
SCK (RC3) Ieire Intrare
SS Ieire Intrare

Pinii de comunicare sunt setai cu registrul TRISC.

Modul de lucru al interfeei SPI


La PIC 16F8777, registrele SSPSTAT i SSPCON sunt utilizate s
controleze modulul SPI. Registrul tampon este SSBUF pentru datele de
intrare/ ieire. Pentru a iniializa interfaa serial SPI s lucreze n mod
Master se vor programa biii SSPM3-SSPM0 din registrul SSPCON.

Tabel 5.6. Programarea modurilor de lucru SPI


SSPM3 SSPM2 SSPM1 SSPM0 Funcia Frecvena
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

Interfaa SPI poate fi iniializat s lucreze n patru moduri diferite


dependente de palierul impulsului de ceas (0 sau 1) pe timpul

140
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
transmisie datei i a frontului cresctor sau descresctor pe care se
realizeaz citirea unei noi date.
Pinul /SS (port A pinul 5) este configurat ca intrare/ieire digital din
registrul ADCON1 care se va prezenta la convertorul analog digital.
Polaritatea ceasului (CKP) determin dac impulsul de ceas este pe
front cresctor sau descresctor n momentul transmiterii datei.
CKP=1 ceasul va fi pe nivel cresctor
CKP=0 ceasul va fi pe nivel descresctor
Frontul ceasului (CKE) stabilete momentul eantionrii datelor, pe
front cresctor sau descresctor de ceas.
CKP = 0, CKE = 0 - Data este citit pe front cresctor
CKP = 0, CKE = 1 - Data este citit pe front descresctor
CKP =1, CKE = 0 - Data este citit pe front descresctor
CKP = 1, CKE = 1 - Data este citit pe front cresctor
Astfel pot fi considerate 4 moduri funcie de strile descrise mai sus
(Tabelul 5.7, Fig. 5.14)

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: Frecvena maxima de lucru la PIC este 20MHz i ceasul de 5MHz

141
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Fig. 5.14. Se prezint sensul semnalelor cnd SPI lucreaz pe mod


Master i Slave

Fig. 5.15. Modul Master, prezentarea diagramei semnalelor (copiat din


[19])

142
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Fig.5.16. Modul Slave, diagram semnalelor pentru CKE=0 i CKE=1 (din


[19])

Fig. 5.17. Schema bloc a interfeei seriale SPI la PIC 16F877 (redesenat
dup [19])

143
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Datele sunt transmise mai nti n registrul tampon SSPSR i apoi


salvate n SSPBUF. Deci exist o dubl buferare ceea ce duce la o mai
bun pstrare a datelor. Pot apare erori de suprapunere a datelor la
primire, cnd vechile valori nu sunt copiate n registrul SSPBUF n
momentul n care se recepioneaz altele.
Dac microcontrolerul este n modul SLEEP, interfaa poate primi sau
transmite date dac este programat s lucreze n modul Slave.
Bitul SSPIF este setat cnd se termin sarcina de citire/scriere din/n
registrul tampon.
Registre folosite n programarea interfeei SPI sunt:
INTCON registrul de ntreruperi prezentat n Tabelul 3.5. (biii GIE,
PEIE sunt folosii pentru programarea dispozitivului SPI s lucreze n
ntreruperi)
PIR1 este registru ce conine biii de semnalizare a ntreruperilor. n
cazul de fa este folosit bitul SSPIF (vezi seciunea Portul Serial la PIC
16F877 secinea 5.1.2)
SSPBUF registru tampon de transmisie/recepie a datelor
SSPCON registru pentru programarea dispozitivului SPI
SSPSTAT arat starea transferului de date, aceast informaie este
dat prin detectarea biilor de START sau STOP, specifiec dac
octetul recepionat a fost de date sau adres, dac urmtorul octet este
de adres pe 10 bii i dac transferul este de scriere sau citire a unui
date.
SSPSR - registrul de deplasare al datelor n sau de la dispozitiv (nu este
accesibil direct)

144
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
SSPBUF i SSPSR creaz o dubl buferare la recepie, acesta permite
recepionarea urmtorului octet nainte de a fi citit vechiul octet. Dup
transferul complet al octetului n SSPBUF, bitul SSPIF este setat.

Descriea 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 eantion


SPI mod Master:
1 = data de intrare eantiont la sfritul semnalului de ieiere a datei
0 = data de intrare eantionat la mijlocul semnalului de ieire a datei
SPI mod Slave:
SMP trebuie ters cnd 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: selecie front ceas pentru SPI (Tabelul 5.7)
mod SPI:
pentru CKP = 0
1 = transmisie date pe front cresctor al SCK
0 = transmisie date pe front descresctor al SCK
Pentru CKP = 1
1 = transmisie date pe front descresctor al SCK
0 = transmisie date pe front cresctor al SCK
n modul I2C Master sau Slave:
1 = nivele de intrare conform pe SMBus spec
145
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
0 = nivele de intrare conform I2C specs
D/A: bit de Data/Adres (doar n mod I2C mode)
1 = Indic faptul c ultimul octet transmis/recepionat a fost de date
0 = Indic faptul c ultimul octet transmis/recepionat a fost de adres
P: bit STOP (doar mod I2C. Bit ters cnd dispozitivul MSSP este
dezactivat, SSPEN este ters)
1 = Indic c ultimul bit detectat a fost STOP (acest bit este 0 pe
RESET)
0 = ultimul bit detectat nu este STOP
S: bit START doar mod I2C. Bit ters cnd 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 informaiei (doar n I2C)
Acest bit pstreaz informaia bitului R/W urmnd ultima adres egal.
Acest bit este valid doar de la egalitatea adresei la urmtorul bit de
START, STOP sau de negarea 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
acest bit i cu biii SEN, RSEN, PEN, RCEN, sau ACKEN.
UA: actualizare adres (doar pe 10-bii mod I2C)
1 = indic actualizarea adresei din registrul SSPADD
146
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
0 = nu este nevoie ca adres s fie actualizat
BF: bit care indic faptul c registrul tampon este plin
Recepie (n mod SPI i I2C):
1 = recepionare complet SSPBUF este plin
0 = recepionare incomplete, SSPBUF este gol
Transmisie (doar n mod I2C):
1 = Transmisie n lucru (nu sunt inclui biii ACK i STOP), SSPBUF plin
0 =Data transmis complet (nu sunt inclui biii 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 detecie a erorii n caz de suprapunere


Mod Master:
1 = scriere n SSPBUF cnd condiia I2C conditions nu este valid
0 = nu este coliziune
Mod Slave:
1 = scriere n SSPBUF cnd transmite nc vechea data (ters soft)
condiia I2C nu este valid
0 = nu este coliziune
SSPOV: bit de indicare a suprapunerii la recepie
Mod SPI:
1 = o nou dat este recepionat cnd SSPBUF are nc data veche.
Data din SSPSR este pierdut prin suprapunere.
Modul Slave - utilizatorul trebuie s citeasc SSPBUF, chiar dac doar
data transmis permite suprapunerea. n mod Master, bitul de
147
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
suprapunere nu este setat, pn cnd fiecare operaie este iniializat
de scrierea n registrul SSPBUF. (Trebuie ters soft)
0 = Nu este suprapunere.
n mod I2 C:
1 = un octet este recepionat n timp ce SSPBUF este ncrcat nc cu
octetul trecut.
SSPOV este pe stare de "nepsare" n modul Transmisie. (trebuie
ters soft)
0 = Nu este suprapunere.
SSPEN = bit de validare a portului serial sincron
n mod SPI, cnd este validat, aceti pini trebuie s fie configurai ca
intrri sau ieiri
1 = valideaz portul serial i configureaz SCK, SDO, SDI, i SS ca pini
ai portului serial
0 = Dezactiveaz portul serial i configureaz pinii ca intrri/ieiri
n mod I2C, cnd este validat, aceti pini trebuie s fie configurai ca
intrri sau ieiri
1 = valideaz portul serial i configureaz SDA, i SCL ca pini ai portului
serial
0 = Dezactiveaz portul serial i configureaz pinii ca intrri/ieiri
CKP: bit selecie polaritatea 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 controlul
1 = validare ceas

148
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
0 = menine ceasul pe nivel sczut (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 selecie a modului de lucru a portului


serial sincron

SSPM3 SSPM2 SSPM1 SSPM0 Funcie


Frecvena
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 bii
0 1 1 1 Slave, adresa pe 10 bii
1 0 0 0 Master, clock =
FOSC/(4*(SSPADD+1))
149
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
1 0 1 1 Master, (Slave repaos)
1 1 1 0 Master, adresa pe 7 bii cu
bii valizi de START, STOP
i ntreruperi
1 1 1 1 Master, adresa pe 10 bii
cu bii 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 validare a apelurilor generale (Doar n modul I2C Slave)


1 = validare ntrerupere cnd o adres general (0000h) este
recepionat 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 recepionat de la slave
0 = Confirmarea a fost recepionat de la slave
ACKDT: bit de confirmare dat (doar n mod I2C Master)
n mod Master recepie:
Valoarea va fi transmis cnd utilizatorul iniiaz o secven de
confirmare la sfritul recepionrii
1 = Nu este confirmare

150
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
0 = confirmare
ACKEN: bit validare confirmare secven (doar n mod I2C Master)
n mod Master recepie:
1 = iniiaz o secven de confirmare pe pinii SDA i SCL i transmite
bit de data ACKDT. ters automat hard.
0 = pauz secvena de confirmare
RCEN: bit de validare recepie (doar n mod I2C Master)
1 = mod validare recpie pentru I2C
0 = pauz recepie
PEN: bit validare condiie de STOP (doar n mod I2C Master)
SCK elibereaz control:
1 = Iniiaz condiie de STOP pe pinii SDA i SCL. ters automat hard.
0 = pauz condiie STOP
RSEN: bit validare a condiiei de START repetat (doar n mod I2C
Master)
1 = Iniiaz condiie de START repetat pe pinii SDA i SCL. ters
automat hard.
0 = pauz condiie START repetat
SEN: bit validare a condiiei de START (doar n mod I2C Master)
1 = Iniiaz condiie de START pe pinii SDA i SCL. ters automat hard.
0 = pauz condiie START

Funcii C aflate n librria CCS pentru programarea interfeei SPI


Read_bank() citire banc de date
Setup_spi() iniializare SPI
Spi_read() citire SPI
Spi_write() scriere SPI
Spi_data_is_in()
151
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Exemplu de utilizare a funciilor C de mai sus


void reset_ext_io(void) {
output_low(EXT_IO_RESET); //pin de RESET nivel sczut
output_high(EXT_IO_RESET); //pin de RESET nivel nalt
setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16); //se
iniializeaz pe mijlocul semnalului de ceas, 10MHz
output_low(EXT_IO_CS); //selectare pin ext_io chip pe nivel sczut
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 acest mod
se realizeaz pe dou fire, SDA i SCL, nu se poate realiza recepia i
transmisia datelor simultan, acest port funcionnd dup un protocol
stabilit de productor. Portul I2C poate lucra n mod Master sau Slave,
adresa fiind reprezentat pe 7 sau 10 bii. 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

152
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
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 terminare
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 programului surs pentru I2C. O adres de dispozitiv are 7
bii conform standardului I2C (la I2C extins adresele pot fi de 10 bii).
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 ctre toate
dispozitivele. Adresele 11110XX sunt rezervate pentru schema extins
cu adres pe 10 bii; exist de asemenea i alte adrese rezervate.

Modurile de lucru selectate cu ajutorul biilor SSPM3, SSPM2, SSPM1,


SSPM0 sunt:
Mod I2C Slave (adresa pe 7 bii)
Mod I2C Slave (adresa pe 10 bii)
Mod I2C Master, ceas=OSC/4(SSPADD+1)
Modul I2C firmwave (furnizate pentru compatibilitatea cu alte produse)
153
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
nainte de a se selecta modul I2C pinii SDA i SCL sunt setai ca intrri.

Fig. 5.18. Schema bloc a portului I2C a microcontrolerului 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 specifcaiilor I2C.
Registrul SSPSTAT d informaii despre starea transferului de date.
Aceste informaii includ detectarea biilor START (S) i STOP (P),
specificnd dac octetul recepionat este dat sau adres, dac
urmtorul octet este o adres pe 10 bii i dac aceasta va fi un transfer
de date de scriere sau citire. Registru SSPBUF este un tampon n care

154
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
data transferat este scris sau citit. SSPSR transfer data n sau din
exterior. n recepionarea datelor se creaz o dubl salvare a datei
astfel c se poate reception urmtorul octet nainte de a fi citit anteriorul.
Cnd transferul este complet data este transferat n SSPBUF i bitul
indicator SSPIF se seteaz automat. Dac se recepioneaz un alt octet
nainte ca SSPBUF s fie citit se realizeaz o suprapunere ceea ce este
indicat prin setarea bitului SSPOV din registrul SSPCON i bitul din
SSPSR este pierdut.
Registrul SSPAD conine adresa modulului Slave. Dac lucreaz n
modul Slave pe adres pe 10 bii, utilizatorul are nevoie s scrie primul
octetul de adres (1111 0 A9 A8 0). Urmnd apoi, dup compararea
octetului trimis, s se scrie octetul de adres mai puin semnificativ
(A7:A0).

Fig. 5.19. Semnalele de pe liniile SCL i SDA (http://www.best-


microcontroller-projects.com/i2c-tutorial.html)

155
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Fig.5.20. Semnalele de START i STOP

Secvena 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 configurai ca intrri. Cnd o
adres este comparat sau o data este transferat dup o adres
recepionat, hardul genereaz automat un impuls de confirmare (ACK)
i apoi SSPBUF este ncrcat cu valoarea curent din registrul SSSR.
Nu se transmite impulsul de confirmare (ACK) dac bitul BF este setat
indicnd regitrul tampon plin sau bitul SSPOV de suprapunere este 1
nainte de recepie 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 strile biilor la
transferul datelor i cnd se transmite ACK. Descierea biilor utilizai
sunt descrii mai sus n prezentarea registrelor.

Secvena transferului

156
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Tabelul 5.8. Tranferul de date n mod Slave, bii afectatai (dup [19])
Stare bii ca SSPSR Generare Setare
date transfer i
SSPBUF /ACK SSPIF
recepie
BF SSPOV
0 0 Da Da Da
1 0 Nu Nu Da
1 1 Nu Nu Da
0 1 Da Nu Da

La recepionarea adresei pe 8 bii se va primi mai nti bitul de Start i


apoi biii SSPSR <7:1> care vor fi comparai cu cei din registrul
SSPADD pe front descresctor al lui SCL. Dac valorile sunt egale i
biii BF i SSPOV sunt teri, valoarea din SSPSR este ncrcat n
SSPBUF pe front cztor, bitul BF este setat pe al 8-lea impuls, front
cztor i se genereaz un impuls de confirmare ACK, iar pe al 9-lea
impuls, front cztor se seteaz bitul SSPIF de ntreruperi.
n cazul n care adresa este pe 10-bii, se repeioneaz doi octeti de
adres. n octetul cel mai semnificativ se specific dac adresa este pe
8 sau 10 bii.
Bitul R/W (SSPSTAT<2>) trebuie s specifice o scriere, astfel c
dispozitivul Slave va recepiona 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 informaie general. n
acest caz toate dispozitivele vor rspunde cu un bit ACK. Acest mod
este asemntor cu protocolul de transmisie adres pe opt sau zece
bii. n acest caz toi biii sunt 0 inclusiv cel de R/W. Acest mod este

157
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
recunoscut cnd bitul GCEN (registrul SSPCON2.7) este validat. n
modul 10 bii este utilizat i bitul UA pentru a indica transferul pe doi
octei ai adresei. Dac microcontrolerul se afl n starea SLEEP,
modului I2C poate primi adres sau date. Dup recepie se produce o
ntrerupere ceea ce trezete 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 condiiilor de START (S) i STOP(P). Aceste condiii sunt
terse prin RESET sau cnd modulul MSSP este dezactivat. Controlul
magistralei I2C poate fi preluat cnd bitul P este 1 logic, magistrala fiind
n repaos cnd ambii bii 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 condiie de START
Exist o condiie de STOP
Este transmis un octet
Este transmis confirmare
Este transmis un START repetat.

158
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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

Cnd modulul funcioneaz n mod multi-Master linia SDA trebuie


supravegheat pentru arbitrare, se observ dac nivelul semnalului este
cel ateptat la ieire.
ntreruperea se produce la una din condiiile prezentate mai sus, inclusiv
i la transmisia unei adrese sau date. Modul Master este validat prin
setarea i tergerea biilor SSPM din SSPCON i setarea bitului
SSPEN.
Odat validat modul Master, exist ase opiuni de lucru:
cere o condiie de START pe SDA i SCL.
cere un START repetat pe SDA i SCL
scrie n SSPBUF iniializnd transmisia unei date/adrese
genereaz condiie de STOP pe SDA i SCL
159
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

configureaz portul I2C pentru a recepiona o dat


genereaz o confirmare ACK la sfritul octetului de date.
Modulul I2C n mod Master genereaz toate semnalele de ceas i
condiiile de START i STOP. Transferul se termin cu condiia de
STOP sau START repetat. Dac se transmite un START repetat se
transmite un alt pachet de date, magistrala nefiind eliberat.
Primul octet transmis de Master este cel de adres, pe 7 bii unul fiind
de R/W.
Datele sunt transferate pe 8 bii, dup recepionare se primete un ACK,
START i STOP delimitnd transferul serial (dac R/W este 0 logic).
Dac R/W este 1 logic se recepioneaz date pe SDA, linia SCL fiind
setat ca ieire, dup care se transmite un ACK. Biii START i STOP
indic nceputul i sfritul transmisiei.
Rata de transfer este generat pentru ceasul de pe SCL i poate fi de
100kHz, 400kHz, 1MHz. Blocul generator al ratei de transfer rencarc
valoarea coninut pe cei mai puin semnificativi 7 bii din registrul
SSPADD. Generatorul ncepe numrarea odat cu scrierea pe SSPBUF
i se oprete dup ACK, pinul SCL rmne n ultima stare. Biii din
SSPADD sunt ncrcai n numrtorul BRG, care numr descresctor
pn la 0. BRG este decrementat de dou ori pe ciclu instruciune. n
mod Master, BRG este rencrcat automat.

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

160
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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 utilizm. Acestea nu fac obiectul de studiu al acestei
lucrri.

Funcii C aflate n librria CCS pentru programarea interfeei I2C


I2c_start()
I2c_stop()
I2c_read()
I2c_write()
I2c_poll()

Exemplu de secvene de program n C pentru programare I2C la PIC


16F877
Funcie de iniializare a I2C pentru transmisie date
void i2c_stop(void)
{

161
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

SDA = 0;
i2c_delay();
SCL = 1;
i2c_delay();
SDA = 1;
i2c_delay();
}

Funcie de iniializare a I2C pentru transmisie date


void i2c_start(void)
{
SDA = 1;
i2c_delay();
SCL = 1;
i2c_delay();
SDA = 0;
i2c_delay();
SCL = 0;
i2c_delay();
}

5.3. Concluzii ale modurilor de transmisie serial


Probleme ale interfeei SPI
Schema ceasului poate fi diferit ntre dispozitive
162
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Lungimea datei poate varia de la un dispozitiv la altul.

Avantaje ale interfeei SPI


Foarte rapid
Protocol simplu de comunicare
Interfee simple, unidirecionale
Permite transmisia biidrecional a datelor simultan

Tabelul 5.9. Compararea celor trei moduri de transfer serial a datelor


SPI RS-232 I2C
Pini 3+1 2 2
Numr de nelimitat 2 1024
dispozitive
Bii n transferul 8 10(8bii 9 (8 bii
unei date dat+START+STOP) dat+ACK)
Terbuie s fie Nu Nu Da
transmis adresa
dispozitivului
nainte de
transferul de
date?
Tip de ceas Doar Master Ambele Ceasul de
Master
poate
influena
Slave-ul
Data poate fi Da Da Nu

163
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

transferat
bidirectional
simultan?

Realiznd o comparaie privind transmisia serial la 80552 i PIC 16F877


se observ c la al doilea microcontroler portul serial este mai evoluat,
existd 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 este mai mare la PIC16F877 dect la 80552.

164
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Capitolul 6

CONVERTOR ANALOG DIGITAL

Dispozitivele de preluare a datelor din mediu au ieiri analogice sau


digitale. Datele analogice trebuiesc prelucrate astfel nct 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 performane deosebite n ultimii ani.
Dac la nceput dispozitivul era extern microcontrolerului iar informaia
era transmis la pinii digitali ai microcontrolerului, acesta a fost
ncorporat la nceput cu performane sczute. Principiul de funcionare
se bazeaz pe logica programat, codul program ncepnd cu etapa de
iniializare a convertorului. Microcontrolerele au intrri digitale.
Selectarea intrrii utilizate se realizeaz prin bii de selecie care aparin
registrului de comand specific convertorului. Convertorul din
microcontroler este, n majoritatea cazurilor, cu aproximaii succesive,
tensiunea de referin fiind intern sau extern. Tensiunea de intrare
analogic trebuie s aib valoare mai mic dect tensiunea de
alimentare a microcontrolerului. Rezoluia poate fi selectat prin soft.
Rezultatul conversiei este nregistrat n registre dedicate acestui
periferic. Exist bii dedicai de start conversie i bii care semnalizez
microcontrolerul c s-a terminat conversia. Convertorul poate lucra sau
nu n ntreruperi.

165
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
6.1. Convertorul analog digital la microcontrolerul PIC16F877
Convertorul analog digital implementat pe microcontrolerul
PIC16F877 are cinci intrri ceea ce permite conectarea a 28 dispozitive.
Intrrile sunt analogice, convertorul genernd un semnal digital al
nivelului analogic prin aproximaii succesive. Rezoluia convertorului
este de 10 bii, valorile sunt nregistrate pe dou registre. Modulul are
referin de tensiune de nivel maxim sau minim, care poate fi selectat
prin program combinnd Vdd, Vss, RA2 i RA3. Cnd microcontrolerul
se afl n mod SLEEP, convertorul funcioneaz folosind oscilatorul RC
intern. Pinii RA2 i RA3 au i funcia de referin extern pentru
convertor.
Registrele utilizate n programarea convertorului sunt:
ADRESH registrul n care se nregistreaz rezultatul, octetul
mai semnificativ
ADRESL- registrul n care se nregistreaz rezultatul, octetul
mai puin semnificativ
ADCON0 registrul prin programarea cruia se controleaz
operaiile modulului
ADCON1 registrul dedicat cu ajutorul cruia se configureaz
funciile 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 stare pini port E
PORTE - programare port E
166
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

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: bii selecie 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 selecie 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/AN5)(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)
neimplementat: se citete ca 0
ADON: bit pornire conversie
1 = modulul realizeaz conversia
0 = conversia oprit
167
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Descriere registru ADCON1
U-0 U-0 R/W- U-0 R/W-0 R/W-0 R/W-0 R/W-0
0
ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0

ADFM: bit de selecie a formatului rezultatului


1 = aliniat dreapta. Biii cei mai semnificativi n numr de 6 din ADRESH
sunt citii ca 0
0 = aliniat la stnga. Biii cei mai puin semnificativi n numr de 6 din
ADRESL sunt citii ca 0
Bit neimplementat:citit ca '0'
PCFG3:PCFG0: bii de control ai configurrii portului analog digital

Fig. 6.1. Moduri de salvare ale rezultatului conversiei (redesenat dup


[19])

168
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Tabel 6.1.Configurarea biilor PCFG 3-0 pentru selectarea pinilor de
intrare analog digitali [19]

Registrele ADRESH:ADRESL conin rezultatul conversiei pe 10 bii.


Dup terminarea conversiei, rezultatul este salvat n cele dou registre
i bitul GO/DONE este ters iar bitul ADIF este setat. Dup etapa de
iniializare a convertorului, trebuie selectai 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. Selecie canal ca intrare (ADCON0)
3. Selecie ceas conversie (ADCON0)
4. Start convertor (ADCON0)
5. Configurare vector ntrerupere (dac se dorete): - tergere ADIF,
setare ADIE, setare PEIE, setare GIE
6. Ateptare pentru primire valoare conversie
7. Start conversie: setare GO/DONE
8. Ateapt terminarea conversiei

169
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
a. Testare bit GO/DONE (pooling)
b. Salt ntrerupere la finalizarea conversiei
9. Citire rezultat din ADRESH:ADRESL, tergere ADIF
10. Salt la punctul 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 selecia sursei de
ceas, modulul ateapt un ciclu instruciune nainte de a ncepe
conversia. Aceasta permite execuia instruciunii SLEEP, care elimin
toate zgomotele digitale de la conversie. Dac se produce o ntrerupere
la sfritul conversiei, microcontrolerul este trezit din modul SLEEP.
Dac se lucreaz n pooling, ADON rmne setat i modulul este nchis.

170
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
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 urmtorul: toate registrele sunt forate n starea lor de
reset conform catalogului, orice conversie fiind oprit. Pinii sunt
configurai ca intrri analogice, valoarea din ADRES este modificat la
RESET.

Funcii din librria C (CSS pentru PIC) pentru programarea convertorului


analog digital
Setup_vref() setare tensiune de referin convertor
Setup_adc_ports()- setare pini
Setup_adc()-iniializare convertor
Set_adc_channel()-iniializare canale
Read_adc()-citire rezultat.

Exemplu de rutin scris n asamblor pentru iniializarea convertor


movlw 0x00
banksel ADCON1
movwf ADCON1 ;PORT A este folosit ca intrare analogic
;rezultatul este aliniat la stnga ignornd ultimii 2 bii
banksel ADCON0
bucl
bsf ADCON0, GO ;start conversie
btfsc ADCON0, GO ;ateapt terminare conversie
goto bucl
bcf PIR1, ADIF ;tergere bit semnalizare
movf ADRESH,0; salvare rezultat n ADRESH
return
171
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Capitolul 7

MEMORII

7.1. Memoria EEPROM la microcontrolerul PIC 16F84

Prezentare general
2
Memoria EEPROM (sau E PROM), 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 alimentrii cu curent. Cea mai important
caracteristic a acestei memorii este faptul c nu este volatil. Cnd
este necesar un spaiu mai mare de stocare (ntlnit la stick-urile USB),
se folosete din motive economice un alt tip de memorie EEPROM:
memorie flash.
Memoria EEPROM este format dintr-o matrice de celule de memorie
care, la rndul lor, sunt formate din perechi de tranzistori ce au ntre ei
un strat subire de oxid izolator. Aceasta poate fi tears i
reprogramat (rescris) n mod repetat prin aplicarea unei tensiuni mai
mari dect cea generat de circuitul extern sau intern.
Microcontrolerul PIC16F84 are n interiorul arhitecturii 64 octei de
date EEPROM n intervalul de adrese 00h to 3Fh (Capitolul 2). Memoria
de date EEPROM poate fi scris i citit n timpul operaiilor, nu este
direct mapat n spaiul registrului de fiiere, fiind indirect accesat prin
SFR. Aceast memorie rezist la 10,000,000 de cicluri de
scriere/tergere.

172
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Regisitrele utilizate pentru programarea memoriei EEPROM sunt din
SFR :
EECON1
EECON2 (registru neimplementat fizic)
EEDATA stocheaz temporar 8 bii de date pentru
scriere/citire
EEADR -nregistreaz adresa locaiei EEPROM accesat
Cand dispozitivul este protejat, CPU poate continua s scrie sau s
citeasc date din EEPROM

Descriere registrul 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 iniializeaz transferul de date definit n EEADR la
registrul EEDATA. Pentru c timpul nu este esenial n citirea datelor ca
la scriere, datele din EEDATA pot fi deja folosite n urmtoarea
instruciune.
1=initializeaz citirea
0=nu iniializeaz citirea
WR bit de control scrire
Setarea acestui bit iniializeaz scrierea datelor din registrul EEDATA la
adresa specifcat prin registrul EEADR.
1=initializeaz scrierea
0=nu iniializeaz scrierea
WREN - Permite scrierea n EEPROM

173
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
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 scriere EEPROM
Acest bit este setat doar n caz c scrierea n EEPROM este ntrerupt
de un semnal sau prin terminarea timpului din temporizatorul watchdog
(dac este activat).
1=a avut loc eroare
0=nu a avut loc eroare
EEIF bitindicator ntrerupere la scriere EEPROM
Bit folosit pentru a informa c scrierea datelor s-a terminat.
Cnd 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 asamblor pentru scriere i citire


memorie EEPROM
1.tergerea unui bloc de memorie de la adresa 20h-2Fh
movlw 0x20 ;iniializare 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

174
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
2.Citirea memorie de date EEPROM
Citirea locaiei 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 urmtor i va fi stocat pn la urmatoarea
citire/scriere

2.1.Exemplul 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 EEPROM - Asemanator cu citirea data este memorata in
EEDATA, utilizatorul va iniia o secven de scriere a fiecarui bit
3.1.Exemplul de scriere n EEPROM
BSF STATUS, RP0 ; Banc 1
BCF INTCON, GIE ; dezactivare INTs.
BSF EECON1, WREN ; validare scriere
MOVLW 55h ;
;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 verificare la scriere
BCF STATUS,RP0 ; Banc 0
175
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
; 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 citete (n EEDATA) la
fel?
SUBWF EEDATA, W ;
BTFSS STATUS, Z ; este diferit de 0?
GOTO WRITE_ERR ; Nu, scrie eroare

Funcii C dedicate programrii memoriei EEPROM


Read_eeprom()
Write_eeprom()
Read_program_eeprom()
Write_program_eeprom()

7.2. Memoria flash la microcontrolerul PIC16FXXX


Memoria flash este un tip de memorie nevolatil cu alimentare
constant ale crei 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 nivel de bit, ceea ce o face
mai lent. Numele de memorie flash vine de la faptul c integratul este
organizat in aa fel nct o operaie de tergere se face printr-o singur
aciune sau flash. Memoria flash este folosit des pentru a memora
cod de control asemntor BIOS-ului calculatoarelor personale. Cnd
176
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
informaia din BIOS trebuie modificat memoria poate fi scris la nivel
de bloc, ceea ce o face mai uor de modificat. In schimb, flashul 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 bii 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 octei i 2048 de pagini de 264 octei de tip flash, funciile
care realizeaz scrierea datelor 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
urmtoarea secven de program:
a - scrie 264 octei n buffer 1 RAM
b - transmite comanda pentru scriere din buffer 1 RAM in FLASH
c - scrie 264 octei n buffer 2 RAM
d - transmite comanda pentru scriere din buffer 1 RAM in FLASH
e - reia secvena de la punctul a.

177
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Fig. 7.1. Arhitectura intern a memoriei flash AT45 DB041B


(redesanet dup [20])

Tabelul 7.1. Adresele blocului de tergere al memoriei [20]

178
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Aplicaie
Se conecteaz memoria flash AT45DB041B la microcontrolerul PIC
conform schemei electrice din Fig. 7.2. Comunicarea dintre cele dou
dispozitive se realizeaz prin interfaa serial. Se vor prezenta rutine 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.
VCC
J1 R15
1 AN0
2 AN1 D6 10k U3 PIC16F83_P
3 VRL/AN2 D1N4002 R14
4 RA3/AN3/Vref + 1MCLR/VPP 28 RB7
5 RA4/AN4/SS/HLVDIN/C2OUT AN0 2 1 28 27 RB6
220
6 RB2/INT2/AN8 AN1 3 2 27 26 RB5
7 RB3/AN9/CCP2 C16 VRL/AN2 4 3 26 25 RB4/AN11
8 RB1/INT1/AN10 RA3/AN3/Vref5+ 4 25 RB3/AN9/CCP2
24
9 RB4/KBI0/AN11 CRYSTAL 10uF 6 5 24 RB2/INT2/AN8
23
10 RB0/INT0/FLT0/AN12 R13 7 6
RA4/AN4/SS/HLVDIN/C2OUT23 RB1/INT1/AN10
22
quartz
11 OSC1 OSC2 0 AVSS 8 7 22 21 RB0/INT0/FLT0/AN12
12 OSC1 9 8 21 20 VDD=VCC
0 180 OSC2 10 9 20 19 VSS=GND
RC0 11 10 19 18 RC7/RX
CON12 RC1/CCP2 12 11 18 17 RC6/TX
C15 C14 RC2/CCP1 13 12 17 16 RC5/SDO
SCK/SCL 14 13 16 15 RC4/SDI/SDA
33p 33p 14 15

0
J6
1 VCC
U15 74126 2

RB5 1 14 VCC
R17 100k RC4/SDI/SDA
2 C1 VCC 13 RB6 CON2 0
SDA 3 A1 C4 12 SCK/SCL
RB4/AN114 Y1 A4 11 SCL
R16 5 C2 Y4 10 RB7
VCC 6 A2 C3 9 SCL R19 J7 R18
7 Y2 A3 8 SCK/SCL VCC 1 SCL VCC
10k GND Y3 SDA
2
10k 100k
0
CON2
U13 AT45DB041B
RC4/SDI/SDA
VCC RC5/SDO
1 8 VCC
VCC1
SCK/SCL 2 SI SO 7
R10 3 SCLK GND 6 D5
RC0 4 RESET VCC 5
CS WP
10k U2 0
16

R11 D4 P1
RC5/SDO 5
13 12
16

U14 AT45DB041B R1IN R1OUT 9 9


10k RC7/RX8 RC7/RX
R12 R8 R2IN R2OUT 4
RC1/CCP2 1 8 8
2 SI SO 7 1k 11 14
10k T1IN T1OUT 7 RC6/TX 3
R9 3 SCLK GND 6 RC6/TX 10
RESET VCC C12 1n T2IN T2OUT 7
RC2/CCP1 4 5 test C9 1n RC7/RX 2
CS WP 0 1
C1+ 6
10k 3
C10 1n 4 C1- MAX232 1
5 C2+
VCC1 C2- CONNECTOR DB9
0 C13 2
6 V+
15

C11 V-
15

Fig. 7.2. Schem electric de conectare a memoriei flash AT45DB041B


la microcontrolerul PIC16F83_P
179
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Exemple de rutine de comunicare a microcontrolerului cu memoria


flash. n Anexa 5 se regsesc adresele utile pentru 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
180
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
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 al memoriei externe flash cod 84h
;datele sunt scrise in memorie 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
;initializare pana la 264 octeti din memoria 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

181
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
; se introduce zero in bank2 cod 87h
movlw 0xFF; incarcare contor32 cu 255
movwf contor32
movlw spi_b2write ; 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
bucla_init_b2_256
addlw 0
call SPI_OUT
decfsz contor32,1; rezultat ramane in contor32
goto bucla_init_b2_256
;initializare pn la 264 octeti din memoria flash
movlw 0x09; reinitializare contor pn 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 memorie flash n mod bloc opcode 50h


182
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
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

;**** iniializare memorie EEPROM


bucla_init_EEPROM
movlw spi_blockerase; transmite cod de tergere n bloc a memoriei
call SPI_OUT
movf contor32,w
andlw 0x0f; transmite adresa care este pe 8 bii
call SPI_OUT
movf contor32,w; contor32 a
andlw 0x0f;
call SPI_OUT
movf contor32,w; contor32 a
andlw 0xf0
call SPI_OUT
183
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
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 verificare 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 testare 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

184
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
;***rutina transmisie SPI
SPI_OUT
; movlw 0
; movwf BSR; set bank 0
movwf SSPBUF; o noua data la ieire de transmisie 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 01
; movwf BSR; set bank 1
return

;***rutina receptie 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 operaie cu mem Flash


SPI_sfarsit
185
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
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
186
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

;***rutina de nchiere comunicaie 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
;***Iniializare memorie flash
;******transmitere date prin SPI la mem ext 1 si 2 SPI mod Master,
;slave este memoria ext. transmit_SPI
INIT_SPI1; iniializare SPI mem ext 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';iniializare pini ieire mem 1
movwf TRISC; 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 ext la sursa de alimentare
187
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
bsf PORTC,0,0; CS=0 invalidare comunicare cu memoria 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';iniializare pini ieire mem 2
movwf TRISC; CS=0, Reset=1, SCK=1 si SDO=1,CS=1(mem ext)
;pinul /CS al memoriei flash este conectat la PortC pin 0
nop
nop
bcf PORTC,2,0; CS=0 validare comunicare cu memorie extern 2
bcf PORTC,1 ; reset memorie extern, conectat la PortC pin 1
nop
bsf PORTC,1,0; conectare memorie extern la sursa de alimentare
bsf PORTC,2,0; CS=0 validare comunicare cu mem ext 2
return

7.3. Lucrul cu pointerii la nivel de locaii de memorie


Un pointer este o variabil care pastreaz adresa unei date, nu
valoarea datei. Poate fi utilizat pentru referirea diferitelor date i structuri
de date. Schimbnd adresa memorat n pointer, pot fi manipulate
informaii situate la diferite locaii de memorie. Pointerii permit de
asemenea crearea de noi variabile n timpul execuiei programului, prin
188
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
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 * Definirea de tipuri de dat tip * int*


refereniere pointer float* int**

Operator de & Extrage adresa unei &a


refereniere variabile

Operator de * Acceseaz zona de memorie *p


derefereniere indicat de un pointer

Exemplu
int* p, a, *q; ocup 2 respectiv 4 octei
p = &a;p se ncarc cu adresa lui a
q = p; coninutul lui p este acelai cu al lui q
*q = 9; indic coninutul lui a

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


189
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Valiabilele p i q (de la adresele 90 i 96) conin adresa lui a (94) iar


pointer pe p indic coninutul lui a (Fig.7.3).
Operatorul de atribuire = este folosit numai ntre pointeri de acelai tip
deoarece spaiul de memorie alocat este acelai/
int *i, *j;
float *a, *b;
i = j;
a = b;
i = a;Fals
b = j;Fals

Unitate: dimensiunea zonei de memorie ctre care indic pointerul


noiunea e definit doar pentru pointerii cu tip
int *p, a;
p = &a;
float *q, b;
q = &b

Exemplu de operaii cu pointeri


int a[10], *p, *q;
p = &a[0];
p+5
q = p + 5;

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

Alocarea dinamic a memoriei


Se include librria malloc.h (Visual C)
Funcii importante folosite n programarea la nivel de memorie al
microcontrolerelor
malloc
tip *p;
p = (tip*) malloc(dimensiune);
free
free(p);
Legtura ntre vectori i pointeri
Exemplu
int c[10];
int *i;

191
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
i = c;
c != i;
i = c + 6;
*(c+5) echivalent cu c[5]
*(i+5) echivalent cu i[5]
Legtura 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+ a *(a+
p 3 + 3)+2
3
Vectori alocai dinamic
Vector dinamic
Declarare
tip* p;
Alocare
p = (tip*) malloc( n * sizeof(tip));
Utilizare
p[i]
Eliberare (dezalocare)
free(p);

192
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Referine 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 aplicaii, 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/product/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., Anghelut A., Arhitectura sistemelor de calcul, Note de curs
Indrumar de laborator , Ed. Alma Mater Bacu, 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.tasking.com/support/8051/m_cc51_v7.2.pdf
13) Nigel Gardner, An introduction to programming The Microchip PIC
in CCS,
http://www.teiser.gr/icd/staff/kalomiros/Mtptx/e-books/eBook%20-
%20PIC%20Programming%20with%20C.pdf
193
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
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/

194
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

ANEXA 1

Tabelul cu registre din zona de registre cu funcii speciale (SFR) la


PIC16F84. Conform catalogului de la [9]

195
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
ANEXA 2

196
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
ANEXA 3

Zona de memorie cu registre cu funcii special la PIC16F877

197
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
ANEXA 4

Registre ale familiei 8051


Nume descriere adres
--- ----------- ------
ACC acumulator E0
B registru 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

198
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
IP

bit descriere simbol


--- ----------- ------
B7 rezervat
B6 rezervat
B5 rezervat
B4 prioritate ntrerupere port serialPS
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 descriere 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

199
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
PSW

bit descriere simbol


--- ----------- ------
B7 flag transport CY
B6 flag transport auxiliar AC
B5 flag de stare general F0
B4 registru bit selecie banc 1 RS1
B3 registru bit selecie banc 0 RS0
B2 flag depire OV
B1 definit de utilizator
B0 parity of accumulator P

TCON

bit descriere simbol


--- ----------- ------
B7 flag depire temporizator 1 TF1
B6 control temporizator 1 on/off TR1
B5 flag depire 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

200
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
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 pentru t/c 0
B1 idem pentru t/c 0
B0 idem pentru t/c 0

201
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
ANEXA 4

Schema bloc a interfeei seriale I2C la 80552 [13]

202
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
ANEXA 5

Tabelele cu operaii i adrese ale memorie flash AT45DB041B (date


de catalog)

203
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
ANEXA 6

Librria 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> <wchar.h> <wctype.h>

204
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
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

205
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

ANEXA 8

OPERATORI, OPERATII SI EXPRESII

Operator Operatie
+ Adunare
- Scdere
* 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
Exemplu Descrierea
Operator
++ ++a Variabla "a" incrementat cu 1
a++
-- --b Variabla "b" decrementat cu 1
b--

OPERATORI DE RELATIONARE
Operator descriere Exemple
> Este mai mare dect b>a
>= Mai mare egal a >= 5
< Mai mic dect a<b
<= Mai mic egal a <= b
== egal a == 6
!= Nu este egal a != b

206
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
OPERATORI LOGICI

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

OPERATORI 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
^

207
Microcontrolere CISC i RISC. Arhitecturi i principii de programare
Cum se folosesc operatorii. Prioritate
Prioritate Operatori Asociativitate
mare () [] -> . de la stnga la
dreapta
! ~ ++ -- +(unar) -(unar) *Pointer de la dreapta la
&Pointer stnga
*/% de la stnga la
dreapta
+- de la stnga la
dreapta
<> de la stnga la
dreapta
< <= > >= de la stnga la
dreapta
== != de la stnga la
dreapta
& de la stnga la
dreapta
^ de la stnga la
dreapta
| de la stnga la
dreapta
&& de la stnga la
dreapta
|| de la dreapta la
stnga
?: de la dreapta la
stnga
sczut = += -= *= /= /= &= ^= |= <= >= de la stnga la
dreapta

208
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

209
Microcontrolere CISC i RISC. Arhitecturi i principii de programare

Tiparul executat n
TIPOGRAFIA
UNIVERSITII MARITIME
Constana

210