Sunteți pe pagina 1din 115

1.

ELEMENTE DE ARITMETICĂ
BINARĂ ŞI CIRCUITE DIGITALE
ELEMENTARE

1.1. Elemente de algebră booleană

Algebra logică sau algebra booleană a fost concepută ca o metodă simbolică


de tratare a funcţiilor logice formale, fiind ulterior extinsă şi în alte domenii.
Deoarece între logica formală şi circuitele de comutaţie (cu două stări) există o
corespondenţă directă (logica formală studiază valoarea de adevăr sau de fals a
unor afirmaţii ce pot fi numai adevărate sau false, iar circuitele de comutaţie sunt
realizate prin interconectarea unor comutatoare ce au două stări: închis sau
deschis), algebra booleană s-a impus ca cea mai importantă modalitate de analiză şi
sinteză a circuitelor de comutaţie.
Algebra booleană se defineşte axiomatic astfel: fie (M, •, +) o mulţime cu
două operaţii şi M={0, 1} cu următoarele proprietăţi (axiome):
a) pentru orice elemente x1, x2 M există relaţiile (parte stabilă):
x1 • x2∈M şi x1 + x2 ∈M
b) operaţiile • şi + sunt comutative
x1 • x2 = x2 • x1 şi x1 + x2 = x2 + x1
c) operaţiile • şi + sunt asociative
(x1 • x2 ) • x3 = x1 • (x2 • x3 ) şi (x1 + x2) + x3 = x1 + (x2 + x3)
d) operaţiile • şi + sunt distributive una faţă de alta:
x1 • (x2 + x3) = x1 • x2 + x1 • x3;
x1 + (x2 • x3) = (x1 + x2) • (x1 + x3);
e) există element neutru pentru fiecare operaţie
x • 1 = x şi x+0 = x;
f) există element invers (complementar) pentru fiecare operaţie
x • x = x şi x+x = 1;
Valorile 0 şi 1 modelează logic stările circuitelor logice (digitale) care au
două stări. O funcţie f: M -> Mn, M = {0, 1} se numeşte funcţie booleană. Mn
reprezintă produsul cartezian M x M x M x ... x M.
Funcţiile logice sunt reprezentate cu ajutorul simbolurilor din figura 1.1:
2 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Figura 1.1. Reprezentarea funcţiilor logice

1.2 Coduri numerice


1.2.1 Reprezentări în virgulă fixă

Codurile numerice se împart în coduri binare şi coduri binar-zecimale.


Codurile binare sunt reprezentări ale numerelor utilizate în sistemele digitale.
Există următoarele tipuri de coduri binare:

1.2.1.1 Reprezentarea în modul şi semn (MS)

Fie (bn-1 bn-2 ... b0 • b-1 ... b-m) = (N)2

Valoarea numărului în baza 10 este:


n−2
N = (-1) bn-1 • ∑b
i =− m
i • 2i

Gama dinamică a numerelor reprezentate în MS este ± ( 2n-1 - 2-m) (valoarea


maximă, în modul este atinsă pentru bi=1, i = - m, n-2, adică
n−2
2 − m ( 2 n −1+ m − 1)
∑ 2i =
i =− m 2 −1
= 2 n −1 − 2 − m

Uzual m=0 (numere întregi). În acest caz - numere întregi reprezentate în MS


pe n biţi - gama dinamică devine ± (2 n-1 -1). În multe cazuri domeniul ± (2 n-1 -
1) se scalează cu 2n-1, adică
N ' = N/ 2 n-1, deci virgula va fi plasată imediat după bitul de semn; se reprezintă
pe n biţi numere fracţionare cu semn. Gama dinamică pentru reprezentarea MS a
numerelor fracţionare este ± (1-1/2n-1).
ELEMENTE DE ARITMETICĂ BINARĂ ŞI CIRCUITE DIGITALE 3
ELEMENTARE
1.2.1.2 Reprezentarea în complement de 1 (C1)

Dacă N>0 atunci valoarea lui zecimală este (în reprezentarea MS):
n−2
(N)MS = 0•2n-1 + ∑b
−n
i • 2i
Numărul negativ (-N) se reprezintă în complement de 1 prin (-N)C1 = 1 bn-
2...b-m, unde bi=1-bi (complement faţă de 1).
Pentru a reprezenta în C1 un număr negativ se consideră valoarea lui absolută
şi în reprezentarea acesteia se complementează toţi biţii.

Exemplu: (9)C1 = 00001001 = 9H


(-9)C1 = 11110110 = F6H = 15x16+6 = 246 = 255-9 = (2n -1)- 9
Rezultă o a doua regulă pentru obţinerea reprezentării valorilor negative ale
unui număr întreg în C1: scăderea din 2n-1 a valorii sale absolute.
Gama dinamică pentru reprezentarea C1 este ± (2n-1 - 2-m) (la fel ca în cazul
reprezentării MS).
Dezavantajul reprezentărilor MS şi C1 este acela că valoarea 0 se exprimă în 2
moduri diferite; de exemplu pentru (MS) valoarea 0 este 000...0 sau 1000...0.

1.2.1.3. Reprezentarea în complement de 2 (C2)

Pentru numere pozitive reprezentarea este identică cu cea din (C1) şi (MS).
Dacă numărul este negativ atunci (N)C2 = 2n - |N| = valoarea zecimală a codului
numărului negativ N. Regula generală pentru N # 0 este (-N)C2 = 2n -N.
Dacă numărul binar are reprezentarea în C2: bn-1, bn-2, ..., b0.b-1...b-m,
atunci valoarea sa în zecimal este dată de relaţia:
n−2
N = ( −1) b n −1 • 2 n −1
+ ∑b
i =− m
i • 2i

Gama dinamică pentru reprezentarea în C2 este: -2n-1 <= N <= 2n-1 - 2-m
deoarece pentru N>=0 bn-1=0 şi valoarea maximă se obţine pentru bi=1, i = -m, n-
n−2
2, deci N max = ∑b
i =− m
i • 2 i = 2 n −1 − 2 − m , iar pentru N<0 bn-1=1 şi valoarea

minimă se obţine pentru bi=0, i = -m,n-2, deci Nmin = -2n-1


Prin scalare cu 2n-1 se obţine reprezentarea în C2 a numerelor fracţionare.
1
Gama dinamică (pentru m=0) este: -1 <= N <= 1-
2 n−1
Există două moduri de obţinere a reprezentării lui (-N) în (C2):
4 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

1) Se adaugă 1 la reprezentarea binară în C1 alui (-N)


2) Se scade din 2n valoarea zecimală a lui N şi apoi se reprezintă în binar (ca
număr fără semn).

În tabelul 1 sunt prezentate implementările MS, C1 şi C2 pentru numerele


întregi pe 8 biţi. Se observă că în reprezentarea C2 numărul 0 se exprimă într-un
singur mod spre deosebire de reprezentările MS şi C1.

1.2.2. Reprezentări în virgulă mobilă (flotantă)

Un număr N real se reprezintă în virgulă mobilă prin două numere binare: un


număr fracţionar cu semn pe m biţi numit mantisă (M) şi un număr întreg cu semn
pe n biţi numit exponent (E), conform relaţiei N=M•2E. Dacă exponentul este
reprezentat în C2 atunci: -2n-1 ≤ E ≤ 2n-1-1, mantisa respectă inegalitatea
1
0 ≤ |M| ≤ 1- m−1
<1.
2
Rezultă gama dinamică pentru reprezentarea în virgulă mobilă (numere
1 n −1 1 n −1 n−1
diferite de 0): m −1
• 2 −2 ≤| N| ≤ (1 − m−1
) • 22 −1
< 22 − 1
2 2
1
(deoarece dacă N#0 cea mai mică mantisă este m−1
, iar cel mai mic exponent este
2
-2n-1). Uzual n=8, m=24 (exponent pe un octet, iar mantisa pe 3 octeţi). Gama
dinamică este mult mai mare decât în cazul reprezentărilor în virgulă fixă. Pentru
n=8 rezultă o gamă cuprinsă între 10-38 şi 1038.

Tabelul 1
Valoarea fără semn a codului de Valoarea obţinută prin interpretarea
reprezentare a numărului codului binar ca număr cu semn
zecimal binar hexazecima (MS) (C1) (C2)
l
0 00000000 00 0 0 0
1 00000001 01 1 1 1
2 00000010 02 2 2 2
... ... ... ... ... ...
127 01111111 7F 127 127 127
128 10000000 80 0 - 127 - 128
... ... ... ... ... ...
254 11111110 FE -126 -1 -2
255 11111111 FF -127 0 -1
ELEMENTE DE ARITMETICĂ BINARĂ ŞI CIRCUITE DIGITALE 5
ELEMENTARE

1.3. Elemente de aritmetică binară


1.3.1. Adunarea şi scăderea numerelor binare

Adunarea şi scăderea numerelor binare de 1bit se realizează conform tabelului


2. in care T - transport în rangul superior şi I - împrumut din rangul superior.
Suma numerelor de 1bit se realizează cu ajutorul sumatorului de 1bit
repreyentat în figura 1.2; pentru numere de n biţi, suma se efectuează cu un
sumator de n biţi care reprezintă o extensie a sumatorului de 1bit.

Tabelul 2
x y x+y T x-y I
0 0 0 0 0 0
0 1 1 0 1 1
1 0 1 0 1 0
1 1 0 1 0 0

Figura 1.2. Sumatorul binar

Funcţionarea sumatorului de n biţi, asociată bitului de rang i este ilustrată in


tabelul 3.
6 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Tabelul 3
Intrări Ieşiri
xi yi Ci Si Ci+1
0 0 0 0 0 0
1 0 0 1 1 0
2 0 1 0 1 0
3 0 1 1 0 1
4 1 0 0 1 0
5 1 0 1 0 1
6 1 1 0 0 1
7 1 1 1 1 1

1.3.2. Adunarea şi scăderea în C2

În reprezentarea în complement de 2 adunarea şi scăderea se pot realiza cu


aceeaşi unitate aritmetică (sumatorul pe n biţi); acest lucru constituie un avantaj
important. Scăderea lui Y din X se realizează prin adunarea la X a complementului
de 2 al lui Y.
Fie X,Y doi operanzi, R rezultatul operaţiei de adunare (scădere) şi (X)C2,
(Y)C2, (R)C2 reprezentarea în complement de 2 a lui X,Y, respectiv R. Există
următoarea relaţie: ( X+Y)C2 = (X)C2 + (Y)C2 , cu condiţia să nu existe depăşiri
de gamă. Depăşirea (overflow) reprezintă, în cazul operaţiilor aritmetice,
modificarea bitului de semn datorită faptului că rezultatul operaţiei este mai mare
decât limitele gamei dinamice admise de reprezentarea numerică.
Suma algebrică se poate efectua în (C2) prin adunarea reprezentărilor în (C2)
ale operanzilor. Rezultatul, pozitiv sau negativ va fi corect cu condiţia să nu existe
depăşiri de gamă.

Exemplu: n=8; G = (-128,127)

1. a>0, b>0; a=10, b=4; a+b=14; (a)C2=10; (b)C2=4; (a)C2+(b)C2=14

2. a<0, b<0; a = -1; b = -3; a+b = -4; (a)C2 = 256 - 1 = 255 = FFH
(b)C2 = 256-3=253=FDH deci (-1)C2+(-3)C2 = FF+FD=1|FCH = FCH =
= (-4)C2

3. a ≥ 0 b<0

3.1. a = 1; b = -3; a+b = -2; (a)C2 = 1; (b)C2 = 256 - 3 = FDH


ELEMENTE DE ARITMETICĂ BINARĂ ŞI CIRCUITE DIGITALE 7
ELEMENTARE

(1)C2 + (-3)C2 = 1+FD = FEH = (-2)C2

3.2. a = 3; b = -1; a+b = 2; (a)C2 = 3; (b) = FFH


(3)C2 + (-1)C2 = 3+FF = 1|02 =2

1.3.3. Depăşirea aritmetică (overflow)

Depăşirea aritmetică poate apare numai dacă operanzii sunt de acelaşi semn şi
rezultatul este mai mare decât M sau mai mic decât (-M '), unde gama dinamică
G=[-M ', M]. Pentru numere întregi pe n biţi reprezentarea în C2 poate fi ilustrată
ca în figura 1.3.

Figura 1.3. Depăşirea aritmetică

De exemplu (pentru n=8): 127+2 = 129>127 deci rezultă depăşire aritmetică.


Efectuând adunarea în (C2) se obţine: (127)C2 + (2)C2 = 7FH + 2H = 81H =
10000001 = (-127)C2
S-a alterat bitul de semn, deci a apărut depăşire aritmetică.

1.3.4. Detectarea depăşirii aritmetice

Fie a, b ∈ G.

1. Dacă a şi b sunt de semne contrare, nu apare depăşire aritmetică deoarece


|a+b| ∈ G.
2. Dacă a şi b sunt de acelaşi semn poate apare depăşire aritmetică. În tabelul
asociat operaţiei de adunare se observă, pentru cazurile 1 şi 6, dacă considerăm că
8 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Xi şi Yi reprezintă biţii de semn ai operanzilor, iar Si reprezintă bitul de semn al


operaţiei, că:

Xn-1 = 0, Yn-1 = 0, Cn-1 = 1 --> Sn-1 = 1, Cn = 0


Xn-1 = 1, Yn-1 = 1, Cn-1 = 0 --> Sn-1 = 0, Cn = 1

Deoarece semnul rezultatului a fost alterat rezultă că a apărut overflow. Se


observă că există relaţia (în ambele cazuri):
Cn-1 ⊕ Cn = 1. Notăm cu OVF depăşirea aritmetică, deci:
OVF = Cn-1 ⊕ Cn, unde ⊕ reprezintă suma modulo 2 (SAU EXCLUSIV).

1.3.5. Înmulţirea numerelor binare

Se va prezenta algoritmul de înmulţire a numerelor întregi cu semn


n−2
reprezentate în C2 pe n biţi. Fie (X)C2 = ( −1) x n −1 • 2 n −1 + ∑x •2
i=0
i
i
şi
n−2
(Y)C2 = ( −1) y n −1 • 2 n −1 + ∑y •2 .
i=0
i
i

Se notează produsul numerelor X şi cu P, deci P=XY. Dacă X şi Y sunt


reprezentaţi pe n biţi, produsul P va avea lungime dublă, 2n biţi.
Produsul P se poate calcula prin mai mulţi algoritmi; viteza de execuţie (de
calcul) depinde de tipul algoritmului utilizat.
Există algoritmi de înmulţire cu un pas (înmulţitor cu n+n intrări şi 2n ieşiri -
analog cu tabla înmulţirii - la ieşire se obţine imediat produsul) şi algoritmi în n
paşi (n este numărul de biţi pentru operanzii ce se inmulţesc) secvenţiali. În acest
caz viteza de lucru este mai mică, dar complexitatea circuitelor utilizate este mai
redusă decât în cazul algoritmilor cu un pas.
În continuare se va studia un algoritm secvenţial de înmulţire a numerelor
binare întregi reprezentate pe n biţi.
Luând în considerare modul de scriere a lui X rezultă:

P = XY = {(-1) Xn-12n-1 + Xn-2 2n-2 +...+X0 20}Y =


= (-1) Xn-12n-1Y + Xn-2 2n-2Y +...+ X0 20Y =
= {2-1 [(-1)Xn-1(Y2n) + 2-1(Xn-2Y2n + ... +2-1(X0Y2n)]}

Înmulţirea cu 2n este echivalentă cu o deplasare la stânga cu n biţi, iar


înmulţirea cu 2-n este echivalentă cu o deplasare la dreapta cu n biţi.
Deînmulţitul Y, înmulţit succesiv cu biţii înmulţitorului X, xi, se adună la
produsul P (care iniţial va lua valoarea 0), dupa care are loc o deplasare spre
dreapta a lui P cu 1 bit, ş.a.m.d.
ELEMENTE DE ARITMETICĂ BINARĂ ŞI CIRCUITE DIGITALE 9
ELEMENTARE
Rezultă algoritmul de înmulţire din figura 1.4.
În implementarea fizică a algoritmului, înmulţirile cu 2n şi 2-1 se realizează
prin deplasări la stânga sau la dreapta. Deplasarea la dreapta se execută cu
conservarea bitului de semn (deplasare aritmetică). Dacă la adunarea anterioară a
rezultat OVF=1 atunci înseamnă că bitul de semn deja s-a alterat, deci trebuie
inversat.
Deci deplasarea la dreapta se face după următoarea regulă:
pn-1 ⊕ OVF --> pn-1, pi+1 --> pi, i=0,..., n-2, unde pi sunt biţii produsului P.

Figura 1.4. Algoritmul de inmultire binară

1.4. Circuite logice


1.4.1. Introducere

Circuitele logice (digitale) se pot clasifica în circuite combinaţionale (CLC) şi


circuite secvenţiale (CLS). Circuitele combinaţionale sunt caracterizate de faptul că
ieşirea depinde de intrare prin intermediul unor funcţii boolene; în cazul circuitelor
secvenţiale, ieşirea depinde de intrare şi de starea circuitului (care conţine istoria
intrărilor). Circuitele combinaţionale nu au "memorie" spre deosebire de circuitele
secvenţiale.
Circuitele digitale reprezintă fizic (electric) variabile boolene (în tensiune sau
curent). În figura 1.5 sunt prezentate principalele caracteristici ale circuitelor
logice. Orice circuit logic este caracterizat de tensiunile de ieşire VOH, VOL şi de
tensiunile acceptate la intrare VIH, VIL corespunzătoare nivelelor logice de "1" logic
(high) şi de "0" logic (low). Aceste valori sunt alese astfel încât să se asigure
interconectarea între circuitele logice (domeniu VOH ⊂ domeniu VIH şi domeniu
10 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

VOL ⊂ domeniu VIH). Există o stare specială de ieşire numită starea de înaltă
impedanţă (high-Z) care permite conectarea mai multor ieşiri împreună.

1.4.2. Circuite combinaţionale (sisteme de ordin 0)

Sistemul de ordin 0 nu are memorie; modificarea intrării produce modificarea


ieşirii, impusă de funcţia f, aproape simultan (după un timp de propagare mic).
Circuitele combinaţionale sunt realizate cu porţi logice.

Figura 1.5. Caracteristicile circuitelor logice

Dintre circuitele combinaţionale uzuale se remarcă: decodificatorul


(demultiplexorul), multiplexorul, sumatorul binar, comparatorul, buffer-ul,
codificatorul, memoria ROM şi ariile logice programabile.

1.4.3. Circuite secvenţiale (sisteme de ordin 1)


ELEMENTE DE ARITMETICĂ BINARĂ ŞI CIRCUITE DIGITALE 11
ELEMENTARE
Un sistem de ordin 1 este realizat din sisteme de ordin 0 conectate printr-o
buclă de reacţie. Sistemul de ordin 1 are memorie. Ca exemple de sisteme de ordin
1 se pot enumera: latch-ul asincron, latch-ul sincron, latch-ul adresabil, memoria
RAM şi registrele.

1.4.4. Automate secvenţiale (sisteme de ordin 2)

Se notează X = mulţimea semnalelor de intrare, Y = mulţimea semnalelor de


ieşire, Q = mulţimea stărilor. Se defineşte funcţia Λ:X x Q --> Q - funcţia de
tranziţie a stărilor (funcţia de tranziţie internă) şi δ:X x Q --> Y - funcţia de ieşire
(funcţia de tranziţie externă). Mulţimea semnalelor de intrare este X={x1,x2,...xn},
mulţimea semnalelor de ieşire este Y={y1,y2,...ym}, iar mulţimea stărilor este
Q={q1,q2,...,qp}. În figura 1.6 sunt reprezentate două modele de automate
secvenţiale:

Figura 1.6. Automate secventiale

Vom nota Qk+1, Qk vectorii de stare ai automatului la momentele k+1,


respectiv k, Xk vectorul de intrare la momentul k şi Yk+1 vectorul de ieşire la
momentul k+1. Pentru automatul de tip Mealy există relaţiile Qk+1 = Λ(Xk, Qk)
şi Yk+1 = δ(Xk, Qk). Pentru un automat Moore Qk+1 = Λ(Xk, Qk) şi Yk+1 = δ
(Qk).
12 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Modelele Mealy şi Moore nu reprezintă clase de sisteme diferite, ci modele


diferite. Un acelaşi automat poate fi modelat ca automat Moore (pentru număr
mare de stări) sau ca automat Mealy (pentru număr mic de stări). Descrierea
automatelor se poate face prin tablouri (tabele) sau prin grafuri de tranziţii ca în
figura 1.7.

Figura 1.7. Descrierea automatelor secventiale

Ca exemple de automate secventiale se pot enumera: bistabilul T, bistabilul D,


numărătorul.
Automatele secvenţiale vor fi structurate astfel încât să se simplifice circuitele
CLC, din structura acestora şi să se poată modifica evoluţia automatului prin citirea
unor informaţii din exterior. Se ajunge la un nou concept – automat secvenţial
programabil – care stă la baza arhitecturii unui procesor sau microcontroler.
2. AUTOMATE SECVENTIALE
PROGRAMABILE. UNITĂŢI DE
PROCESARE ŞI COMANDĂ
2.1. Reducerea complexitătii automatelor secvenţiale prin
serializare (structurarea spaţiului stărilor)

Un automat secvenţial este modelat conform figurii 24a (model Mealy) şi este
descris de S = (X,Y,Q,Λ,δ) (notaţiile fiind definite anterior).Fie q ∈Q; la un
semnal de tact starea q se modifică în q' prin legea de tranziţie a stării Λ. Dacă
numărul de stări este mare, funcţia Λ conduce la un CLC complicat (complex).
Dacă funcţia Λ se poate descompune în mai multe funcţii mai simple Λi astfel încât
să existe relaţia de compunere Λ =Λ0o...oΛm-1 , cu Λi: X x Q --> Q, circuitul
combinaţional complex se înlocuieşte cu un circuit combinaţional mai simplu (de
dimensiune mai mică).
Funcţia de tranziţie a stării este serializată în m paşi de tact. Din punct de
vedere formal această serializare este echivalentă cu modificarea la fiecare pas
numai a unui subvector al lui Qi. Spunem că spaţiul stărilor este structurat în Q =
Q0 x Q1 x ...x Qm-1, unde Qi reprezintă o mulţime de subvectori de stare.
Vom presupune că există Λ0, Λ1,...Λm-1 astfel încât Λi modifică numai un
subvector Qi.
Ipoteza 1. Evoluţia automatului într-un singur pas astfel:

Q = Qm-1 Qm-2 … Q1 Q0

Λ = Λ m-1 Λ m-2 …Λ1Λ0

Q’ = Q’m-1 Q’m-2 … Q’1 Q’0

Semnul ' reprezintă stările modificate prin aplicarea funcţiei Λ. Circuitul


combinaţional este complex. Toate funcţiile Λi acţionează simultan asupra
vectorului Qi.
Ipoteza 2. Evoluţia automatului se face în m paşi astfel:
Q = Qm-1 Qm-2 … Q1 Q0

Λ m-1 - modifică Qm-1

Q’ = Q’m-1 Qm-2
B B B
… Q1 Q0
B B B B
14 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Q = Q’m-1 Qm-2 … Q1 Q0

Λ m-2 - modifică Qm-2

Q’ = Q’m-1 Q’m-2 … Q1 Q0

.....

Q = Q’m-1 Q’m-2 … Q’1 Q0

Λ 0 - modifică Q0

Q’ = Q’m-1 Q’m-2 … Q’1 Q’0

Circuitele combinationale ce implementeaza funcţiile Λi sunt mai simple.


Este necesară selectarea funcţiei Λi la fiecare pas. Acest lucru se realizează
prin adăugarea la intrările X a unor intrări suplimentare F∈ F (numite funcţii);
intrarea F va selecta funcţiile Λi la fiecare pas.
De asemenea este necesară selectarea la fiecare pas a subvectorului care se
modifică Qi. Se adaugă o intrare numită adresă A ∈ A (mulţimea de adrese).
Funcţia Λi se aplică lui Q’m-1 Q’m-2 … Q’i+1 Qi … Q1 Q0 , unde Q’m-1 Q’m-2 …
Q’i+1 reprezintă subvectori de stare modificaţi la paşii anteriori. În mod echivalent
putem spune că Λi se aplică numai lui Qi, dar alegerea lui Λi este influenţată
(eventual) de rezultatele obţinute la pasul anterior prin ieşiri speciale, numite
indicatori I ∈I.
Automatul secvenţial devine: S = (X x F x A, Y x I, q, Λi, δi) şi
Λi: Qi x X --> Qi, δi: Qi x X --> Y
În figura 2.1 este reprezentat un automat secvenţial serializat (cu structurarea
spaţiului stărilor).
Fiecare circuit al memoriei RAM, cu n/m biţi, reprezintă un subvector de
stare. Se selectează funcţia CLC (prin F şi eventual I); apoi se selectează prin
adresa A subvectorul de stare asupra căruia se va opera (se citeşte din RAM locaţia
de adresă A).
În continuare se calculează subvectorul de stare modificat , iar rezultatul este
stocat temporar în latch-ul L1. La sfârşitul semnalului de tact se scrie în RAM (prin
circuitul CLC1, funcţie şi de intrarea X) la adresa A subvectorul de stare modificat
(se actualizează subvectorul de stare).Ieşirea Y se calculează tot cu ajutorul
circuitului CLC utilizând toate stările automatului şi intrarea X.
ELEMENTE DE ARITMETICĂ BINARĂ ŞI CIRCUITE DIGITALE 15
ELEMENTARE

Figura 2.1. Automat secvenţial cu structurarea spaţiului stărilor

Dacă valorile vectorului X se pot introduce tot succesiv în subvectorii de


lungime p/k, atunci circuitul CLC se simplifică şi mai mult. Pentru situaţia în care
vectorul X este introdus succesiv în subvectorii de lungime p/k, iar spaţiul stărilor
este structurat în subvectori de lungime n/m, complexitatea circuitului CLC se
reduce de aproximativ 2m+k ori în raport cu varianta nestructurată a automatului
secvenţial.
În continuare se vor prezentare exemple de automate secvenţiale ce derivă din
schema din figura 2.1.
16 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

2.2. Exemple de automate structurate

1. Automat RALU (unitate aritmetică şi registre)

Un circuit logic combinaţional care execută operaţii aritmetice şi logice


elementare se numeşte unitate aritmetică şi logică (ALU).

Schema automatului RALU este ilustrată în figura 2.2.

Figura 2.2. Automat RALU (Register and Arithmetic Logic Unit)

În figura 2.2 DI reprezintă intrarea X, iar DO este ieşirea Y. Restul notaţiilor


sunt cele definite anterior.

2. Unitate RALU complexă

În figura 2.3 este prezentată o unitate RALU complexă.


În comparaţie cu unitatea RALU din figura 2.2 (RALU - elementar) schema
din figura 2.3 are următoarele perfecţionări:
- extrage doi operanzi simultan;
- ieşirea este fie de la ALU, fie de la RAM;
ELEMENTE DE ARITMETICĂ BINARĂ ŞI CIRCUITE DIGITALE 17
ELEMENTARE
- există două circuite suplimentare de deplasare (SHIFT).
Diagramele de timp asociate unităţii RALU complexe sunt prezentate în
figura 2.4.

Figura 2.3. Unitate RALU complexă


18 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Figura 2.4. Diagrama de timp pentru funcţionarea unităţii RALU complexe

Un ciclu de tact TCY trebuie să îndeplinească următoarea condiţie:

ta + tPL + tMUX + tALU + tSHIFT + tsetup < TCY , unde:


ta - timpul de acces în RAM
tPL - timp de propagare latch
tMUX - timp de propagare multiplexor
tALU - timp de calcul în ALU
tSHIFT - timp de deplasare
tsetup - timp de set-up necesar memoriei RAMDatele apar la începutul la
ieşirea elementului cu memorie (de pe buclă) şi se înscriu la sfârşitul ciclului în
elementul cu memorie.
Condiţia generală de funcţionare este:

TCY > suma timpilor de propagare pe buclă


ELEMENTE DE ARITMETICĂ BINARĂ ŞI CIRCUITE DIGITALE 19
ELEMENTARE
Comenzile circuitului sosesc din exterior, de la un alt automat (automat de
comandă) care generează AA, AB, S1, S2, S3, DI, F, OE, CLK.
Reuniunea acestor comenzi reprezintă o instrucţiune a RALU.

2.3. Principiul "pipe - line" (paralelism temporal)


Timpul de propagare pe buclă este suma timpilor de propagare a circuitelor
combinaţionale din structura buclei.
Principiul "pipe - line" (conductă, bandă rulantă) presupune introducerea în buclă a unor
elemente de memorare suplimentare; bucla este divizată în mai multe tronsoane. La fiecare
tact datele circulă între două elemente cu memorie - asemănător cu circulaţia produselor pe o
bandă rulantă de asamblare). Acţiunile (operaţiile) se fac simultan, asupra unor date diferite.
Condiţia de funcţionare este alimentarea în flux continuu a "conductei" cu date, astfel
încât toate circuitele logice combinaţionale să fie ocupate.
În figura 2.5 este ilustrat principiul "pipe - line" pentru un automat secvenţial divizat în
patru tronsoane de prelucrare.
Elementele de memorare sunt notate cu M1, M2, M3 şi M4, circuitele logice
combinaţionale cu CLC1, CLC2, CLC3 şi CLC4, iar operaţiile efectuate de fiecare circuit sunt
notate cu O1, O2, O3 şi O4.
Fiecare CLC efectuează o operaţie specifică astfel:

- CLC1 execută operaţia O1 asupra datelor Data1, Data2, Data3, Data4,...;


- CLC2 execută operaţia O2 asupra datelor de la ieşirea lui CLC1;
- CLC3 execută operaţia O3 asupra datelor de la ieşirea lui CLC2;
- CLC4 execută operaţia O4 asupra datelor de la ieşirea lui CLC3.

Ieşirea lui CLC4 se memorează în elementul de memorare M1. Dacă se notează cu Ti


timpul de prelucrare pentru fiecare CLCi, i = 1,4, atunci ciclul de prelucrare al automatului
secvenţial este TCY > T1 + T2 + T3 + T4 = 4T, dacă Ti = T, i = 1,4, în cazul automatului fără
pipe - line. Pentru automatul cu pipe - line, la fiecare tact T se obţine un rezultat (cu o
întârziere de 4T); viteza de execuţie este mai ridicată decât în cazul automatului fără pipe -
line.

2.4. Automatul de comandă de tip CROM (controler + ROM)


Descrierea automatului de comandă prin cvintetul (X, Y, Q, Λ, δ) este complicată. Pentru
schemele complexe se preferă o descriere funcţională. Funcţia va determina structura. Scopul
automatului de comandă este generarea unei secvenţe de comenzi spre un alt obiect (de
exemplu RALU), astfel încât să se realizeze o acţiune complexă prin serializarea unor acţiuni
elementare. Evoluţia automatului de comandă va fi determinată de starea proprie şi de intrări
(care sunt ordine externe sau condiţii externe testate de automat). Această evoluţie, în n tacte,
poate fi modelată cu un arbore cu n nivele, în care se parcurge un anumit drum (şi se
generează o secvenţă de comenzi spre exterior) ca în figura 2.6.
20 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Figura 2.5. Tehnica “pipe-line”

Figura 2.6. Funcţionarea uni automat de comandă

Forma simplificată a automatului de comandă de tip CROM (Controller and ROM) este
prezentată în figura 2.7.
Registrul de stare este scris la fiecare tact. Adresa cuvântului urmator din ROM poate fi
selectată, prin MXA, ca fiind (AU, YC) sau O (ordin exterior). Selecţia adresei următoare este
dată de conţinutul registrului de stare (bitul S). Câmpul de biţi STC selectează condiţia de test
care va modifica adresa următoare.
Dintr-o stare dată caracterizată de (CO, STC, S, AU) se poate trece într-o altă stare
determinată de adresa generată către ROM. Circuitul ROM realizează un CLC cu n intrări şi k
ieşiri; un cuvânt din ROM se numeşte microinstrucţiune. Iniţializarea automatului se face cu
semnalul CLR ceea ce implică ştergerea registrului de stare şi deci adresa iniţială egală cu 0.
ELEMENTE DE ARITMETICĂ BINARĂ ŞI CIRCUITE DIGITALE 21
ELEMENTARE

Figura 2.7. Automatul CROM

Timpul de propagare pe buclă, în cazul cel mai defavorabil este:

tRDout + tMXC + tMXA + taccROM + tsetupR < TCY


unde:
tRDout - timp de stabilire a ieşirii registrului (de încărcare)
tMXC, tMXA - timpi de propagare prin multiplexoare
taccROM - timp de acces la ROM
tsetupR - timp de set-up registru

Prin introducerea unor registre suplimentare (varianta "pipe - line") se poate micşora
timpul TCY (vezi figura 2.8).
"Divizarea" buclei are efecte asupra secvenţării; astfel dacă notăm R(n), RA(n) conţinutul
registrelor R, RA la tactul n, se poate scrie (pentru tactul n):

1) CO <-- R(n) = microinstrucţiunea n


2) R <-- ROM (RA(n)) = microinstrucţiunea (n+1)
3) RA <-- f (R(n)) = adresa microinstrucţiunii (n+2)

(Se face mai întâi citirea registrului şi apoi scrierea sa).


22 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Figura 2.8. Automat CROM cu “pipe-line”

2.4.1. Perfecţionări ale automatului de comandă

1) În cazul unei secvenţe liniare de acţiuni, comenzile se plasează în ROM la adrese


succesive, deci este util a avea un numărător de adres şi un circuit de incrementare (contor de
microprogram) conectat la MXA. Acesta poate fi utilizat ca generator al adresei următoare. În
cazul în care secvenţa de acţiuni trebuie continuată la un moment dat de la altă adresă din
ROM (salt), în loc de a selecta adresa următoare de la acest numărător, o vom selecta din
câmpul de adrese al ROM.
2) Posibilitatea de a efectua "subrutine" - adică secvenţe de acţiuni specifice, utilizabile
(apelabile) din alte secvenţe cu posibilitatea reântoarcerii în secvenţa iniţială (apelantă) după
execuţia acţiunilor subrutinei.
În cazul utilizării subrutinelor este necesară memorarea adresei de revenire în secvenţa
apelantă. În cazul unor apeluri de subrutine din alte subrutine este necesară memorarea
adreselor de revenire. Acest lucru se realizează cu ajutorul unei stive adresată cu un numărător
(stack-pointer - SP) care indică "vârful" stivei şi este de obicei decrementat la introducerea
unui element în stivă (PUSH) şi incrementat la scoaterea unui element din stivă (POP).

În figura 2.9 este ilustrat un automat de comandă cu numărător şi stivă.


Notaţiile utilizate sunt:
R1 - registru auxiliar;
CLK - tact;
SP - contor de stivă (stack pointer);
STACK - memorie stivă;
uPC - microprogram counter (numărător);
INC - circuit de incrementare;
MXA - multiplexor de adrese;
LCAU - logica de control a adresei următoare (CLC2);
ELEMENTE DE ARITMETICĂ BINARĂ ŞI CIRCUITE DIGITALE 23
ELEMENTARE
MXC - multiplexor de comandă;
ROM - memorie de microprograme (CLC1);
RMI - registru de microinstrucţiuni (de stare);
CT - condiţie de test.
Câmpurile de comandă în registrul RMI sunt următoarele:
ADR - adresa microinstrucţiunii următoare (adresă de salt);
SCT - selecţie condiţie de test;
CAU - control adresă următoare;
T/F - true/false pentru selecţia condiţiei de test.

Figura 2.9. Automat CROM perfecţionat

La fiecare tact se citeşte RMI şi se generează comenzile specifice microinstrucţiunii


curente, se selectează condiţia de test şi adresa instrucţiunii următoare; această adresă poate fi:
directă (ADR sau alte adrese de salt din exterior), din registrul R1 (scrisă la un pas anterior),
ieşirea stivei (POP) sau ieşirea μPC. Adresa următoare este o funcţie de: alte adrese de salt din
exterior, adresa scrisă în RMI (AA), condiţia de test (CAU, SCT, T/F), adresa scrisă anterior
în R1, ieşirea stivei, ieşirea μPC. La sfârşitul tactului curent registrul de stare RMI conţine
microinstrucţiunea următoare extrasă din ROM de la una din adresele posibile (D/R/S/PC).
3. UNITĂŢI CENTRALE DE
PRELUCRARE. ETAPE ALE
FUNCŢIONĂRII
MICROPROCESORULUI
3.1. Sisteme de procesare de ordin 3. (Procesorul)
Un automat de ordin 2 împreună cu o buclă de reacţie (printr-un circuit logic
combinaţional) formează un automat de ordin 3. Un sistem microprogramabil este constituit
din două automate de ordin 2 interconectate: un automat de procesare (AP) şi un automat de
comandă (AC). Automatul de comandă generează o secvenţă de comenzi (microinstrucţiuni)
spre automatul de procesare.
Automatul de procesare prelucrează datele de intrare în funcţie de comenzile primite şi
prin indicatori ai rezultatelor (de condiţii) influenţează evoluţia ulterioară a automatului de
comandă.
Un automat de procesare (sau automat aritmetic) (de exemplu unitatea RALU) poate fi
reprezentat ca în figura 3.1.

Figura 3.1. Automat de procesare

Lărgimea cuvântului binar prelucrat în paralel este n = 4,8,16,32,64. Dacă intrările şi


ieşirile sunt conectate pe aceleaşi linii fizice de semnal (acces bidirecţional) sensul de
circulaţie a informaţiei este comandat prin biţi suplimentari.
Automatul de comandă (de exemplu CROM) va fi numit unitate de comandă (UC);
această unitate generează ordine pentru automatul de procesare (RALU). O mulţime succesivă
de ordine reprezintă un program de comandă pentru RALU.
Procesorul reprezintă un sistem digital format din RALU şi UC (ordinul sistemului este
≥ 3) în bucla de reacţie. În figura 3.2 este prezentată schema generală a procesorului.
Notaţiile din figura 3.2 sunt următoarele:

DI, DO - date de intrare, ieşire;


FL - indicatori (flag-uri);
C - comenzi;
I - instrucţiuni (ordine din exterior);
SI - semnale de intrare (pentru sincronizare cu evenimente externe);
2 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

SO - semnale de ieşire (comenzi spre alte dispozitive, sincronizări)

Figura 3.2. Procesorul – structura generală

Unitatea RALU modifică evoluţia unităţii de comandă UC prin flaguri (FL); unitatea de
comandă influenţează evoluţia RALU prin generarea de comenzi în funcţie de instrucţiunea (I)
primită din exterior. Sistemul este caracterizat prin flexibilitate datorită posibilităţii modificării
funcţiei sale prin instrucţiuni exterioare.
Se adaugă în plus semnale de intrare (SI) pentru sincronizarea procesorului cu
evenimente externe şi semnale de ieşire (SO) care pot reprezenta comenzi spre alte subsisteme
externe sau semnale de sincronizare cu alte dispozitive externe.
La fiecare instrucţiune primită se declanşează în UC o secvenţă de acţiuni, numită
microprogram, asociată instrucţiunii I.
Ordinea de introducere a instrucţiunii I este determinată de elemente din exteriorul
procesorului; în acest mod se simplifică substanţial unitatea de comandă. Secvenţa de
instrucţiuni introdusă se numeşte program de comandă al procesorului.
Funcţionarea procesorului este ciclică după cum urmează:

1) Unitatea de comandă (UC) primeşte instrucţiunea curentă, iar unitatea de procesare


(RALU) primeşte data de intrare curentă.
2) Unitatea de comandă (UC) generează secvenţa de comenzi asociată spre unitatea
RALU.
3) Unitatea de procesare RALU execută comenzile. Unitatea de comandă evoluează ca
automat cu număr finit de stări, influenţat de unitatea aritmetică şi logică (ALU) din
componenţa RALU, prin flaguri. În cazul în care sunt necesare transferuri de date cu
exteriorul, se comandă citiri pe DI, respectiv ieşiri pe DO.
4) Unitatea de comandă trece la recepţionarea instrucţiunii următoare.

Etapele 3) şi 4) se pot desfăşura în paralel (tehnica pipe - line).

3.2. Microcalculatorul elementar. Arhitectura von Neumann


Procesorul din figura 3.2 permite (datorită separării fizice a liniilor DI, DO şi I) execuţia
unei instrucţiuni curente (pe DI şi DO) în paralel cu extragerea instrucţiunii următoare (pe
liniile I). Datorită acestui paralelism temporal, viteza de lucru a procesorului este mare.
Această structură este folosită în procesoarele rapide (de exemplu procesoare pentru
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 3
PROIECTAREA APLICAŢIILOR

prelucrarea semnalelor). Arhitectura unui astfel de procesor, cu linii de date separate de liniile
de instrucţiuni, se numeşte arhitectură Harvard.
Dacă se renunţă la paralelismul temporal, atunci se pot unifica liniile DI, DO şi I într-o
singură magistrală (bus) bidirecţională pe care circulă date sau instrucţiuni denumită
magistrală de date sau bus de date (BD).

Implicaţiile acestei unificări sunt:

- extragerea şi execuţia instrucţiunilor au un caracter secvenţial;


- apare necesitatea comandării sensului de circulaţie al informaţiei pe busul de date, de
către unitatea de comandă;
- pe busul de date trebuie conectate circuite cu posibilitatea stării de high-Z la ieşire
pentru a invalida blocurile inactive.

Avantajele unificării liniilor DI, DO şi I într-un bus comun sunt:

- din punct de vedere structural: datele şi instrucţiunile pot fi memorate pe un suport fizic
unic numit memorie principală (MP).
- din punct de vedere funcţional: flexibiltatea devine foarte mare deoarece informaţia
fizică poate fi interpretată de procesor ca dată sau ca instrucţiune.

O secvenţă de instrucţiuni se numeşte program. Programele pot fi memorate de procesor


ca date oarecare (pot fi transferate, modificate). Datele rezultate în urma unor prelucrări pot fi
interpretate ca instrucţiuni. Dispar principial orice restricţii privind amplasarea instrucţiunilor
şi datelor în memoria principală.
Această arhitectură cu bus unic de date şi instrucţiuni se numeşte arhitectura von
Neumann
Unitatea de comandă trebuie să interpreteze corect cuvintele citite din memoria
principală, ca fiind coduri de instrucţiuni sau date numerice; rezultă o funcţie nouă - funcţia de
adresare. Rezultă că unitatea de comandă trebuie completată cu o nouă structură, numită
unitatea de comandă a programelor (UCPG) sau automat de adresare (AA); UCPG controlează
ordinea extragerii instrucţiunii şi a datelor din memoria principală.
În final unitatea de comandă este privită ca un ansamblu format din interconectarea
UCPG cu o unitate de control a microprogramelor (vezi anterior) notată cu UCμ care
păstrează funcţia unităţii de comandă din schema de principiu. UCμ generează o secvenţă de
comenzi asociate fiecărei instrucţiuni (o instrucţiune reprezintă o secvenţă de acţiuni sau
microinstrucţiuni) pentru RALU şi se sincronizează cu semnale externe pe o magistrală de
comenzi (C). Magistrala de comenzi conţine linii de intrare (pentru sincronizarea cu
evenimentele externe) şi linii de ieşire (pentru generarea comenzilor).
În figura 3.3 este prezentat modul de conectare al procesorului la memoria principală.
Procesorul se va denumi prin definiţie unitate centrală de prelucrare (UCP). Dacă UCP este
integrat monolitic, atunci se numeşte microprocesor. Un procesor împreună cu memoria
principală, circuitele de interfaţă (porturi de intrare - ieşire) şi alte circuite auxiliare formează
4 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

un microcontroler. Configuraţia elementară de bază a unui microcontroler cu un singur


microprocesor (în arhitectura von Neumnann - caracterizată de bus unic de instrucţiuni şi date)
este ilustrată în figura 3.4.

Figura 3.3. Conectarea procesorului la memoria principală

Notaţiile utilizate sunt:

- UCP - unitatea centrală de prelucrare;


- MP - memoria principală;
- PE, PI - "porturi" de ieşire, intrare;
- DISP - dispozitive externe;
- BA, BD, BC - busuri de adrese, date, comenzi

Figura 3.4. Configuraţia de bază a unui microcontroler (microcalclator)

Memoria principală poate fi memorie de program (de tip ROM) sau memorie de date (de
tip ROM - date fixe sau RAM - date variabile).
Memoria de date poate conţine şi programe, fără nici o restricţie.
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 5
PROIECTAREA APLICAŢIILOR

Porturile de intrare/ieşire permit interconectarea microcalculatorului cu dispozitive


externe (periferice).

Magistrala (busul) de adrese este unidirecţional; pe acest bus, UCP generează adresa
necesară memoriilor sau porturilor de intrare/ieşire.
Busul de date este bidirecţional cu 8, 16, 32 sau 64 biţi.
Busul de comandă (control) este bidirecţional şi conţine linii de ieşire ce reprezintă
comenzi (scriere, citire, etc.) şi linii de intrare - sincronizări cu evenimente externe.
Din punct de vedere al comenzii transferului pe bus-ul de date, există module active
(master) care generează adrese şi comenzi (UCP, circuite de acces direct la memorie (DMA))
şi module pasive (slave) care recepţionează comenzi de la un modul master; la un moment de
timp este activ un singur modul master.
Informaţia pe bus-ul de date poate fi:
- coduri numerice de instrucţiuni (comenzi elementare adresate UCP pentru a executa o
instrucţiune - transfer de date, operaţii aritmetice/logice, salturi în program, operaţii auxiliare);
- adrese - informaţie de localizare a datelor (ca informaţie auxiliară la instrucţiune);
- date propriu-zise.
Dispozitivele externe pot fi informatice (console teletype, monitoare video, imprimante,
memorie de masă (discuri, bandă magnetică) sau interfeţe cu sistemul comandat de
microcalculator (convertoare A/D, D/A, module de achiziţie de date, circuite logice specifice
aplicaţiei).

3.2.1. Principiul transferului pe bus-ul de date

1: Citire memorie principală sau port de intrare

BA <-- α (adresa de memorie sau de port)


BC <-- comenzi de citire memorie sau port
BD <-- MEM(α) sau PI(α) (conţinutul locaţiei de memorie de adresă α sau al
portului de intrare de adresă α)
μP <-- (BD) (data citită din memorie sau port este transferată de pe BD în
registrele μP)

2: Scriere în memoria principală sau într-un port de ieşire

BA <-- α (adresa de memorie sau de port)


BD <-- d (data din microprocesor se transferă pe BD)
BC <-- comenzi de scriere în memorie sau port de ieşire
MEM(α) sau PE(α) <-- (BD) (data este transferată de pe BD în locaţia de
memorie de adresă α sau în portul de ieşire de adresă α)
6 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

3.3. Funcţionarea unui microcalculator elementar cu arhitectură


von Neumann
Unitatea RALU execută operaţia de prelucrare dată prin instrucţiune. Unitatea de
comandă generează comenzile interne necesare execuţiei instrucţiunii (comandă secvenţa de
acţiuni elementare în interiorul unei instrucţiuni). UCPG comandă secvenţarea instrucţiunilor
şi adresarea datelor.
O instrucţiune reprezintă o comandă elementară adresată UCP pentru a executa operaţii
aritmetice, logice, auxiliare şi pentru a selecta adresa instrucţiunii următoare. Reprezentarea
instrucţiunii în memoria principală poate avea format variabil (ca număr de cuvinte) sau
format fix (număr fix de cuvinte - la procesoarele RISC, DSP).
Unitatea de comandă conţine un registru de instrucţiuni, un decodificator al codului
instrucţiunii (asociază codului instrucţiunii un ordin dat automatului de comandă), automatul
de comandă propriu-zis (care generează toate secvenţele de comenzi pentru execuţia
instrucţiunii curente şi selecţia instrucţiunii următoare) şi o schemă de tacte (generator de
ceas). Unitatea de control a programului conţine un contor de program (PC) pentru adresarea
memoriei principale în vederea citirii cuvântului curent al codului de program şi un circuit de
incrementare; deasemenea conţine un registru de adresare a datelor (RA) care conţine adresele
datelor calculate conform modului de adresare. Pot exista şi alte registre auxiliare de adresare
(index, deplasament). Există deasemenea un registru care conţine adresa vârfului stivei (SP);
stiva poate să fie internă (în UCP) şi/sau externă (în memoria principală).
Ciclul de instrucţiune reprezintă totalitatea operaţiilor necesare pentru execuţia unei
instrucţiuni. Execuţia unei instrucţiuni se compune din n ≥ 1 operaţii pe bus (citiri, scrieri).
Operaţia de citire-scriere pe bus se numeşte ciclu maşină. Un ciclu maşină se compune din n
≥ 1 cicluri de tact. Orice instrucţiune incepe cu un ciclu maşină M1, care preia codul operaţiei
asociată instrucţiunii.
Succesiunea generală a operaţiilor într-un ciclu de bus este următoarea:

1. citire cod instrucţiune ( n ≥ 1 cuvinte); RI <-- MP(PC);


2. decodificarea codului (în UC);
3. citirea (dacă este cazul) a altor cuvinte din memoria de program (adrese,
operanzi de tip imediat);
4. citirea (dacă este cazul) a operanzilor din memoria principală;
5. execuţia instrucţiunii şi determinarea adresei instrucţiunii următoare;
6. memorarea rezultatului (în registrele interne sau memoria principală).

Operaţiile 1 şi 2 sunt obligatorii pentru fiecare instrucţiune; operaţiiile 3 şi 4 pot să apară


sau nu în funcţie de tipul instrucţiunii; operaţia 5 este obligatorie în orice instrucţiune, iar
operaţia 6 poate să apară sau nu în funcţie de instrucţiune.
În figura 3.5 este ilustrată funcţionarea unui microcontroler (microcalculator).
Notaţiile utilizate sunt:
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 7
PROIECTAREA APLICAŢIILOR

RALU: A - acumulator
AL - latch acumulator
TMP- registru temporar
ALU- unitate aritmetică şi logică
UCPG: PC + IMC- contor de program + circuit de incrementare
AR - registru de adresare a datelor
UC: RI - registru de instrucţiuni
DEC - decodificator instrucţiuni
8 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Figura 3.5. Funcţionarea unui microcontroler (microcalculator)

3.4. Metode pentru creşterea performanţelor UCP


Creşterea performanţelor UCP se referă în principal la mărirea vitezei de prelucrare.
Metodele utilizate pot fi de natură electrică (creşterea frecvenţei de tact prin îmbunătăţirea
tehnologiei) sau arhitecturală (sporirea gradului de paralelism, utilizarea unor instrucţiuni mai
complexe din punct de vedere al operaţiilor şi al modurilor de adresare - procesoare CISC –
Complex Instruction Set Computer, utilizarea tehnicii “pipe-line” şi a unor instrucţiuni simple
- procesoare RISC – Reduced Instruction Set Computer.
Principalele moduri prin care se poate îmbunătăţi performanţa unui UCP sunt:

- utilizarea unităţii aritmetice pentru calculul adreselor (pentru arhitecturi von


Neumann)
- utilizarea tehnicii “pipe-line” pentru UCP cu arhitectură CISC
- definirea unei arhitecturi cu bus-uri separate pentru date şi instrucţiuni (arhitectura
Harvard)
- utilizarea arhitecturii RISC
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 9
PROIECTAREA APLICAŢIILOR

3.5. Subsisteme ale UCP


3.5.1. Unităţi RALU (automate de prelucrare)

a) Unităţi RALU cu bus unic (procesoare CISC)

Schema de principiu pentru RALU elementar este prezentată în figura 3.6.

Figura 3.6. Structura automatului RALU cu bus unic


Registrele din unitatea RALU sunt împărţite în două grupuri (high, low) şi se pot utiliza şi
pe lungime dublă. RTA şi RTB sunt registre temporare. MUX este un multiplexor. Blocul de
corecţie BCD asigură corecţia rezultatului ALU pentru lucrul in zecimal (Binary Coded
Decimal – BCD).
Operaţiile ALU pot fi:
- cu un singur operand (din registre sau de pe bus);
- cu doi operanzi (din registre sau de pe bus);
Unitatea ALU poate efectua operaţii aritmetice elementare (+, -, ∗, /), operaţii logice
(AND, OR, XOR, NOT), deplasări, rotaţii.
Operaţiile ALU se pot efectua şi pe lăţime dublă.

b) Unitatea RALU pentru microprocesoare RISC

Este prezentată în figura 3.7.


10 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Figura 3.7. Unitate RALU pentru procesoare RISC

Avantajele acestei unităţi RALU sunt următoarele:

- număr mare de registre (120x32 biţi);


- se pot extrage doi operanzi simultan (în registrele RA, RB);
- execută în acelaşi ciclu operaţia: R <-- SHIFT (R1 ∗ R2) , unde SHIFT reprezintă
operatorul de deplasare, iar ∗ este o operaţie oarecare.

Unitatea ALU poate să fie controlată de pe bus-ul extern. De asemenea, registrul de


rezultate poate fi citit (scris de pe bus-ul extern).

3.5.2. Comanda execuţiei programelor

Unitatea de comandă a programelor (UCPG) asigură funcţiile:

- adresarea datelor (modul de calcul al adresei se numeşte mod de adresare);


- adresarea instrucţiunilor (în secvenţă (secvenţial), salturi în programe, apeluri şi resturi
din subprograme).
Schema de principiu a unei unităţi UCPG elementare este prezentată în figura 3.8.

Figura 3.8. Structura UCPG


LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 11
PROIECTAREA APLICAŢIILOR

Unitatea ALU este utilizată pentru a incrementa/decrementa unul dintre


registrele PC, SP, AR. Functia UCPG este descrisă de relaţia: BA <-- PC | SP |
AR, în funcţie de tipul operaţiei (extragere cod instrucţiune, lucrul cu stiva,
citire/scriere date).
După efectuarea operaţiei curente, se poate modifica valoarea registrului corespunzător
cu +1 | -1 | 0. În microprocesoarele concrete se pot utiliza în locul lui AR registre din unitatea
RALU.

3.5.2.1. Moduri de adresare a datelor

Se defineşte adresa efectivă ca fiind adresa calculată conform modului de adresare


utilizat. Adresa care se generează pe busul de adrese se numeşte adresă fizică şi poate fi:
- chiar adresa efectivă (pentru adresare liniara);
- modificată (pentru adresare sewgmentată sau paginată).
Vom nota cu O - un operand şi cu EA - adresa efectivă.
Modurile de adresare sunt:

1. Adresare imediată: O este specificat în instrucţiune după codul instrucţiunii.


2. Directă la registru: O aparţine unui registru din RALU specificat în codul instrucţiunii.
Prezintă dezavantajul că nu permite scrierea compactă de programe pentru prelucrarea de
tabele de date.
3. Directă la memorie: EA este dată în codul instrucţiunii după codul operaţiei.
4. Indirectă prin registru: EA este conţinutul unui registru specificat în codul instrucţiunii.
5. Indirectă prin registru cu bază şi deplasament: EA este conţinutul unui registru de bază
plus un deplasament.
6. Indirectă prin două registre: EA este conţinutul unui registru de bază plus conţinutul
unui registru index.
7. Indirectă prin două registre de bază index şi deplasament: EA este suma conţinutului a
două registre şi a unui deplasament.
8. Indirectă prin memorie cu index şi deplasament: EA este suma dintre conţinutul unei
locaţii de memorie de adresă egală cu suma între un registru bază şi un deplasament şi
conţinutul unui registru index.
Modurile de adresare de mai sus sunt ilustrate în figura 3.9.
12 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Figura 3.9. Moduri de adresare a datelor

3.5.2.2. Adresarea instrucţiunilor

După fiecare instrucţiune contorul de program PC se încarcă cu o adresă care


depinde de tipul de operaţie executat în instrucţiunea curentă. Există următoarele
moduri de adresare a instrucţiunilor:
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 13
PROIECTAREA APLICAŢIILOR

1. - execuţie secvenţială PC <-- PC + n, n este deplasarea până la adresa de început


a instrucţiunii următoare;
2. - salt cu adresă directă PC <-- a, a adresa de salt;
3. - salt cu adresă relativă PC <-- PC + d, d deplasament (+/-) faţă de adresa
instrucţiunii următoare.
Avantajul acestei metode de salt constă în relocabilitatea programelor (codul
programului poate fi deplasat în memoria principală la altă adresă şi rămâne
executabil fără nici o modificare). Programele ce folosesc adresarea directă a
instrucţiunilor nu sunt relocabile. Figura 3.10 ilustrează modul de adresare cu salt
relativ la program.

Figura 3.10. Salt relativ la PC

4. - salt cu adresare indirectă


PC <-- Reg (prin registru)
PC <-- (EA) (prin memorie)
(EA) reprezintă conţinutul cuvântului de memorie de adresă EA, calculată
conform unui mod de adresare a datelor. Se utilizează la realizarea de tabele de
adrese de salt (instrucţiunea case). Instrucţiunile pot fi adresate şi cu ajutorul stivei
(CALL/RET); de exemplu, apelul CALL k reprezintă secvenţa de operaţii: SP <--

SP - 1, SP <-- adresa următoare după CALL k, PC <-- k, iar revenirea din


subrutină, RET, este echivalentă cu operaţiile: PC <-- (SP), SP <-- SP + 1.
14 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

3.5.3. Unitatea de comandă (UC)

Unitatea de comandă are următoarele funcţii: extrage codul instrucţiunii


(fetch), decodifică instrucţiunea, comandă execuţia unei secvenţe de acţiuni
asociate instrucţiunii respective (microprogram).
Unitatea de comandă poate fi realizată prin logică convenţională- sau logică
cablată- (primele microprocesoare, procesoarele RISC), sau prin microprogramare
(procesoarele CISC).
O unitate de comandă microprogramată execută o secvenţă de
microinstrucţiuni, asociată instrucţiunii, care generează comenzile pentru execuţia
instrucţiunii la nivel maşină (citire-RD, scriere -WR, validări, etc.) şi comenzi
pentru selectarea adresei următoare în memoria de microprograme. Logica de
comandă (controler) şi circuitul ROM (pentru microprograme) constituie un
microsecvenţor.

Exemplu de secvenţare pentru execuţia unei instrucţiuni

Notaţii:
MM = memorie de microprograme;
RMI = registru de microinstrucţiuni;
μP = contor de microinstrucţiuni;
μI(i) = microinstrucţiunea i;
PC = contor de instrucţiuni.
Fazele de secvenţare sunt următoarele:

(0) Reset μPC ==> adresa MM = 0;


(1) Adresa MM = 0, citeşte μI(0), RMI <-- μI(0) (microinstrucţiunea "fetch")

Execuţia μI(0) (FETCH)

(2) - comandă de aplicare a adresei PC la memoria principală (MP);


(3) - adresa MP = PC;
(4) - comandă de citire (Read) şi validarea destinaţiei (RI = registru de
instrucţiuni);
(5) - RI <-- MP(PC);
(5') - selectarea μI(1) ca microinstrucţiune următoare şi citirea ei.

Execuţia μI(1) (DECODIFICARE)

Microinstrucţiunea μI(1) determină un salt necondiţionat în MM la o adresă


dată de codul instrucţiunii. Este posibilă o transformare care asigură independenţa
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 15
PROIECTAREA APLICAŢIILOR

codificării instrucţiunii de plasarea adreselor de salt în MM (printr-un codificator


(ROM) care are ca intrări codul instrucţiunii şi ca ieşiri adresa de salt în MM.

(6) - selectarea RI ca generator de adresă de salt;


(7) - aplicarea adresei de salt la MM;
(8) - salt la adresa microprogramului asociat instrucţiunii I.

Execuţia μI1(I), μI2(I)

(9) - execuţia microprogramului asociat instrucţiunii I. Se incrementează


corespunzător PC, se citesc/scriu date, se efectuează operaţii în RALU, etc. Ultima
microinstrucţiune conţine un salt necondiţionat în memoria de microprograme, la
adresa 0 (FETCH); se începe un nou ciclu de instrucţiune.Indicatori de condiţie
(flaguri) din RALU pot să determine salturi condiţionate la diverse microprograme
în funcţie de valoarea biţilor condiţionali.
Principiul microprogramării pentru realizarea unităţii de comandă este ilustrat
în figura 3.11.
Microinstrucţiunea cu formatul din figura 3.12 este o microinstrucţiune
orizontală caracterizată de: câmpuri independente, timp de execuţie redus (1 tact),
grad mare de paralelism. Pentru microinstrucţiunile orizontale, dimensiunea MM
este mare, iar gradul de utilizare este mic.
În cazul unor comenzi disjuncte, se poate utiliza un decodificator (ca în figura
3.13) pentru a reduce numărul de câmpuri ale microinstrucţiunii.
Utilizarea unui câmp cu mai multe semnificaţii conduce la microprogramare
verticală; semnificaţia câmpului este dată de un câmp special de selecţie. Mai
multe microinstrucţiuni succesive pot utiliza acelaşi câmp, cu semnificaţie diferită.
O restricţie a utilizării microprogramării verticale este aceea că nu se poate
realiza o operaţie care utilizează un operand imediat din microprogram şi
efectuează simultan şi un salt.
16 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Figura 3.11. Principiul microprogramării

Formatul unei microinstrucţiuni este prezentat în figura 3.12.

Figura 3.12. Formatul microinstrucţiunii


LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 17
PROIECTAREA APLICAŢIILOR

Figura 3.13. Formatul unei microinstrucţiuni cu comenzi disjuncte

În practică, se utilizează microprogramarea "diagonală" (combinaţie de


microinstrucţiuni orizontale şi verticale).
Pentru acţiuni tipice necesare în mai multe microprograme, se pot defini
microsubrutine.
Codurile instrucţiunilor la nivel maşină sunt structurate ca figura 3.14.

Figura 3.14. Structura codurilor de instrucţiune

Câmpurile DEST şi SRC devin parametrii ai microprogramului care poate


lucra cu orice destinaţie şi cu orice sursă (dintre cele accesibile utilizatorului).
În general, structura unei instrucţiuni un are un număr de câmpuri fix (ca la
procesoare RISC), ci poate avea un număr variabil de câmpuri, în funcţie de
complexitatea operaţiilor (ca la procesoare CISC).
18 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

3.6. Microcontrolere specializate în prelucrarea digitală a


semnalelor
Majoritatea aplicaţiilor de procesare a semnalelor (Digital Signal Processing -
DSP) necesită o prelucrare în timp real cu o intîrziere minimă între momentele de
timp ale achizitiei semnalului de intrare şi generarea semnalului de iesire. Pentru
aceste aplicaţii datele de intrare nu pot fi stocate (pentru a fi prelucrate " off line" )
deci procesorul trebuie sa fie suficient de rapid pentru a se evita pierderea de date.
Pe de altă parte algoritmii DSP sînt caracterizaţi de paralelism în ceea ce
priveşte organizarea calculelor; acest paralelism poate fi exploatat de arhitectura
procesorului de semnal.
În figura 3.15 este prezentată o configuratie generică a unui procesor de
semnal constituit din: unitatea de procesare, memorie, unitatea detransfer a datelor,
procesorul de intrare / ieşire şi procesorul de control.
În structură pot exista mai multe unităti de prelucrare distribuite, cu memorii
private sau comune. Transferul datelor şi conflictele de acces la memorie pot
constitui elemente de reducere a vitezei globale de operare a procesorului. Pentru
evitarea acestui fenomen se utilizează proiectarea modularizată, cu partajarea
sarcinilor între unitătile de prelucrare. Acest lucru este valabil atât pentru
procesoarele de semnal nou create cât şi pentru structurile de prelucrare cu mai
multe procesoare integrate interconectate.
Procesorul de intrare - iesire (I /O) asigură preluarea semnalului de intrare şi
generarea semnalului de ieşire (filtrare de bandă, conversii, stocare a datelor,
protocolul de comuniţie cu exteriorul).
Memoria este caracterizată prin: capacitatea de stocare a datelor, lărgimea
cuvîntului de date, modurile de adresare a datelor, timpul de acces).
Reţeaua de transfer a datelor asigură transmiterea datelor către toate unitătile
funcţionale ale procesorului de semnal (transmisie de date, rutarea datelor,
controlul asupra erorilor).
Procesorul de control este caracterizat de: capacitatea de stocare a
instrucţiunilor, viteza de execuţie, setul de instrucţiuni.
Unitatea de prelucrare asigură efectuarea operaţiilor de bază (operaţii
aritmetice, logice) şi este caracterizată de: timpul de execuţie a intrucţiunilor,
gradul de flexibilitate.
Funcţiile procesorului de control sînt: interpretarea comenzilor primite din
exterior, controlul transferului de date, controlul unităţilor de prelucrare şi
controlul interfeţelor de intrare-ieşire.
Aceste funcţii pot fi distribuite şi către alte elemente ale sistemului. De
exemplu unităţile de prelucrare au posibilitatea de a controla local transferul
datelor şi funcţiile aritmetice - logice proprii.
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 19
PROIECTAREA APLICAŢIILOR

Intrare
Procesor Procesor
I / O
de control
Iesire

Retea de
Memorie Unitate de
transfer
prelucrare

a datelor

Figura 3.15 Procesor de semnal generic

Procesorul de control poate efectua prelucrări complementare aplicaţiei DSP


(de uz general care nu au cerinte critice de timp: monitorizare, întreţinere etc.)
Resursele procesorului de control includ capacitatea de stocare a datelor şi
instrucţiunilor, setul de instrucţiuni, capabilitatea aritmetică.
Elementele de prelucrare execută algoritmul DSP în timp real. Aceste
elemente sînt specializate în efectuarea prelucrărilor specifice algoritmilor DSP.
Reţeaua de transfer a datelor reprezintă un bloc esenţial în sistem; acest bloc
poate avea influenţe majore în viteza de prelucrare globală a sistemului.
Resursele reţelei de transfer a datelor includ: căile de rutare a datelor,
lărgimea busurilor de transfer a datelor, viteza de transmisie, posibilitatea de
transfer pe blocuri de date. Cerinţele de control a retelei de transfer includ
protocoalele de comunicaţie şi modurile de adresare. Numărul de busuri reprezintă
o problemă care diminuează capacitatea de transfer a datelor între blocurile din
figura 1; nu este convenabilă realizarea unei interconectări totale între blocuri
datorită complexitătii tehnologice şi a necesităţii introducerii unor blocuri
suplimentare de arbitare a cererilor de acces multiple.
Resursele memoriilor includ: capacitatea de stocare, lărgimea cuvintului de
date, modurile de adresare şi controlul general al memoriei (decodificare,
comenzi).

3.6.1. Caracteristici ale procesoarelor DSP


20 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Prelucrarea digitală a semnalelor presupune utilizarea unor procesoare de


semnal cu performante ridicate. Performantele nu pot fi masurate numai prin
viteza de multiplicare/acumulare (MIPS). Deoarece o instrucţiune pentru un
procesor de semnal (DSP) nu este echivalentă cu o instructiune pentru un alt
procesor de semnal, rata MIPS poate să nu fie concludentă şi poate conduce la
erori de apreciere.
Arhitectura unui DSP şi performanţele pentru fiecare bloc funcţional din
aceasta arhitectură (cum ar fi unitatea aritmetică, unitatea de adresare şi
secvenţorul de program) pot fi mult mai importante în stabilirea caracteristicilor
unui procesor de semnal. Ceea ce distinge un procesor de semnal de un procesor de
uz general este reprezentat de următoarele:

1. Aritmetica rapidă şi flexibilă


Un procesor de semnal trebuie sa permita calcule într-un singur ciclu
(multiplicări, multiplicări şi acumulări, deplasări, operaţii aritmetice şi logice).
Unitatea aritmetică trebuie sa permita implementarea unui algoritm de prelucrare a
semnalelor fara ca acesta sa fie reformulat (modificat) pentru a putea fi
implementat.

2. Dinamica extinsa pentru multiplicari/acumulari


Dinamica extinsă este fundamentală pentru algoritmii de prelucrare a
semnalelor. Aceasta asigură protecţia la depăşirile aritmetice care apar în decursul
sumelor parţiale (de exemplu efectuarea calculelor pe 40 biţi cu 8 biti de extensie a
bitului de semn).

3. Încărcarea a 2 operanzi într-un singur ciclu (din memoria interna


sau externa)
În calculele cu sumă de produse (convoluţii numerice) trebuie încărcati 2
operanzi pentru a efectua calculele. Capacitatea de adresare flexibilă pentru 2 date
din memorie este importantă.

4. Buffere circulare hardware (în memoria internă sau externă)


O clasă largă de algoritmi de prelucrare a semnalelor necesită buffere de
memorie circulare; dacă există posibilitatea hardware de a utiliza astfel de buffere
se reduce timpul de execuţie (de prelucrare) şi se simplifică implementarea
algoritmului.

5.Bucle hardware şi salturi condiţionate fără cicluri suplimentare


Algoritmii de prelucrare sînt în mod natural repetitivi şi pot fi exprimaţi
simplu prin bucle de program. Secventorul de program trebuie să permită
implementarea buclelor şi a salturilor conditionate fără ciclii maşină suplimentari
datoraţi testării condiţiei de terminare a buclei sau testării condiţiei de salt; aceasta
conduce la performanţe mai bune din punct de vedere al timpului de prelucrare.
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 21
PROIECTAREA APLICAŢIILOR

3.6.2 Unităţi aritmetice şi de control pentru procesoare DSP


Unitatea aritmetica poate fi organizata ca în figura 3.16.

Figura 3.16. Moduri de realizare a unităţilor aritmetice DSP

Structurile (a) şi (b) sunt potrivite pentru sume de produse; se pot efectua
înmulţiri rapide. Timpul de efectuare al unei sume de produs (înmulţire şi
acumulare la suma anterioră) este destul de mare. Pentru îmbunatăţirea
performanţelor acestei structuri se pot folosi în paralel înmultitorul şi sumatorul.
Multiplicatorul se poate folosi în mod secvenţial (se efectuează cîte un produs apoi
se face acumularea rezultatului) sau în timp ce se efectueaza un produs se
acumuleaza rezultatul anterior (utilizarea în paralel a multiplicatorului şi a
sumatorului).
Dezavantajele structurii (a) sunt: efectuarea sumelor simple se face cu
utilizarea suplimentară a multiplicatorului (ceea ce măreşte timpul de calcul) şi
efectuarea produselor multiple se face cu utilizarea suplimentară a sumatorului.
Avantajul structurii (b) este posibilitatea efectuării unor calcule, de tip x.y+z, cu
viteză foarte mare datorită faptului ca sumatorul şi multiplicatorul pot lucra paralel.
Dezavantajele structurii (b) sunt: numărul de busuri interne mare; pentru
reducerea numărului de busuri se alege varianta transferurilor pe busuri comune
sumatorului şi multiplicatorului: paralelismul nu mai este total.
Unitatea de control a unui procesor de semnal poate fi realizată
microprogramat utilizînd tehnica pipe-line pentru a mari viteza de lucru. În figura
3.17-a este ilustrată realizarea unei unităţi de control microprogramate fără pipe-
line. Modificările introduse prin tehnica pipe line sînt ilustrate în figura 3.17-b.
22 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Figura 3.17. Unitate de comanda pentru procesoare DSP

Notaţiile utilizate sînt:

tsecv - timp de calcul al adresei pentru memoria de microprograme


tacc - timp de acces la memoria de microprograme

tPR,tSR - timp de încărcare a registrelor R1,R2


tstat - timp de stabilire a stării unitătii aritmetice (în avans)
tc - timp de calcul efectiv (operaţii interne în unitatea aritmetică)

În timp ce unitatea aritmetică execută instructiunea (n) secventorul


calculează deja adresa pentru instructiunea (n+1) folosind ca informaţie
instructiunea (n) şi starea unităţii aritmetice de la instructiunea (n-1).
Unitatea de comandă din figura 3.17-a se regăseste în toate procesoarele
CISC. Varianta cu pipe-line este obligatorie în procesoare DSP pentru a asigura o
viteză de lucru sporită. Există şi procesoare CISC cu unitate de comanda pipe-line,
dar, în general, nu e obligatorie pentru microcontrolerele uzuale.
În microcontrolerele DSP, microinstrucţiunea este orizontală, pentru a
putea asigura controlul mai multor unităţi funcţionale în paralel.
4. SINCRONIZAREA PROCESORULUI CU
DISPOZITIVE EXTERNE. TRANSFERURI
INTRARE-IEŞIRE

4.1. Sincronizarea UCP cu dispozitive externe


4.1.1 Conceptul de întrerupere

Întreruperea, în sens strict, reprezintă oprirea temporară a executiei unui


program la comanda unui semnal exterior unitatii centrale (semnificind producerea
unui eveniment extern) si executarea unui program specific asociat evenimentului
extern. Odata cu incheierea servirii intreruperii programul intrerupt este reluat
automat din starea in care a fost intrerupt.
O astfel de intrerupere propriu-zisa poarta numele de intrerupere externa sau
întrerupere hardware (HW). În acest caz evenimentelor externe li se asociaza
semnalele numite cereri de intrerupere (CI). Servirea cererii de intrerupere (SCI)
consta in executia subprogramului asociat evenimentului extern respectiv.
Surse ale intreruperilor externe pot fi:
- dispozitive periferice care solicita prin CI servicii specifice (transferuri IO
sau actiuni particulare solicitate prin simpla prezenta a CI) corespunzatoare
aplicatiei;
- dispozitive HW de supraveghere a functionarii normale a sistemului,
distincte de aplicatia propriu-zisa (ex. circuite detectoare de erori de paritate la
transferurile cu memoria, de sesizare a caderii iminente a tensiunii de alimentare,
etc.).
Anumite UCP permit generarea interna (prin instructiuni ale programului) a
intreruperii executiei programului principal si executia unui subprogram asociat
utilizind un mecanism foarte asemănator cu acela al intreruperilor propriu-zise
HW. Aceste intreruperi se numesc întreruperi interne sau întreruperi software
(SW).
Surse ale intreruperilor interne pot fi:
- indicatoare ale unor situatii de exceptie (depăşiri la operaţiile aritmetice,
operaţii de control nepermise în programul utilizatorului, nerezidenţa unor
segmente virtuale în memoria principala fizică, etc)
- alte situaţii necritice care pot fi întâlnite în programele de aplicaţie, dar care
necesită execuţia unor subprograme asociate.
Sistemul de întreruperi este sistemul hardware-software (HW-SW) prin
care UCP realizează funcţiunile de întrerupere. Existenţa sistemului de întreruperi
permite:
- sincronizarea activităţii UCP cu evenimente externe;
2 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

- eliberarea UCP de sarcina explorarii intrărilor, în vederea modificarilor de


stare şi micşorarea timpului de răspuns la modificarea intrărilor;
- tratarea ierarhizată (după priorităţi) a diverselor sarcini alocate UCP;
- detectarea rapidă a unor situaţii anormale în funcţionarea sistemului cu
sporirea implicită a fiabilităţii.
Termenul de control al întreruperilor se referă la acceptarea sau neacceptarea
de către UCP a CI îi se aplică evident doar întreruperilor externe, HW nu şi celor
interne, SW.
De asemenea anumite microprocesoare posedă semnale de întrerupere care
determină execuţia necondiţionată a subprogramului asociat. Acestea poartă
numele de întreruperi nemascabile.
Întreruperile care pot fi validate/ invalidate prin program se numesc
mascabile. Pentru aceasta UCP dispune de instructiuni de validare a intreruperilor
şi de invalidare a intreruperilor.

Răspunsul UCP laîintreruperi

Considerind o UCP cu o singură intrare de întrerupere mascabilă (INTR) şi


mai multe surse de intrerupere posibile, realizarea acţiunilor specificate în definirea
întreruperilor necesită în principiu următoarele acţiuni ale UCP, la apariţia unei CI
acceptate:

- confirmarea acceptării şi identificarea întrerupatorului;


- salvarea stării programului întrerupt;
- transferul executiei la subrutina de servire;
- restabilirea stării programului întrerupt după executarea subrutinei;
- reluarea execuţiei programului întrerupt.

Daca sursa de întrerupere este unică, se alocă prin construcţia UCP o adresă
fixă, la care se va plasa subrutina de servire. În această situaţie sistemul de
întreruperi se numeşte cu vectorizare fixă.

În cazul mai multor surse de intrerupere ele vor fi identificate prin coduri
proprii (tip de întrerupere), citite de către UCP în ciclul masină de confirmare a
acceptării şi identificare a întrerupatorului.
Generarea unui tip de întrerupere se poate face în două moduri:
- de către dispozitivul extern, daca este prevăzut cu logica necesară;
- de către un dispozitiv special numit controler de ăntreruperi (CINT) prevăzut
cu mai multe intrări la care sosesc CI de la dispozitivele externe, cărora li se
alocă tipuri distincte şi cu ieşirea conectată la intrarea INTR a UCP.

Confirmarea acceptării unei cereri de întrerupere de către UCP se face printr-


un semnal de recunoaştere INTA (INTerrupt Acknowledge). La primirea acestuia,
CINT generează pe bus-ul de date (BD) tipul de intrerupere. Adresa de servire a
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 3
PROIECTAREA APLICAŢIILOR

întreruperii se citeşte dintr-o tabelă, stocată în memorie, care se numeşte tabela


vectorilor de întrerupere.
Figura 4.1. ilustrează răspunsul la întreruperi a unui procesor.

Figura 4.1 Răspunsul UCP la întreruperi

4.1.2. Sincronizarea cu dispozitive lente

Memoriile si dispozitivele externe din structura unui sistem cu microprocesor


pot avea o viteză mai redusă decât a UCP. În aceste situaţii este necesar să existe
semnale speciale prin care UCP să poată să se sincronizeze cu aceste dispozitive
lente. Trebuie precizat însă că, pentru perifericele integrate în structura unui
microcontroler, acest lucru nu este necesar.
Sincronizarea cu memorie şi dispozitivele externe lente se realizeză cu
ajutorul unui semnal, READY, care este testat pe durata fiecărui ciclu maşină.
Dacă semnalul READY este zero logic, atunci toate semnalele de pe magistralele
externe ale UCP vor fi ingheţate până când semnalul READY devine unu logic.
Procesorul se află, pe durata cât READY este yero logic, în starea de WAIT.
Figura 4.2. ilustrează sincronizarea cu memoria si dispozitivele externe lente.

4.2. Interfeţe de intrare-ieşire. Porturi I/O


4 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Structura tipică a oricarui microcalculator are o secţiune de intrare ieşire -


IO (ca in figura 3.4). Schema din figura 3.4 trebuie completată cu circuite de
selecţie a memoriei şi a porturilor. Figura 4.3 indică modul în care se conectează
mai multe module de memorie şi de intrare – ieşire pe magistralele unui procesor.

Figura 4.2. Sincronizarea cu memorii si dispozitive externe lente


LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 5
PROIECTAREA APLICAŢIILOR

Figura 4.3. Structura unui microcontroler

În schema din figura 4.3 un singur modul de memorie sau port IO sunt
active la un moment dat. Acest lucru este asigurat de decodificatoarele DEC1 şi
DEC2.
Sectiunea de intrare asigura accesul informaţiilor din lumea exterioara spre
calculator (tastatura, cititor de banda, disc, echipamente de masură, semnalizari
dintr-un proces etc).
Prin sectiunea de ieşire se transmit spre exterior rezultate, comezi, mărimi
către echipamente de executie, etc. Toata funcţionarea sistemului este coordonată
de către unitatea de control, care supervizează şi sincronizează toate operaţiile,
transferul de informaţie, decodifică instrucţiunile programului şi determină
execuţia acestora.
Elementele de intrare/ieşire vor fi realizate cu circuite speciale, în
exteriorul microprocesorului. De multe ori, producătorii de microprocesoare vor
furniza aşa numite familii de circuite integrate, asociate (compatibile ca
funcţionare), cu tipurile de microprocesoare pe care le realizează.
Transferul de intrare ieşire repezintă schimbul de informatii dintre
dispozitivele periferice (exterioare sistemului cu microprocessor) şi este realizat
prin intermediul unor cicuite de interfată numite porturi de intrare-ieşire sau porturi
I/O.
Porturile I/O sunt accesate în mod similar unor locaţii de memorie.
Adresele acestor porturi pot fi înglobate in spaţiul de adrese al memoriei sau pot fi
separate.
Transferul datelor între diversele secţiuni ale sistemului se face pe
magistralele de date ale sistemului. Diferenţierea diferitelor surse de informaţie de
la care/către se vehiculează datele în sistem se face prin existenţa adreselor
distincte ale acestora. Astfel fiecare cuvânt de date al memoriei sistemului are o
6 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

adresă unică. Microprocesorul generează această adresă dacă se efectuează


transferuri de informaţie de la/la cuvântul de date pe magistrala de adrese a
sistemului. Similar şi porturile sistemului au adrese unice. Apariţia unei anumite
adrese va conduce la selecţia unică a portului dorit, care va fi activat şi cu care va
opera sistemul. Diferenţierea între memorie şi porturi cât şi indicarea sensului
transferului datelor (de la microprocesor înspre memorie sau porturi - scriere; la
microprocessor dinspre memorie sau porturi - citire) va fi facută prin semnale
specifice ale secţiunii de control.
Porturile de la care se face citirea datelor se numesc porturi de intrare
(INPUT). Porturile la care se face scrierea datelor se numesc porturi de ieşire
(OUTPUT).

4.2.1. Transferul de date. Protocoale de comunicaţie

Transferurile de date pot fi clasificate după următoarele criterii:

1. după gradul de implicare a microprocesorului în realizarea transferului


- transfer comandat prin program (transfer programat)
- transfer cu acces direct la memorie ( transfer DMA - Direct
Memory Access)
2. după dispozitivul care solicita transferul
- transfer solicitat de CPU
- transfer solicitat de dispozitivul periferic
3. după gradul de serializare
- transfer serial
- transfer paralel

Performanţele sistemului în ceea ce priveşte transferul de date sunt


influenţate de modul în care se realizează sincronizarea dintre CPU sş
dispozitivul extern.
Transferul programat presupune ca procesorul initiază, controlează
desfaşurarea transferului şi încheie transferul de date, ca în organigrama din
figura 4.4.
Acest tip de transfer presupune existenta unei bucle de aşteptare activă în
care UCP interogează dispozitivul periferic pentru a determina când acesta are
date gata de transfer. Portul I/O are este compus dintr-un port de stare (care
indică printre altele şi faptul că datele sunt pregatite de transfer) şi un port de
date care conţine informaţia dorită. Transferul programat cu buclă de aşteptare
activă nu este foarte eficient deoarece “blochează” procesorul în bucla de
interogare. Organigrama din figura 2 poate fi modificată prin utilizarea
întreruperilor generate de dispozitivul perifeic atunci când datele sunt pregătite
de transfer. Bucla de aşteptare activă se transformă într-o buclă de aşteptare
pasivă ce poate fi înlocuită cu alte prelucrări utile.
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 7
PROIECTAREA APLICAŢIILOR

Citirea efectivă a datelor şi stocarea acestora se vor face în rutina de


servire a întreruperilor generate de dispozitivul periferic (portul I/O).
Avantajul utilizării întreruperilor este acela ca UCP poate fi utilizată pentru
prelucrări utile; este necesar ca UCP să aibă în componenţă un bloc de răspuns
la întreruperi (creşte complexitatea hardware).

Figura 4.4. Transferul programat (port de intrare)


8 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

În cazul transferului de tip DMA, procesorul initiazp transferul – prin


programarea unui circuit specializat numit controler DMA (DMAC) – după
care desfăşurarea transferului şi încheierea acestuia se vor face sub controlul
DMAC. Transferul DMA este guvernat de principiul cererii şi acceptarii
magistralelor (Bus Request-Bus Grant) ilustrat în figura 4.5.

Figura 4.5. Principiul cererii si acceptarii magistralelor

Dupa programarea circuitului DMAC, acesta aşteaptă o cerere de transfer


de la dispozitivul periferic (REQ); când aceasta este generată, DMAC confirmă
acceptarea cererii (către dispozitivul periferic) prin semnalul ACK şi generează
o cerere de magistrală (Bus Request – BR) către UCP; se aşteaptă confirmarea
cedării magistralelor de către procesor (prin semnalul Bus Grant – BG), după
care procesorul îşi trece magistralele în starea de inalta impedanta (HiZ) şi
devine slave in sistem. Controlerul DMA este master în sistem şi controlează
magistralele, efectuând transferuri de date cu memoria sau dispozitivele
periferice, fără interventia UCP (care poate să efectueze numai operatii ce nu
necesită magistralele sistemului). Această situaţie este menţinută până când
semnalul de cerere de magistrală este inhibat, dupa care UCP redevine master
iar DMAC slave. Figura 4.6 ilustrează etapele desfaşurării transferului DMA.
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 9
PROIECTAREA APLICAŢIILOR

Figura 4.6. Diagrama de operare a transferului DMA


4.2.1.1 Transferul serial

Pentru a putea realiza transferuri pe distanţe mai mari se utilizează interfete


speciale care transforma informaţia paralelă - cuvântul de date - într-o succesiune
de impulsuri, transmise pe un singur fir de legatură ca în figura 4.7.

Figura 4.7. Transferul serial

Transmisia în acest mod se face cu viteză mai mică decât transmisia simultană
a tuturor biţilor (transmisie paralelă), dar problemele de zgomot şi preţul
echipamentelor sunt mai reduse.
Transmisia serială se va face prin emiterea unor impulsuri de tensiune, cu două
niveluri, corespunzătoare valorilor logice "0" sau "1" ale biţilor ce se transmit.
Durata acestor pulsuri este fixă, fiind dată de semnalul de "ceas", care va impune
viteza de serializare a datelor. Este evident ca pentru o funcţionare corectă va fi
necesar ca ambele circuite, atât cel emiţător (transmitator) cât şi receptorul, să
functioneze cu aceeaşi frecvenţă a ceasului. De aceea, aceste viteze de
transmisie/receptie serială sunt standardizate. Ele se măsoară în numărul de biti ce
10 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

se transmit/receptionează pe secunda. Vitezele standard tipice sunt: 110,300,600,


1200, 2400, 4800, 9600 până la 115000 de biţi pe secundă. Există doua moduri
principale de transmisie a datelor: modul asincron (cel mai utilizat) şi modul
sincron.
Pentru a ameliora deformarea pulsurilor în linia seriala (datorate atenuarilor şi
capacităţii parazite a liniei) se pot utiliza următoarele metode:
- introducerea unor circuite de conversie a pulsurilor din gama 0÷5
V în gama 0÷12V sau (-12) ÷ (+12 )V
- eşantionarea multiplă a bitului ( pâna la de 64 de ori durata de bit)
şi determinarea prin logică majoritară a valorii acestuia
În figura 4.8. sunt ilustrate cele doua metode.

Pentru distanţe foarte mari se pot utiliza în locul convertoarelor de nivel


circuite de tip modem (modulator – demodulator) care transformă (modulează)
şirul de pulsuri în semnal analogic (mai puţin modificat de canalul de
comunicaţie) care va fi demodulat la recepţie şi refăcut în formă binară.

Figura 4.8. Îmbunatăţirea transmisiei seriale

Formatul transmisiei seriale asincrone este prezentat în figura 4.9:


LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 11
PROIECTAREA APLICAŢIILOR

Figura 4.9. Formatul transmisiei seriale asincrone

Transmisia este declansată în mod asincron; semnalizarea începerii acesteia se


realizează prin bitul de START (cu valoarea logică "0"). Acesta va declanşa la
receptor, operaţia de receptie şi deserializare a următorilor biţi, ce reprezintă
informatia propriu-zisă ce se transmite (b0 pina la b7 în figura 4.9). Transmisia se
va incheia cu un numar precizat (cel puţin 1) de biţi de stop (valoarea logică "1").
Abia apoi se va putea emite eventual un alt cuvint de date, în aceeaşi succesiune a
operaţiilor.

4.2.1.2 Transferul paralel

Transferul paralel al datelor se realizează prin transmiterea simultană a datelor


prin intermediul unui cablu format din N conductori, fiecare conductor purtând un
bit, ca in figura 4.10.

Figura 4.10. Transferul paralel

Transmiterea datelor în mod paralel între două calculatoare sau între un


calculator şi o consolă nu se poate face pe distante mai mari de câţiva metri
datorită problemelor deosebite legate de ecranarea acestor cabluri şi a preţului de
cost ridicat. Nu se pot - sau nu este convenabil - realiza magistrale de date care să
12 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

permită transferul simultan al tuturor biţilor cuvintelor de date între două asemenea
echipamente.
Transferurile de date în mod paralel pot fi clasificate astfel:
- transferuri fara protocol electric ( se transmit numai datele, fără
alte semnale de comandă)
- transferuri cu protocol electric ( pe lângă date se transmit şi
semnale de comandă a transferului)
- transferurile cu protocol electric pot fi cu sau fără confirmare
- transfer paralel asincron sau sincron (după modul de sincronizare
între transmiţător şi receptor)
Pentru transferul fara protocol, UCP are sarcina interogarii porturilor de
intrare (pentru a determina momentele în care datele sunt pregatite); pentru ieşire,
dispozitivul periferic are drept sarcina urmărirea modificării datelor. Dezavantajele
transferului de date fără protocol sunt: nu există sincronizare, nu se confirmă faptul
că datele au ajuns la destinaţie şi încărcarea suplimentară a UCP pentru realizarea
transfrului programat.
În cazul transferurilor cu protocol electric fără confirmare transmisia poate
fi iniţiată fie de transmiţător fie de receptor. Daca transmisia este iniţiată de
transmiţător, acesta va emite către receptor un semnal (RDY) care indică faptul că
datele sunt pregătite de transfer. Receptorul aşteaptă semnalul RDY după care
preia datele de pe magistrala de date. Acest protocol este ilustrat în figura 4.11.
Transferul de date poate fi iniţiat şi de receptor; acesta va emite un semnal de
cerere de date (REQ) către tranmiţător. După primirea semnalului REQ,
transmiţătorul va transmite datele pe magistala de date de unde acestea vor fi
preluate de către receptor. Protocolul este ilustrat în figura 4.12.
Pentru ambele tipuri de protocoale fără confirmare nu se rezolva decât
determinarea momentelor de timp la care se vor transmite datele pe magistrala de
date. Transmitatorul si receptorul trebuie să funcţioneze la aceeaşi viteză pentru a
se evita pierderea de date sau receptionarea aceloraşi date de mai multe ori. Nu
există o confirmare a faptului că datele au fost recepţionate şi nu este posibil ca
transmitatorul şi receptorul să opereze cu viteze diferite.
Aceste dezavantaje sunt eliminate prin utilizarea protocolului cu confirmare
ilustrat in f igura 4.13.
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 13
PROIECTAREA APLICAŢIILOR

Figura 4.11. Transfer paralel cu protocol asincron fără confirmare (transfer iniţiat
de transmiţător)
14 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Figura 4.12. Transfer paralel cu protocol asincron fără confirmare (transfer iniţiat
de receptor)

În cazul protocolului cu confirmare, de exemplu cu iniţierea transferului de


catre transmiţător, acesta emite un semnal (RDY) care indică receptorului că datele
sunt pregatite de transfer, plasează datele pe magistrala de date, dar nu se iniţiaza
un nou transfer pâna când transmitatorul nu recepţioneaza un semnal de confirmare
(ACK) emis de receptor care indică faptul că datele au fost preluate. Protocolul cu
confirmare se mai numeste protocol cu hand-shaking.
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 15
PROIECTAREA APLICAŢIILOR

Figura 4.13. Transfer paralel cu protocol asincron cu confirmare (hand-shaking)

4.3. Selecţia memoriei


Etapele proiectării unui bloc de selecţie de memorie sunt următoarele:

1. Determinarea numărului de circuite de memorie necesare:


D
n= , unde D este dimensiunea zonei de memorie si d este
d
dimensiunea unui circuit de memorie
16 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

2. Determinarea numărului de semnale de selecţie necesare:


n
m= , unde c este numărul de circuite de memorie decodificate
c
simultan
Fiecare semnal de selecţie selectează un bloc de memorie de 2p
locaţii (octeţi)

3. Determinarea adreselor iniţiale şi finale pentru fiecare bloc de memorie şi


numărului de biţi necesari pentru reprezentarea acestora. Se cunoaşte
adresa iniţială a zonei de memorie si lungimea acesteia.

4. Realizarea tabelului de decodificare:

Decodificare externa Decodificare interna


AN-1 ……..…… Ap Ap-1 ……..……..….A0
0 0 …10…… 0 0 0 0 0 …............... 0 0 0 Adresa initială – bloc 0
CS0
0 0 …10…… 0 0 0 1 1 ….......…… 1 1 1 Adresa finală – bloc 0
0 0 …10…… 0 0 1 0 0 ….......…… 0 0 0 Adresa initială – bloc 1
CS1
0 0 …10…… 0 0 1 1 1 ….......…… 1 1 1 Adresa finală – bloc 1
………
0 0 …10…… 1 1 1 0 0 ….......…… 0 0 0 Adresa initială – bloc m-1
CSm-1
0 0 …10…… 1 1 1 1 1 ….......…… 1 1 1 Adresa finală – bloc m-1

În tabelul de decodificare se trec adresele iniţiale şi finale pentru fiecare bloc,


în format hexazecimal si format binar. S-a considerat ca un bloc de memorie are 2p
locaţii (octeţi) şi că numărul maxim de biţi necesar pentru reprezentarea adresei
este N.

5. Realizarea schemei de selecţie cu circuite de decodificare şi porţi logice,


pe baza tabelului de decodificare. Se observă că în grupul adreselor
decodificate extern există biţi de adresă care nu se modifică – vor fi
utilizaţi la validarea decodificatorului – şi biţi de adresă care variază – vor
fi folosiţi ca intrări de selecţie în decodificator
6. Conectarea semnalelor de date şi de control la circuitele de memorie, în
funcţie de tipul de memorie (RAM sau ROM)

Proiectarea selecţiei de memorie este exemplificată, urmând etapele 1-5 de mai


sus, pentru următorul caz:

- dimensiunea zonei de memorie – D = 256k octeţi


LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 17
PROIECTAREA APLICAŢIILOR

- dimensiunea unui circuit de memorie – d = 64k octeţi


- memorie de tip RAM
- adresa initială a zonei de memorie – 0x80000

D 256 k
Numărul de circuite de memorie necesare este n = = =4
d 64k
Dacă nu se specifică altfel, vom lua c = 1 .
n
Numărul de semnale de selecţie este m = =n=4
1
Deoarece avem relaţia d = 64 k = 216 şi considerăm o locaţie de memorie de un
octet, numărul de biţi de adresă pentru decodificarea interna este p = 16 .
Avem relaţia D = 256 k = 218 , rezultă numarul de biti pentru adresarea zonei de
memorie 18.
Adresa finală a zonei de memorie este 0 x80000 + D − 1 =
0 x80000 + 0 x40000 − 1 = 0 xBFFFF

Numărul maxin de biţi pentru reprezentarea adreselor este 20.

Există 4 blocuri de memorie, conform tabelului de decodificare:

Decodificare externa Decodificare interna


A19 A18 A17 A16 A15 ……..……………....A0
1 0 0 0 0 0 …..............…… 0 0 0 0x80000
CS0
1 0 0 0 1 1 …..............…… 1 1 1 0x8FFFF
1 0 0 1 0 0 …..............…… 0 0 0 0x90000
CS1
1 0 0 1 1 1 …..............…… 1 1 1 0x9FFFF
1 0 1 0 0 0 …..............…… 0 0 0 0xA0000
CS2
1 0 1 0 1 1 …..............…… 1 1 1 0xAFFFF
1 0 1 1 0 0 …..............…… 0 0 0 0xB0000
CS3
1 0 1 1 1 1 …..............…… 1 1 1 0xBFFFF

Conform tabelului de decodificare se poate realiza schema de selecţie din figura


4.14.
18 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Figura 4.14. Exemplu de selecţie de memorie

4.4. Selecţia porturilor de intrare ieşire


Porturile IO sunt selectate printr-o schema de selecţie asemanătoare selecţiei
memoriei. Spre deosebire de selecţia memoriei, decodificarea porturilor poate fi
incompletă (datorita faptului ca numarul de porturi din sistem este suficient de
mare şi nu se va dori extinderea acestora – de exemplu cu 8 biţi de adrese se
selectează 256 de porturi ceea ce reprezintă un număr relativ suficient de porturi
IO).
Selecţia porturilor poate fi făcută cu maparea porturilor în spaţiul de adrese al
memoriei sau cu adresare într-un spaţiu diferit de adrese (denumite adrese IO).
Avantajele maparii în memorie a porturilor constau în posibilitatea utilizarii
instructiunilor de adresare a memoriei ( cu moduri mai sofisticate de adresare, ceea
ce oferă o flexibilitate ridicată în utilizarea porturilor).
Dezavantajul mapării în memorie consta în ocuparea ineficienta a unui bloc de
memorie pentru selecţia unui singur port. Acest dezavantaj poate fi ameliorat prin
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 19
PROIECTAREA APLICAŢIILOR

utilizarea unor circuite de decodificare ce selectează o zonă “îngustă” de memorie.


Acest lucru este posibil însă dacă chipul de memorie are o capacitate mică.

Exemple de porturi simple

Cu ajutorul unor circuite simple (buffer, registre) se pot implementa


porturi de intrare – ieşire simple. Aceste porturi nu implementeaza protocoale de
comunicaţie, dar pot fi utilizate în cazul transferurilor de date de viteză mică.
În figura 4.15 se ilustrează modalitatea de realizare a porturilor IO simple.

Figura 4.15. Porturi de intrare/ieşire simplificate

Selecţia porturilor poate fi făcută cu utilizarea decodificatoarelor şi/sau a


porţilor logice.

Adresarea liniară a porturilor

Adresarea liniară a porturilor IO este o metodă simplă de selecţie care


foloseşte câte un singur bit de adresă pentru selecţia unui port.
Adresarea liniară a porturilor de intrare este prezentată în figura 4.16.
20 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Figura 4.16. Selecţia liniară a porturilor de intrare

Fiecare port de intrare, PI_i, este selectat de bitul de adresă Ai=0. Semnalul
IORD/ indică un semnal general de citire a porturilor de intrare.
Pentru selecţia liniară a porturilor de intrare nu este permis ca două sau mai
multe adrese să fie in starea de zero logic; în acest caz va apare un conflict electric
pe magistrala de date.
Selecţia liniară a porturilor de ieşire este ilustrată în figura 4.17.
Fiecare port de ieşire, PO_i, este selectat de bitul de adresă Ai=0. Semnalul
IOWR/ indică un semnal general de scriere a porturilor de ieşire.
Pentru selecţia liniară a porturilor de ieşire două sau mai multe adrese pot fi în
starea de zero logic; în acest caz se pot scrie (cu aceeaşi valoare) mai multe porturi
de ieşire simultan.

Figura 4.17. Selectia liniara a porturilor de iesire


LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 21
PROIECTAREA APLICAŢIILOR

Fiecare familie de microprocesoare are porturi asociate. De exemplu


pentru familia Intel 80x86 există următoarele porturi: port paralel 8255, port serial
8251, timer 8253, controler de intreruperi 8259 si controler DMA 8237.

Exemplu de schema de porturi de I/O

Pentru a studia porturile de intrari/ieşire, se prezintă o interfaţă I/O


pentru un sistem microprocesor. Spaţiul de adrese pentru porturi poate să fie între
0H si 3FFH. Din această cauză în decodificare au fost folosite numai adresele A0
÷ Α9 (3FFH este reprezentabil pe 10 biţi). Figura 4.18 prezintă schema de
decodificare pentru generarea semnalelor de selecţie de chip pentru un număr de 8
porturi începând cu adresa de bază 2A0H.
.

Figura 4.18. Schema de decodificare a porturilor de intrare-ieşire

Tabelul de decodificare este:

A9 A8 A A A A A A A A0 CS Adres Port
7 6 5 4 3 2 1 a
1 0 1 0 1 0 0 0 0 0 CS0 2A0 PORT_0
1 0 1 0 1 0 0 0 0 1 CS1 2A1 PORT_1
1 0 1 0 1 0 0 0 1 0 CS2 2A2 PORT_2
1 0 1 0 1 0 0 0 1 1 CS3 2A3 PORT_3
1 0 1 0 1 0 0 1 0 0 CS4 2A4 PORT_4
22 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

1 0 1 0 1 0 0 1 0 1 CS5 2A5 PORT_5


1 0 1 0 1 0 0 1 1 0 CS6 2A6 PORT_6
1 0 1 0 1 0 0 1 1 1 CS7 2A7 PORT_7

Semnalul IODECODE/ din figura.4 indică un acces de scriere/citire de la


orice port din intervalul 2A0 H ÷ 2Α7Η. Practic nu există nici un port care să fie
selectat pentru adresele 2A6H si 2A7H.
În decodificarea propriu-zisă sunt folosite numai adresele A0, A1, A2.
Celelalte adrese sunt folosite pentru sintetizarea semnalului IODECODE, iar A3
este folosit ca validare pentru decodificator. Ieşirile sale sunt active în starea “low”
(0 logic).

Semnalele IOR/ si IOW/ sunt formate din semnalele M/IO si RD/ respectiv
M/IO si WR astfel:

IOR = M/IO + RD

IOW = M/IO + WR

Semnalul AEN/ este format din liniile de adresa superioare (A15 pâna la A10)
astfel:

AEN = A15+ A14+ A13+ A12+ A11 +A10


5. EXEMPLE DE MICROCONTROLERE.
PROIECTAREA UNUI SISTEM CU
MICROCONTROLER
5.1. Descrierea microcontrolerului ATMEL AT90S8515

AT90S8515 este un microcontroler CMOS pe 8 biţi, produs de ATMEL,


realizat în arhitectura AVR RISC.

Caracteristicile microcontrolerului AT90S8515 sunt:


• Arhitectură RISC:
- 118 instrucţiuni, cele mai multe fiind executate într-un ciclu;
- 32 registre de uz general pe 8 biţi;
- până la 8MIPS la o frecvenţă de 8 MHz.
• Memorie:
- 8 K octeţi memorie de Program (Flash);
- 512 octeţi memorie SRAM;
- 512 octeţi memorie EEPROM;
- Protecţie la citire pentru Flash şi EEPROM.
• Module periferice:
- 1 Timer/Counter pe 8 biţi cu prescaler separat;
- 1 Timer/Counter pe 16 biţi cu prescaler separat şi diverse moduri
de lucru;
- Comparator analogic;
- Watchdog Timer programabil cu oscilator RC intern;
- Port serial UART programabil;
- Interfaţă serială SPI master/slave.
• 32 de linii I/O programabile.
• Întreruperi externe şi interne.
• Moduri “Low Power Idle” şi “Power Down”.
• Frecvenţă de ceas până la 8MHz.

Diagrama acestui microcontroler este prezentată în figura 5.1.


În figura 5.2 este prezentată arhitectura simplificată a microcontrolerului
AT90S8515.
Arhitectura AVR este o arhitectură Harvard cu bus-uri separate pentru
program şi date. În timpul execuţiei unei instrucţiuni, instrucţiunea următoare este
adusă din memoria de program (pipe-line cu două niveluri). Tehnica pipe-line
permite ca instrucţiunile să fie executate la fiecare ciclu de tact. Memoria de
program este de tip Flash programabilă intern.
Figura 5.1: Diagrama bloc a lui AT90S8515
Figura 5.2: Arhitectura AVR

Există 32 de registre de lucru, pe 8 biţi, cu timp de acces rapid. Aceasta


înseamnă o operaţie aritmetică logică este executată într-un singur ciclu de către
ALU (Arithmetic Logic Unit). Cei doi operanzi sunt extraşi din registre, se execută
operaţia şi rezultatul este stocat în registrul destinaţie, toate acestea într-un singur
ciclu. Şase dintre cele 32 registre pot fi folosite ca 3 pointeri pe 16 biţi pentru
adresare relativă în memoria de date SRAM. Aceste registre sunt X, Y şi Z.
Unitatea ALU permite efectuarea operaţiilor logice şi aritmetice cu un registru,
între două registre sau între un registru şi o constantă. În plus registrele de lucru pot
fi accesate prin intermediul celor trei pointeri ca oricare locaţie de memorie. Acest
lucru este posibil deoarece registrelor le sunt alocate primele 32 de adrese din
spaţiul memoriei de date. Spaţiul locaţiilor de memorie I/O conţine 64 de adrese
pentru dispozitivele periferice ale microcontrolerului ca: registre de control,
Timere/Countere, convertoare A/D, porturi I/O şi alte funcţii I/O. Locaţiile de
memorie I/O pot fi adresate direct sau indirect prin cei trei pointeri între adresele
0x20-0x5F. Cu instrucţiunile rjmp şi rcall se poate adresa direct tot spaţiul de
memorie de program, internă de 4K. Toate
instrucţiunile AVR au un format pe 16 biţi. Fiecare
adresă de memorie de program conţine o instrucţiune
pe 16 sau 32 biţi. În timpul întreruperilor şi al
apelurilor de subrutină adresa de revenire este salvată
în stivă. Stiva se află în spaţiul de memorie SRAM şi
este limitată doar de dimensiunea acestei memorii.
Pointerul stivei SP este accesibil în spaţiul de memorie
I/O. Memoria de date este ilustrată în figura 5.3:

În continuare se vor detalia următoarele


caracteristici ale microcontrolerului AT90S8515
precum si dispozitivele periferice:

1. Registrele de lucru de uz general;


2. Memoria de program FLASH;
3. Memoria de date SRAM internă şi externă;
4. Moduri de adresare a memoriei de program şi
de date;
5. Timpii de acces ai memoriei, execuţia în timp a
instrucţiunilor;
6. Porturi I/O mapate în memorie;
7. Resetul şi înteruperile;
8. Moduri “Sleep”;
9. Porturile I/O.

Figura 5.3: Organizarea memoriei de date

1. Registrele de lucru de uz general.

Organizarea acestora este prezentată în figura 5.4:


Toate instrucţiunile care operează cu registre au acces direct într-un singur
ciclu la toate aceste registre. Singurele excepţii sunt instrucţiunile care operează cu
un registru şi o constantă. Acestea pot folosi doar registrele din a doua jumătate a
spaţiului registrelor de lucru şi anume R16, ...,R31.
După cum reiese din figura 4 fiecărui registru îi este alocată o adresă din
spaţiul memoriei de date în primele 32 locaţii. Deşi nu sunt implementate fizic ca
locaţii de memorie SRAM, această organizare permite o largă flexibilitate în
accesarea acestor registre. Registrele R26, ... , R31 au şi funcţia de pointeri X, Z şi
Z pentru adresarea indirectă a locaţiilor din spaţiul memoriei de date.
Figura 5.4: Organizarea registrelor de lucru

2. Memoria de program FLASH

Microcontrolerul AT90S8515 are 8K octeţi de memorie de program


programabilă intern. Deoarece toate instrucţiunile sunt pe 16 sau 32 biţi, această
memorie este organizată ca 4K x 16 biţi. Registrul “Program Counter” are 12 biţi,
deci se pot adresa direct 4096 de locaţii. Anduranţa memoriei de program (flash)
este cel puţin 1000 de cicluri scriere/citire.

3. Memoria de date SRAM internă şi externă

Această memorie are o structură ca în figura 5.5.


Primele 608 locaţii ale memoriei de date cuprind registrele de lucru (32),
memoria I/O (64) şi memoria internă SRAM (următoarele 512 locaţii). O memorie
externă opţională poate fi conectată şi ocupă spaţiul de adrese cuprins între adresa
superioară a memoriei SRAM interne şi 64K. Locaţiile din memoria SRAM
externă pot fi accesate de aceleaşi instrucţiuni ca cele din memoria internă, singura
diferenţă fiind că la accesarea unei locaţii de memorie externă există o întârziere de
un ciclu maşină faţă de accesarea unei locaţii de memorie internă. De asemenea,
dacă stiva este situată în spaţiul extern SRAM la întreruperile şi apelurilor
subrutinelor se vor adăuga încă două cicluri maşină, deoarece adresele
instrucţiunilor (2 octeţi) vor fi introduse sau extrase din stivă.
Figura 5.5. Organizarea memoriei SRAM

Accesarea memoriei externe SRAM implică setarea unui bit dintr-un registru
de control al microcontrolerului (bitul SRE din registrul I/O MCUCR) şi folosirea
pinilor RD (citire) şi WR (scriere). Pentru accesarea întregului spaţiu de 64K
SRAM pot fi folosite toate modalităţile de adresare directă şi indirectă.

4. Moduri de adresare a memoriei de program şi de date

Modurile de adresare a memoriei de date sunt:


• Adresare directă
- a unui registru de lucru – adresa registrului este inclusă în codul
instrucţiunii (pe 5 biţi);
- a două registre de lucru – adresele celor două registre sunt incluse
în codul instrucţiunii (pe câte 5 biţi);
- a unei locaţii de memorie I/O – adresa locaţiei I/O (pe 6 biţi)
împreună cu adresa registrului destinaţie (pe 5 biţi) sunt incluse în
codul instrucţiunii;
- a unei locaţii din memoria SRAM – adresa locaţiei SRAM pe 16
biţi reprezintă al doilea cuvânt din cele două cuvinte pe 16 biţi ale
instrucţiunii;
• Adresare indirectă
- a unei locaţii din memoria SRAM prin pointerii X,Y, Z – adresa
locaţiei SRAM pe 16 biţi se află într-unul din pointerii X, Y, Z;
- a unei locaţii din memoria SRAM cu înlocuire prin pointerii Y, Z;
adresa locaţiei SRAM se obţine prin adunarea unui număr de 6 biţi
(aflat în codul instrucţiunii) la unul ditre pointerii Y, Z;
- a unei locaţii din memoria SRAM cu predecrementare (X, Y, Z) –
adresa locaţiei SRAM conţinută în unul dintre pointerii X, Y, Z este
decrementată înainte de efectuarea operaţiei RD/WR asupra locaţiei;
- a unei locaţii din memoria SRAM cu postincrementare (X, Y, Y);
adresa locaţiei SRAM conţinută în unul dintre pointerii X, Y, Z este
incrementată după efectuarea operaţiei RD/WR asupra locaţiei;
- a unei constante din memoria de program folosind instrucţiunea
LPM – adresa constantei se află în pointerul Z pe 15 biţi, iar din LSB
se selectează octetul inferior dacă LSB=0 sau superior dacă LSB=1.

Modurile de adresare a memoriei de program sunt:

• Adresarea indirectă prin instrucţiunile ijmp şi icall – execuţia


programului continuă de la adresa aflată în pointerul Z;
• Adresarea relativă prin instrucţiunile rjmp şi rcall – execuţia
programului continuă de la o adresă obţinută astfel: PC+k+1 unde PC este adresa
curentă de program, k o constantă pe 12 biţi cu semn conţinută în codul
instrucţiunii (-2048<k<2047).

5. Timpii de acces ai memoriei, execuţia în timp a instrucţiunilor

Microcontrolerul este controlat direct de ceasul generat de un cristal extern


fără nici o divizare. În figura 5.6 este ilustrat paralelismul dintre execuţia
instrucţiunilor şi aducerea acestora din memorie (fetch), paralelism relizat pe baza
arhitecturii Harvard şi a tehnicii pipe-line.
Figura 5.6: Tehnica pipe-line cu două nivele

În figura 5.7 este ilustrat modul în care este efectuată o operaţie aritmetică sau
logică folosind două registre şi salvat rezultatul în registrul destinaţie într-un singur
ciclu.

Figura 5.7: Modul de execuţie a unei operaţii aritmetice-logice

6. Porturile I/O mapate în memorie

Porturile I/O şi dispozitivele periferice sunt situate în spaţiul de adrese I/O


0x20-0x5F. Locaţiile din acestă zonă de memorie pot fi accesate de instrucţiunile
in şi out care transferă date între registrele de lucru şi spaţiul I/O. Primele 16
registre pot fi accesate direct de instrucţiunile sbi (set bit) şi cbi (reset bit) care
acţionează la nivel de bit.

7. Reset-ul şi gestionarea întreruperilor

Microcontrolerul AT90S8515 are trei surse posibile pentru iniţializare (reset):

• Power-on Reset – microcontrolerul este resetat când tensiunea de alimentare


este mai mică de un anumit prag;
• Reset extern – microcontrolerul este resetat de un nivel logic zero prezent pe
pinul RESET pe o durată mare de 50ns;
• Watchdog Reset – microcontrolerul este resetat când a expirat perioada
modulului Watchdog Timer dacă acest lucru este validat. În urma unui “reset”
toate locaţiile din spaţiul I/O sunt setate la valorile lor iniţiale şi programul începe
de la adresa 0x000.
AT90S8515 dispune de 12 surse de întrerupere fiecare din acestea având
asociat un vector de întrerupere în memoria de program. De asemenea pentru
fiecare întrerupere există un bit de mascare care trebuie setat împreună cu bitul de
validarea a intreruperilor pentru a valida acea întrerupere. Există intreruperi
externe şi interne (de la toate dispozitivele periferice din structura
microcontrolerului). Întreruperile sunt vectorizate fix, ficare semnal de întrerupere
are o adresă de servire prestabilită.De asemenea, prioritatea întreruperilor este
fixată.
Sistemul de întreruperi este controlat de o serie de registre: General Interrupt
Mask Register – GIMSK, General Interrupt Flag Register – GIFR, Timer/Counter
Interrupt Mask Register – TIMSK şi Timer/Counter Interrupt Flag Register –
TIFR. Când apare o întrerupere bitul Global Interrupt Enable SREG[I] este resetat
(zero) şi toate întreruperile sun mascate. Utilizatorul poate seta acest bit pentru a
valida eventualele întreruperi ce pot apărea în timpul execuţiei rutinei de servire a
întreruperii curente. La execuţia instrucţiunii reti bitul I va fi setat automat.
Latenţa oricărei întreruperi este de minim patru cicluri maşină. În acest timp
adresa PC este salvată în stivă şi SP este decrementat cu doi. La revenirea din
rutina de întrerupere lucrurile se întâmplă exect invers: PC este extras din stivă şi
SP este incrementat cu doi. Registrul SREG nu este introdus în stivă, de aceesa
acest registru trebuie salvat.

8. Moduri “Sleep”

Există două moduri:


• Idle Mode – execuţia instrucţiunii sleep opreşte execuţia programului,
dar dispozitivele periferice (Timere, sistemul de întreruperi, etc) funcţionează.
Acest lucru face ca microcontrolerul să poată fi scos din modul “Idle” de
întreruperi externe şi interne, ca de exemplu trecerea prin 0 a unui timer.
• Power Down Mode – în acest mod oscilatorul extern şi dispozitivele
periferice sunt blocate şi microcontrolerul poate fi scos din acest mod doar de o
întrerupere externă, de un Reset extern sau de Watchdog Reset.
La apariţia evenimentului care repune microcontrolerul în funcţiune, acesta
reia execuţia programului cu rutina de întrerupere sau cu rutina de Reset dacă
microcontrolerul a primit vreun Reset.
În timpul în care microcontrolerul se află în unul dintre cele două moduri,
conţinutul registrelor de lucru, registrelor I/O şi al locaţiilor SRAM rămâne
nemodificat.

9. Porturile I/O

AT90S8515 dipune de 32 pini I/O organizaţi în patru porturi: PortA, PortB,


PortC, PortD. Toate aceste porturi sunt bidirecţionale. Fiecărui port îi sunt asociate
câte trei registre:
• Data Register – PORTx;
• Data Direction Register – DDRx registrul din care se setează direcţia
portului individual pentru fiecare pin ;
• Port x Input Pins – PINx registrul din care se citeşte portul respectiv.

Funcţiile generale I/O ale porturilor sunt multiplexate cu funcţii speciale


asociate dispozitivelor periferice, accesului memoriei externe, întreruperilor, etc.

Microcontrolerului AT90S8515 are o serie de dispozitivele periferice descrise


pe scurt în continuare.
Acestea sunt:

1. Modulele Timer/Conters;
2. Watchdog Timer;
3. Memoria de date EEPROM;
4. Serial Peripheral Interface (SPI);
5. Universal Asynchronus Receiver Transmiter (UART);
6. Analog Comparator;
7. Interfaţa cu memoria externă.

1. Modulele Timer/Conters

AT90S8515 dispune de două numărătoare/timere de uz general, unul de 8 biţi


şi unul de 16 biţi. Fiecăruia i se poate selecta o valoare individuală pentru prescaler
din acelaşi prescaler de 10 biţi. Ambele module pot fi folosite ca timere cu un
clock generat intern sau ca numărătoare cu un clock extern de la un pin I/O. Cele 4
valori pentru prescaler sunt CK/8, CK/64, CK/256 şi CK/1024 unde CK este clock-
ul dat de oscilatorul extern.
Ambele timere pot genera întreruperi ale căror biţi de validare se află în
registrul Timer/Counter Interrupt Mask Register (TIMSK) şi ale căror flaguri de
întrerupere se află in registrul Timer/Counter Interrupt Flag Register (TIFR).

Timer/Counter0 este un numărător pe 8 biţi. Registrul de control al acestuia


este Timer/Counter0 Control Register (TCCR0) din care se setează valoarea
prescalerului, ceasul intern sau extern şi starea pornit-oprit a modulului. La
trecerea din 0xFF în 0x00 flagul overflow este setat şi este generată întreruperea
TMR0_OVR dacă aceasta este validată.
Ceasul extern este sincronizat cu oscilatorul microcontrolerului. Pentru a
asigura o numărare corectă a impulsurilor externe, durata dintre două tranziţii ale
clock-ului extern trebuie să fie mai mare ca perioada oscilatorului
microcontrolerului.
Timer/Counter1 este un numărător pe 16 biţi. Registrele de control ale
acestuia sunt Timer/Counter1 Control Registers (TCCR1A and TCCR1B).
Diferitele flaguri de stare (overflow, captura unui eveniment, etc) se află în
registrul Timer/Counter Interrupt Flag Register (TIFR). De asemenea ceasul
extern trebuie să îndeplinească condiţia ca perioada dintre două tranziţii să fie mai
mare decât perioada oscilatorului microcontrolerului pentru a asigura o funcţionare
corectă a modulului.
Modulul Timer/Counter1 suportă funcţia de comparare folosind registrele
Output Compare Register 1 A şi B (OCR1A şi OCR1B) pe care le compară cu
registrul TCNT1. Funcţiile de comparare includ resetarea numărătorului la
egalitatea cu registrul OCR1A sau alte acţiuni pe pinii de ieşire la egalitatea cu
ambele registre A şi B. Modulul poate fi utilizat şi ca modulator de impulsuri în
durată pe 8, 9 sau 10 biţi. De asemenea funcţia Input Capture poate salva
conţinutul TCNT1 în registrul Input Capture Register (ICR1) la apariţia unui
eveniment extern pe pinul de captură ICP. Setările evenimentului de captură sunt
definite de registrul Timer/Counter1 Control Registers B (TCCR1B). În plus
modulul Analog Comparator poate genera evenimentul de captură.

2. Watchdog Timer

Timerul Watchdog are un clock separat intern la o frecvenţă de 1 MHz,


valoare tipică la o tensiune de alimentare de 5V. Din setarea valorii prescalerului
intrevalul de reset poate fi ajustat la una dintre cele opt valori posibile.
Instrucţiunea wdr resetează numărătorul. Dacă în perioada setată nu se foloseşte
instrucţiunea wdr atunci microcontrolerul va fi resetat. Aceasta este o protecţie
pentru prevenirea blocării programului (într-o buclă infinită ieşire de exemplu).

3. Memoria de date EEPROM

AT90S8515 conţine 512 octeţi de memorie EEPROM care sunt organizaţi ca


un spaţiu separat de date în care se poate scrie sau citi câte un octet. Are o
anduranţă de 100 000 de cicluri scriere/ştergere. Timpul de scriere este în
intervalul 2.5-4ms depinzând de tensiunea de alimentare. Când o locaţie EEPROM
este scrisă, execuţia programului este întreruptă pentru două cicluri maşină înainte
ca instrucţiunea următoare să fie executată. La citirea din EEPROM se întâmplă
acelaşi lucru numai că execuţia este oprită timp de 4 cicluri.
Registrele EEARH and EEARL specifică adresa în spaţiul de 512 locaţii ale
memoriei EEPROM. Registrul EEDR conţine datele care trebuiesc scrise sau citite
din locaţia a cărei adresă este dată de perechea de registre EEAR.
Registrul Control Register – EECR conţine biţii de control ai modulului
EEPROM. Pentru prevenirea scrierilor nedorite în locaţiile din memoria EEPROM
trebuie luate anumite măsuri de protectie (de exemplu resetarea microcontrolerului
pe perioadele în care tensiunea de alimentare scade sub un anumit prag).
4. Serial Peripheral Interface (SPI)

Acest modul permite un transfer de mare viteză între microcontroler şi


dispozitive periferice externe sau între mai multe microcontrolere. SPI are
următoarele caracteristici:

• Transfer sincron de date Full Duplex pe 3 fire;


• Operare mastaer sau slave;
• Transferul poate începe cu LSB sau MSB;
• Patru rate de transfer programabile;
• Generează întrerupere la terminarea transmisiei;
• Protecţie la coliziunea de scriere în registrul de transmisie;
• Poate scoate microcontrolerul din Idle Mode.

Interconexiunea între două dispozitive Master-Slave prin SPI este ilustrată în figura
5.8:

Figura 5.8: Conexiunea master-slave

Pinul PB7 (SCK) este ieşire în modul Master şi intrare în mod Slave. Scrierea
în registrul SPI Data Register al microcontrolerului Master porneşte generatorul de
tact, datele încep să fie transmise pe pinul PB5 (MOSI) şi recepţionate pe acelaşi
pin PB5 al microcontrolerului Slave. Acelaşi lucru se întâmplă şi în sens invers de
la slave către master pe pinii PB6 (MISO). Aceasta înseamnă că pe timpul unei
perioade de Clock sunt interschimbaţi 2 biţi între Master şi Slave. Pentru
comunicarea între mai multe dispozitive este prevăzut un semnal de control Slave
Select PB4 (SS) care trebuie ţinut în zero pentru a accesa un dispozitiv individual.
După transmiterea ultimului bit SPI generează o întrerupere dacă aceasta este
validată.
Registrele asociate cu modulul SPI sunt: SPI Control Register – SPCR şi SPI
Status Register – SPSR.
5. Universal Asynchronus Receiver Transmiter (UART)

Principalele caracteristici ale acestui modul sunt:


• Generatorul pentru stabilirea ratei de transmisie pemite a gamă largă
de viteze de transmisie;
• Se pot transfera 8 sau 9 biţi;
• Protecţii:
- Overrun – umplerea buferului de recepţie;
- Framing error – recepţionarea unui bit de stop 0;
- Start bit fals – eliminarea tranziţiilor false care ar putea să
pornească recepţia unui octet.
• Trei întreruperi asociate, separate TX Complete, TX Data Register
Empty, RX Complete.
Transmisia de date este iniţiată prin scrierea datelor care trebuie transmise în
registrul UART I/O Data Register. Transferul din acest registru în registrul de
transmisie apare când:
1. Un nou octet a fost scris în registrul UDR după ce bitul de stop al
octetului anterior a fost transmis. În această situaţie registrul de transmisie
este încărcat imediat;
2. Un nou octet a fost scris în registrul UDR înainte de transmiterea bitului
de stop al octetului anterior. Registrul de transmisie este încărcat după ce
a fost transmis bitul de stop al octetului curent transmis.
Dacă registrul de transmisie este gol, datele sunt transferate din UDR. În
acelaşi moment flagul UDRE (UART Data Register Empty) este setat şi modulul
UART este gata să primească următorul octet. În timp de un ciclu de tact se
transmite bitul de start urmat apoi de LSB. Când s-a transmis ultimul bit, bitul de
stop registrul de transmisie se va încărca cu date dacă acestea au fost scrise în
prealabil în registrul UDR în timpul transmisei. Dacă până la transmitera bitului de
stop registrul UDR nu a fost scris, flagul TX Complete (TXC) va fi setat. Bitul
TXEN validează modulul de transmisie când este setat (unu) şi pinul PD1 va fi
configurat automat ca ieşire, indiferent de valoarea setată în registrul DDRD (Data
Direction Register D). Când bitul TXEN este resetat (zero) pinul PD1 poate fi
folosit ca un pin general I/O.
Recepţia semnalului de la pinul RXD se face cu detecţie majoritară la o rată
de 16 ori mai mare decât viteza de recepţie. În timp ce linia este în repaus (1)
detecţia unui nivel logic 0 va fi interpretată ca front negativ al bitului de start şi
secvenţa de detecţie a acestui bit va fi iniţiată. După această tranziţie negativă se
sondeaza nivelul semnalului de intrare la eşantioanele 8,9,10. Dacă două sau mai
multe dintre aceste eşantioane vor fi detectate ca 1, bitul de start nu va fi considerat
valid (va fi considerat o tranziţie falsă) şi receptorul va căuta o nouă traziţie
negativă pentru a detecta un bit de start real. Dacă se detectează o tranziţie validă
se va face detecţia majoritară pentru fiecare bit recepţionat. Aceasta înseamnă că
valoarea găsită la două sau mai multe dintre eşantioanele 8, 9 sau 10 va fi luată ca
valoarea detectată pentru bitul respectiv. Toţi biţii astfel detectaţi vor fi introduşi în
registrul de recepţie.
Analog, la detectarea bitului de stop majoritatea eşantioanelor trebuie să fie 1
pentru ca acest bit să fie validat. Dacă nu se întâmplă acest lucru va fi o eroare
semnalată prin setarea flagului Framing Error (FE) din registrul UART Status
Register (USR). Înainte de citirea registrului UDR trebuie verificat bitul FE pentru
detecţia erorilor.
Indiferent dacă s-a detectat un bit de stop valid sau nu, la sfârşitul recepţiei
unui octet datele sunt transferate în UDR şi bitul RX Complete (RXC) din registrul
USR va fi setat. UDR reprezintă de fapt două registre, unul pentru recepţie şi unul
pentru transmisie. Când UDR este citit atunci este accesat registrul de recepţie, iar
când se scrie în UDR este accesat registrul de transmisie.
Dacă la terminarea recepţiei unui octet, registrul UDR nu a fost în prealabil
citit flagul OverRun (OR) este setat, semnalizând că ultimul octet recepţionat nu a
putut fi transferat în UDR şi a fost pierdut. Bitul OR este reactualizat după citirea
din registrul UDR şi trebuie verificat pentru a detecta erorile ce pot apărea la
necitirea la timp a registrului UDR în cazurile în care volumul de prelucrări ale
microcontrolerului este mare sau când viteza de recepţie a datelor este mare.
Când bitul RXEN (RX Enable) din registrul UCR este resetat (0) modulul de
recepţie este invalidat. Aceasta înseamnă ca pinul PD0 poate fi folosit ca un pin
general I/O. Când RXEN este setat (1) pinul PD0 va fi configurat automat ca
intrare, indiferent de valoarea setată în registrul DDRD (Data Direction Register
D). Când bitul CHR9 din registrul UCR este setat se foloseşte un format de 9 biţi
plus un bit de start şi unul de stop. Cel de-al nouălea bit ce trebuie transmis trebuie
setat la valoarea dorită înainte de iniţierea transmisiei prin scrierea în registrul
UDR. Al nouălea bit recepţionat se află în bitul RXB8 din registrul UCR.
Registrele asociate modulului UART sunt UART I/O Data Register – UDR şi
UART Control Register – UCR.
Generatorul de tact pentru stabilirea vitezei de transfer este un divizor de
frecvenţă care generează un semnal de tact cu frecvenţa dedusă din următoarea
formulă:

Baud=fCK/16(UBRR+1)
unde:
• Baud – este viteza de transfer;
• fCK – este frecvenţa oscilatorului microcontrolerului;
• UBRR – este conţinutul registrului UART Baud Rate Register

Se poate obţine o gamă largă de viteze de transfer plecând de la o frecvenţă


dată fCK.
6. Comparatorul Analogic (Analog Comparator)- AC

Modulul AC compară nivelele de tensiune de pe intrarea pozitivă PB2 (AIN0)


şi intrarea negativă pinul PB3 (AIN1). Când nivelul tensiunii de la AIN0 este mai
mare decât AIN1 bitul Analog Comparator Output (ACO) este setat (1). ACO
poate să declanşeze funcţia Timer/Counter1 Input Capture. În plus comparatorul
poate declanşa o întrerupere separată, asociată exclusiv cu acest modul. Registrul
de control al modulului comparator este Timer/Counter1 Input Capture.

7. Interfaţa cu memoria externă

Interfaţa cu memoria SRAM constă în:

• Port A – reprezintă bus-ul de date multiplexat cu bus-ul de adrese de


nivel inferior;
• Port C – reprezintă bus-ul de adrese de nivel superior;
• Pinul ALE – Address Latch Enable;
• Pinul RD/WR – reprezintă strobe RD/WR.

Memoria externă este validată prin setarea bitului SRE din registrul MCUCR
(MCU Control Register), acest lucru implicând suprascrierea setărilor din registru
de direcţie DDRA. Când bitul SRE este resetat (0) memoria externă nu este
folosită, Portul A este folosit în concordanţă cu setările din registrul DDRA şi
spaţiul de adrese peste spaţiul alocat memoriei interne SRAM nu poate fi folosit.
Pe frontul negativ al pinului ALE pe Portul A este disponibilă o adresă validă.
În timpul transferului de date ALE este 0. RD şi WR sunt active doar când se
accesează memoria SRAM externă. În figura 5.9 se arată cum se poate conecta o
memorie SRAM externă la microcontroler folosind 8 latch-uri care sunt
transparente când G este în 1. În mod normal accesul SRAM extern se face într-o
schemă de trei cicluri după cum se poate vedea în figura 5.10. Când este nevoie de
un ciclu în plus pentru acces se setează bitul SRW din registrul MCUCR. Noua
schemă este prezentată în figura 5.11.
Figura 5.9: Conectarea unei memorii externe SRAM

Figura 5.10: Accesarea memoriei externe SRAM fără ciclu de aşteptare

Figura 5.11: Accesarea memoriei externe SRAM cu ciclu de aşteptare


5.2 Familia de procesoare DSP - ADSP 218x
Familia de procesoare de semnal ADSP 218x este o familie de procesoare
optimizată pentru prelucrarea semnalelor şi alte aplicaţii de viteză mare ce necesită
calcule numerice.
Arhitectura utilizată este o arhitectura Harvard modificată care conţine
următoarele blocuri: ALU, MAC, SHIFTER. Se prelucreaza date pe 16 biţi; există
2 generatoare de adrese pentru date şi un secvenţor de program care permite
executarea operaţiilor de calcul cu maximum de eficientă.
Se adaugă o serie de extensii:

- memorie de program şi de date internă (on-chip)


- 2 porturi seriale
- 1 circuit de timp programabil (timer)
- posibilităţi extinse de lucru cu întreruperi

Memoria internă are capacitatea de 1kx16 pentru date şi 2kx24 pentru


program. Se pot încarca doi operanzi simultan, din memoria de date şi din memoria
de program, într-un singur ciclu maşină. Memoria de date şi memoria de program
se pot extinde, în exterior, până la 16kx16 şi respectiv până la 16kx24. Arhitectura
microcalculatorului ADSP 218x este prezentată în figura 5.12.
Microcalculatorul ADSP 218x permite cedarea magistralelor prin semnale
specifice şi poate utiliza pînă la 6 nivele de întrerupere.

Figura 5.12. Arhitectura microcalculatorului ADSP218x

Procesorul ADSP 218x poate să realizeze într-un singur ciclu:


2 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

- generarea adresei instrucţiunii următoare


- încărcarea instrucţiunii următoare
- 1 sau 2 transferuri de date
- actualizarea a 1 sau 2 pointeri de adresă
- efectuarea oricărei operaţii de calcul
- recepţia şi transmiterea unui bit pe porturile seriale

Setul de instrucţiuni este puternic; permite transferuri flexibile de date şi


instrucţiuni multifuncţie (transferuri de 1 sau 2 date urmate de o operaţie de
calcul). Orice instrucţiune se execută într-un singur ciclu maşină (tipic de 30 ns).
Sintaxa limbajului de asamblare este algebrică.
Procesorul ADSP 218x are 5 busuri interne:

- PMA (Program Memory Address) - busul adreselor pentru memoria de


program
- DMA (Data Memory Address) - busul adreselor pentru memoria de date
- PMD (Program Memory Data) - busul de date pentru memoria de pro-
gram
- DMD (Data Memory Data) - busul de date pentru memoria de date
- R (Result) - bus de rezultate

Pe busul R se interconectează unităţile de calcul. Aceste unităţi sunt


prezentate în continuare pe scurt: unitatea ALU - poate efectua setul standard de
operaţii aritmetice şi logice; în plus are şi 2 primitive de împărţire; unitatea MAC -
permite efectuarea operaţiilor de înmulţire, înmultire cu acumulare, înmultire cu
scădere, fiecare într-un singur ciclu; unitatea SHIFTER - permite efectuarea
deplasărilor logice şi aritmetice precum şi a operaţiilor de normalizare şi
denormalizare a blocurilor de date.
Ieşirea oricărei unităţi de calcul poate fi intrare în oricare unităte de calcul
la următorul ciclu masină. Toate cele 3 unităţi de calcul au registre de intrare şi
registre de ieşire care pot fi citite sau scrise de pe busul DMD.
Între memorie şi unitătea de calcul există registre atît la intrare cît şi la
ieşire (există un nivel pipe-line între intrare şi iesire, la nivelul unităţilor de calcul).
Busul R permite rezultatelor unei operatii anterioare să fie utilizate direct
ca intrare pentru operatia următoare. Acest lucru evită intirzierile excesive datorate
"pipe-line-lui" existent, cînd se execută o serie de operaţii diferite.
Cele 2 generatoare de adrese (DAG1 şi DAG2) determină adresa datelor
pentru memoria de date (DAG1) cît şi pentru memoria de date şi de program
(DAG2). Se pot genera adrese cu modificarea ulterioară a pointerului de adresă.
Fiecare unitate de adresare poate genera 4 adrese indirecte prin registru. Unităţile
de adresare a datelor pot funcţiona simultan - deci se pot adresa 2 operanzi
simultan.
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 3
PROIECTAREA APLICAŢIILOR

Se pot implementa buffere de memorie circulare (utile în realizarea


filtrelor digitale FIR). Există modul de generare a adreselor cu inversarea bitilor
("bit reverse") util pentru calculul FFT.
Secvenţorul de program generează adresa instrucţiunii din memoria de
program. Există un registru de instrucţiuni în care se memorează codul instrucţiunii
curente. Acest registru introduce un nivel de "pipe- line". Instructiunea este citită
din memoria de program şi încărcată în registrul de instrucţiuni (IR) într-un singur
ciclu; instrucţiunea va fi executată în ciclul următor atunci cînd o nouă instrucţiune
(următoarea) este încărcată în IR.
Secventorul permite salturi condiţionate, apeluri de subrutine şi reintorcere
din acest apel într-un singur ciclu. Datorită faptului că există stive hardware în
componenţa secvenţorului, se pot execută bucle DO UNTIL fără cicluri
suplimentare (zero overhead). Salturile condiţionate se execută de asemenea fără
cicluri suplimentare.
Secvenţorul de program contine şi un controler de întreruperi asociat.
Circuitul de timp programabil contine un registru de prescalare pe 8 biţi
,un registru numarator pe 16 biţi şi un registru pentru constantă de numarare pe 16
biţi. La trecerea prin zero a registrului numarator se genereaza o întrerupere.
Cele doua porturi seriale (SPORT0 şi SPORT1) permit realizarea unei
comunicatii seriale sincrone; protocolul de comunicatie este flexibil, programabil .
Pentru a se interschimba informaţii între memoria de program internă şi
memoria de date internă există blocul "bus exchange".
Busurile PMA şi DMA sunt multiplexate pentru a rezultă magistrala de
adrese externă (pentru memoria externă de program sau de date)
Busurile DMA şi DMD sunt multiplexate pentru a rezultă magistrala de
date externă.
Separarea memoriei externe în memorie de program şi memorie de date se
efectueaza prin semnale de selectie separate; totodată există şi semnale specifice
pentru citirea şi scrierea memoriei externe. Sunt prevazute de asemenea şi semnale
pentru acceptarea şi confirmarea cedarii magistralelor externe altor dispozitive.
În continuare sunt prezentate semnalele microcalculatorului ADSP 218x:

A0 - A13 -bus de adrese extern (pentru date, program şi "boot")


D0 - D23 -bus de date extern (pentru date, program şi "boot")
RESET/ - semnal de iniţializare
IRQ2 - întrerupere externă (#2)
BR/ - cerere de bus
BG/ - confirmarea cererii de magistrală
PMS/ - selecţie memorie de program
DMS/ - selecţie memorie de date
BMS/ - selecţie memorie "boot"
RD/ - citire
WR/ - scriere
4 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

MMAP - configurare memorie de program


CLIKIN, XTAL - pentru conectarea ceasului
CLKOUT - ieşire de ceas
SPORT0 (TFS0, RFS0, DT0, DR0, SCLK0) -semnale asociate portului
serial #0 (sincronizare la transmisie, sincronizare la recepţie, transmisie de date,
receptie de date, ceas serial)
SPORT1 (TFS1, RFS1, DT1, DR1, SCLK1) -semnale asociate portului
serial #1 (sincronizare la transmisie, sincronizare la receptie, transmisie de date,
receptie de date, ceas serial) sau (IRQ1/, IRQ0/, SCLK1,FO,FI) - cerere de
întrerupere #1, cerere de întrerupere #0, ceas programabil, "flag out","flag în"- în
funcţie de configurarea procesorului.

Aritmetica utilizată de ADSP 218x

Microcalculatorul ADSP 218x lucreaza în virgula fixă pe 16 biţi.


Interpretarea datelor este următoarea:
- şiruri de biţi (pentru operatii logice NOT, AND, OR, XOR - nu se in-
terpreteaza şirul binar ca număr)
- numere întregi fără semn
- numere întregi cu semn (în complement de 2)
- numere fracţionare (în format 1.15 în complement de 2)

Aritmetica ALU

Cu exceptia primitivei de împărţire cu semn (DIVS) ALU interpretează


operanzii şi rezultatele ca şiruri binare de 16 biţi. Rezultatul poate fi interpretat ca
număr cu semn prin intermediul indicatorilor condiţionali (flag-uri). Detectarea
depăşirii aritmetice se face conform aritmeticii în complement de 2 (dacă bitul
MSB al rezultatului se modifică în mod incorect). De exemplu adunarea a două
numere pozitive trebuie să genereze un rezultat pozitiv în caz contrar a apărut o
depăşire aritmetică ce a alterat bitul de semn (MSB) al rezultatului. Logica de
pozitionare a flag-ului de transport (AC) lucrează pentru numere întregi fără semn;
acest bit este setat dacă se generează transport pentru bitul 16 (MSB) şi este util
pentru operatii multicuvînt ("multiword" ) pe 32 biţi, în precizie dublă.

Aritmetica MAC

Multiplicatorul produce rezultate ca şiruri de biţi.Intrările pe 16 biţi sunt


interpretate în conformitate cu informaţia conţinută în instrucţiune (ambii operanzi
cu semn, unul cu semn şi celălalt fără semn). Rezultatul pe 32 biţi este considerat
cu semn, iar bitul de semn (MSB) este extins pina la 40 biţi. Există 2 formate
posibile pentru inmultitor: 1.15 (pentru numere cu semn) şi 16.0 (pentru numere
întregi).
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 5
PROIECTAREA APLICAŢIILOR

Înmulţirea a doi operanzi în format 1.15 conduce la generarea unui rezultat


în format 2.30; pentru a corecta acest lucru rezultatul înmulţirii trebuie deplasat cu
1 pozitie la stînga; rezultatul deplasarii este în format 1.31 şi poate fi rotunjit în
formatul 1.15. Pentru numere întregi rezultatul înmulţirii este în format 32.0 care
se poate rotunji în formatul 16.0 fără a fi necesara o deplasare prealabilă.

Aritmetica SHIFTER

Deplasările logice interpretează operanzii ca numere întregi fără semn sau


ca şiruri binare, iar deplasarea aritmetică interpretează rezultatul ca un numar cu
semn în complement de 2. Exponentul pentru numerele în virgula mobilă se
reprezintă în complement de 2. Se poate lucra cu blocuri de date în virgula mobilă
care sunt interpretate în complement de 2.

5.2.1.Unitatea ALU

Este prezentată în figura 5.13.


Este o unitate pe 16 biţi cu două porturi de intrare X şi Y şi un port de
iesire R. Unitatea ALU permite efectuarea unui set complet de funcţii aritmetice şi
logice: adunare, scădere, negare, incrementare, decrementare, valoare absolută,
AND, OR, XOR, NOT. Există şi două primitive de împărţire.
Unitatea ALU acceptă un semnal de "carry-în" (CY) şi generează 6
semnale de stare (flaguri): AZ(zero), AN(negativ), AC(transport), AV(depăşire
aritmetică), AS(semn intrare X) şi AQ(cît); aceste flaguri sunt pozitionate la
sfirşitul fiecărui ciclu maşină.
6 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Figura 5.13 Unitatea ALU - ADSP218x

Intrarea X a ALU poate acceptă date din două surse: registrul AX sau
busul de rezultate R. Conectarea directă pe busul R permite utilizarea operanzilor
de tip imediat (acest lucru este specific pentru toate unitătile de calcul ale ADSP
2101). Registrul AX este dedicat pentru intrarea X şi are în compunere 2 registre
de 16 biţi AX0 şi AX1 care se pot citi/scrie de pe magistrala DMD; cu ajutorul
blocului de interschimbare DMD-PMD aceste registre sunt accesibile şi de pe
magistrala PMD. Un registru AX poate fi intrare în ALU în acelaşi timp în care
celălalt registru este citit/scris de pe magistrala DMD.
Intrarea Y a unităţii ALU poate de asemenea să accepte date din 2 surse:
“registrul” AY şi registrul de reacţie AF. “Registrul” AY este dedicat pentru
intrarea Y şi conţine 2 registre: AY0 şi AY1; aceste două registre se pot citi/scrie
de pe magistrala DMD şi se pot scrie direct de pe magistrala PMD; ele se pot citi
de pe magistrala PMD prin intermediul blocului de interschimb între PMD şi
DMD. În mod similar unul dintre registrele AY poate fi intrare în ALU în timp ce
celălalt registru este citit/scris de pe magistrala DMD.
Iesirea ALU este încărcată în registrul AF sau în registrul de rezultat AR;
ieşirea încărcată în AF poate fi utilizată ca intrare în ALU. Registrul AR poate fi
încărcat şi în mod direct de pe magistrala DMD; prin blocul de interschimbare
DMD-PMD registrul AR poate fi citit/scris de pe magistrala PMD.
Orice registru asociat unităţii ALU poate fi citit sau scris intr-un singur
ciclu maşină; citirea se efectuează la începutul ciclului iar scrierea la sfirşitul
acestuia. Acest lucru permite ca un operand al ALU să fie citit la începutul unui
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 7
PROIECTAREA APLICAŢIILOR

ciclu şi actualizat la sfârsitul acestuia. De asemenea se permite ca rezultatul să fie


încărcat în memorie la inceputul unui ciclu şi actualizat cu un nou rezultat la
sfirsitul ciclului(acelasi ciclu maşină).
Unitatea ALU conţine un set de registre duplicat (AX,AY,AF,AR); un
singur set este accesibil la un moment de timp dat. Setul secundar de registre este
util pentru schimbarea rapida a contextului programului de exemplu în cazul
întreruperilor. Selectarea unuia dintre seturi se face prin program.

Primitivele de împărţire

Există 2 primitive pentru realizarea împărţirii. Împărţirea poate fi cu semn


sau fără semn dar împărtitorul şi deîmpărtitul trebuie să fie de acelasi tip (cu semn
sau fără semn). Se imparte un numar de 32 biţi la un numar de 16 biţi şi rezultă un
cît pe 16 biţi. Primitiva DIVS este executată la inceputul împărţirii cu semn; se
calculează semnul cîtului (memorat în flagul AQ). Pentru împărtirea numerelor
fără semn DIVS nu este utilizată.Cea de a doua primitiva - DIVQ, calculează biţii
cîtului; această primitivă este apelată de 15 ori pentru împărţirea cu semn şi de 16
ori pentru împărţirea fără semn.
Starea unităţii ALU este memorată într-un registru de stare (ASTAT) cu
următorii biţi:

AZ - zero - 1 dacă ieşirea ALU este 0


AN - negativ - 1 dacă ieşirea ALU este < 0
AV - depaşire aritmetică - 1 dacă a apărut depăşire aritmetică
AC - transport - 1 dacă a apărut transport din bitul de rang 16
AS - semn - indică bitul de semn al intrarii X a unităţii ALU
AQ - cît - indică bitul curent al restului împărţirii

5.2.2. Unitatea MAC

Unitatea de înmulţire - acumulare (MAC) poate efectua inmultiri rapide şi


inmultiri cu acumulare (adunare sau scadere).Rezultatul poate fi rotunjit sau
saturat.Schema bloc a acestei unităti este prezentată în figura 5.14.
8 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Figura 5.14.Unitatea MAC - ADSP218x

Unitatea MAC permite efectuarea operatiilor de înmulţire rapidă, a


operaţiilor de înmulţire cu acumulare/scădere, saturare şi ştergere (aducere la zero).
O buclă de reacţie permite utilizarea unei părti a rezultatului ca intrare în
MAC.
Unitatea MAC are doua porturi de intrare X şi Y de cîte 16 biţi şi un port
de ieşire P de 32 biţi.Produsul pe 32 de biţi este o intrare într-un sumator de 40 biţi
care adună rezultatul anterior cu cel curent. Registrul MR are 40 biţi şi este compus
din 3 registre: MR0 (16 biţi) cel mai putin semnificativ, MR1(16 biţi) registrul mai
semnificativ şi MR2 (8 biţi) registrul de extensie de semn.Sumatorul este de 40 de
biţi pentru a permite depasirile aritmetice imediate ce apar într-o sumă de produse.
Există un bit de stare (flag) - MV - care indică dacă acumulatorul a fost afectat de
depăşire aritmetică (în complement de 2) peste 32 biţi (cînd suma de produse s-a
incheiat).
Registrele de intrare - iesire ale unitătii MAC sunt similare cu registrele
ALU.Portul X acceptă date de la registrul MX sau de pe bus-ul R (de rezultat). Se
permite în acest mod încărcarea unor operanzi de tip imediat.Există 2 registre MX:
MX0 şi MX1 care pot fi citite sau scrise de pe magistrala DMD. Este permis ca în
timp ce unul din registrele MX este intrare pentru MAC celălalt să fie citit/scris de
pe DMD. Portul Y acceptă date de la registrul MY sau registrul MF. Registrul MY
are registrele MY0 şi MY1; aceste registre pot să fie citite şi scrise de pe
magistrala DMD şi scrise direct de pe magistrala PMD; citirea pe PMD se poate
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 9
PROIECTAREA APLICAŢIILOR

face prin blocul de interschimb PMD - DMD. Este permis ca în timp ce unul din
registrele MY este intrare pentru MAC celălalt să fie citit/scris de pe DMD.
Ieşirea sumatorului este încărcată în registrul MF sau în registrul MR.
Registrul MF permite ca bitii 16-31 ai rezultatului să fie utilizati direct la intrarea
înmultitorului la ciclul următor. Registrele MR0, MR1, MR2 pot fi încărcate de pe
magistrala DMD şi pot să fie citite de pe DMD sau bus-ul R.
Orice registru asociat unităţii MAC poate fi citit şi scris în acelasi ciclu:
citirea se face la începutul ciclului iar scrierea la sfârsitul acestuia.Se permite ca o
intrare în MAC (un operand) să fie încărcată la începutul ciclului (operaţiei) şi să
fie actualizată la sfirsitul ciclului (de exemplu din memorie).
De asemenea se permite ca un rezultat să fie încărcat în memorie şi
actualizat cu un nou rezultat în acelaşi ciclu.
Unitatea MAC conţine un set duplicat de registre (MX, MY, MR, MF); un
singur set este disponibil la un moment dat. Acest set este utilizat pentru
schimbarea rapidă a contextului programului (în cazul întreruperilor). Setul de
registre este selectat prin program.

Operatiile MAC

Operaţiile efectuate de MAC sunt: MR=X*Y, MR=MR+X*Y,


MR=MR-X*Y, MR=0. Sunt permise 2 moduri pentru funcţiile de înmulţire şi
înmulţire-acumulare: modul pentru numere fracţionare (în format 1.15) şi modul
pentru numere întregi (în format 16.0). Modul este selectat printr-un bit dintr-un
registru de stare al MAC (MSTAT); la iniţializare este activ modul pentru numere
fractionare.
În ambele moduri de lucru ieşirea înmulţitorului este încărcată într-un
acumulator de 40 biţi (sumator - scăzător) pentru a implementa funcţia MR+/-
X*Y.
În modul de lucru fractionar ieşirea pe 32 de biţi a multiplicatorului este
ajustată în cazul operatiei de multiplicare - acumulare prin extinderea bitului de
semn pâna la 40 de biţi şi deplasarea cu 1 bit la stânga înainte de încărcarea
rezultatului în registrul MR. Acest lucru se realizează deoarece o înmulţire în
format 1.15 cu 1.15 trebuie să genereze un rezultat în format 1.31 care poate fi
rotunjit la formatul 1.15. Bitul LSB este poziţionat în 0.

Formate de intrare pentru operanzi

Operanzii pot fi cu semn sau fără semn fiecare; se pot inmulti operanzi de
tipuri diferite (semn-fără semn).Tipul operandului este specificat dinamic pentru
fiecare operaţie de înmulţire în parte.

Registrele de intrare - iesire ale MAC


10 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Sunt următoarele:
registre X : MX0,MX1,AR,MR0,MR1,MR2,SR0,SR1;
registre Y : MY0,MY1,MF;
registre destinaţie: MR (MR2,MR1,MR0),MF;

Protecţia la depăşire a MAC

Acumulatorul din MAC generează un semnal de stare, MV, dacă a apărut o


depăşire aritmetică (flag-ul MV este încărcat într-un registru de stare general la
fiecare operatie cu MAC).
Acest flag este setat de fiecare dată cînd apare o depăşire aritmetică pe 32
de biţi (MR1, MR0) adică dacă bitul de semn (MSB al registrului MR1) nu se
regăseşte în conţinutul registrului MR2.
Registrul MR poate fi saturat dacă apare depăşire aritmetică.
Flagul MV este actualizat după o sumă de produse astfel ca depăşirile
aritmetice care pot apare la sume partiale se pot compensa (şi nu sunt luate în
considerare).Depăşirea care poate să apară în registrul MR2 (peste bitul MSB al
registrului MR2) nu este permisă; dacă apare acest fenomen se pierde bitul de
semn şi saturarea se face incorect; acest caz apare după 255 de depăşiri parţiale
necompensate. Pentru a evita această situaţie trebuie să se efectueze, pentru
sigurantă, un număr de maxim 256 de sume de produse, ceea ce este în majoritatea
cazurilor suficient.
Acumulatorul din unitatea MAC are posibilitatea de a fi rotunjit pe 40 de
biţi la graniţa dintre biţii de rang 15 şi 16 dacă se specifica acest lucru în formatul
instrucţiunii.

5.2.3. Unitatea SHIFTER

Acest bloc funcţional permite efectuarea unui set complet de funcţii de


deplasare pe 16 biţi de intrare , generând o ieşire pe 32 biţi; acest set include
deplasări aritmetice, deplasări logice şi normalizari. De asemenea unitatea de
deplasare poate fi utilizată pentru calcule în virgulă mobilă.
Schema bloc a unitătii de deplasare este dată în figura 5.15.:
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 11
PROIECTAREA APLICAŢIILOR

Figura 5.15. Unitatea SHIFTER - ADSP218x

Unitatea de deplasare poate fi împarţită în 4 sectiuni: matricea de deplasare


(shift array), logica OR/PASS , detectorul de exponent şi logica de comparare a
exponentului.
Matricea de deplasare este constituită dintr-un "barrel-shifter" cu 16
intrări şi 32 ieşiri. Acest circuit permite realizarea unei deplasări pe 16 biţi într-un
singur ciclu. Intrarea în acest circuit de deplasare este dată de un registru de intrare
SI (16 biţi); acest registru este intrare şi pentru detectorul de exponent şi poate fi
citit/scris de pe DMD. De asemenea ca intrări în circuitul de deplasare pot fi regis-
trele AR, SR sau MR prin busul R. Registrul SR este de 32 biţi şi este divizat în 2
sectiuni de câte 16 biţi: SR0 şi SR1.Registrele SR0 şi SR1 pot fi încărcate de pe
busul DMD şi pot fi citite de pe DMD sau busul R.De asemenea registrul SR poate
fi încărcat prin logica OR/PASS permitînd deplasări în dublă precizie (32 de biţi).
Registrul SE este de 8 biţi şi memorează exponentul în timpul operatiilor
de normalizare şi denormalizare, reprezintă o valoare în complement de 2 şi poate
fi citit/scris de pe busul DMD.
Registrul SB reţine exponentul unui bloc de date (cel mai mare exponent
care va fi utilizat pentru normalizare); este un registru de 5 biţi, în complement de
2; poate fi citit/scris de pe DMD.
Citirea registrelor SB sau SE se face pe DMD, în format pe 16 biţi cu
extensia semnului.Toate registrele din unitatea de deplasare pot fi citite/scrise într-
un singur ciclu (citire la inceputul ciclului şi scriere la sfirsitul acestuia). Se
12 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

permite ca un operand să fie încărcat în unitatea de deplasare la inceputul ciclului


şi să fie actualizat la sfirsitul acestuia.
Unitatea de deplasare conţine un set duplicat de registre (SE, SB, SI, SR1,
SR0); un singur set este accesibil la un moment dat; sunt utilizate la schimbarea
rapidă a contextului programului (în cazul întreruperilor); selectarea unui set se
face prin program.
Operaţiile posibile ale unităţii de deplasare sunt:
- ASHIFT -deplasare aritmetică
- LSHIFT -deplasare logică
- NORM - normalizare
- EXP - calculul exponentului unui numar în virgula mobilă
- EXPADJ - ajustarea exponentului unui bloc de date în virgulă mobilă.

Funcţiile de deplasare pot fi efectuate în modurile HI sau LO astfel:


În modul LO intrarea în unitatea de deplasare (registrul SI) este aliniată
după partea mai puţin semnificativă a ieşirii (registrul SR0); în modul HI intrarea
este aliniată după partea cea mai semnificativa a ieşirii (registrul SR1).
Blocul OR este utilizat pentru deplasări în dubla precizie (pe 32 de biţi de
intrare).

5.2.4.Unitătile de adresare (Data Address Generator – DAG)

ADSP 218x conţine două generatoare de adrese pentru date, permiţând


adresarea simultană a doi operanzi (unul în PM şi celălalt în DM). De asemenea,
datele pot fi adresate indirect, cu modificarea dinamică a adresei.
Există trei tipuri de registre (pe 14 biţi):
- registrul modificator - M (modificator)
- registrul index - I (index)
- registrul de lungime - L (lungime)

Aceste registre pot fi scrise/citite pe magistrala DMD.


Registrul index memorează adresa de bază a unui bloc de date, calculată
astfel:
A = ( I + M - B ) modulo ( L ) + B
unde: A = adresa următoare (calculată);
I = adresa curentă;
M = valoarea modificatorului (cu semn)
B = adresa de bază (indicată de linker)
M + I = adresa post-modificată;
L = lungimea buffer-ului circular (-L < M < L este o condiţie
obligatorie).
Daca valoarea lui L este 0 atunci adresarea este liniară iar dacă această
valoare este nenulă atunci adresarea se numeste circulară.
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 13
PROIECTAREA APLICAŢIILOR

5.2.5.Unitatea de comanda (secvenţorul de program)

Generează adresa instrucţiunii curente şi permite crearea unor programe


flexibile; permite de asemenea implementarea buclelor hardware, fără cicluri
suplimentare şi a salturilor condiţionate.
Adresa instrucţiunii următoare poate fi selectată din următoarele surse:
registrul de instrucţiuni (program "secvenţorul", liniar), logica de conditie (pentru
salturi condiţionate), comparatorul de bucla (pentru bucle hardware de tip DO
UNTIL) şi contolerul de întreruperi (la acceptarea unei întreruperi).
O a cincea sursă o reprezintă DAG2 atunci cînd se execută un salt indirect
prin registru.
Pentru programe secvenţiale sursa adresei următoare este modulul de
incrementare al PC; stiva PC este utilizată ca sursă a adresei instrucţiunii următoare
atunci cînd se execută o reîntoarcere dintr-o subrutină sau din servirea unei cereri
de întrerupere. De asemenea este utilizată şi atunci cînd se revine la începutul unei
bucle DO UNTIL.
Registrul de instrucţiuni este utilizat ca sursă atunci cînd se execută un salt
direct (adresa conţinută în instrucţiune).
Întreruperile sunt vectorizate fix; la acceptarea unei întreruperi controlerul
de întrerupere va genera o adresă de salt fixă (prestabilită).
Fiecare întrerupere are alocată o zona de 4 locatii de memorie (PM);
rutinele de servire a întreruperilor cu lungime mai mare decît 4 locatii vor fi plasate
în altă zona de memorie (PM) şi se va execută, la fiecare întrerupere, o instrucţiune
de salt catre rutina corespunzatoare. Instructiunea de salt este plasată în spatiul
rezervat vectorului de întrerupere cu rutina de servire mai mare de 4 locatii.
Unitatea de adresare DAG2 devine sursa pentru adresa instrucţiunii
următoare atunci cînd se execută un salt indirect prin registru, dar în acest caz
DAG2 nu este o intrare în multiplexorul adresei instrucţiunii următoare şi PC este
încărcat de pe bus-ul PMA.
Contorul de program (PC) este un registru de 14 biţi şi conţine adresa
instrucţiunii curente. Iesirea PC este incrementată de modulul de incrementare
(dacă este cazul) pentru a se calcula adresa instrucţiunii următoare.
Stiva PC este utilizată pentru salvarea conţinutului registrului PC în cazul
instructiunilor CALL sau DO UNTIL sau a întreruperilor.
Există un contor de buclă şi o stivă asociată acestuia; acest contor este util
pentru implementarea buclelor DO UNTIL: efectuarea unei secvenţe de
instrucţiuni de un anumit numar de ori, conţinut în acest contor - CNTR; stiva
asociată este utilizată pentru a permite lucrul cu bucle de acest tip înlanţuite (se
salveaza CNTR).
De exemplu:
CNTR = N
--- DO adr UNTIL CE ; CE = expirare CNTR
| CNTR = N1 ; se salveaza N în stiva CNTR
14 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

| --- DO adr1 UNTIL CE


| | .....
| | .....
| --> adr1: .....
--> adr: .....
Salvarea CNTR în stivă se face automat.
Comparatorul de buclă şi stiva asociată sunt utilizate pentru implementarea
buclelor DO UNTIL.
Comparatorul de buclă compara în mod continuu adresa ultimei
instrucţiuni a buclei (codată în instructiunea DO UNTIL) cu adresa curentă pentru
a testa sfârsitul buclei; adresa primei instrucţiuni a buclei este menţinută în stiva
PC.
Cînd ultima instrucţiune a buclei este executată, se testează condiţia de
reluare a buclei şi dacă aceasta e indeplinită se face un salt la prima instrucţiune a
buclei fără a se introduce cicluri suplimentare.
Stiva asociată logicii de buclă stochează adresele de sfîrşit şi condiţiile de
terminare pentru buclele înlănţuite (se admit pîna la 4 nivele de bucle înlănţuite).
Condiţiile de terminare a buclelor pot fi următoarele: EQ (rezultat egal cu
0), NE (diferit de zero), LT (mai mic ca 0), GE (mai mare ca 0), LE (mai mic sau
egal cu 0), GT (mai mare ca 0), AC (ALU carry), NOT AC, AV (ALU overflow),
NOT AV, MV (MAC overflow), NOT MV, NEG (semnul intrarii X negativ), POS
(semnul intrarii X pozitiv), CE (CNTR expirat), FOREVER (intotdeauna).
Controlerul de întreruperi permite ca procesorul să raspundă la 6
nivele de întrerupere, vectorizate fix. Intreruperile pot fi mascate; pot fi active pe
front sau pe palier şi pot fi forţate sau sterse sub controlul programului. Sunt
admise şi întreruperi înlanţuite (cu respectarea priorităţilor).
Contextul programului poate fi modificat rapid prin trecerea pe setul de
registre auxiliare: în acest fel nu se mai utilizează stiva pentru a salva contextul
programului la servirea întreruperii. Există registre speciale pentru controlul
întreruperilor: ICNTL (controlează modul de sesizare a întreruperilor – pe front sau
pe palier) şi IMASK- maschează (invalidează) întreruperile care nu se utilizează.
Registrele IMASK şi ICNTL pot fi atât citite cât şi scrise.

Secvenţa de operare pentru controlerul de întreruperi

Semnalele de cerere de întrerupere individuale sunt prelucrate (printr-o


funcţie AND cu registrul IMASK); rezultatul acestei funcţii este încărcat într-un
circuit de detecţie a prioritătii care selectează întreruperea nemascată de prioritate
maximă. Ieşirea acestui circuit de detecţie este în permanenţă actualizată pentru a
permite înlănţuirea întreruperilor (dacă acest mod este activ).
O ieşire activă determină un salt la adresa fixă corespunzatoare priorităţii
întreruperii. Întârzierea între apariţia întreruperii externe şi servirea acesteia este
mai mică de 2 ciclii maşină..
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 15
PROIECTAREA APLICAŢIILOR

La apariţia unei întreruperi se salvează automat stiva "de stare" (status


stack) starea curentă a unităţii ALU, a unităţii MAC şi registrul IMASK. La
revenirea din întrerupere starea maşinii este refăcută.

Registrele de stare şi stiva de stare

Starea procesorului ADSP 218x şi modul de lucru sunt memorate în 6


registre care pot fi citite pe magistrala DMD.
Acestea sunt: ASTAT (stare ALU), SSTAT (stare stivă), MSTAT
(stare MAC), ICNTL, IMASK şi IFC (forţare întreruperi
software).
5.3.Proiectarea unui sistem cu microcontroler

Un sistem cu microcontroler se realizează conform schemei din figura 4.3.


Practic, la conectarea microcontrolerului in sistem trebuie proiectate doar schemele
de selecţie a memoriei şi a porturilor. Un exemplu de sistem cu ADSP218x este
ilustrat in figura 5.16. Figurile 5.17, 5.18 si 5.19 prezintă schemele electrice de
principiu pentru unitatea centrală de prelucrare, selecţia IO şi conectarea codecului.

Figura 5.16. Schema bloc a unui sistem cu ADSP2181


LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 3
PROIECTAREA APLICAŢIILOR
4 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Figura 5.19. Conectarea codecului AD1847 intr-un sistem cu ADSP2181

Sistemul de prelucrare de semnal ilustrat in figurile 5.17, 5.18 şi


5.19 utilizează o memorie EPROM pentru încărcarea programului în
memoria internă de program, comunică cu circuitul codec prin portul serial
SPORT0 şi accesează două porturi IO, plasate la adresele 0x1FF şi 0x0FF
pentru citirea unor butoane si afişarea pe un display de 7 segmente. Sistemul
nu are memorie externă.
6. LIMBAJE DE PROGRAMARE PENTRU
MICROCONTROLERE. PROIECTAREA
APLICAŢIILOR
6.1. Organigrama generală a unei aplicaţii de timp real cu
microcontroler
Realizarea unei aplicaţii cu microcontroler presupune implementarea unui
sistem hardware, ca în capitolul 5, şi dezvoltarea unui program de aplicaţie.
Programul se poate scrie în limbaj de asamblare sau în limbaj de nivel înalt (de
obicei în limbajul C).
Scrierea aplicaţiei în limbaj de asamblare are avantajul că timpul de execuţie
va fi minim, dar efortul depus pentru dezvoltarea acesteia va fi mai mare datorită
sintaxei limbajului de asamblare şi a necesităţii de a efectua manual managementul
resurselor microcontrolerului (registre, memorie). Trebuie remarcat faptul că, în
general, programele scrise în limbaj de asamblare utilizează mult mai eficient
resursele hardware, mai ales în situaţia când acesta are complexitate ridicată.
Dezvoltarea aplicaţiei în limbaj C are avantajul că se reduce timpul de
elaborare a programului, dar acesta nu este optim datorită faptului trebuie
respectate anumite reguli, impuse de compilator, în procesul de translatare a
codului scris în C în cod de limbaj de asamblare.
Programele scrise în limbaj C pot să nu utilizeze eficient toate resursele
hardware, mai ales dacă arhitectura microcontrolerului este complexă (ca de de
exemplu microcontrolerele DSP). Există metode de optimizare a codului C, pentru
a se crea programe eficiente sau se poate scrie un program mixt (în limbaj C cu
secţiuni de limbaj de asamblare).
Dacă arhitectura microcontrolerului este relativ simplă (ca la
microcontrolerele AVR), atunci diferentele dintre codul în limbaj de asamblare şi
limbaj de nivel înalt sunt acceptabile.
Dezvoltarea aplicaţiilor pentru microcontrolere se face folosind progarme
specializate denumite IDE (Integrated Development Environment) care integrează
toate uneltele software necesare generării codului executabil (editare, compilare,
asamblare, link-editare) şi depanarii acestuia (simulatoare, emulatoare).
În continuare este prezentată organigrama generală a unei aplicaţii pentru
microcontroler şi diagrama de timp asociată prelucrărilor (figura 6.1).
Se vor genera întreruperi periodice, iar în rutina de servire a acestor
întreruperi se vor citi intrarile, se vor prelucra şi se va genera pe portul de ieşire
rezultatul prelucrărilor.
Condiţia de funcţionare în timp real, pentru organigrama din figura 6.1, este:
6 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

t in + t p + t out ≤ T , unde t in este timpul de citire a intrării, t p este timpul de


prelucrare a unei intrari, t out este timpul de scriere a ieşirii iar T este perioada
întreruperilor periodice. Timpul de prelucrare t p poate să fie diferit de la o intrare
la alta.

Figura 6.1. Organigrama generală a unei aplicaţii cu microcontroler

Alegerea perioadei întreruperilor se face luând în considerare două criterii


contradictorii: T trebuie să fie suficient de mică pentru a sesiza modificări rapide
ale intrărilor şi T trebuie să fie suficient de mare pentru a îndeplini condiţia de
funcţionare în timp real pentru prelucrări complexe.
O valoare de compromis acceptată în multe aplicaţii este T = 20 ms.

6.2. Setul de instrucţiuni al microcontrolerului ADSP2181


Setul de instrucţiuni al procesorului ADSP 2181 permite realizarea unor
algoritmi de prelucrare a semnalelor ce necesită viteză mare de prelucrare; acest
lucru este posibil datorită faptului ca sunt permise transferuri rapide de date între
unitătile de calcul ale ŠC; instructiunile se execută intr-un singur ciclu maşină;
setul de instrucţiuni este puternic (operatii aritmetice, MAC, deplasari, instrucţiuni
de control al programului, bucle HW); există registre interne suficiente pentru a se
evită, în general, ciclurile de acces la memorie în decursul executiei unui algoritm
rapid.
Adresarea memoriei este flexibila; se permit adresarea directă (imediată) şi
indirectă (cu postindexare); este posibila adresarea simultana a doi operanzi.
Sintaxa limbajului de asamblare este algebrică; sunt permise câteva structuri
de date (vectori, buffere circulare) utile pentru simplificarea scrierii programelor.
De asemenea se execută instrucţiuni multifuncţie; acestea permit, într-un
singur ciclu, efectuarea unei operatii de calcul şi maxim două transferuri de date.
Transferurile de date permise sunt: registru - registru , registru - memorie.
Există 5 categorii de instrucţiuni:
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 7
PROIECTAREA APLICAŢIILOR

- instrucţiuni de calcul;
- instrucţiuni de transfer;
- instrucţiuni multifuncţie;
- instrucţiuni de control al programului;
- alte instrucţiuni.

Instrucţiunile multifuncţie se pot clasifica astfel:

a) - operaţii de calcul ALU/MAC cu citirea memoriei de date şi de program.


b) - citirea memoriei de date şi de program.
c) - operatii de calcul cu citirea memoriei.
d) - operatii de calcul cu scrierea memoriei.
e) - operatii de calcul cu transfer la registru.

Instrucţiunile de control al programului controlează secvenţorul de program şi se


pot clasifica în:

- salturi la rutina de servire a întreruperilor şi apeluri de subrutine;


- reintoarceri din întreruperi şi subrutine;
- bucle DO UNTIL;
- controlul flag+urilor de intrare-ieşire
- IDLE (asteaptă întreruperi în starea 'power-down').

Principalele instrucţiuni ale microcontrolerului ADSP 2181 sunt prezentate în


tablele următoare.

Instrucţiuni de transfer

reg = reg Transfer registru-registru


reg = <data> Încărcare registru
reg = DM (<addr>) Citire memorie de date (adresare directă)
dreg = DM (Ix , My) Citire memorie de date (adresare indirectă)
dreg = PM (Ix , My) Citire memorie de program (adresare directă)
DM (<addr>) = reg Scriere memorie de date (adresare directă)
DM (Ix , My) = dreg Scriere memorie de date (adresare indirectă)
PM (Ix , My) = dreg Scriere memorie deprogram (adresare indirectă)
8 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Instrucţiuni MAC

[IF cond] MR|MF = xop * yop Înmulţire


= MR + xop * yop Înmulţire cu acumulare
= MR – xop * yop Înmulţire cu scădere
= MR Transfer MR
=0 Ştergere MR
IF MV SAT MR Saturare MR

Instrucţiuni ALU

[IF cond] AR|AF = xop + yop [+ C] Adunare cu transport


= xop – yop [+ C– 1] Scădere cu împrumut
= yop – xop [+ C– 1]
= xop AND yop AND
= xop OR yop OR
= xop XOR yop XOR
= PASS xop Transfer pentru setarea flags
= – xop Negare
= NOT xop NOT
= ABS xop Valoare absolută
= yop + 1 Incrementare
= yop – 1 Decrementare
= DIVS yop, xop
Împarţire
= DIVQ xop

Instrucţiuni SHIFTER

[IF cond] SR = [SR OR] ASHIFT xop Deplasare aritmetică (cu SE)
[IF cond] SR = [SR OR] LSHIFT xop Deplasare logică (cu SE)
SR = [SR OR] ASHIFT xop BY <exp> Deplasare aritmetică imediată
SR = [SR OR] LSHIFT xop BY <exp> Deplasare logică imediată
[IF cond] SE = EXP xop Calcul exponent
[IF cond] SB = EXPADJ xop Calcul al exponentului unui blocu
de date
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 9
PROIECTAREA APLICAŢIILOR

[IF cond] SR = [SR OR] NORM xop Normalizare


Instrucţiuni multifuncţie

<ALU>|<MAC>|<SHIFT> , dreg = Calcul şi transfer între registre


dreg
<ALU>|<MAC>|<SHIFT> , dreg = DM Calcul şi citire de memorie de
(Ix , My) date
<ALU>|<MAC>|<SHIFT> , dreg = PM Calcul şi citire de memorie de
(Ix , My) program
DM (Ix , My) = dreg , Calcul şi scriere de memorie de
<ALU>|<MAC>|<SHIFT> date
PM (Ix , My) = dreg , Calcul şi scriere de memorie de
<ALU>|<MAC>|<SHIFT> program
dreg = DM (Ix , My) , dreg = Citire memorie de date şi
PM (Ix , My) memorie de program
<ALU>|<MAC> , dreg = DM (Ix , My), Instrucţiune ALU/MAC şi citire
dreg = PM (Ix , My) din memorie de date şi din
memorie de program

Instrucţiuni pentru controlul programului

DO <addr> [UNTIL term] Buclă Do Until


[IF cond] JUMP (Ix) Salt indirect
[IF cond] JUMP <addr> Salt direct
[IF cond] CALL (Ix) Apel de subrutină (indirect)
[IF cond] CALL <addr> Apel de subrutină (direct)
IF [NOT ] FLAG_IN JUMP <addr> Salt condiţionat de FLAG-IN
IF [NOT ] FLAG_IN CALL <addr> Appel de subrutină condiţionat
de FLAG-IN
[IF cond] SET|RESET|TOGGLE Modificare FLAG-OUT
FLAG_OUT [, ...]
[IF cond] RTS Revenire din subrutină
[IF cond] RTI Revenire din întrerupere
IDLE [(n)] Idle
10 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

Alte instrucţiuni

NOP Nici o operaţie


MODIFY (Ix , My) Modificare registru index
[PUSH STS] [, POP CNTR] [, POP PC] Control stivă
[, POP LOOP]
ENA|DIS SEC_REG [, ...] Control set de registre primar
(secundar)
BIT_REV - inversarea biţilor de adresă
AV_LATCH - activare saturare ALU
AR_SAT
M_MODE - mod de operare MAC
TIMER - setare timer
G_MODE - operaţii interne active in starea
de HOLD

Notaţii:

Ix Registru index
My Registru de modificare
<data> Valoare (dată) imediată
<addr> Adresă imediată
<exp> Exponent
<ALU> Orice instrucţiune ALU (excepţie împărţirea)
<MAC> Orice instrucţiune MAC
<SHIFT> Orice instrucţiune (excepţie deplasare imediată)
cond Condiţie logică ( EQ, NE, LT, GT, CE etc.)
term Condiţie de terminare a buclei DO UNTIL
dreg Registru de date (ALU, MAC sau SHIFTER)
reg Orice registru (inclusive dreg)
; Termină o instrucţiune
, Separă operaţiile multiple într-o instrucţiune multifuncţie
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 11
PROIECTAREA APLICAŢIILOR

6.3. Optimizarea performanţelor unui program în limbajul C


Pentru situaţiile în care programele sunt scrise în limbaj C, de exemplu pentru
procesoare DSP, se pot da următoarele recomandări pentru optimizarea codului:

1. Algoritmul trebuie descris într-o formă adecvată arhitecturii


microcontrolerului (se iau în considerare elementele de paralelism,
artimetica utilizată de microcalculator, modurile de adresare, tipurile de
instrucţiuni).
2. Codificarea algoritmului (scrierea programului) se realizează cât mai
simplu din punct de vedere al codului şi a strucrurilor de date utilizate.
3. Secţiunile critice ale programului se pot rescrie în limbaj de asamblare
(pentru minimizarea timpului de execuţie şi a dimensiunii codului)
4. Se evită efectuarea calculelor ce vor fi emulate (operaţii aritmetice pentru
care microcontrolerul nu are intrucţiune nativă – împărţire, calcule în
virgulă mobilă)
5. Utilizarea analizei interprocedurale

- definirea constantelor

De exemplu pentru următorul program:

#include <stdio.h>
int val; // initialized to zero
void init() {
val = 3; // re-assigned
}
void func() {
printf("val %d",val);
}
int main() {
init();
func();
}

Variabila val este iniţializată de două ori, ceea ce este ineficient. Prin analiza
interprocedurală nu se poate determina faptul ca val este o constanta. Pentru acest
lucru programul trebuie rescris astfel:

#include <stdio.h>
const int val = 3; // initialized once
12 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

void init() {
}
void func() {
printf("val %d",val);
}
int main() {
init();
func();
}
Pentru codul rescris variabila val este iniţializată o singură dată.

- evitarea alierii pointerilor

Fie următorul program:

void fn(char a[], char b[], int n) {


int i;
for (i = 0; i < n; ++i)
a[i] = b[i];
}

Variabilele de tip pointer a si b pot indica acelaşi tablou (fenomenul se


numeste alierea pointerilor). Prin analiza interprocedurală compilatorul va încerca
să determine situaţiile de aliere şi să le rezolve.
Dacă funcţia fn este apelată de două ori într-un program, analiza
interprocedurală poate determina urmatoarele rezultate:

fn(glob1, glob2, N);


fn(glob1, glob2, N);

În acest caz pointerii a si b nu se intersecteaza (nu apare alierea).

fn(glob1, glob2, N);


fn(glob3, glob4, N);

În acest caz pointerii a si b nu se intersecteaza (nu apare alierea).

fn(glob1, glob2, N);


fn(glob3, glob1, N);

În acest caz pointerii a si b pot indica acelaşi tablou (poate apare alierea).

Această situaţie apare deoarece analiza interprocedurala ia în considerare toate


apelurile de funcţii în mod global şi nu individual, atunci când determină riscul
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 13
PROIECTAREA APLICAŢIILOR

apariţiei alierii. Dacă apelurile ar fi luate în considerare individual analiza


interprocedurală trebuie să analizeze fluxul de intrucţiuni şi să ia in considerare un
număr mare de permutari posibile, ceea ce ar mări foarte mult timpul de compilare.

Evitarea alierii pointerilor se poate realiza şi prin utilizarea calificatorilor


restrict si const.
Secvenţa:

for (i=0; i<100; i++)


a[i] = b[i];

poate fi rescrisă pentru a elimina alierea pointerilor a si b astfel:

int * restrict p = a;
int * restrict q = b;
for (i=0; i<100; i++)
*p++ = *q++;

Calificatorul restrict precizează compilatorului că accesele la memorie nu se vor


suprapune.

Utilizarea calificatorului const este ilustrată de secvenţa:

void copy(short *a, const short *b) {


int i;
for (i=0; i<100; i++)
a[i] = b[i];
}

6. Utilizarea tablourilor indexate sau a pointerilor, după caz

Limbajul C permite ca accesarea datelor să se efectueze fie prin indexarea


unui tablou, fie incrementând un pointer la tablou. Cele două posibilităti sunt
prezentate în continuare:

- cu tablouri indexate:

void va_ind(const short a[], const short b[], short out[], int n) {
int i;
for (i = 0; i < n; ++i)
out[i] = a[i] + b[i]; }
14 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

- cu pointeri

void va_ptr(const short a[], const short b[], short out[], int n) {
int i;
short *pout = out;
const short *pa = a, *pb = b;
for (i = 0; i < n; ++i)
*pout++ = *pa++ + *pb++;
}

În funcţie de aplicaţie codul generat la compilare poate fi mai eficient folosind


unul dintre cele două stiluri.
Cea mai buna strategie este de a începe prin scrierea codului folosind
indexarea; daca rezultatul compilarii nu este satisfacator se pot folosi pointeri.

7. Utilizarea funcţiilor inline sau a limbajului de asamblare (dacă pentru


funcţia dorită nu există varianta inline)
8. Utilizarea de secţiuni diferite de memorie pentru variabilele programului
(memorie de program, memorie de date) pentru exploatarea paralelismului
microcalculatorului.
9. Reguli pentru scrierea buclelor de program:

- buclele de program trebuie sa fie cât mai scurte (pentru a putea fi


optimizate automat de către compilator)
- se va evita desfacerea (unrolling) manuală a buclelor – în scopul
exploatării paralelismului unităţilor aritmetice ale
microcalculatorului (pipe-line); acest lucru se va face automat de
către compilator, dacă e posibil.

Desfacerea manuală a buclelor poate face programul mai greu de înteles şi poate
împiedica realizarea optimizării automate de către compilator.

Pentru secvenţa de program:

void va1(const short a[], const short b[], short c[], int n)
{
int i;
for (i = 0; i < n; ++i) {
c[i] = b[i] + a[i];
}
}

compilatorul va optimiza bucla, iar pentru secvenţa desfăcută manual:


LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 15
PROIECTAREA APLICAŢIILOR

void va2(const short a[], const short b[], short c[], int n)
{
short xa, xb, xc, ya, yb, yc;
int i;
for (i = 0; i < n; i+=2) {
xb = b[i]; yb = b[i+1];
xa = a[i]; ya = a[i+1];
xc = xa + xb; yc = ya + yb;
c[i] = xc; c[i+1] = yc;
}
}

este dificil pentru compilator să optimizeze bucla.

- evitarea rotirii manulale a buclelor pentru a încărca sau stoca în


avans variabile ale programului

Pentru secvenţa următoare:

int ss(short *a, short *b, int n) {


int sum = 0;
int i;
for (i = 0; i < n; i++) {
sum += a[i] + b[i];
}
return sum;
}

bucla va fi rotită de către compilator.

Secvenţa rotită manual:

int ss(short *a, short *b, int n) {


short ta, tb;
int sum = 0;
int i = 0;
ta = a[i]; tb = b[i];
for (i = 1; i < n; i++) {
sum += ta + tb;
ta = a[i]; tb = b[i];
}
sum += ta + tb;
return sum;
16 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII

este dificil de optimizat datorită variabilelor auxiliare ta si tb.

- lungimea buclelor interioare trebuie să fie mai mare ca lungimea


buclelor exterioare
- se va evita utilizarea instrucţiunilor condiţionale în interiorul
buclelor

Următoarea secvenţă:

for (i=0; i<100; i++) {


if (mult_by_b)
sum1 += a[i] * b[i];
else
sum1 += a[i] * c[i];
}

nu poate fi optimizată; este mai bine ca secvenţa să fie rescrisă astfel:

if (mult_by_b) {
for (i=0; i<100; i++)
sum1 += a[i] * b[i];
} else {
for (i=0; i<100; i++)
sum1 += a[i] * c[i];
}

În acest caz secvenţa conţine două bucle simple ce pot fi optimizate.

- se vor evita apelurile de funcţii în interiorul buclelor


- contorul buclei trebuie să fie incrementat sau decrementat cu
factorul 1, în caz contrar optimizarea devine dificilă
- contorul buclei trebuie să fie variabilă locală pentru ca bucla să
poată fi controlată hardware

Contorul buclei trebuie să fie variabilă locală (care va fi stocată într-un registru) şi
nu variabilă globală. Următorul cod:

for (i=0; i<globvar; i++)


a[i] = 10;
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 17
PROIECTAREA APLICAŢIILOR

poate necesita reîncărcarea variabilei globvar la fiecare iteraţie şi nu va


transforma bucla într-o buclă controlată hardware (cu ajutorul unui hardware
dedicat ce asigura incrementarea contorului şi verificarea terminării buclei).

Codul poate fi rescris astfel:

int upper_bound = globvar;


for (i=0; i<upper_bound; i++)
a[i] = 10;

ceea ce permite transformarea buclei într-o buclă hardware.

10. Utilizarea funcţiilor de lucru în aritmetică fracţionară (1.15)

Dacă programul necesită efectuarea unor calcule în aritmetică fractionară, ca în


exemplul următor:

long dot_product (short *a, short *b) {


int i;
long sum=0;
for (i=0; i<100; i++) {
/* this line is performance critical */
sum += (((long)a[i]*b[i]) << 1);
}
return sum;
}

este mai eficient să se utilizeze funcţiile aritmetice ale compilatorului pentru


operaţii în format fracţionar, în locul deplasărilor, astfel:

#include <math.h>
fract32 dot_product(fract16 *a, fract16 *b) {
int i;
fract32 sum=0;
for (i=0; i<100; i++) {
/* this line is performance critical */
sum += __builtin_mult_fr1x32(a[i],b[i]);
}
return sum;
}

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