You are on page 1of 159

1.

Sisteme cu microprocesoare

Un sistem este un ansamblu format dintr-o intrare, o ieşire şi un proces.


Adesea, pot exista mai multe intrări şi ieşiri.

Intrare Ieşire
Proces

Un microprocesor, ca şi un sistem, are intrări, ieşiri şi un proces. Intrările


şi ieşirile microprocesorului sunt tensiuni ce pot fi utilizate pentru controlul
dispozitivelor externe.
Procesul implică analiza tensiunilor de intrare şi, folosirea acestora
pentru generarea tensiunilor de ieşire dorite. Analiza este bazată pe
instrucţiunile introduse anterior.

Tensiune de ieşire pentru controlul


Tensiune de dispozitivelor externe
intrare Microprocesor

Un exemplu trivial de utilizare a unui microprocesor poate fi acționarea


unei uși automate, cu ajutorul unei telecomenzi. În momentul acționării
telecomenzii, aceasta trimite o serie de impulsuri luminoase către un senzor de
lumină. Senzorul de lumină convertește lumina în pulsuri de tensiune electrică,
recunoscute de microprocesor. Tensiunile de ieșire acționează un motor electric
ce acționează ușa.
Fizic, un microprocesor este un circuit electronic foarte mic (aproximativ
12 mm), sensibil la umezeală sau frecare şi încapsulat (pentru protecţie) în
plastic sau material ceramic. Dimensiunea, forma şi numărul pinilor depind de
cantitatea de date pe care microprocesorul este proiectat să le prelucreze.

Pini de conectare

Carcasă din plastic sau


material ceramic
Microprocesorul conţine funcţii echivalente cu o unitate centrală de
procesare (CPU) mică a unui calculator. Este capabil să realizeze funcţiile de
bază ale calculatorului, putând fi astfel încorporat într-o proiectare de sistem,
unde astfel de funcţii sunt cerute. Un microprocesor, prin definiţie înseamnă
doar unitatea centrală de procesare: un decodificator de instrucţiuni, registre şi
unitatea de procesare logică şi aritmetică (ALU).

Un sistem bazat pe microprocesor este un sistem ce conţine un


microprocesor, şi nu are neapărat de a face cu operaţiile de calcul. De exemplu,
sistemul de deschidere a uşii unui garaj este un sistem bazat pe microprocesor
sau un sistem controlat de un microprocesor.
Microcalculatoarele sunt sisteme particulare bazate pe microprocesoare,
ce conţin cel puţin trei componente: microprocesorul sau unitate centrală de
prelucrare (CPU), memoria şi componentele periferice de intrare-ieşire. Un
microcalculator poate fi un calculator utilizat în scop general (de exemplu un
PC) sau un sistem proiectat să îndeplinească o sarcină particulară (de exemplu
un sistem de reglare într-un circuit, microcontroller-ul).
Unitatea centrală de prelucrare execută toate instrucțiunile logice și
aritmetice.
Un microcontroller este un microcalculator într-un singur cip. Deci, un
microcontroller include pe acelaşi cip un microprocesor (CPU) împreună cu
cele mai des utilizate periferice. Un controller (regulator) este utilizat pentru
controlul anumitor procese. O aplicaţie tipică pentru un microcontroller este de
exemplu, monitorizarea şi reglarea temperaturii dintr-o clădire.
Pe măsură ce procesul de miniaturizare s-a dezvoltat, toate componentele
necesare pentru controller (regulator) au fost construite direct pe un singur cip.
Microcontroller-ul include în mod uzual:
 CPU
 EPROM / PROM / ROM (memorie de tipul “read only”
pentru codul programului)
 RAM (memorie de tipul “random access” pentru date)
 dispozitive de intrare / ieşire seriale sau porturi seriale
(UART-uri)
 alte interfeţe de comunicaţie seriale (I2C – magistrala serială
multi-master, SPI - interfaţă serială periferică, CAN –
controller de reţea
 CAN, CNA (convertoare analog-digital şi digital-analogic )
 Numărătoare
 Controller al întreruperilor
Prin includerea doar a caracteristicilor specifice unui anumit task, costul
microcontrollere-lor este relativ scăzut. Un microcontroller tipic are
instrucţiuni de manipulare la nivel de bit, acces uşor şi direct la intrări/ieşiri şi o
procesare eficientă şi rapidă a întreruperilor.
În funcţie de puterea şi caracteristicile de care avem nevoie, se pot
selecta microcontrolere pe 4, 8, 16 sau 32 de biţi.
Diagrama bloc a unui microcontroler tip este prezentată în figura de mai
jos:

Controlul Timere/
întreruperii RAM ROM Numărătoare

CPU

Porturi
OSC CAN/CNA I/O Port serial
Senzor CAN Procesor CNA Element de execuţie

Memorie

Un sistem integrat (embedded) este un sistem bazat pe microprocesor ce


este integrat ca un subsistem într-un sistem mai mare.
Principalele componente ale unui astfel de sistem sunt:
 Microprocesor
 Senzori
 Convertoare (CAN sau CAN)
 Elemente de execuţie
 Memorie (pe cip sau în exteriorul cipului)
 Căi de comunicaţie
În general sisteme integrate au constrângeri legate de realizarea
operaţiilor în timp real (RTC – real-time computing).

Microprocesorul

Evoluţia microprocesorului
Un procesor este un circuit logic care are drept rol procesarea
instrucţiunilor de bază ce conduc un calculator.
Primele procesoare create aveau multe componente separate, dar pe
măsură ce tehnologia a avansat, s-a realizat integrarea tuturor componentelor
procesorului într-o singur circuit de silicon (cip). Aceste circuite integrate sunt
denumite microprocesoare.
Microprocesoarele se găsesc pretutindeni. Supercalculatoarele sunt
proiectate să realizeze calcule folosind sute sau chiar mii de microprocesoare.
Chiar şi calculatoarele personale ce au un singur procesor central, folosesc alte
procesoare pentru controlul ecranului, al comunicaţiei prin reţea, precum şi al
altor funcţii.
Microprocesoarele sunt proiectate cu scopul rulării programelor.
Procesoarele pot fi programate să realizeze orice funcţie este nevoie la un
anumit moment. Posibilităţile de utilizare ale procesorului sunt limitate doar de
imaginaţia programatorului.
În ultimii 35 de ani, pe măsură ce tehnologiile de fabricaţie s-au
îmbunătăţit, performanţa microprocesoarelor s-a dublat cam odată la 2 ani
(legea lui Moore).
Fiind proiectate să ruleze programe, microprocesoarele realizează multe
funcţii diferite, iar creşterea rapidă a performanţei permite dezvoltarea de noi
aplicaţii. Cererea continuă de noi aplicaţii este datorată dezvoltării proceselor
de fabricaţie.
Fizic, microprocesorul este o colecţie de tranzistori şi fire. Pe măsură ce
numărul tranzistorilor a crescut de la câteva sute la milioane modalitatea de
conectare a tranzistorilor, astfel încât aceştia să execute rapid comenzile ce
rulează programe, a devenit o sarcină mai complicată.
O clasificare a tehnologiei utilizate în funcție de numărul tranzistorilor,
poate fi realizată astfel:
- Integrat pe scară redusă (SSI): 2 – 64 tranzistori
- Integrat pe scară medie (MSI): 64 – 2.000 tranzistori
- Integrat pe scară largă (LSI): 2.000 – 64.000 tranzistori
- Integrat pe scară foarte largă (VLSI): 64.000 – 2 milione de tranzistori
- Integrat pe scară ultra largă (ULSI): 2 milioane – Fără limită.
Toate microprocesoarele actuale folosesc tranzistori de tipul MOSFET
(tranzistor cu efect de câmp tip metal-oxid semiconductor). Desigur, pentru
realizarea circuitului logic, tranzistoarele formează porți logice sau elemente
secvențiale, conectate împreună.
Tranzistoarele MOSFET au trei terminale: poartă (G), sursă (D) și drenă
(D). Ele prezintă și un terminal conectat la substratul pe care a fost realizat
tranzistorul. Funcționarea tranzistorului se bazează pe controlul conductanței
electrice a canalului între drenă și sursă, control realizat prin tensiunea dintre
poartă și sursă.
În funcție de polaritate există două tipuri de tranzistoare MOS: cu canal n
(NMOS) și canal p (PMOS). După principiul de funcționare, tranzistoarele pot
fi clasificate astfel: cu canal indus și canal inițial.

Aplicarea unui tensiuni corespunzătoare între poartă și sursă are drept


efect crearea unui câmp electric (sarcini electrice) cu efect conductor între sursă
și drenă. Tensiunea poartă-sursă pentru care începe să aibă loc conducția poartă
numele de tensiune de prag (threshold voltage).
Prin conectarea celor două tipuri de tranzistoare MOS (NMOS și PMOS)
pe aceeași plachetă din semiconductor, cu interconexiuni de metal între intrări
și ieșiri, se obține un circuit CMOS (MOS complementar). Acesta stă la baza
circuitelor digitale moderne, deci inclusiv la construcția microprocesoarelor.

Comportarea circuitului CMOS este echivalentă cu a unui inversor


(poartă logică NOT): o tensiune pozitivă ridicată +VDD corespunzătoare
nivelului 1 logic aplicată la intrare deschide tranzistorul NMOS și blochează
tranzistorul PMOS stabilind ieșirea la VSS, adică la 0 logic, pe de altă parte, o
tensiune negativă de valoare –Vss echivalentă nivelului 0 logic aplicată la
intrare, va deschide tranzistorul PMOS și va bloca tranzistorul NMOS, ieșirea
stabilindu-se la +VDD adică la nivelul logic 1.
Principalul motiv pentru care se folosește un circuit CMOS la realizarea
porților logice este incapacitatea tranzistorilor NMOS de a “trage sus”
(abilitatea de a trage tensiunea pe drena până la tensiunea de alimenatre VDD),
respectiv a tranzistorilor PMOS de a „trage jos” (capacitatea de a trage
tensiunea pe drenă până la tensiunea de împământare Vss).
O altă poartă logică foarte des utilizată este poarta NAND. Cea mai
simplă poartă NAND are două intrări ce furnizează la ieșirea 0 logic, numai
dacă ambele intrări sunt în 1 logic. Poarta folosește doi tranzistori PMOS și doi
tranzistori NMOS. Tranzistorii PMOS sunt conectați în paralel de la ieșire la
linia de alimentare. Atunci, când sunt în conducție, ieșirea va fi în 1 logic.
Tranzistorii NMOS sunt conectați în serie de la ieșire la linia de împământare.
Doar dacă ambii tranzistori sunt în conducție, ieșirea va fi în 0 logic.
Istoric, primul microprocesor a fost produs de Intel în anul 1971, fiind
denumit 4004. Acesta era un procesor pe 4 biţi (datele pot fi transferate pe 4
biţi), conţinea 2300 de tranzistori şi o viteză maximă a ceasului de 740kHz,
ceea ce-i permitea execuţia a aproximativ 92.000 de instrucţiuni pe secundă.
Viteza de execuție a unui microprocesor poate fi exprimată prin
acronimul IPS (instrucțiuni pe secundă), precedat de litera M pentru milioane, k
pentru mii și G pentru giga, fiind calculată ca și produsul dintre numărul de
cicluri ale ceasului într-o secundă și numărul ciclurilor de ceas necesare pentru
execuția unei instrucțiuni.
Exemplu: Procesorul 4004 rula la 740kHz, realizând un număr de
aproximativ 0.12 instrucțiuni pe fiecare ciclu de ceas, deci numărul de
instrucțiuni pe secundă va fi 740  106  0.12  92 kIPS.
În anul 1972, Intel a lansat procesorul 8008 pe 8 biţi ce lucra la 200kHz.
Memoria adresabilă era de 16KB. Următorul procesor a fost 8080, introdus în
1974 cu o frecvenţă a ceasului de 2MHz. În cazul procesorului 8080,
performanţa a crescut de 10 ori faţă de predecesorul 8008. Memoria adresabilă
a crescut la 64KB.
Microprocesorul 8080 a fost folosit pentru primul calculator personal
Altair 8800. Sistemul de operare utilizat a fost scris de Microsoft şi s-a numit
Microsoft BASIC pentru Altair.

In 1976 compania Zilog a lansat procesorul Z-80, acesta fiind o


îmbunătăţire a procesorului 8080. Între cele două procesoare nu exista o
compatibilitate la nivel de conexiuni externe, dar Z-80 încorpora o serie de
instrucţiuni specifice lui 8080, ceea ce permitea rularea tuturor programelor
scrise pentru acesta. Z-80 rula iniţial la o frecvenţă egală cu 2.5MHz (o
versiune ulterioară rula la 10MHz) şi conţinea 8.500 de tranzistori.
În 1978 Intel a introdus microprocesorul 8086, ce constituia o
îmbunătăţire importantă faţă de procesoarele precedente. Procesorul 8086 are o
proiectare pe 16 biţi (registre interne pe 16 biţi şi magistrală pentru date, de
asemenea, de 16 biţi). Procesorul conţinea 29.000 de tranzistori, rula la o
frecvenţă de 5MHz şi folosea o adresare pe 20 de biţi ceea ce-i permitea să
adreseze direct până la 1MB de memorie.
O variantă mai ieftină a lui 8086, a fost lansată în 1979 sub denumirea
8088. Avea aceleaşi specificaţii ca şi 8086, cu deosebirea că magistrala externă
de date a fost redusă la 8 biţi.
În acelaşi an a apărut procesorul MC68000 creat de compania Motorola.
Procesorul avea o arhitectură pe 32 de biţi (registre de 32 de biţi), magistrala
internă de date de 16 biţi şi magistrală externă de date de 16 biţi. Procesorul
suportă o adresare pe 24 de biţi, având 68.000 de tranzistori şi a fost folosit
intensiv de compania Apple pentru primele sale PC-uri.
Între anii 1980-1990 Intel a lansat procesoarele 80286, 80386 şi 80486.
Odată cu procesorul 80286 s-a introdus unitatea de management a segmentării
memoriei (MMU), iar 80386 a introdus un model de memorie pe 32 de biţi cu
un management al paginării memoriei.
Familia de procesoare Pentium, foloseşte setul de instrucţiuni al
procesorului 80486 (cu câteva instrucţiuni suplimentare), primul procesor
Pentium fiind introdus în 1993. Procesorul rulează la o frecvenţă de 60 sau
66MHz şi are 3.1 milioane de tranzistori. Procesorul Pentium a fost primul
procesor capabil să execute două instrucţiuni simultan. Alte caracteristici ale
acestor procesoare sunt: două cache-uri de câte 8KB pentru instrucţiuni şi date,
ceea ce permite procesorului să aducă datele şi instrucţiunile simultan din
cache, magistrala de 64 de biţi, optimizare în ceea ce priveşte execuţia
instrucţiunilor critice, posibilitatea de a executa în acelaşi timp instrucţiuni
multiple în virgulă mobilă, set de instrucţiuni pentru operaţii de tipul
multiprocesor (posibilitatea de a utiliza mai multe procesoare).
După anul 2000 au apărut procesoarele pe 64 de biţi (Intel64, AMD64)
compatibile cu procesoarele x86. Procesoarele cu mai multe nuclee (multi-core)
au apărut cu scopul creşterii performanţei prin utilizarea unei proiectări ce
presupune multiprocesarea simetrică. Un procesor cu mai multe nuclee este un
cip ce conţine mai mult de un nucleu microprocesor. Astfel de procesoare pot
să multiplice performanţele obţinute în funcţie de numărul de nuclee. Interfaţa
şi cache-ul poate fi partajate între nuclee. Primele procesoare cu două miezuri
(dual-core) au apărut în anul 2005 (Pentium D şi Athlon 64 X2). Procesoarele
lucrau la o frecvenţă cuprinsă între 2 şi 3.2 GHz, având până la 243 de milioane
de tranzistori.
Procesoarele de ultimă generaţie lucrează la frecvenţe de 2 până la
5.2GHz, numărul tranzistorilor ajungând la ordinul miliardelor. Toate aceste
procesoare sunt procesoare cu mai multe miezuri şi prezintă tehnologii ca: SMT
(sarcini multiple simultane), SC (cache partajat), etc.

2.000.000.000
1.000.000.000

100.000.000

10.000.000
Numărul de tranzistori

1.000.000

100.000

10.000
2.300
1971 1980 1990 2000 2008
Anul apariţiei

Arhitectura microprocesoarelor

Una dintre cele mai mari limitări în creşterea vitezei de execuţie a


algoritmilor o reprezintă transferarea informaţiilor spre şi dinspre memorie.
Aceste informaţii includ date şi instrucţiuni ale programului. Există următoarele
tipuri de arhitecturi:
1. Arhitectura Von Neumann
Arhitectura Von Neumann conţine o singură memorie şi o singură
magistrală pentru transferul datelor spre şi dinspre unitatea centrală de
procesare (CPU).
Dispozitive Adrese Adrese Dispozitive
de CPU de ieşire
intrare
Date Date

Adrese Date

Memorie (Programe şi
date)

Sunt necesari două cicluri de ceas pentru a termina execuția unei


instrucțiuni. În primul ciclu de ceas, procesorul extrage din memorie
instrucțiunea care urmează să fie executată și o decodează. În următorul ciclu
de ceas datele sunt preluate din memorie.
Această arhitectură este satisfăcătoare când acceptăm execuţia tuturor
sarcinilor necesare serial. Ea asigură flexibilitate maximă în alocarea memoriei.

2. Arhitectura Harvard
Conţine memorii separate pentru date şi instrucţiuni ale programului, cu
magistrale separate pentru fiecare.

Adrese Adrese Dispozitive


Dispozitive
de CPU de ieşire
intrare Date
Date

Adrese Date Adrese Date

Memorie Memorie
pentru pentru date
programe

Întrucât magistralele operează independent, datele şi instrucţiunile


programului pot fi extrase simultan, îmbunătăţind viteza faţă de cazul unei
singure magistrale.
În cazul arhitecturii Harvard, procesorul poate finaliza execuția unei
instrucțiuni într-un singur ciclu de ceas.
Această arhitectură este utilizată de majoritatea microcontrolerelor şi
DSP-urilor actuale (procesoare de semnal).
3. Arhitectura Harvard modificată
Arhitectura Harvard modificată este un caz particular al arhitecturii
Harvard, ce permite o legătură între procesor si memoria pentru instrucţiuni.
Arhitectura permite cuvintelor din memoria pentru instrucţiuni să fie tratate ca
şi date de tipul “read-only”, prin urmare datele de tipul const (caractere text)
pot fi citite în interiorul memoriei pentru instrucţiuni. Această metodă conservă
mai multă memorie de date pentru variabilele de citire/scriere. Arhitectura
Harvard modificată permite conţinutului memoriei de instrucţiuni să fie tratată
ca şi cum ar lucra cu date.

Adrese Adrese Dispozitive


Dispozitive
de CPU de ieşire
intrare Date
Date

Adrese Date Adrese Date

Memorie Memorie
pentru pentru date
programe

Secţiunea codului Date de Secţiunea datelor


tipul const

Principalul avantaj al arhitecturii (accesul simultan la mai mult de o


memorie) a fost anulat de sistemul modern al memoriei cache, care permite
maşinilor cu arhitectură Von Neumann ce sunt mai flexibile să aibă, în
majoritatea cazurilor, acceaşi performanţă. În consecinţă, arhitectura Harvard
modificată este folosită pentru aplicaţii de nişă unde
performanţa/complexitatea/uşurinţa în programare o recomandă.
Viteza procesorului este mai mare decât viteza de accesare a memoriei.
Prin urmare, calculatoarele moderne cu memorie cache, au încorporate aspecte
ce aparţin ambelor arhitecturi.
La arhitectura Von Neumann, cache-ul de pe procesor este divizat în
cache pentru instrucţiuni şi cache pentru date, fără a fi nevoie să se mai separe
memoria principală. Arhitectura Harvard este folosită pentru accesarea cache-
ului de pe procesor, în timp ce arhitectura Von Neumann este utilizată pentru
accesarea cipului de memorie externă.
Limbaje de programare
Limbajele de programare pot fi grupate în 2 mari categorii: limbaje de
programare de nivel scăzut și limbaje de programare de nivel ridicat.
Din categoria limbajelor de nivel scăzut fac parte codul mașină și
limbajul de asamblare, iar din categoria limbajelor de nivel ridicat fac parte
limbaje de programare, precum C, C++, Pascal, Visual Basic, etc.

1. Limbaje de nivel scăzut


Fiecare microprocesor are o listă de instrucţiuni specifică. Lista poartă
numele de “mulţime a instrucţiunilor” şi constă din sute de instrucţiuni ce pot fi
grupate astfel încât să se realizeze funcţia dorită. Decodificatorul de instrucţiuni
recunoaşte instrucţiunile şi permite microprocesorului să execute aceste
instrucţiuni.
Codul binar ce este înţeles de către microprocesor este numit cod maşină
şi constă din şiruri de biţi. Şirurile de biţi sunt grupate în blocuri de 8, 16, 32
sau 64 pe cipurile de memorie (ROM sau RAM) în funcţie de tipul
microprocesorului.
Spre exemplu pentru microprocesorul I8086 o instrucțiunie poate fi
codificată folosind 1 până la 6 octeți, după următoarea structură:

Octet 7 6 5 4 3 2 1 0
1 Op-codul (instrucțiunea) D W
2 MOD REG R/M
3 Deplasament, adresare, date
4 Deplasament, adresare, date
5 Date
6 Date

Primul câmp este format din:


- Câmpul instrucțiunii (6 biți) – specifică tipul instrucțiunii realizate
(transfer, adunare, salt, comparație, etc);
- D – specifică direcția registrului (REG) specificat în octetul 2 (dacă
D=1, atunci REG este registru destinație – datele sunt transmise de la
câmpul specificat prin R/M, dacă D=0, atunci REG este registru
sursă);
- W – specifică dimensiunea datelor (dacă W=0, atunci se lucrează la
nivel de octet, dacă W=1 se lucrează la nivel de cuvânt).
Al doilea câmp este format din:
- MOD – pe 2 biți – specifică modul de lucru (cu registru sau cu
memoria, fiind în concordanță cu ultimul câmp R/M);
- REG – pe 3 biți – specifică registrul utilizat (fiecare registru al
procesorului are alocat un cod);
- R/M – pe 3 biți – utilizat pentru a specifica celălalt registru sau
memorie în cazul instrucțiunilor cu doi operanzi (excepția fiind acelea
cu operanzi imediați).
Octeții 3 până la 6 sunt opționali și pot specifica deplasamentul, dacă
acesta există, modul de adresare (imediată, directă, indirectă, etc), precum și
date.
În cazul în care operandul sursă este o valoare imediată (constantă),
atunci codificarea este mult mai simplă.
Exemplu: Se consideră următorul program ce realizează adunarea a două
numere folosind codul mașină corespunzător procesorului Intel8086.
1011 1000 0000 0001 0000 0000
1011 1011 0000 0010 0000 0000
0000 0011 1100 0011
Semnificație:
- primii octeți din primele două linii (1011 1000 și 1011 1011)
reprezintă op-codul sau instrucțiunea la care se adaugă codul
registrului utilizat. În acest caz este vorba despre instrucțiunea de
transfer sau mutare a unui operand (mov) ce are op-codul 1011
1000. De asemenea sunt implicați registrii generali de date AX și
BX ce au codurile 000, respectiv 011.
- Următorii octeți reprezintă datele imediate (0000 0001 0000
0000 și 0000 0010 0000 0000). Acestea sunt stocate în format
little-endian (cel mai putin semnificativ octet la adresa mai
mică).
- Primul octet al ultimei linii reprezintă op-codul instrucțiunii de
adunare (add) între doi regiștri pe 16 biți.
- Următorul octet conține primii 2 biți (11) care specifică că se
lucrează cu regiștrii fără deplasament, iar următorii 6 biți
reprezintă codurile regiștrilor implicați.
Există câteva probleme legate de utilizarea codului maşină, şi anume:
- reprezentarea sub formă binară (şiruri de 1 şi 0) poate conduce
către greşeli (programatorul trebuie să introducă milioane de
biţi)
- programatorul trebuie să aibă grijă la structura internă a
microprocesorului (registre, instrucţiuni, cerinţe pentru
codificare, etc.)
Pentru a crește eficiența în programare, atunci când se scrie un program
în cod mașină a fost introdusă reprezentarea numerelor în format hexazecimal.
Totuși, această reprezentare nu este foarte utilizată în programare.
Limbajul de asamblare a fost proiectat cu scopul de a face aceeaşi muncă
ca şi codul maşină, dar într-un mod mult mai rapid şi mai uşor.
În limbajul de asamblare numerele pot fi exprimate
Locul şirurilor de 1 şi 0 a fost luat de litere.
Exemplu: Adunarea celor două numere reprezentată în format binar
poate fi descrisă prin următoarele linii de cod
mov ax,01h
mov bx,02h
add ax,bx
Codul de mai sus se numeşte mnemonic. Mnemonicele reprezintă un
ajutor pentru memorie, fiind folosite pentru codurile de asamblare.
Transformarea codului scris în asamblare în codul maşină se face prin
intermediul unui program numit asamblor.

Codul în asamblare Asamblor Codul maşină


(program)
(codul sursă) (codul obiect)

Codul obiect este încărcat în memoria RAM (adresa de început a


memoriei RAM utilizate este prima definită în codul scris în asamblare).
Un impediment major al programării în limbaj de asamblare îl constituie
faptul că asamblorul poate lucra doar cu setul de instrucţiuni oferit de
producătorul microprocesorului.
Limbajul de asamblare, ca şi codul maşină sunt proiectate pentru a fi
utilizate pe un anumit microprocesor, şi în general nu sunt compatibile pentru
alte tipuri.
Un program scris în asamblare este mai rapid şi necesită mai puţin spaţiu
de memorie decât programele scrise în alte limbaje de programare. Codul
maşină şi limbajul de asamblare se numesc limbaje procedurale
(microprocesorul execută instrucţiune cu instrucţiune).

2. Limbaje de nivel înalt


În cazul limbajelor de nivel înalt se foloseşte un compilator pentru
producerea codului maşină. Compilatorul, faţă de asamblor poate trata şi erorile
de sintaxă existente în program. Pentru compilator, programatorul trebuie să
scrie toate comenzile disponibile ale limbajului de nivel înalt în program de
asamblare. Acest lucru face ca în general compilatoarele să depindă de iscusinţa
programatorului.
Programatorul poate stoca părţi de cod scrise pentru diverse funţii în
librării. Legarea acestor secvenţe de cod din librării în programul principal se
realizează prin intermediul unui linker. Ultima operaţie realizată este încărcarea
programului pe RAM prin intermediul unui loader. Acesta determină ce adrese
din memoria microprocesorului sunt disponibile, de asemenea converteşte
etichetele la adresele lor finale.
Adesea limbajul de nivel înalt este independent de calculatorul pe care se
rulează, adică programul scris în acest limbaj poate fi transportabil pe un alt tip
de calculator – o trăsătură foarte utilă.
Limbajele de nivel înalt pot fi procedurale sau ne-procedurale. Limbajele
ce conţin algoritmi de tipul pas cu pas, utilizaţi pentru rezolvarea unei probleme
se numesc limbaje procedurale. Limbajele ce exprimă specificaţii ale unui
program care trebuiesc rezolvate sunt cunoscute ca ne-procedurale.
Limbajele procedurale au următoarele avantaje:
 pot specifica date reale, întregi, booleene, caractere sau structuri de
date, cum ar fi: vectori, matrice, stive, înregistrări, mulţimi, şiruri
de caractere, liste, arbori, etc.
 structuri de control ale secvenţei de operaţii ce urmează să fie
realizate.
Limbajele procedurale sunt proiectate folosind o mulţime de reguli de
sintaxă ce specifică “cuvintele” limbajului şi modul în care acestea sunt
combinate.
Pe lângă regulile de sintaxă, fiecare limbaj are reguli semantice. Fiecare
structură corectă din punct de vedere sintactic trebuie să aibă cel puţin o
interpretare semantică.
Codul sursă de
intrare (nivel înalt)
Compilator
(Converteşte
sursa în cod
obiect) Codul
sursă
Codul
obiect
Linker Codul
(Combină două obiect Librărie
coduri obiect)

Codul
obiect

Loader
(Adaugă adresele
sistemului RAM)

Limbajele de tipul Fortran 95, CCOBOL şi C sunt limbaje algoritmice,


adică oferă o metodologie de a împărţi o problemă mare într-un număr de task-
uri, precum şi programarea acestor task-uri în mod independent ca şi funcţii sau
subrutine. Aceste funcţii sau subrutine sunt combinate pentru a forma un
program.
Pe măsură ce costul programării a devenit tot mai mare dar şi pentru că
funcţiile sau subrutinele sunt destul de rigide, a fost nevoie de construirea
programelor prin utilizarea unei librării de componente refolosibile. Acest lucru
a condus la apariţia limbajelor orientate pe obiect, unde conceptul de
subrutină/funcţie a fost extins la acela a unui obiect. Într-un program orientat pe
obiecte, un obiect este modelat printr-o colecţie a structurilor de date şi printr-o
mulţime de proceduri ce pot fi realizate pe această structură de date.
În limbajele procedurale fiecare declaraţie determină modificarea
valorilor din una sau mai multe locaţii de memorie. Proiectarea programului
constă din scrierea unei secvenţe de declaraţii ce transformă starea memoriei de
la valoarea iniţială la valoarea finală, această fiind şi soluţia problemei.
Limbajele funcţionale ne-procedurale rezolvă o problemă prin aplicarea
unui set de funcţii variabilelor iniţiale într-un mod specific pentru determinarea
răspunsului căutat.
Sintaxa unor astfel de limbaje poate fi definită prin:
 
f n f n1  f n2  f1  data  
Unde f sunt aplicări succesive de funcţii ce transformă argumentele lor.
Din clasa de limbajele ne-procedurale mai fac parte limbajele bazate pe
reguli sau limbajele bazate pe logică. Un program logic este exprimat ca o
mulţime de propoziţii atomice (cunoscute ca fapte) şi clauze de legătură (reguli
de tipul if - then).
Limbaj de
programare

Limbaj de nivel Limbaj de nivel


scăzut înalt

Procedural Orientat pe
Ne-procedural problemă
Cod maşină

Matlab Mathematica
Limbaj de
asamblare Orientat pe Orientat pe
Algoritmic obiect scriere
Funcţional Logic

Fortran 95 COBOL C Pascal

LISP ML PROLOG

Visual
Smalltalk C++ JAVA Basic Pearl

Clasficarea limbajelor de programare


Arhitectura microprocesorului

1. Arhitectura internă a microprocesorului

Structura internă a microprocesorului poate fi împărţită în 3


secţiuni: secţiunea registrelor, unitatea de control şi unitatea aritmetică şi
logică.
Schematic, arhitectura internă a unui microprocesor simplu poate
fi reprezentată astfel:

Unitatea logică și aritmetică


(ALU) Registre de uz
general
Registru de stare
Registru de adrese
ale memoriei
Registru de
deplasare Numărătorul
program
Magistrala de date

Registru de Registrul
complementare instrucțiunii

Logica booleană
și adunare

Unitatea de control
(UC)

Registru tampon

1.1 Secţiunea registrelor


Numărul, mărimea şi tipul registrelor poate varia de la un
microprocesor la altul. Totuşi, diversele registre ale microprocesoarelor
efectuează operaţii similare. Structura registrelor microprocesorului
joacă un rol important în proiectarea arhitecturii microprocesorului.
Registre de bază ale microprocesorului
Registrele de bază ale microprocesorului sunt: registrul
instrucţiunii, numărătorul program, registrul de adrese ale memoriei şi
acumulatorul.
 Registrul instrucţiunii (IR) – registrul are rol de stocare a
instrucţiunilor. Conţinutul acestuia este decodat de microprocesor ca
o instrucţiune. Mărimea cuvântului microprocesorului determină
mărimea registrului. De exemplu, un microprocesor pe 32 de biţi are
un registru al instrucţiunii de 32 de biţi.
 Numărătorul program (PC) – conţine adresele instrucţiunii sau codul
operaţiei (op-code). În mod normal numărătorul program conţine
adresa următoarei instrucţiuni ce va fi executată. Dimensiunea
numărătorului program este determinată de dimensiunea magistralei
de adrese.
 Registrul de adrese ale memoriei (MAR) – conţine adresele datelor.
Microprocesorul foloseşte adresele, ce sunt stocate în registrul
adreselor de memorie, ca un pointer direct la memorie.
 Acumulatorul (A) – este utilizat pentru a stoca rezultatul majorităţii
operaţiilor efectuate de ALU. În general, se introduce un octet în
acumulator de la un dispozitiv extern sau se extrage un octet din
acumulator şi a-l trimite către dispozitivele externe. Unele
microprocesoare au mai multe acumulatoare. În aceste
microprocesoare, acumulatorul ce urmează a fi utilizat de
instrucţiune este specificat în op-code.
În funcţie de secţiunea registrelor, microprocesoarele pot fi
clasificate fie ca fiind bazate pe acumulator, fie ca fiind bazate pe
registre cu scop general. Într-un microprocesor bazat pe acumulator
(Intel 8085, Motorola 6809), se presupune că datele sunt păstrate într-un
registru numit acumulator. Toate operaţiile logice şi aritmetice sunt
realizate folosind acest registru. Astfel de registre sunt în general
registrele pe 8 biţi.
Microprocesoarele bazate pe registre cu scop general sunt de
obicei microprocesoarele pe 16, 32 şi 64 de biţi (Intel
8086/80386/80486/Pentium şi Motorola
68000/68020/68030/68040/PowerPC).
La acest tip de microprocesoare, registrele pot păstra date,
adresele memoriei, precum şi rezultatul operaţiilor aritmetice şi logice.
Utilizarea registrelor cu scop general mărește viteza de execuție a
programului, deoarece microprocesorul nu trebuie să citească datele
dintr-o memorie externă printr-o magistrală de date. De obicei aceste
registre au dimensiunea de 16 sau 32 de biți.
Dintre registrele de uz general amintim:
- registrul index – este folosit ca un numărător în modificările de adrese,
pentru o instrucţiune, sau funcţii generale de stocare. Registrul index
este folosit împreună cu instrucţiunile pentru accesarea vectorilor sau a
datelor. Registru index este utilizat pentru a modifica porțiunea de
adrese a memoriei, prin urmare pot fi accesate valori (date) – adresare
indexată. Adresa efectivă se determină în acest caz prin adunarea adresei
corespunzătoare instrucțiunii la conținutul registrului index. Aceste
tipuri de registre au o lungime de 16 sau 32 de biţi.
- registru de stare – conţine biţi individuali, fiecare bit având
semnificaţie specifică. Biţii din registrul de stare sunt denumiţi “flag-
uri”. Starea unei operaţii specifice a microprocesorului este indicată prin
fiecare flag, ce este setat sau resetat de logica internă a
microprocesorului.
Dintre flag-uri amintim:
 flag-ul de transport (carry flag) – folosit pentru a indica dacă
rezultatul generat de o operaţie aritmetică depăşeşte dimensiunea
cuvântului microprocesorului;
 flag-ul zero (zero flag) – este utilizat ori de câte ori rezultatul unei
operaţii este zero;
 flag-ul de paritate (parity flag) - este setat la valoarea 1 dacă
rezultatul ultimei operaţii conţine fie un număr par de 1 (paritate
pară) sau un număr impar de 1 (paritate impară), în funcţie de
microprocesor;
 flag-ul de semn (sign flag) – este utilizat pentru a indica ori de
câte ori rezultatul ultimei operaţii este pozitiv sau negativ. Dacă
cel mai semnificativ bit al ultimei operaţii este 1, atunci flag-ul
este setat la valoarea 1, indicând că rezultatul este negativ. Flagul
este resetat la valoarea 0 dacă cel mai semnificativ bit al
rezultatului este 0, dacă rezultatul este pozitiv;
 flag-ul de depăşire (overflow flag) – este setat 1 dacă rezultatul
unei operaţii aritmetice este prea mare pentru dimensiunea
maximă a cuvântului microprocesorului, altfel este resetat la 0.
- registrul pointer la stivă – Stiva constă dintr-un număr de locaţii RAM
în care se pot scrie date, sau din care se pot citi date. Aceste locaţii sunt
în general accesate prin subrutine. Adresa stivei este conţinută într-un
registru numit “pointer-ul stivei”. În general pentru accesul la stivă sunt
utilizate două instrucţiuni: PUSH şi POP. Instrucţiunea PUSH este
definită prin scrierea la vârful sau în partea de jos a stivei, în timp ce
instrucţiunea POP este utilizată pentru citirea din stivă (de la vârf către
partea de jos). Unele microprocesoare accesează stiva de la vârf
(pointer-ul la stivă este decrementat după o instrucţiune PUSH şi
incrementat după o instrucţiune POP), altele din partea de jos a stivei.
Microprocesoarele utilizează în mod uzual registre de 16 sau 32 de biţi
pentru operaţii de tipul PUSH sau POP. Stiva este o memorie de tipul
LIFO (ultimul intrat – primul extras).
Un exemplu de utilizare a regiștrilor poate fi descris astfel:
Se consideră un program ce realizează adunarea a două numere.
Primul număr este stocat în memorie la adresele succesive 1010 și
respectiv, 1012. Presupunem că valorile ce sunt stocate la aceste adrese
sunt [1010]=0001h și [1012]=0002h.
Pentru realizarea operației de adunare va fi realizată următoarea
succesiune de operații:
a. Se încarcă registru de adrese al memoriei cu adresa
primei valori, deci se va încărca adresa 1010 în acest
registru;
b. Se mută ceea ce se găsește la această adresă (valoarea
0001h) în registrul de date, D0;
c. Se incrementează registru de adrese al memoriei cu 2 (se
lucrează la nivel de cuvînt), practic se va trece la
următoarea adresă (1012), ce conține a doua valoare
implicată în operația de adunare;
d. Adună conținutul acestei locații de memorie cu valoarea
ce a fost mutată în registrul datelor D0, și memorează
rezultatul în registru pe 16 biți (D0).

1.2 Unitatea de control


Principalul scop al unităţii de control este acela de a citi şi decoda
instrucţiunile din memoria program. Pentru executarea unei instrucţiuni,
unitatea de control accesează blocurile unităţii logice şi aritmetice, pe
baza op-codurilor conţinute în registrul instrucţiunii. Op-codurile
definesc operaţiile ce sunt realizate prin intermediul unităţii de control
cu scopul execuţiei unei instrucţiuni.
Unitatea de control interpretează conţinutul registrului
instrucţiunii şi apoi răspunde la instrucţiune prin generarea unei
secvenţe de semnale de activare. Aceste semnale activează blocurile
logice ale ALU pentru realizarea operaţiei dorite.
Unitatea de control generează semnalele de control, care
constituie ieşiri către alte elemente ale microcalculatorului prin
intermediul magistralei de control. De asemenea, unitatea de control ia
măsurile necesare ca răspuns la semnalele de control de pe magistrala de
control ce provin de la alte elemente ale microcalculatorului.
În funcţie de tipul microprocesorului, semnalele de control pot
varia. Totuşi, există o serie de semnale specifice majorităţii
microprocesoarelor:
 RESET – atunci când pinul de intrare este în starea HIGH
sau LOW (în funcţie de microprocesor), numărătorul
program este încărcat cu o adresă predefinită specificată de
producător. De exemplu, la μP 80486, după o reiniţializare
(reset) hardware, numărătorul program este încărcat cu
FFFFFFF016. Aceasta înseamnă că instrucţiunea stocată în
memorie la adresa FFFFFFF016 este executată prima.
 READ / WRITE ( R / W ) – starea acestei linii transmite
elementelor microcalculatorului ori de câte ori
microprocesorul realizează o operaţie de tipul READ sau
WRITE. Un semnal HIGH pe linie indică o operaţie de tipul
READ, iar un semnal de tipul LOW indică o operaţie de
tipul WRITE. Unele microprocesoare au pini separaţi READ
şi WRITE.
 READY - este un semnal de intrare pentru microprocesor şi
este folosit de dispozitivele lente (memorie şi porturi de I/O)
pentru a câştiga un timp suplimentar la transferul sau
recepţia datelor de la microprocesor. Semnalul este un
semnal activ pe LOW. Atunci când microprocesorul
selectează un echipament lent, echipamentul trece pinul
READY în starea LOW. Microprocesorul răspunde prin
suspendarea tuturor operaţiilor interne şi intră în starea
WAIT. Atunci când dispozitivul este gata de a transmite sau
recepţiona date, înlătură semnalul READY.
 Cerere de întrerupere ( INT sau IRQ ) – Dispozitivele
externe de I/O pot întrerupe microprocesorul prin
intermediul acestui pin. Când semnalul este activat prin
dispozitivele externe, microprocesorul sare la un program
special numit: rutină de deservire a întreruperii. Programul
este în general scris de către utilizator pentru a realiza sarcini
pe care dispozitivul ce solicită întreruperea vrea să le
realizeze microprocesorul. După executarea acestei rutine,
microprocesorul se întoarce la programul principal ce era
executat înainte de apariţia întreruperii.

1.3 Unitatea logică şi aritmetică


Unitatea realizează toate manipulările de date, cum ar fi operaţiile
aritmetice şi logice din interiorul microprocesorului. Dimensiunea
unităţii este în conformitate cu lungimea cuvântului microcalculatorului
(un microprocesor pe 32 de biţi va avea o unitate de 32 de biţi). În mod
uzual, ALU realizează următoarele funcţii:
 Adunare binară şi operaţii logice
 Găsirea complementului faţă de 1 a datelor
 Deplasare sau rotaţie spre dreapta sau spre stânga cu
transport a conţinutului unui registru cu scop general.
Structura internă a microprocesoarelor pe 16 biți

Pentru exemplificare se prezintă în figura de mai jos structura


internă a microprocesorului Intel 8086:

AX AH AL 20
ALU
Regiştrii BX BH BL pentru
generali calculul
CX adreselor
CH CL

DX DH DL
Registre
segment pe Controlul
Alţi regiştrii
16 biţi logic al
generali
magistralei
Pointerul de
Pointer la stiva instrucţiuni

Magistrala de date

Registrul de instrucţiuni
Regiştrii temporari
Şase instrucţiuni
Unitatea sunt puse în coada
ALU de control de aşteptare în
pentru memoria FIFO
operaţii aritmetice
şi logice

Registru de stare

Microprocesorul I8086 are o structură internă divizată în două


unităţi funcţionale:
 Unitatea de interfaţă a magistralei (BIU)
 Unitatea de execuţie (EU)
Unitatea de interfaţă realizează conectarea microprocesorului la
memoria externă şi cipurile de I/O. Cele două unităţi (BIU şi EU)
funcţionează independent. Unitatea de interfaţă citeşte (preia)
instrucţiuni şi scrie sau citeşte date la sau de la memorie şi porturile de
I/O. EU execută instrucţiuni ce au fost deja preluate de BIU. Interfața cu
magistrala conţine registre segment, pointer al instrucţiunii (IP), registre
de aşteptare ale instrucţiunii şi un circuit de control al magistralei/ de
generare a adreselor.
Procesorul I8086 foloseşte memoria segmentată. Memoria
principală de 1MB este împărţită în 16 segmente de câte 64 KB fiecare.
Adresele pe 20 de biţi sunt generate în unitatea de interfaţă a magistralei
prin intermediul unităţii logice şi aritmetice, prin utilizarea unui pointer
al instrucţiunii pe 16 biţi şi un registru segment de 16 biţi. Segmentarea
memoriei este utilă în sistemele cu timp-partajat, atunci când câţiva
utilizatori partajează un microprocesor.
Segmentarea permite comutarea, cu uşurinţă, de la un utilizator la
altul prin schimbarea conţinutului registrului segment.
Logica magistralei de control a BIU generează toate semnalele
magistralei de control, cum ar fi, semnale de citire sau scriere pentru
memorie şi porturile de I/O. Registrul de instrucţiuni al BIU constă
dintr-o memorie de tipul FIFO (primul intrat - primul ieşit), în care până
la şase octeţi ai instrucţiunii sunt citiţi înainte de la memoria externă,
astfel încât timpul de execuţie al instrucţiunii să crească. Unitatea de
control din EU traduce instrucţiunile pe baza conţinutului registrelor
instrucţiunii din BIU.
Unitatea de execuţie conţine registre generale pe 16 biţi (AX, BX,
CX, DX). Fiecare dintre acestea sunt împărţite în registre de 8 biţi (AH,
AL,….).
Registrul AX sau acumulatorul este utilizat pentru operații
aritmetice, precum și operații de intrare/ieșire.
Registrul BX sau registrul bază este singurul registru de uz
general al cărui conținut poate fi utilizat pentru adresarea memoriei.
Toate adresările la memorie utilizează conținutul acestui registru pentru
adresare, folosind registrul DS drept registru segment implicit.
Registrul CX sau numărător este cu precădere utilizat pentru
instrucțiuni logice de rotire, deplasare sau salturi. De exemplu
instrucțiunea LOOP va decrementa automat conținutul registrului CX cu
1, până când CX=0 și se trece la următoarea instrucțiune.
Registrul DX sau registrul de date este utilizat pentru a păstra
rezultatele mai mari de 16 biți ale operațiilor aritmetice efectuate la
nivel de cuvânt.
Cele patru registre segment din structura interfeței cu magistrala
sunt: CS – segmentul de cod, DS – segmentul de date, ES – extra
segmentul și SS – segmentul stivei).
Toate instrucțiunile codului sunt localizate în memoria principală,
accesată prin registrul CS prin intermediul unui deplasament (offset) pe
16 biți, conținut în pointerul instrucțiunii (IP).
Registrul SS indică către stiva curentă. Adresa fizică a stivei pe
20 de biți este calculată folosind indicatorii de stivă BP și SP.
Registrul DS indică către segmentul de date curent; operanzii
pentru majoritatea instrucțiunilor sunt extrase din acest segment.
Regiștrii index SI și DI sunt utilizați ca deplasamente pentru a calcula o
adresă fizică pe 20 de biți.
Registrul ES indică către extra segmentul în care datele ce
depășesc 64 de KB sunt stocate.
Unitatea de execuţie conţine de asemenea un registru al stării.
Unitatea logică şi aritmetică din EU realizează operaţiile aritmetice şi
logice.
Legat de setul de instrucțiuni al procesorului 8086 trebuie precizat
faptul că există aproximativ 117 instrucțiuni diferite. Setul conține
instrucțiuni cu unul, doi sau nici un operand.
Instrucțiunile pot fi grupate în 8 categorii:
- instrucțiuni de transfer a datelor
- instrucțiuni de manipulare a biților
- instrucțiuni de transfer necondiționat
- instrucțiuni de întrerupere
- instrucțiuni aritmetice
- instrucțiuni cu șiruri de caractere
- instrucțiuni de ramificare condițională
- instrucțiuni de control a procesorului

Structura internă a microprocesoarelor pe 32 şi 64 de biţi


Odată cu apariţia microprocesoarelor pe 32 de biţi s-a
implementat conceptul de pipelining în care aducerea instrucţiunilor şi
execuţia ciclurilor se suprapun. Metoda permite pregătirea simultană
pentru execuţie a uneia sau mai multor instrucţiuni, în timp ce o altă
instrucţiune este executată.
De asemenea, s-a trecut la operarea simultană pe cuvinte de 32 de
biţi, reprezentând instrucţiuni diferite sau părţi ale unei singure
instrucţiuni, precum şi introducerea unor concepte dintre care amintim:
managementul memoriei, tehnicile memoriei virtuale, etc. Acestea
permit programatorilor să scrie programe ce sunt mult mai mari decât
acelea care ar putea să încapă în memoria principală (programele sunt
stocate pe un dispozitiv secundar, cum ar fi o unitate de disc, iar porţiuni
din acel program sunt schimbate în memoria principală, dacă acest lucru
este necesar).
Cipurile microprocesoarelor pe 32 de biţi conţin şi un circuit de
segmentare. Cu ajutorul acestora, blocuri de cod numite „segmente”, ce
corespund modulelor unui program şi care au diferite dimensiuni
stabilite de programator sau compilator, sunt schimbate. Există şi o
metodă alternativă la segmentare, şi anume paginarea. Diferenţa dintre
cele două este aceea că în cazul paginării modulele au aceeaşi
dimensiune.
Aritmetica în virgulă mobilă este implementată în cazul acestor
microprocesoare prin intermediul unui procesor în virgulă mobilă. La
microprocesoarele precedente aritmetica în virgulă mobilă era
implementată soft prin intermediul unei subrutine.
Schemele de management a memoriei (sau caching) sunt utilizate
cu scopul de a minimiza timpul de acces pentru majoritatea
instrucţiunilor. Memoria cache este inclusă pe cipul microprocesorului.
De obicei, microprocesoarele pe 32 de biţi sunt procesoare
superscalare. Acest lucru înseamnă că ele pot executa mai mult de o
instrucţiune într-un ciclu de ceas, putând fi astfel folosite în sisteme de
operare multitasking.
Unele microprocesoare pe 32 de biţi implementează o
caracteristică de predicţie a sectoarelor multiple. Acest lucru permite
microprocesorului să anticipeze salturile din fluxul instrucţiunii. De
asemenea, microprocesoarele pot determina secvenţa optimală a
execuţiei instrucţiunii, prin urmărirea instrucţiunilor de decodare şi
determinarea momentului în care instrucţiunile sunt păstrate sau sunt
executate.
Microprocesoarele pe 64 de biţi includ toate caracteristicile
microprocesoarelor pe 32 de biţi, iar, în plus, au unităţi de virgulă
mobilă şi magistrale de adrese şi date mai mari. În mod uzual
microprocesoarele pe 64 de biţi pot executa 4 instrucţiuni la un ciclu de
ceas.
Microprocesorul Intel 80386 este primul microprocesor pe 32 de
biţi al firmei Intel, fiind bazat pe 8086. Microprocesorul 80386 conţine
magistrale separate interne şi externe de 32 de biţi, precum şi 8 registre
generale pe 32 de biţi. Procesorul poate mânui date pe 8, 16 şi 32 de biţi.
Are pini separaţi de adrese şi date şi poate genera o adresă fizică de 32
de biţi. Poate adresa până la 4GB de memorie fizică şi 64TB de
memorie virtuală. Cipul microprocesorului are 132 de pini şi este
proiectat folosind tehnologia HCMOS III.
Datorită caracteristicii de pipeling , microprocesorul poate realiza
în paralel funcţiile de aducere, decodare, execuţie şi management a
memoriei. Managementul memoriei şi protecţia hard traduce adresele
logice în adrese fizice şi oferă reguli de protecţie necesară mediului
multitasking. Principalele diferenţe dintre 8086 şi 80386 sunt adresele şi
datele de 32 de biţi, paginarea şi managementul memoriei.
Arhitectura internă a lui 80386 include câteva unităţi funcţionale
ce operează în paralel. Operaţia este cunoscută sub numele de
“procesare ramificată (pipelined processing)”. Aducerea, decodarea,
execuţia, managementul memoriei şi accesul la magistrală sunt realizate
simultan. Unităţile funcţionale ale microprocesorului 80386 sunt:
 Unitatea de interfaţă a magistralei (BIU)
 Unitatea de execuţie (EU)
 Unitatea de segmentare
 Unitatea de paginare
 Unitatea de decodificare
 Unitatea de pre-aducere (prefetch)
Unitatea de interfaţă a magistralei realizează funcţii similare cu
cea a microprocesorului 8086, fiind responsabilă pentru:
- aducerea instrucțiunii
- citirea și scrierea datelor pentru memorie
- transferul datelor pentru dispozitivele de intrare/ieșire
Practic intefața magistralei are rol de interfațare cu lumea
exterioară. Transferul informațiilor se face pe magistrala demultiplexată
de 32 de biți a procesorului.
Unitatea de pre-aducere are rolul de a crea o listă de tipul FIFO cu
instrucțiuni. Octeții corespunzători instrucțiunilor sunt păstrați de către
această unitate până când unitatea de decodificare este gata să-i
primească. Magistrala unității intră în starea de inactivitate dacă lista
este plină, iar unitatea de execuție nu solicită accesul la datele din
memorie.
Unitatea de decodificare este responsabilă pentru decodificarea
instrucțiuniilor ce provin de la unitatea de execuție. Citește instrucțiunile
în cod mașină din lista de așteptare a instrucțiunilor. Instrucțiunile
decodificate sunt păstrate până când acestea sunt solicitate de unitatea de
execuție.
Unitatea de execuţie procesează instrucţiunile din coada
instrucţiunilor. Conţine o unitate de control şi o unitate a datelor.
Unitatea de control conţine microcod şi hard paralel pentru înmulţiri,
împărţiri şi calculul adresei efective cât mai rapid posibil. Unitatea de
date include o unitate logică şi aritmetică, 8 registre generale, şi un
deplasator pe 64 de biţi pentru a realiza deplasări multiple ale biţilor
într-un singur ciclu de ceas. Unitatea de date efectuează operaţiile
solicitate de unitatea de control.
Unitatea de segmentare translatează adresele logice în adrese
liniare la solicitarea unităţii de execuţie. Adresele liniare sunt trimise la
unitatea de paginare.
Prin intermediul mecanismului de paginare, microprocesorul
traduce adresele liniare în adrese fizice. Dacă paginarea nu este activată,
adresa fizică este identică cu adresa liniară. 80386 nu conţine pe cip
memorie cache. Se poate însă realiza o interfaţare între microprocesor şi
o memorie cache externă prin intermediul unui cip controller al
memoriei cache.
Unitatea de execuție Unitatea de segmentare Unitatea de paginare
Registre Regiștrii Registru
segment tampon pentru
translatare
Deplasare

Înmulțire/
Împărțire Translatorul de Translator de
segment pagină
ALU

Unitatea magistralelor
Interfața
magistrale
lor
Decodificator Coadă de
așteptare a
unității de pre-
Coadă de aducere
așteptare pentru Pre-aducere
instrucțiuni

Unitatea de decodificare Unitatea de pre-aducere

2. Magistrale externe
Un număr prestabilit de fire numite magistrale, sunt utilizate
pentru interfațarea procesorului cu lumea exterioară sau pentru
transferul informațiilor în interiorul unității centrale de procesare.
Magistralele externe sunt grupate în următoarele categorii: magistrala de
date, magistrala de adrese și magistrala de control.

2.1 Magistrala de date


Magistrala de date este o magistrală bidirecțională prin care se
realizează schimbul de date dintre procesor și dispozitivele externe
(dispozitive de I/O, memorii, etc.). Magistrala de date poate juca și rolul
de transfer unidirecțional de instrucțiuni de la memorie.
Direcția transferului de informații (în cazul bidirecțional) este
supervizată de unitatea de control a microprocesorului, prin generare de
semnale specifice de citire, scriere, discriminare între diversele
dispozitive externe, definire a secvențelor de transmitere a datelor, etc.
Dimensiunea magistralei (numărul de linii de conexiune) depinde
de lungimea cuvântului specific microprocesorului (8, 16, 32,64, etc.
2.2 Magistrala de adrese
Este o magistrală unidirecțională utilizată pentru transferul
codului binar specific locației datei ce se va utiliza în cadrul operației ce
se execută.
Discriminarea între diversele tipuri de adrese transmise, practic
selecția dispozitivului extern revine to în sarcina unității de control.
Magistrala de adrese stabilește prin numărul de linii și capacitatea
de adresare a unui microprocesor.
De exemplu, microprocesorul I8086 are o memorie de 1MB, și
pentru accesarea acesteia va fi nevoie de 20 de linii de adresă
( 220  1048576 ).
În acest caz, cele 20 de linii de adresă sunt obținute prin
multiplexare cu magistrala de date.

2.3 Magistrala de control


Magistrala de control este utilizată pentru a transmite semnale de
control și comandă de la o componentă la cealaltă.
Semnalele de control pot fi grupate astfel:
 semnale de control a magistralei
 semnalele de arbitrare a magistralei
 semnale de control a înteruperilor
 semnale de stare
 semnale diverse
Semnalele de pe magistrala de control permit selectarea
echipamentului extern cu care microprocesorul comunică.
Setul minim al semnalelor de control a magistralei include
următoarele: WRITE – semnal de ieșire pentru microprocesor, READ –
semnal de intrare, Address strobe (pin de adrese) – utilizat pentru
selecția unui circuit extern – semnal de ieșire, READY – semnal utilizat
pentru a specifica faptul că dispozitivul extern este gata să transmită
informații – intrare pentru microprocesor.
Semnalele de arbitrare a magistralei sunt semnale de control și
sincronizare pentru administrarea cererilor externe de control al
magistralei.
Semnalele de control al întreruperilor sunt semnale ce realizează
controlul și sincronizarea cu evenimentele externe.
Pentru sincronizarea cu evenimentele externe trebuie să existe
două tipuri de semnale:
- cerere de înterrupere (INT sau NMI)
- acceptarea întreruperii (INTA).
Semnalele de stare indică starea procesorului, respectiv:
- tipul ciclului mașină curent
- informații despre regiștrii interni folosite pentru
calcularea adreselor
- sincronizarea informațiilor cu alte magistrale
- starea memoriei interne cache.
În categoria semnalelor diverse pot fi evidențiate o serie de
semnale speciale definite în funcție de tipul microprocesorului: semnale
pentru controlul coprocesorului extern, semnale pentru testarea
intrărilor, semnale de depanare, semnal de reinițializare, etc.

3. Întreruperi
Procesul în urma căruia microprocesorul își suspendă operațiile
curente și execută anumite operații de urgență, poartă numele de
întrerupere. Prin intermediul întreruperilor, dispozitivele externe
realizează comunicația cu procesorul.
O întrerupere mai poate fi definită prin apelul unei subrutine
inițiate de un dispozitiv extern prin hardware (întrerupere hardware) sau
chiar de microprocesor (întrerupere software).
În urma cererilor de întrerupere, microprocesorul execută
instrucțiunea curentă, acceptă întreruperea, salvează conținutul
numărătorului program în vîrful stivei și transferă controlul rutinei ce
deservește întreruperea respectivă. Microprocesorul execută rutina de
deservire (ISR), și după execuția întreruperii transferă din nou controlul
programului principal.
Sistemele de întreruperi pot fi clasificate astfel:
- sistem de întrerupere pe o singură linie sau pe un singur
nivel
- sistem de întrerupere cu mai multe lini sau mai multe
niveluri
- linii de întrerupere vectoriale
3.1. Sistem de întrerupere cu o singură linie
Într-o configurație de acest tip microprocesorul are o singură linie
dedicată cererilor de întrerupere.
Dispozitivele de I/O sunt conectate la linia cererilor de
întrerupere. Cererile de întrerupere sunt trecute printr-o poartă logică
exclusivă (OR), după care sunt aplicate microprocesorului. Ca răspuns
la o cerere de întrerupere, microprocesorul execută următorii pași:
- transferă controlul rutinei de procesare a întreruperii sau
subrutina de nivel a întreruperii (ILS)
- determină adresele dispozitivului ce a transmis cererea
de întrerupere
- transferă controlul către programul de tratare a
întreruperii
- se întoarce la programul principal, activează
întreruperile mascabile și termină execuția.
Magistrala de date

Microprocesor
INTA

INTR

Dispozitiv Dispozitiv Dispozitiv


1 2 3

3.2. Sistem de întrerupere cu mai multe linii


În acest tip de sistem liniile individuale destinate cererilor de
întrerupere sunt conectate la linii diferite ale microprocesorului. Acesta,
poate accepta alte cereri de întreruperi în timpul execuției unei rutine de
deservire a întreruperii. Dacă microprocesorul are numai o linie de
întrerupere, logica de control a întreruperilor rezolvă prioritatea
cererilor, iar întreruperea cu prioritatea cea mai mare este deservită
prima, în timp ce celelalte întreruperi sunt menținute în starea de
așteptare.

Magistrala de date
Logica de control a
Microprocesor

întreruperilor

INTR INTR IRQn


IRQ1
IRQ0
INTA Dispozitiv Dispozitiv Dispozitiv
1 2 … n

3.3. Linii de întrerupere vectoriale


Întreruperile vectoriale sunt acelea ce presupun ca
microprocesorul drept răspuns la un semnal de întrerupere să
predetermine locația de memorie care este adresa de început a subrutinei
de tratare a întreruperii. Această adresă este denumită adresă vectorială.
Există două tipuri de adrese vectoriale:
- adresă vectorială fixă
- adresă vectorială programabilă
Procesoarele ce suportă adrese vectoriale fixe, au adrese
vectoriale implicite pentru fiecare întrerupere. Programatorul nu
poate modifica aceste adrese. Procesoarele ce suportă adrese
vectoriale programabile mențin un tabel în memorie (tabelul
vectorilor de întrerupere - IVT).
3.4. Clasificarea întreruperilor
Întreruperile pot fi clasificate în două categorii mari: hardware și
software.
Întreruperile hardware pot fi împărțite în funcție de modul în care
sunt detectate de procesor: întreruperi declanșate pe nivel sau pe
tranziție. O întrerupere pe nivel este o întrerupere semnalizată prin
menținerea liniei de întrerupere pe nivelul crescător sau descrescător
(high sau low). Un dispozitiv ce dorește să utilizeze o astfel de
întrerupere, trece linia de întrerupere pe nivelul său activ și menține linia
pe acest nivel până când întreruperea este deservită.
O întrerupere pe tranziție este semnalizată de o tranziție pe nivel
pe linia de întrerupere, fie pe frontul descrescător, fie pe frontul
crescător. Un dispozitiv ce dorește să semnalizeze o întrerupere,
transmite un impuls pe linie și apoi eliberează linia la starea sa inactivă.
Dacă impulsul este prea scurt pentru a fi detectat, atunci este necesar un
dispozitiv special pentru a detecta tranziția.
Întreruperile mai pot fi clasificate și în întreruperi mascabile și
întreruperi nemascabile.
Întreruperile mascabile sunt acele ce pot fi mascate sau pentru
care poate fi refuzată deservirea. Aceste întreruperi sunt asociate cu
sarcinile de nivel scăzut ce, în general, pot fi omise.
Întreruperile nemascabile sunt acelea ce nu pot fi ignorate sau
mascate de microprocesor. Fiecare procesor suportă întrerupere
nemascabilă (NMI). Această întrerupere este o întrerupere de prioritate
maximă.
3.5 Întreruperile procesorului I8086
Întreruperile microprocesorului I8086 pot fi clasificate în 3
categorii:
- întreruperi hardware
- întreruperi software
- întreruperi generate ca urmare a unei erori
Întreruperile hardware sunt cele generate pe liniile de întrerupere
NMI și INTR ale microprocesorului de către dispozitivele externe. Linia
NMI este utilizată pentru semnalizarea unui eveniment critic, cum ar
căderea tensiunii de alimentare.
În cazul în care mai multe dispozitive externe transmit o cerere de
întrerupere, și, deoarece, microprocesorul dispune de o singură linie de
întrerupere INTR, atunci este necesar un controller programabil al
întreruperilor (de exemplu circuitul I8259A) care să gestioneze această
situație.
Întreruperile software sunt acelea generate prin instrucțiuni de
tipul INT sau INTO.
Întreruperile generate la apariția unei erori sunt, spre exemplu,
cele generate ca urmare a unei împărțiri prin zero, sau ca urmare a unei
erori în execuția unei instrucțiuni.
Odată cu acceptarea unei întreruperi, procesorul va realiza
următoarea secvență, înainte de execuția subrutinei de tratare a
întreruperii:
- registrul fanioanelor este introdus în stivă
- intrările INTR sunt dezactivate și fanionul TF este șters
- registrul CS este introdus în stivă
- registrul IP este introdus în stivă
- registrul IP este încărcat cu adresa vectorului de
întrerupere (deplasamentul).
- Registrul CS este încărcat cu adresa vectorului de
întrerupere (segment)
- subrutina de tratare a întreruperii este executată de la
adresa formată din cei doi regiștrii CS și IP.
Atunci când ultima instrucțiuni (IRET) a subrutinei este
executată registrele introduse în stivă sunt extrase în ordine inversă. În
acest mod microprocesorul își reia execuția procesului inițial.
Microprocesorul I8086 poate deservi până la 256 de întreruperi
diferite.
Aceste întreruperi sunt grupate în tabelul (tabela) vectorilor de
întrerupere. Acest tabel are alocat în memorie un spațiu cuprins între
adresele 00000h și 003FFh.
Primele 5 întreruperi ale tabelei sunt destinate unor aplicații
specifice. Aceste întreruperi pot fi generate prin program folosind
instrucțiuni INT.
Întreruperea de tipul 0 sau INT0 este generată ori de câte ori se
încearcă o împărțire prin zero sau atunci când rezultatul împărțirii nu
încape în registrul destinație (se utilizează instrucțiuni de tipul DIV sau
IDIV).
Întreruperea de tipul 1 apare după fiecare instrucțiune dacă bitul
corespunzător fanionului de urmărire este setat. Atunci când acest fanion
este setat programul este rulat pas cu pas, iar programatorul poate
verifica rezultatul după fiecare instrucțiune.
00000h
Întrerupere de tipul 0
sau împărțire prin zero
00004h

Întreruperi dedicate (5)


Întrerupere de tipul 1
sau într-un singur pas
00008h
Întrerupere de tipul 2
sau NMI 0000Ch
Întrerupere de tipul 3
sau breakpoint
Întrerupere de tipul 4
sau INTO


Întrerupere de tipul 5
Întreruperi rezervate

(rezervată)
Întrerupere de tipul 6
(27)

(rezervată)

Întrerupere de tipul 13
(rezervată)
Întreruperi disponibile (224)

Întrerupere de tipul 32
(rezervată)
Întrerupere de tipul 33
(disponibilă)

Întrerupere de tipul 255


(disponibilă) 003FFh

Întreruperea de tipul 2 sau NMI este o întrerupere nemascabilă cu


cea mai mare prioritate. Această întrerupere nu poate fi dezactivată sau
ținută în așteptare.
Întreruperea nemascabilă este întotdeauna recunoscută de
microprocesor și nu poate fi mascată prin program.
Întreruperea de tipul 3 sau breakpoint este utilizată în etapa de
depanare a programului.
Întreruperea de tipul 4 este generată de microprocesor atunci când
se execută o instrucțiune de tipul INTO.
Microprocesorul I8086 are o singură linie de întrerupere externă
INTR ce poate fi intern mascată prin program. Înainte ca
microprocesorul să accepte de la un dispozitiv extern o întrerupere pe
această linie, fanionul de întrerupere trebuie să fie activat printr-o
instrucțiune de tipul STI (setarea fanionului de întrerupere).
Întreruperile microprocesorului 8086 sunt deservite în următoarea
ordine:
1. Întreruperi interne și excepții
2. Întreruperi software
3. Întreruperi nemascabile
4. Întreruperi externe (INTR)
5. Întreruperi de tipul pas cu pas (single step).
MEMORIA SISTEMELOR CU MICROPROCESOARE

Memoria unui sistem cu microprocesor reprezintă o componentă


importantă a acestuia, fiind utilizată pentru stocarea informației sub formă
binară. Memoriile se prezintă sub forma unor circuite integrate și se găsesc
sub formă distinctă sau intră în componența altor circuite integrate cum ar fi:
microcontrolere, circuite de telecomunicații, etc.
Fiecare cip de memorie conține un număr mare de celule sau registre.
Numărul acestora poate varia de la câteva sute de celule la câteva milioane, în
funcție de capacitatea memoriei. Rolul acestor celule este acela de a stoca biți
(4, 8, 16, 32 sau 64 de biți).
Abilitatea de a păstra datele și după ce alimentarea a fost oprită împarte
memoria în două categorii:
- memorie RAM (Random acces memory) – datele se pierd imediat
după oprirea alimentării externe. Aceste tipuri de memorii pot fi scrise și citite
în orice moment și la orice adresă.
- memorie ROM (Read only memory) – datele pot fi păstrate pe
cipul de memorie o perioadă lungă fără alimentare externă. Memoriile ROM
pot fi doar citite. Înscrierea acestor cipuri de memorie se poate realiza într-o
etapă anterioară utilizării ei prin programare (burning).
- memorie hibridă - de exemplu: memoriile EEPROM și Flash au
comportament de memorie RAM, iar memoriile NV SRAM (nevolatile) au
comportament de memorie ROM.
Timpul de acces la o memorie reprezintă intervalul de timp dintre
momentul selectării acesteia și momentul disponibilității la ieșire a datei
cerute (pentru operația de citire), respectiv momentul memorării datei (în
cazul operației de scriere). Timpii de acces sunt dependenți de tipul memoriei
utilizate, de viteza microprocesorului, etc.
Accesarea memoriei poate fi realizată:
- secvențial sau serial – în acest caz accesarea locației de memorie
dorită se realizează prin parcurgerea locațiilor anterioare. O astfel de abordare
impune timpi de acces variabili ce pot fi însemnați pentru memorii actuale cu
o capacitate mare.
- aleator – în acest caz se permite operarea directă cu locația de
memorie dorită.
Toate memoriile actuale (RAM sau ROM) sunt proiectate să suporte
accesarea aleatoare.
Accesarea memoriei se realizează prin intermediul unei adrese. Pentru
accesarea unei celule de memorie este necesară aplicarea adresei binare la
intrarea unor dispozitive ce se numesc decodificatoare de linie și coloană.
Decodificatoarele sunt circuite logice, care pe baza adresei unei locații sunt
capabile să comute către linia și coloana indicată prin adresă.

Figura 1. Accesarea memoriei


Numărul maxim de locații ce pot fi adresate depind de numărul de biți
din adresă ( 2 = numărul de locații, unde n reprezintă numărul de biți din
n

adresă).
Exemplu: Procesorul Intel 8086 are 20 de linii de adresă, prin urmare
numărul de locații adresate este egal cu 220 (1M).
Organizarea memoriei este determinată de: numărul de locații x numărul
de biți stocați în fiecare locație. Prin urmare, se pot întâlni notații de forma: 16
x 1, 16K x 8, 1M x 1, etc.
Memoria RAM
În general memoriile RAM sunt utilizate pentru stocarea datelor.
Memoria RAM poate fi de două tipuri: RAM static (SRAM) și RAM dinamic
(DRAM).
Memoriile DRAM se găsesc cu precădere la calculatoare personale și
sisteme înglobate (embedded), datorită necesarului mare de memorie la prețuri
scăzute.
Memoriile DRAM sunt realizate în tehnologie unipolară NMOS sau
CMOS.
Celula de memorare DRAM conține un singur tranzistor MOS,
funcționând în regim de impulsuri. Memorarea se realizează prin încărcarea
sau descărcarea unui condensator de valoare foarte mică.

Figura 2. Celulă de memorare DRAM


Scrierea unui 1 presupune activarea bufferului de intrare prin intermediul
liniei de bit. În același timp linia de cuvânt este activată, producând astfel
intrarea în conducție a tranzistorului T și încărcarea condesatorului Cm.
Citirea unui 1 presupune activarea bufferului de ieșire prin intermediul
liniei de bit. Activarea liniei de cuvânt va provoca intrarea în conducție a
tranzistorului și descărcarea condensatorului Cm.
Diferența între cele două operații (scriere și citire) este determinată prin
tensiunea aplicată liniei de bit. În cazul scrierii această tensiune este la nivel
high, fiind egală cu tensiunea aplicată pe linia de cuvânt. În cazul citirii
tensiunea aplicată pe linia de bit este low, apropiată de zero, pe când tensiunea
aplicată pe linia de cuvânt este high.
Termenul dinamic corespunzător acestor tipuri de memorii se referă la
necesitatea constantă de împrospătare a datelor stocate.
Operația este realizată de circuite specializate numite controllere RAM la
intervale cuprinse între 2 și 4 ms. Reîmprospătarea datelor este necesară,
datorită alterării informației înscrise în condesantor prin citire, dar și datorită
descărcării exponențiale în timp a acestuia ca urmare a curenților de pierdere.
Circuitul logic al unei memorii DRAM de dimensiune 16K x 8 se poate
reprezenta sub forma unei matrici cu 128 de linii și 128 de coloane (se pot
stoca 16384 octeți de informație).

Figura 3. Circuitul logic al unei memorii DRAM

Pentru această configurație sunt necesare 14 linii de adresă


( 2  16384 ) sau pot fi utilizate mai puține linii de adresă, dar multiplexate,
14

fiind nevoie și de un circuit de gestionare a liniilor partajate.


Liniile de adresa A0 – A6 corespunzătoare adreselor linie sunt activate pe
_____
frontul descrescător al semnalului RAS , în timp ce linii de adresă A7 – A14
corespunzătoare adreselor coloană sunt activate pe frontul descrescător al
_____
semnalului CAS . La formarea unei adrese valide, celula de memorie este
blocată și pregătită pentru operații de citire/scriere. Octetul de date este scris la
ieșire sau citit la intrare prin intermediul liniilor de date D0 – D7 prin
_____ _____ _____
intermediul semnalului WE ( WE = 0 scriere, WE = 1 citire). Operațiile de
scriere/citire pentru o memorie DRAM pot fi sintetizate conform următoarelor
diagrame:
Memoria SRAM
Memoriile SRAM nu necesită operații de reîmprospătare a datelor.
Constructiv cipurile de memorii sunt realizate cu bistabile sau circuite flip-
flop în tehnologie bipolară sau unipolară.
Un circuit flip-flop poate stoca un singur bit (0 sau 1) iar funcționarea
acestuia este descrisă astfel: pe frontul crescător al semnalului de ceas
corespunzător microprocesorului, ieșirea este egală cu intrarea, altfel ieșirea
reține starea anterioară.
Memoriile SRAM au un timp de acces mai mic decât memoriile DRAM
și suportă operații la putere mică, totuși celulele conțin mai mulți tranzistori (6
tranzistori), prin urmare au un cost de producție mai ridicat. SRAM-urile se
folosesc frecvent pentru memoriile cache ale procesoarelor rapide, ca memorie
principală în echipamente portabile, precum și pentru microcontrolere.

Ceas

Intrare Ieșire Intrare


D Q

C Ieșire

Ceas

Figura 4. Circuit flip-flop

Figura 5. Celulă de memorare SRAM


Interfața memoriei SRAM este mai simplă decât cea a memoriei DRAM
și constă din magistrală nemultiplexată de adrese și magistrală de date.
Schema logică a unui circuit SRAM de 4K x 8 conține o matrice ce
poate stoca 4096 octeți de informație. Evident, pentru adresare sunt necesare
12 linii de adresă.
SRAM-ul se prezintă sub forma unei matrici de 64 de linii și 64 de
coloane.
Funcționarea circuitului poate fi descrisă astfel:
___
- Dacă semnalul CS  1, memoria este în repaus;
___ ___
- Dacă CS  0 și WE  0 , un octet de date este scris prin intermediul
liniilor de intrare (D0 – D7) la adresa indicată prin liniile de adresă;
___ ___
- Dacă CS  0 și WE  1 , un octet de date este citit de la adresa
specificată prin liniile de ieșire (D0– D7).
Pinii externi corespunzători unei memorii RAM (SRAM și DRAM)
sunt prezentați în figurile următoare:

Semnificația pinilor este:


1. Pentru cipul SRAM (128K x 8)
- I/O0 – I/O7 – pini pentru scrierea/citirea datelor
- A0 – A16 – linii de adresă
___
- WE – semnal utilizat pentru controlul fluxului de date (scriere
___ Figura
___ 6. Circuitul logic al unei memorii SRAM
WE  0 , citire WE  1)
___ ___
- CS 1 , CS 2 – pini pentru selecția circuitului

2. Pentru cipul DRAM (1M x 1)


_____ _____
- RAS și CAS – semnale de strobare pentru liniile și coloanele
adreselor. În acest caz pentru a adresa 1Meg este nevoie de multiplexare.
- Write – determină un ciclu de citire sau de scriere.
- Din și Dout – pini pentru intrarea și ieșirea datelor (în acest caz se
transferă un bit).
Memoria ROM
Așa cum s-a precizat memoria ROM este o memorie nevolatilă, utilizată
pentru stocarea permanentă a datelor, în mod uzual prin intermediul unei surse
de tensiune separată de alimentarea principală a plăcii.
Conținutul cipului poate fi, în general, doar citit de către procesorul
master, totuși, în funcție de tipul memoriei ROM, procesorul master poate fi
capabil să șteargă sau să modifice datele de pe ROM.
O posibilă arhitectură pentru memoria ROM se poate obține prin
interconectarea unui decodificator cu un codificator.
Prin aplicarea unei adrese pe liniile de adrese se va activa o singură linie.
La ieșirea codificatorului se obține un cod pe k biți ce reprezintă informația
înmagazinată în locația ce corespunde liniei de cuvânt active.

Figura 7. Arhitectură pentru memoria ROM

Există mai multe variante constructive pentru memoria ROM:


1. Memoriile ROM cu programare prin mască (Mask ROM) – sunt
memorii programate de către producător prin realizarea unor măști de
programare specifice fiecărui set de circuite realizate. În consecință informația
se scrie în procesul de fabricație și nu poate fi modificată de utilizator. Sunt
circuite ieftine, dar trebuie realizate într-un număr mare pentru a fi eficiente
din punct de vedere economic.
2. Memoriile PROM (ROM programabil) – sunt programate
individual de către utilizator o singură dată. Programarea se realizează prin
distrugerea selectivă, conform informației ce se memorează, a unei micro-
fuzibile, prin aplicarea unei tensiuni mai mari, de programare pe biții doriți.
3. Memoriile EPROM (ROM programabil prin ștergere) – oferă
posibilitatea reprogramării memoriilor ROM. Programarea se realizează prin
utilizarea unui dispozitiv ce emite radiații ultraviolete de intensitate mare și
perioadă mică, asupra unei ferestre transparente de pe cipul de memorie.
Memoriile EPROM se folosesc în etapa de dezvoltare și testare a sistemului
sau a unei aplicații. Operația de ștergere și reprogramare a acestor circuite
poate fi repetată de zeci, chiar de sute de ori. Procesul de programare a
memoriilor EPROM se realizează de către un programator de EPROM-uri.
4. Memoriile OTPROM (ROM programabil o singură dată) – sunt o
variantă a circuitelor EPROM încapsulate în plastic, fără fereastră de cuarț.
Acestea se pot programa o singură dată, fiind mai ieftine decât EPROM-urile.
5. Memoriile EEPROM (ROM programabil prin ștergere electrică)
– pot fi programate electric, oferind astfel posibilitatea de a fi programate
chiar în cursul execuției programului.
6. Memoriile Flash – sunt versiuni mai rapide și mai ieftine ale
memoriilor de tipul EEPROM. Memoria Flash poate fi scrisă și ștearsă electric
în blocuri sau sectoare (blocuri de octeți) într-un interval de timp foarte scurt
(câteva microsecunde, față de zeci de milisecunde la EEPROM, respectiv zeci
de minute la expunere la radiații ultraviolete la EPROM).
Memoriile ROM progamabile prin mască și cele PROM nu se mai
utilizează în prezent. Memoriile EPROM, EEPROM și OTPROM sunt
fabricate în tehnologie NMOS și mai ales CMOS.
Memoriile ROM sunt utilizate în microsisteme pentru stocarea
programelor și a constantelor (firmware). Unele sisteme de calcul de
dimensiuni reduse stochează în ROM interpretoare Basic (în cazul
calculatoarelor de buzunar) sau sisteme de operare și aplicații (Word, Excel,
etc.).
Sistemele cu microcontrolere stochează codul firmware direct în memora
ROM a controlerului. Dacă această memorie este EEPROM sau Flash,
reprogramarea ei este simplă. În fapt, memoria Flash internă a
microcontrolerelor este folosită ca memorie de program, iar cea EEPROM ca
memorie de date nevolatilă.
Desigur, utilizarea diverselor tipuri de memorie ROM se poate face, de
exemplu, de-a lungul unui proces de dezvoltare. Pentru început, se pot utiliza
memorii EPROM pentru testarea soft-ului și a hard-ului. Memoriile OTPROM
pot fi utilizate la finalul procesului de dezvoltare pentru diferite versiuni ale
codului. În general, pentru dezvoltarea de sisteme complexe și scumpe se
folosesc memorii Flash, posibil în combinație cu alte tipuri de memorii ROM
cum ar fi MROM bootabil.

- D0 – D7 – pini de date
- A0 – A16 – linii de adresă
____
- CE – activare circuitului
____
- OE – activare ieșirii (ieșirea circuitului este deconectată de la pinii
de date)
_______
- PGM – activează modul de programare
Organizarea memoriei
Structura uzuală a memoriei unui sistem cu microprocesor cuprinde atât
memorii RAM cât și memorii ROM. Organizarea și dimensiunile acestora
depind de aplicația în care se utilizează sistemul.
Zonele de adrese ocupate de memoria RAM și ROM depind de
proiectantul sistemului. Pentru un microprocesor pe 8 biți organizarea fizică a
memoriei poate arăta astfel:

Figura 8. Organizarea fizică a memoriei


Desigur orice tip de memorie poate fi alocat, în funcție de necesitățile
sistemului.
Determinarea numărului de KB de memorie din fiecare secțiune, se face
conform relației:

N M
1024
unde:
N - adresa de început a blocului de memorie următor
M - adresa de început a blocului de memorie curent
Exemple de conectare:
1. Interfațarea microprocesorului 8086 cu memoria principală
Conectarea microprocesorului Intel 8086, ce lucrează în modul minim,
cu memoria principală se face conform reprezentării:

Figura 11. Conectarea procesorului I8086 cu memoria

Spațiul de memorie al microprocesorului Intel 8086 poate fi privit ca


1MB (celule consecutive conținând date pe 16 biți) sau ca două blocuri de
512KB fiecare (blocul adreselor pare și blocul adreselor impare).
Adresa unei locații din cadrul unui bloc de date se formează utilizând
liniile de adrese A1 – A19. Blocul adreselor pare este conectat la magistrala de
date D7 – D0, iar blocul adreselor impare la magistrala D15 – D8.
Pentru performanțe maxime, datele de 16 biți trebuie plasate cu octetul
mai puțin semnificativ la o adresă pară (aliniate la adrese pare).
De exemplu, un cuvânt de 16 biți amplasat la adresele (2k, 2k+1) este
accesat într-un singur ciclu de magistrală, altfel sunt necesare două cicluri de
magistrală:
- se accesează octetul de la adresă impară (2k+1) – cel mai puțin
______
semnificativ – utilizând A0  1 și BHE  0 .
- se accesează octetul de la adresa pară (2k+2) – cel mai semnificativ
______
– prin incrementarea adresei cu o unitate ( A0  0 și BHE  1).

Se consideră o alocare a memoriei principale sub forma următoare:


Memoria principală cuprinde 8 circuite RAM de capacitate 1K x 4
(capacitate totală 4K x 8) și 4 circuite ROM de capacitate 8K x 8 (capcacitate
totală 32K x 8).
Ieșirile ROM și RAM sunt legate în paralel la magistrala de date, ceea ce
impune activarea la un moment dat a unui singur circuit pe fiecare linie a
magistralei de date, cu ajutorul semnalelor de selecție a circuitelor. Acestea,
împreună cu semnalele de selecție a blocurilor (A0 și BHE) constituie intrările
unor porți logice exclusive. Ieșirile porților validează transferurile dacă sunt
plasate pe intrările de validare a fiecărui circuit de memorie.
Datorită funcției de decodificare a circuitelor de decodificare numai o
singură ieșire este activă la un moment dat, ceea ce asigură activarea unui
singur cip de memorie și dezactivarea celorlalte.
Figura 12. Exemplu de conectare a memoriei principale
Decodificatoarele realizează alocarea adreselor logice (A0 – A19)
locațiilor fizice din circuite.
Tabelele de decodificare pot avea următoarea structură:
- Pentru memoria ROM
___
A19 – A15 A14 A13 – A1 Adrese Ieșire
M / IO
activă
1 1…1 0 0 …….. 0 F8000h - FBFFFh CSROM-0
1 …….. 1
1 1…1 1 0 …….. 0 FC000h - FFFFFh CSROM-1
1 …….. 1
- Pentru memoria RAM
___
A19 – A12 A11 A10 – A1 Adrese Ieșire
M / IO
activă
1 0 …… 0 0 0 …….. 0 00000h - 007FFh CSRAM-0
1 …….. 1
1 0 …… 0 1 0 …….. 0 00800h - 00FFFh CSRAM-1
1 …….. 1

1. Interfațarea microcontrolerului 8051 cu memoria principală


În cazul microcontrolerul 8051 memoria localizată pe cipul
dispozitivului este împărțită astfel: 128B de memorie RAM și 4KB de
memorie ROM.
Dispozitivele din familia 8051 prezintă spații de adresare distincte pentru
memoria de date și memoria program.
Figura 13. Memoria de date și memoria program pentru 8051

Separarea logică a memoriei de date și program permite ca


memoria internă de date să fie accesată prin adrese de 8 biți care sunt mai
rapid manipulate și păstrate de o unitate de prelucrare pe 8 biți (așa cum este
unitatea dispozitivului). Totuși, sunt generate și adrese pe 16 biți pentru
memoria de date. Pot fi adresați până la 64KB de memorie RAM externă,
____ ____
utilizând semnalele de citire/scriere ( RD și WR ). De asemenea, pot fi utilizați
până la 64KB de memorie program, primii 4KB fiind interni.
Conectarea memoriei program externe la dispozitivele din familia
8051 se poate face astfel:

Figura 14. Conectarea memoriei program externe


În acest caz 16 linii de I/O (porturile P0 și P2) sunt dedicate funcțiilor de
magistrală. Portul P0 servește ca o magistrală de adrese și date multiplexată în
timp. Acesta emite octetul inferior al numărătorului program (PCL) ca adresă,
și apoi trece în starea de intrare, așteptând octetul de cod din memoria
program. În timp ce octetul inferior (PCL) este valid la ieșirea lui P0, semnalul
ALE înscrie acest octet într-un latch de adresă extern. Portul 2 emite octetul
________
superior al adresei (PCH), apoi semnalul PSEN activează ieșirea EPROM-
ului și octetul de cod este citit în microcontroler.
Adresele memoriei de date externe pot fi de 1 sau 2 octeți.
Adresele de 1 octet sunt adesea utilizate în conjucție cu una sau mai multe linii
de I/O suplimentare pentru a pagina memoria RAM. Un exemplu de conectare
a unei memorii externe de 2KB folosind paginarea este prezentată în figura de
mai jos:

Figura 15. Conectarea memoriei de date externe

În acest caz CPU utilizează memoria ROM internă. Portul P0 servește ca


magistrală de adrese/date multiplexată în timp pentru memoria RAM, iar 3
linii ale portului P2 sunt utilizate pentru a pagina memoria RAM. CPU
____ ____
generează semnalele RD și WR necesare pentru accesarea memoriei RAM
externe, utilizând două linii ale lui P3. Dacă memoria program este internă,
ceilalți biți ai portului P2 sunt disponibili ca linii de I/O.
Pinii externi ai microprocesorului

Pinii externi ai microprocesorului pot fi grupaţi în următoarele


categorii:
1. Pini pentru semnalele de adresă
2. Pini pentru semnale de date
3. Pini pentru semnale de comandă
4. Pini pentru semnale de întrerupere
5. Pini pentru semnale de arbitrare a magistralei
6. Pini pentru alimentare şi ceas
7. Pini pentru semnale de stare
8. Pini pentru alte tipuri de semnale

Pinii externi ai microprocesorului I8086

Microprocesorul I8086 are 40 de pini, mulţi dintre aceştia având


funcţii multiple.
Microprocesorul poate fi configurat să lucreze în două moduri:
- modul minim, atunci când pinul MN / MX este în starea
HIGH (acest mod este utilizat pentru sistemele cu un
singur procesor)
- modul maxim, atunci când pinul MN / MX este în starea
LOW (se foloseşte pentru sistemele cu mai multe
procesoare).
Semnificaţia pinilor este următoarea:
AD0  AD15 - 16 linii de adresă şi date multiplexate în timp. În timpul
primei perioade de ceas (microprocesorul are 4 perioade de ceas: T1
până la T4) a unui ciclu de acces la magistrală, aceste linii conţin cei
mai puţin semnificativi 16 biţi de adresă. În timpul celorlalte perioade de
ceas, aceste linii sunt utilizate ca linii de date.
A16 / S 3  A19 / S 6 - 4 linii de adresă şi stare multiplexate în timp. În
timpul primei perioade de ceas, aceste linii conţin cei mai semnificativi
4 biţi de adresă (A16 ÷ A19). Ele formează împreună cu liniile A0 ÷
A15 o adresă pe 20 de biţi. În celelalte perioade de ceas, aceste 4 linii
conţin informaţie de stare (S3 ÷ S6).
S 3, S 4 - specifică tipul registrului segment utilizat pentru adresare
(furnizează biţii de adresă pentru determinarea segmentului de memorie
utilizat).

S4 S3 Segment utilizat
0 0 Extra Segment
0 1 Stack Segment
1 0 Code Segment
1 1 Data Segment

S 5 - reflectă starea fanionului de întreruperi al microprocesorului (S5


=IF).
S 6 - indică ocuparea magistralelor de câtre U.C. (unitatea centrală).
Această linie este în starea LOW (0) dacă microprocesorul controlează
magistrala sistem şi va comuta în timpul unui ciclu HOLD, când
microprocesorul cedează controlul magistralelor unui alt circuit.
BHE / S 7 - În timpul primei perioade de ceas a execuţiei unei
instrucţiuni această linie este utilizată ca BHE (Bus High Enable).
BHE  0 în timpul secvenţei de citire, scriere sau acceptare a
întreruperii, în care datele trebuie transferate pe cei 8 biţi mai
semnificativi ai magistralei de date. Acest semnal este utilizat împreună
cu linia de adrese A0 pentru a selecta blocurile de memorie (determină
tipul transferului).

BHE A0
0 0 Se transferă un cuvânt pe 16 biţi
0 1 Se transferă un octet pe D15-D8
1 0 Se transferă un octet pe D7-D0
1 1 Nu are loc transfer

RD - semnal de ieşire, activ în starea LOW - utilizat pentru citirea


datelor dintr-o locaţie de memorie sau de la un dispozitiv de tip I/O.
READY - semnal de intrare, care indică faptul că memoria sau
dispozitivul I/O selectat este gata (pregătit) să realizeze operaţia de
transfer a datelor. Acest semnal este furnizat de generatorul de ceas
8284, pe baza semnalelor asincrone RDY1 sau RDY2 . Dacă linia
READY este în starea LOW, 8086 va intra în starea de aşteptare
(WAIT) până când semnalul READY trece în starea HIGH.
TEST - este un semnal de intrare, testat în timpul execuţiei instrucţiunii
WAIT. La execuţia unei instrucţiuni WAIT, microprocesorul 8086
citeşte starea liniei TEST : dacă aceasta este 0, execuţia continuă; dacă
nu, microprocesorul intră într-o stare de repaus ("Idle") până la trecerea
în 0 a liniei TEST .
INTR - linie de intrare pentru cererile de întrerupere, testată de
microprocesor în ultima perioadă de ceas a fiecărei instrucţiuni. Dacă
bitul de activare a întreruperilor este în 1 şi INTR este în starea HIGH,
atunci microprocesorul 8086 va executa o secvenţă de acceptare a
întreruperii şi transferă controlul rutinei corespunzătoare de tratare a
întreruperii. În caz contrar, microprocesorul trece la execuţia următoarei
instrucţiuni.
NMI - cerere de întrerupere nemascabilă (linie de intrare). Este activă
pe tranziţia pozitivă a semnalului (de la LOW la HIGH ), iniţiind
întreruperea la sfârşitul instrucţiunii curente.
RESET - semnal de iniţializare, generat de circuitul de ceas 8284.
Trebuie să fie activ (în 1) cel puţin 4 perioade de ceas. Întrerupe orice
activitate a microprocesorului, acesta reluându-şi activitatea când
RESET trece în zero.
HOLD - semnal de intrare, activ pe 1, produs de logica externă, prin
care se solicită microprocesorului trecerea în starea HOLD, stare în care
microprocesorul cedează controlul magistralelor controllerului DMA
(Direct Memory Access). Microprocesorul trece în starea HOLD după
terminarea ciclului maşină curent, confirmând aceasta prin semnalul
HLDA.
HLDA - acceptarea cererii de HOLD - este un semnal de ieşire, generat
de microprocesor, prin care se confirmă acceptarea transferului DMA.
WR - semnal de ieşire, utilizat în operaţiile de scriere în memorie sau
într-un port I/O.
M / IO - semnal de ieşire, utilizat pentru discriminare între operaţiile de
acces (citire sau scriere) la memorie ( M / IO  1 ) sau la porturi I/O
( M / IO  0 ).
DT / R - semnal de ieşire utilizat pentru comanda sensului transferului
datelor prin circuitele 8286/8287. Dacă DT / R  1 , datele sunt plasate
de microprocesor pe magistrala sistem. Daca DT / R  0 , datele de pe
magistrala sistem sunt preluate (recepţionate) de microprocesor.
DEN - este utilizat pentru activarea transferului prin circuitele
8286/8287, sensul transferului fiind dat de semnalul DT / R .
ALE - este activ în starea T1 a fiecărui ciclu de acces la magistrale (în
timp ce o adresă validă de memorie este prezentă pe magistrala de
adrese). Este utilizat pentru memorarea adresei de pe liniile
AD0  AD15 , A16 / S 3  A19 / S 6 şi a semnalului BHE / S 7 pentru
demultiplexarea magistralelor de adrese/date şi adrese/stare.
INTA - semnal de ieşire, activ pe 0, prin care microprocesorul confirmă
acceptarea unei cereri de întrerupere.
RQ / GT i (i = 0, 1) - linii de tip cerere/răspuns, utilizate pentru
preluarea accesului la magistrala locală de câtre alte dispozitive master,
la sfârşitul ciclului curent al procesorului.
LOCK - semnal de ieşire - indică faptul că alte dispozitive master nu
vor obţine controlul asupra magistralelor atâta timp cât LOCK  0 .
Semnalul LOCK este activat de instrucţiunea cu prefixul "LOCK" şi
rămâne activ până când următoarea instrucţiune este extrasă din şirul de
aşteptare.
S 2, S1, S 0 - semnale de stare, utilizate pentru identificarea ciclului pe
magistrală.
QSi (i = 0, 1) - indică starea cozii (şirului) de instrucţiuni a
microprocesorului 8086.
Pentru a comunica cu dispozitivele externe pentru transferul
datelor sau pentru aducerea instrucțiunilor, microprocesorul 8086
execută un ciclu de magistrală. Un ciclu minim de magistrală conține
patru perioade de ceas (T).
Operațiile efectuate în cele patru cicluri de ceas pot fi sintetizate
astfel:
- În timpul primei perioade de ceas (T1), se calculează adresele pe
20 de biți, de la un registru segment și un offset (deplasament) de
pe magistrala multiplexată de adrese și date;
- În a doua stare (T2), microprocesorul elimină adresele de pe
magistală, realizând activarea liniilor AD 0  AD15 pentru citirea
datelor în timpul celui de-al treilea ciclu (T3). Totodată, în timpul
ciclului T2 , cele patru linii multiplexate comută din linii de
adresă ( A19  A16 ) în linii de stare pentru ciclul de magistrală
____ ____
( S6  S3 ). Semnalele de citire ( RD ) și scriere WR sunt ținute
în starea LOW pe o porțiune a ciclului T2 , pe tot ciclul T3 și pe o
parte din ciclul T4.
- În timpul celei de-a treia perioade T3, microprocesorul continuă să
transmită ca și ieșiri informațiile referitoare la stare (liniile
A19  A16 ) și în același timp să scrie date la ieșire sau să citească
date de intrare de pe liniile AD15  AD0 . Dacă memoria sau
dispozitivul de intrare/ieșire nu este suficient de rapid pentru a
transfera datele către microprocesor, atunci memoria sau
dispozitivul activează LOW linia de intrare READY la începutul
perioadei T3. Acest lucru forțează microprocesorul să introducă
cicluri suplimentare de ceas (starea de așteptare Tw) după T2.
Activitatea în starea suplimentară este aceeași cu cea din starea
T3. Dacă dispozitivul I/O are suficient timp să realizeze
transferul, activează HIGH linia de intrare READY. Odată cu
terminarea ciclului suplimentar, microprocesorul execută ciclul
de magistrală T4. Dacă nu este activată nici o stare de așteptare
(WAIT), microprocesorul va stoca datele de pe liniile
AD15  AD0 din timpul ultimei stări de tipul WAIT.
- În timpul perioadei T4, microprocesorul dezactivează liniile de
comandă, precum și memoria sau dispozitivul de I/O de la
magistrale. Ciclul de magistrală se termină cu această stare.
______ __
- Pinii DEN și DT / R sunt utilizați pentru transferul datelor. În
______
timpul ciclului de citire, pinul DEN este în starea LOW pe o
__
porțiune a ciclului T2 și în tot ciclul T3. Pinul DT / R este în
starea LOW în toate cele patru cicluri de ceas. Microprocesorul
folosește acest pin să recepționeze date în timpul ciclurilor T3 și
T4. În timpul unei secvențe de scriere, microprocesorul ține în
______
starea LOW pinul DEN în timpul unei părți a perioadei T1, pe
toată perioada T2 și T3, respectiv a unei părți din perioada T4.
__
Microprocesorul trece în starea HIGH linia DT / R în timpul
celor patru cicluri de magistrală pentru a scrie data în timpul
perioadelor T3 și T4.

Pinii externi ai microprocesorului I80386

Microprocesorul I80386 are 132 de pini dispuşi într-un format de


tipul PGA (Pin Grid Array).
I80386 are 20 de pini de alimentare şi 21 de pini de masă.
Prezenţa acestor pini multipli are ca efect reducerea zgomotului. CLK 2
furnizează semnalul de ceas pentru microprocesor. Microprocesorul este
iniţializat prin activarea pinului RESET . Acesta trebuie să fie activ cel
puţin 15 perioade de ceas. Semnalul RESET este senzitiv pe nivel.
Ceasul şi semnalele de iniţializare este generat de circuitul 82384.
D0  D31 - magistrală de date pe 32 de biţi. Microprocesorul 80386 poate
transfera prin intermediul acestei magistrale date de 16 sau 32 de biţi.
Transferul de date prin magistrală se face în funcţie de activarea
pinilor BE 0  BE 3 :

BE 0 BE 1 BE 2 BE 3
0 - - - Se transferă un octet pe D7-D0
- 0 - - Se transferă un octet pe D15-D8
- - 0 - Se transferă un octet pe D23-D16
- - - 0 Se transferă un octet pe D31-D24

Pentru transferul a 1 până la 4 octeţi de date se pot activa unu sau mai
mulţi pini.
A2  A31 - pini de adrese. Împreună cu semnalele de activare BE 0  BE 3
sunt folosiţi pentru generarea adreselor memoriei fizice sau porturilor de
I/O. Prin intermediul acestor pini, 80386 poate adresa direct până la
4GB de memorie fizică (de la adresa 00000000h până la FFFFFFFFh).
W / R, D / C, M / IO, LOCK - pini de ieşire ce specifică tipul ciclului de
magistrală executat de 80386.
W / R - când este în starea HIGH, specifică ciclu de scriere, iar când
este în starea LOW specifică ciclu de citire.
D / C - când este în starea HIGH identifică un ciclu de date, iar când
este în starea LOW identifică un ciclu de control.
M / IO - face distincţia între ciclurile de memorie şi cele ale porturilor
de I/O.
Pinii W / R, D / C şi M / IO definesc un ciclu de magistrală primar.
Aceste semnale sunt valide când ADS (address status output) este activ.

M / IO D/C W /R Tipul ciclului de magistrală

0 0 0 Acceptarea unei întreruperi


0 1 0 Citire date din porturile de I/O
0 1 1 Scriere date în porturile de I/O
1 0 0 Citire ROM
1 1 0 Citire RAM
1 1 1 Scriere RAM

Semnalele magistralei de control sunt: ADS (starea adreselor),


READY (confirmarea transferului), NA (solicitarea următoarei adrese)
şi BS16 (magistrală de dimensiunea 16).
Dacă ADS  0 , atunci vom avea un ciclu de magistrală valid
( W / R, D / C, M / IO ), precum şi semnalele magistralei de
activare/adrese ( BE 0  BE 3 , A2  A31 ).
Dacă READY  0 în timpul unui ciclu de citire sau a ciclului de
acceptare a unei întreruperi, microprocesorul transferă în latch-uri datele
de intrare la pinii de date şi termină ciclul. Dacă READY  0 în timpul
unui ciclu de scriere, 80386 termină ciclul de magistrală .
Pinul NA este activat de hard-ul extern ce solicită adresarea de tip
pipeline. Intrarea BS16 permite microprocesorului interfaţarea cu
memorie sau porturi de I/O de 16 sau 32 de biţi. Pentru memorii sau
porturi de 16 biţi, BS16  0 , iar 80386 foloseşte magistrala de date
D15  D0 . Pentru memorii sau porturi de 32 de biţi BS16  1 .
Pinii HOLD şi HLDA sunt semnale ale magistralei de arbitrare şi
sunt utilizate pentru transferul DMA. Pinii PEREQ, BUSY şi ERROR
sunt utilizaţi pentru interfaţarea cu un coprocesor (80287 sau 80387).
Pinii INTR (mascabil) şi NMI (nemascabil) sunt pini de
întrerupere. Când INTR este activ şi dacă bitul IF al fanionului
EFLAGS este 1, microprocesorul (atunci când este gata) răspunde la
INTR prin realizarea a două cicluri de acceptarea a întreruperii, iar la
sfârşitul celui de-al doilea ciclu trimite în latch un vector de 8 biţi pe
D7  D0 pentru identificarea sursei întreruperii.
Sistemul intrărilor şi ieşirilor

Componentele intrare/ieşire (I/O) de pe o placă sunt responsabile


pentru transferul informaţiilor de la şi spre placa la care dispozitivele
I/O sunt conectate.
Placa I/O poate conţine: componente de intrare ce aduc informaţia
de la un dispozitiv de intrare către procesor, componente de ieşire ce
preiau informaţia de la procesor şi o transmit către un dispozitiv de
ieşire, sau componente ce realizează ambele operaţii.

Dispozitivele de intrare/ieşire pot fi grupate în următoarele


categorii:
 Dispozitive de reţea şi comunicaţii
 Dispozitive de intrare (tastatură, mouse, telecomandă)
 Dispozitive de ieşire şi grafice (ecranele tactile, monitoare,
imprimante, LED-uri)
 Dispozitive de stocare (controllere optice de disc, controllere
magnetice de disc)
 Dispozitive de depanare (BDM – mod de depanare în
background, JTAG – metodă de accesare a memoriei şi a
resurselor procesorului fără ca vreo aplicaţie să ruleze pe
acestea, port serial, port paralel)
 Dispozitive variate şi de timp real (timere/numărătoare, CAN-
uri, CNA-uri, comutatoare).
Organizarea hard a dispozitivelor de I/O poate include câteva
unităţi, cum ar fi:
 Mediul de transmisie – un mediu wireless sau cablat,
conectând dispozitivul de I/O la placă, pentru comunicaţiile de
date.
 Portul de comunicare – modul în care se conectează la placă
mediul de transmisie (în cazul semnalului wireless, acesta
recepţionează un semnal wireless).
 Interfaţă de comunicare – realizează administrarea
comunicaţiilor de date dintre procesor şi dispozitivele de I/O
(controller-ul I/O), fiind responsabilă pentru codificarea şi
decodificarea datelor. Această unitate poate fi integrată la
nivelul procesorului sau poate fi o unitate separată.
 Un controller de I/O - practic un procesor slave ce conduce
dispozitivele de I/O.
 Magistrale de I/O – conectează procesorul de placa I/O.
 Procesor integrat – joacă rol de procesor master pentru
întreaga arhitectură.

Arhitectura actuală a sistemului intrărilor şi ieşirilor ce presupune


implementarea pe o placă integrată, fără utilizarea conectărilor şi a
porturilor, sau utilizarea unui controller al dispozitivelor de I/O, este
dependentă de tipul dispozitivului la care acesta este conectat sau
localizat pe placa integrată.
Desigur, factori cum ar fi flexibilitatea şi fiabilitatea, joacă un rol
important în proiectarea sistemului intrărilor/ieşirilor.

Plăcile de I/O pot fi grupate şi în funcţie de modul în care


transmit/recepţionează datele, astfel: seriale, paralele sau combinate.
Dispozitive de I/O seriale
Plăcile de I/O ce transmit şi recepţionează date în mod serial sunt
construite din componente la care datele sunt stocate, transmise şi
recepţionate bit cu bit (un bit la un moment de timp). Comunicaţiile
seriale includ în cadrul sistemului de I/O un port serial sau o interfaţă
serială.
Interfaţa serială administrează transmisia şi recepţia serială a
datelor între procesorul master şi dispozitivul de I/O sau controller-ul
acestuia. Interfaţa include buffere de recepţie şi transmisie pentru
stocarea, codificarea sau decodificarea datelor. Structurile de transmisie
şi recepţie serială a datelor diferă prin direcţia datelor, precum şi prin
procesul de recepţie/transmisie. Datele pot fi transmise între două
dispozitive în unul din următoarele moduri: într-o singură direcţie, în
ambele direcţii, dar la momente diferite, deoarece împart aceeaşi linie de
transmisie, şi simultan în ambele direcţii. Comunicaţia serială a datelor
utilizează o structură simplex (fluxurile de date pot fi doar transmise, şi
deci recepţionate într-o singură direcţie). O structură half duplex este
aceea în care fluxurile de date pot fi transmise şi recepţionate în orice
direcţie, dar numai într-o singură direcţia la un anumit moment de timp.
O structură full duplex este aceea ce permite transmisia şi recepţia
datelor simultan în orice direcţie.
Transferul datelor poate fi făcut în mod sincron (datele se transmit
într-un flux continuu la intervale regulate date de ceasul procesorului)
sau în mod asincron (transferul datelor se face intermitent la intervale
aleatoare).
În transferul asincron, datele sunt transmise, sunt stocate şi
modificate în interiorul buffer-ului interfeţei seriale de transmisie.
Interfaţa serială a transmiţătorului împarte fluxul de date în pachete (de
regulă 4 sau 8 biţi per pachet). Pachetele sunt încapsulate în frame-uri,
pentru a fi transmise separat. Frame-urile sunt pachete modificate de
interfaţa serială pentru a include un bit de START şi un bit de STOP. În
unele cazuri, poate fi adăugat şi un bit de paritate. Un exemplu de
interfaţă serială asincronă este UART (receptor-transmiţător asincron
universal).

În modul sincron de transmisie, nu există biţi de START sau


STOP, adăugaţi la fluxul de date şi nici perioadă de repaus (Idle). În
schimb, vitezele de transmisie şi recepţie a datelor trebuie să fie
sincronizate. În modul sincron există un singur ceas comun pentru
recepţie şi transmisie. Un exemplu de interfaţă serială sincronă este SPI
(interfaţă periferică serială).
Porturile seriale sunt interfeţe de comunicaţie seriale (COM-uri)
utilizate în general pentru a conecta dispozitivele de I/O de pe placă cu
cele externe. Interfaţa serială realizează, de asemenea conversia datelor,
ce vin la/de la portul serial, în date pe care circuitul logic al procesorului
le poate prelucra.

Dispozitive de I/O paralele


Componentele ce transmit date în paralel sunt dispozitive ce pot
transfera mai mulţi biţi simultan.
Interfaţa paralelă administrează transmisia şi recepţia paralelă a
datelor între procesor şi alte dispozitive de I/O. Aceasta este
responsabilă şi pentru decodificarea biţilor de date recepţionaţi la pinii
portului paralel, precum şi pentru codificarea datelor transmise de
procesor către pinii portului paralel.
Interfaţa include buffere de recepţie şi transmisie pentru stocarea
şi manipularea datelor ce sunt transferate.
Din punctul de vedere al direcţiei de transmitere a datelor,
dispozitivele de I/O paralele utilizează cele trei moduri: simplex, half-
duplex şi full-duplex.
De asemenea, porturile paralele pot transmite datele sincron sau
asincron. Capacitatea de transmitere a datelor în acest caz este mai
mare decât în cazul dispozitivelor de I/O seriale, datorită transmiterii sau
recepţiei simultane a mai multor biţi.
Exemple de plăci I/O ce transmit sau recepţionează date paralel
sunt: controllere IEEE 1284 pentru dispozitive de tipul
imprimantă/display-uri, porturi CRT sau SCSI (dispozitive de stocare).
Transferul datelor între microcomputer şi dispozitivele de I/O se
poate realiza prin:
1. Utilizarea dispozitivelor de I/O programabile
2. Utilizarea dispozitivelor de I/O întreruptibile
3. Utilizarea unui DMA (direct memory acces)

Dispozitive de I/O programabile


În acest caz microcomputerul comunică cu dispozitivul extern
prin intermediul a unu sau mai porturi de I/O.
Pentru anumite tipuri de dispozitive, fiecare bit al portului poate fi
configurat individual fie ca intrare, fie ca ieşire. Pentru alte tipuri de
dispozitive, toţi biţii portului sunt setaţi ca biţi de ieşire paralelă sau
intrare paralelă. Fiecare port poate fi configurat ca port de intrare sau
ieşire prin intermediul unor registre numite “comandă” sau “registru de
direcţie a datelor”. Registrul direcţiei datelor este un registru de ieşire la
care fiecare bit din port poate fi configurat ca intrare sau ieşire.
Un registru al direcţiei datelor pe 8 biţi ce conţine 34H, poate fi
definit astfel:

Valoarea 34H (0011 0100) este trimisă la ieşire, prin urmare biţii
0, 1, 3, 6 şi 7 sunt setaţi ca intrări, iar biţii 2, 4 şi 5 ca ieşiri.
Microcomputerul poate trimite data către un dispozitiv extern, de
exemplu un LED conectat la pinii 2, 4 şi 5 printr-o interfaţă
corespunzătoare.
Prin intermediul intrărilor definite anterior, microcomputerul
poate citi starea dispozitivelor externe, cum ar fi comutatoarele.
Pentru dispozitivele de I/O paralele, există doar un singur registru
al direcţiei datelor, cunoscut sub numele de “registru comandă”. Un bit
special din acest registru este utilizat pentru configurare tuturor biţilor
portului ca intrări sau ieşiri.

Porturile de I/O sunt adresate folosind tehnicile standard I/O sau


memory-mappped I/O . Tehnica standard I/O foloseşte un pin de ieşire
(de ex. pinul M / IO ) pentru a realiza discriminarea între memorie şi
porturile de I/O. Pentru lucrul cu porturile există două instrucţiuni: IN şi
OUT.
În cazul memory-mapped, microprocesorul nu realizează
discriminarea între memorie şi porturi. În schimb, procesorul foloseşte o
porţiune a adreselor memoriei pentru a reprezenta porturile de I/O.
Porturile de I/O sunt reprezentate ca şi părţi ale adreselor memoriei
principale a procesorului, fiind accesate prin instrucţiuni de tipul MOVE
caracteristice lucrului cu memoria.

Dispozitive de I/O întreruptibile


Un dispozitiv de I/O întreruptibil este un dispozitiv ce iniţiază un
transfer intrare-ieşire. Dispozitivul extern este conectat la un pin numit
pin de întrerupere (INT) de pe cipul procesorului. Dacă dispozitivul
iniţiază un transfer, atunci va activa acest pin. La activarea pinului,
microcomputerul termină instrucţiunea curentă şi salvează conţinutul
numărătorului program şi a registrului de stare în stivă. După aceste
operaţii, microcomputerul, încarcă o adresă în numărătorul program,
către o subrutină de deservire a întreruperii. Acest program este scris de
către programator.
Ultima instrucţiune a acestui program este RETURN. Aceasta are ca
efect încărcarea numărătorului program şi a registrului de stare cu
valorile salvate în stivă.
Există trei tipuri de întreruperi: întreruperi externe, întreruperi
interne şi întreruperi soft. Întreruperile externe sunt iniţiate prin
intermediul pinilor de întrerupere ai microprocesorului. Întreruperile
externe pot fi la rândul lor împărţite în întreruperi mascabile şi
întreruperi nemascabile. Întreruperile nemascabile nu pot fi activate sau
dezactivate prin instrucţiuni, în timp ce pentru întreruperile mascabile
există instrucţiuni pentru activarea şi dezactivarea acestora. De exemplu,
microprocesorul 8086 poate activa şi dezactiva întreruperile mascabile
prin execuţia unor instrucţiuni de tipul CLI (clear interrupt flag) sau STI
(set interrupt flag). Întreruperile nemascabile au prioritate mai
mare decât întreruperile mascabile. Întreruperile nemascabile sunt
utilizate de obicei la o întrerupere generată de căderea tensiunii.
Subrutina de deservire a întreruperii poate fi stocată într-o memorie
nevolatilă cum ar fi o baterie de recuperare CMOS RAM.
Procesorul 8086 furnizează o întrerupere mascabilă cu
confirmare. Întreruperea este implementată prin utilizarea a doi pini:
INTR şi INTA . Atunci când pinul INTR este activat de către un dispozitiv
extern, procesorul termină instrucţiunea curentă, salvează în stivă
numărătorul program în stivă şi generează un semnal de acceptare a
întreruperii ( INTA ). Ca răspuns la semnalul INTA , dispozitivul extern
generează un număr pe 8 biţi, citit de procesor şi utilizat pentru a
identifica subrutina de deservire a întreruperii.
Întreruperile externe sunt întreruperi activate intern de către
condiţii excepţionale cum ar fi: depăşiri, împărţiri prin zero, sau execuţia
unui op-cod ilegal. Utilizatorul poate scrie o rutină de deservire pentru a
indica situaţia apărută, şi de asemenea de a deservi întreruperea.
Majoritatea procesoarelor includ întreruperi soft sau apelări de sistem.
Instrucţiunile întreruperilor soft sunt de obicei utilizate pentru apelarea
sistemului de operare.

DMA
Accesul direct la memorie (DMA) este o tehnică ce transferă date
între memoria microcomputerului şi dispozitivele de I/O fără implicarea
microprocesorului. DMA este utilizată în transferul blocurilor mari de
date între dispozitivele periferice (de ex. hard disk) şi memorie. Tehnica
DMA foloseşte un controller DMA pentru operaţiunile de transfer ale
datelor. Principalele funcţii ale controllerului DMA sunt:
 Dispozitivele de I/O solicită operaţie de tipul DMA prin
intermediul liniei de cerere DMA a controllerului
 Controllerul activează pinul HOLD al microprocesorului,
solicitând acestuia să elibereze magistrala
 Microprocesorul răspunde cu semnalul HLDA , indicând că
magistrala este dezactivată. Controllerul DMA plasează
valoarea curentă a registrelor sale interne, cum ar fi registrul
adreselor şi numărătorul, pe magistrală, trimiţând în acelaşi timp
o confirmare către dispozitivul periferic. Controllerul DMA
termină transferul DMA.
În mod uzual, un transfer de tipul DMA începe printr-o cerere pe
linia DMA conectată la circuitul controllerului DMA. După secvenţa de
semnale HOLD / HLDA / DMA ACK dintre microprocesor şi controller,
acesta preia controlul magistralei, controlând datele transferate între
RAM şi dispozitivele de I/O. La terminarea transferului, controllerul
întrerupere microprocesorul prin linia INT şi returnează magistrala
microprocesorului prin dezactivarea semnalelor HOLD şi DMA ACK .
Controllerul DMA are, în mod obişnuit cel puţin trei registre ce
sunt selectate de linia registrului de selecţie (RS): un registru al
adreselor, un registru al numărătorului şi un registru de stare. Atât
registru adreselor cât şi registru numărător sunt iniţializate de
microprocesor. Registrul adreselor conţine adresa de început a datelor ce
vor fi transferate, iar registrul numărător conţine blocul dorit a fi
transferat. Registrul de stare conţine informaţii cum ar fi terminarea
transferului DMA.
Performanţele dispozitivelor de I/O
Performanţa unui dispozitiv de I/O este cel mai important aspect
pe care proiectantul unui sistem integrat trebuie să-l aibă în vedere. Cele
mai importante aspecte ce pot influenţa performanţa unui astfel de
sistem pot fi grupate astfel:
1. Vitezele de transmisie a dispozitivelor de I/O – dispozitivele pot
avea viteze diferite de transmitere a datelor. De exemplu, tastatura
sau mouse-ul transmit datele sub forma caracterelor/sec., în timp
ce alte dispozitive cum sunt unităţile de disc, reţelele transmit
datele în Mbytes/sec.
2. Viteza procesorului – viteza procesorului trebuie sincronizată cu
viteza de transmitere a dispozitivului de I/O. Dacă, dispozitivul de
I/O procesează datele mult mai încet decât viteza de transmisie a
procesorului, atunci datele se vor fi pierdute de către dispozitivul
de I/O.
3. Comunicaţia între procesor şi dispozitivul de I/O – în general
există controllere dedicate între procesor şi dispozitivele de I/O ce
administrează dispozitivele. În acest mod procesorul poate
prelucra datele într-un mod mai eficient şi mai rapid. Controller-
ul dispozitivelor poate decide, de exemplu asupra modalităţii de
întrerupere necesară sincronizării mai multor dispozitive de I/O.
Pentru sincronizarea dispozitivelor lente şi a procesorului, este
necesară prezenţa fanioanelor de stare şi întrerupere. În cazul unor
dispozitive mai rapide decât viteza procesorului, există anumite tipuri de
interfeţe (de ex. DMA) ce permite acestor dispozitive să realizeze o
operaţie de bypass asupra procesorului.
Unităţile de măsură ce definesc performanţa dispozitivelor de I/O
sunt:
 Capacitatea dispozitivelor – cantitatea maximă de date /
timp ce poate fi procesată.
 Timpul de execuţie – timpul necesar pentru procesarea
tuturor datelor.
 Timpul de răspuns sau timpul de întârziere – timpul scurs
între o cerere de procesare a datelor şi momentul în care
componenta respectivă este procesată.
Moduri de adresare a memoriei
Alegerea modurilor de adresare este o caracteristică vitală în proiectarea unui
sistem cu microprocesor, deoarece afectează în mod direct viteza de execuție, cerințele de
memorie și ușurința în programare.
Instrucțiunile cele mai comune de referire la memorie sunt similare celor ce se
adresează lucrului cu regiștrii, de exemplu: transferă, adună, scade, șterge,
complementează, etc, dar cu unul dintre operanzi și/sau rezultatul în memoria
calculatorului, de exemplu: încarcă acumulatorul cu conținutul din locația de memorie,
sau memorează conținutul registrului în locația de memorie.
1. Adresarea imediată – Instrucțiunile de adresare imediată nu sunt propriu-zis
instrucțiuni de referire la memorie. Instrucțiunile de adresare imediată de
tipul: încarcă acumulatorul cu o valoare imediată, sau adună în acumulator o
valoare imediată, sunt instrucțiuni de un cuvânt (adresă până la 13 biți) sau
intrucțiuni de două cuvinte. În fiecare mod, biții de adresă sunt interpretați ca
un operand întreg, cu sau fără semn. Instrucțiunile de adresare imediată sunt
utile pentru stabilirea adreselor de indicatori de adresă, registrelor index,
contoarelor și pentru operații cu parametrii fixați.
2. Adresarea directă – Adresarea directă chiar a unui singur operand sau a
rezultatului în memorie este neproductivă. Chiar o instrucțiune de referire la
memorie pe un cuvânt necesită două referiri la memorie, deci de regulă două
cicluri de memorie pentru citirea și execuția instrucțiunii. Din această cauză
pentru fiecare cuvânt suplimentar al unei instrucțiuni este nevoie de un acces
la memorie suplimentar, precum și de un timp suplimentar.
Adresarea directă poate irosi spații de memorie, deoarece puține instrucțiuni
de referire a memoriei adresează locații aleatoare în memorie. Locațiile tind să
se “grupeze” în programe și în structuri locale de date. În particular, multe
instrucțiuni referă cuvinte din matrici sau tabele mai mici de 256 de cuvinte..
3. Adresare paginată – Octetul sau cuvântul de adresă de instrucțiune este
interpretat ca o “deplasare” (pozitivă) față de o origine de pagină. Memoria
este împărțită în pagini succesive, spre exemplu, de 256 cuvinte sau octeți,
pentru 8 biți de adresă de instrucțiune. Locațiile 0-255 reprezintă pagina 0,
256-511 pagina 1, etc. Numărul de pagină este fie pagina curentă (acceași
pagină cu instrucțiunea curentă) sau numărul de pagină este stabilit într-un
registru de pagină, printr-o instrucțiune anterioară.
4. Adresare relativă – Octetul sau cuvîntul de adresă a instrucțiunii este
interpretat ca o deplasare pozitivă sau negativă față de locația instrucțiunii
curente. Adresarea relativă cu un octet de adresă de 8 biți este utilă în
instrucțiunile de ramificare. Adresarea relativă cu o adresă întreagă de 16 biți
este uneori utilizată pentru a înlocui adresarea directă, pentru că programele ce
conțin numai informații cu adrese relative sunt ușor de relocat în memorie.
5. Adresarea indirectă și indirectă prin registru – În cazul adresării prin
registru, instrucțiunea necesită doar 3-5 biți pentru a specifica unul din cele 8-
32 registre de indicatori de adresă care au fost anterior încărcați cu adresa
efectivă a operandului.

Registre
indicatoare
de adresă de
16 biți
Instrucțiune pe 8 biți
Registrul 1 Memoria
7 4 3 0
Registrul 2 000534
Cod de 00 10 Operand
operație Registrul 3

------
Adresa efectivă
Selectează unul a operandului
dintre cele 16
registre
indicatoare de
adresă

Modul de adresare este eficient în aplicațiile unde registrul de indicatori de


adrese este incrementat (sau decrementat) pentru a parcurge pas cu pas locațiile de
memorie ale unei matrici sau tabel.
6. Adresarea indirectă – plasează adresa efectivă a operandului într-o locație de
memorie care poate fi specificată prin orice alt mod de adresare (directă,
paginată, indirectă, prin registre etc.). Fiecare locație de memorie poate astfel
să fie utilizată ca registru indicator de adresă, dar adresarea indirectă necesită
un ciclu de memorie suplimentar pentru accesul suplimentar la memorie.
Instrucțiune

15 9 9 0
Memoria
000534 Operand
Cod de 000000111
operație

Adresa efectivă
Adresă indirectă a operandului
pe 9 biți

7. Adresarea indexată – O instrucțiune de referire indexată la memorie are un


octet sau un cuvânt de adresă al cărui conținut este adunat la conținutul unui
registru index specificat pentru a forma adresa efectivă a operandului. O
aplicație tipică este accesul la un operand dintr-o tabelă de memorie, unde:
adresă operand = adresa se început a tabelei + o deplasare

0 7 8 11 12 15 0 15
Format registru-memorie indexat și
format registru imediat Cod de Registru Registru Cuvînt de adresă
operație index

Conține adresa relativă indexată sau


imediată sau numărul de deplasări

8. Operații pe stivă în memorie – Rezultatele intermediare ale operațiilor


aritmetice și de sortare, ca și adresele de întoarcere din subrutine și întreruperi
sunt memorate și regăsite într-o anumită ordine (de regulă ultimul venit –
primul ieșit - LIFO). Acest lucru este realizat prin adăugarea și scoaterea de
cuvinte sau octeți din vârful unei stive de locații din memoria calculatorului.
Operațiile de adăugare (push) și scoatere din stivă (pop) sunt exemplificate în
figura următoare.
Adresele D
descresc în 212
sus 214 C
214
214 C Indicator C
214 de adresă 214 Indicator

Indicator
stivă de adresă B
stivă 216
de adresă B B
stivă 216 216
A
218
A A
218 218
220
220 220
Pune în stivă Scoate din stivă

Stiva începe cu locația 218 și se construiește în jos - adresele de memorie sunt


mai mici spre vârful stivei. Indicatorul de adresă al stivei este inițial încărcat cu adresa
220, 218 sau 220=218+2 este referit ca bază a stivei. Putem pune în stivă mai multe
elemente, indicatorul de adresă al stivei este lăsat totdeauna să indice la elementul din
vârful stivei.

Operații de intrare/ieșire programate

Calculatoarele de capacitate mică transmit și recepționează de obicei cuvintele sau


octeții de date pe magistrale paralele de 4 la 18 biți. Acest lucru înseamnă că biții de date
sunt transmiși simultan în vederea creșterii vitezei de operare.
Liniile magistralelor de date se conectează la magistralele procesorului prin
intermediul unor amplificatoare-tampon (amplificatoare de magistrală și receptoare de
magistrală pentru fiecare bit de date) și astfel se conectează cu registrele procesorului.
Liniile de date pot fi bidirecționale sau pot exista magistrale separate de intrare și ieșire.
Totuși, majoritatea sistemelor de interfață utilizează o magistrală de intrare/ieșire cu mai
multe linii specializate. În acest caz toate dispozitivele externe care recepționează sau
transmit cuvinte de date sunt conectate la o magistrală de date paralelă, conectată la un
registru al procesorului printr-o logică corespunzătoare. Semnalele logice de comandă
pentru selectarea unui anumit dispozitiv și a funcției ce urmează a fi efectuată (transmisie
sau recepție) precum și pentru sincronizarea transferurilor de date cu ciclul de operare al
calculatorului sunt transmise pe linii separate ale magistralei.

Calculator
Linii (nivele) de selectare a echipamentului
Comandate prin
registrul de 1,2 sau 3
impulsuri
instrucțiuni temporizate

Impulsuri de transfer
Selector de Selector de
de I/E sincronizate
echipament echipament
de selectoarele de
Selectare externă
Selectare externă
echipament
Linii de date
Date de la sau
spre acumulator
sau memorie
Date transferate spre sau de la Date transferate spre sau de la
registrul echipamentului 1 registrul echipamentului 2

Dacă se utilizează amplificatoare de magistrală cu trei stări, atunci semnalele


provenind de la surse diferite, pot utiliza fiecare, pe rând aceleași linii ale magistralei. Cu
amplificatoare de magistrală de nivel TTL (vezi figura de mai jos), asemenea semnale
sunt inversate pe magistrală, astfel încât semnalele inversate sunt trecute printr-un circuit
SAU logic realizat cu circuite amplificatoare cu colector deschis.

+ 5V

Magistrală

125 Închis
16 Ω Deschis
100 pF
În cazul unei magistrale sincrone datele de I/O se vor transfera spre sau dintr-un
registru al procesorului ca răspuns la o instrucțiune programată de I/O, ce conține codul
de 6 biți al adresei dispozitivului selectat ca parte componentă a celor 16 biți ai
cuvântului-instrucțiune. Biții individuali ai cuvântului-instrucțiune determină selectarea
dispozitivului și semnalele pe liniile de comandă ale unei magistrale de I/O cu linii
specializate:
a. Biții 0 – 4 indică procesorului care instrucțiune de I/O este dorită. Unul dintre
acești biți poate să selecteze o operație de citire (READ) sau scriere (WRITE),
sau se lasă această decizie în seama unei intrări logice de la echipamentul
periferic.
b. Biții 5 – 10 sunt biții de adresă ai dispozitivului, utilizați pentru selectarea
acestuia. Când aceste linii transferă codul de selecție al dispozitivului asociat
unui anume echipament, selectorul de dispozitiv (porți decodificatoare ȘI),
acceptă și transmite un set de impulsuri succesive de comandă, utilizate pentru
efectuarea transferului de date și a altor operații în dispozitivul selectat,
operații determinate de biții 13 și 15 ai instrucțiunii.
c. Biții 11 și 12 sunt biți de comandă, biți de selecție sau biți de subselecție
pentru echipamente multidispozitiv. Nivelurile corespunzătoare celor două
linii pot fi utilizate pentru selectarea unui dispozitiv suplimentar sau pentru
selectarea diverselor funcții ce urmează a fi efectuate de un anumit
echipament.
d. Biții 13, 14 și 15 produc impulsuri de comandă succesive pe trei linii de
comandă. Un impuls apare dacă bitul corespunzător este 1.
O instrucțiune de I/O de 16 biți poate selecta unul din 211  2048 dispozitive
și/sau funcțiuni posibile ale dispozitivului prin diferite combinații ale biților de adresă,
biților de control și impulsurilor de comandă.
Acest sistem necesită 4 cicluri complete de memorie pentru fiecare operație de
I/O, unul pentru extragerea instrucțiunii din memorie și câte unul pentru fiecare impuls
I/O. Cea mai frecventă utilizare a impulsurilor de comandă trecute prin porți de selecție a
dispozitivului periferic este transferul de date spre și dinspre procesor. În acest caz,
impulsurile I/O sunt sincronizate cu ciclul de operare al procesorului, respectiv cu
disponibilitatea calculatorului de a accepta sau transmite date.

Codul Biții
operației Selectare
spre procesor 0-4 Logica de selectare externă
echipament
1 dacă este
Biții selectat
5-10 Amplificatoare
Impulsuri de
emițătoare de comandă
Biții magistrală pentru
temporizare,
11,12 transfer, etc.
1

Biții Generatoare 2
13-15 de impulsuri
3
Cuvântul instrucțiune de 16 biți așa
cum apare în instrucțiunile Cablu de I/O
Ceasul
procesorului și în registrele pentru procesorului
memoria de date

Pentru un transfer de date pe o magistrală sincronă, adresa și un impuls I/O


trebuie să ajungă la dispozitivul periferic, respectiv datele trebuie să fie disponibile și
transmise pe întreaga lungime a magistralei într-un interval fix de timp ce se stabilește
pentru o instrucțiune de I/O. Această condiție restrânge timpul acordat operațiilor de
transfer de date într-un dispozitiv selectat și, de asemenea limitează lungimea magistralei
de I/O.
Un sistem cu magistrală asincronă elimină aceste restricții. În locul unei
sincronizări rigide cu ceasul, transmisia impulsurilor de I/O și terminarea instrucțiunilor
corespunzătoare sunt sincronizate prin semnale de sincronizare reciprocă, retransmise
dinspre dispozitiv, astfel încât să se asigure efectuarea completă a fiecărui transfer de
date. Interfețele pentru magistrale asincrone sunt puțin mai complicate, dar acestea pot
lucra simultan cu dispozitive având viteze de transfer foarte diferite, inclusiv cu diverse
tipuri de memorii. Magistralele asincrone pot fi extinse cu ajutorul unor amplificatoare de
memorie tampon (extensii de magistrală). Întârzierile suplimentare care apar pot încetini
operațiile, dar nu ridică probleme de sincronizare.
Procesor Dispozitiv

Linii de adresă Selector de


ale magistralei dispozitive
(decodificator de
adresă)

_______ Impuls I/O


MSYN MSYN

_______ Întârziere de x sec.


SSYN SSYN

_______
Activare semnal SSYN

Funcționarea unei astfel de interfețe poate fi sintetizată astfel: procesorul trimite


adresa dispozitivului periferic și, după un interval de timp necesar stabilizării adresei și
________
ieșirii selectorului de dispozitiv, este transmis pe magistrală un impuls I/O - MSYN .
După un interval de timp, necesar operațiilor simple de scriere de date, selectorul
dispozitivului periferic activat permite transmiterea înapoi, spre procesor a unui semnal
________ ________
denumit SSYN . În continuare, dispozitivul poate întârzia retransmiterea lui SSYN , prin
________
plasarea unui semnal logic 0 pe linia de activare a semnalului SSYN , până ce operația
________
inițiată de MSYN este terminată (de exemplu se permite transferul cu întârziere a unor
date sau se realizează o operație de citire din memoria internă).
________
La recepția lui SSYN , procesorul șterge MSYN și, după un interval de timp
înlătură semnalele de adresă și comandă (și datele, dacă a fost realizată o operație de
scriere). Este permisă începerea unui nou ciclu de instrucțiuni numai după ce semnalul
________
șters MSYN este retransmis procesorului ca SSYN  1 .
Dacă retransmiterea lui SSYN  0 este întârziată în mod excesiv (datorită unei
funcționări incorecte sau a adresării unui dispozitiv inexistent), un circuit care păstrează
evidența timpului scurs și sesizează depășirea unui interval maxim admisibil, va avertiza
utilizatorul printr-un semnal de întrerupere.
Liniile de comandă, adresă și date ale unei magistrale asincrone pot fi folosite, de
asemenea, pentru transferuri asincrone de date între memorie și dispozitivele de I/O, dar
și pentru transferuri de adrese de întrerupere și pentru accesul direct la memorie. Este
posibilă, de asemenea, multiplexarea datelor și adreselor.
Sisteme de întreruperi
Într-un sistem de întreruperi, un nivel logic al indicatoarelor de stare a
dispozitivului (CERERE DE TRATARE A ÎNTRERUPERII) întrerupe programul după
terminarea instrucțiunii curente. Linia de întrerupere este testată pe parcursul execuției
instrucțiunii curente prin cod sau prin hardware. Dacă sistemul de întreruperi este activat
o cerere de tratare determina un salt automat la o subrutina de tratare a întreruperii,
imediat după ce instrucțiunea curentă este executată. Adresa rutinei de tratare a
întreruperii este plasată de programator într-o locație a unui indicator special asociat cu
sistemul de întreruperi.
La terminarea unei rutine de tratare a unei întreruperi, procesorul trebuie să revină
la programul întrerupt. Prin urmare, va fi necesară pe lângă memorarea adresei de
revenire (conținutul incrementat al numărătorului de adrese de instrucțiuni), salvarea și
restaurarea ulterioară a oricărui aspect al stării procesorului (registrul de stare) care apare
în timpul execuției programului întrerupt și care poate fi perturbat de către rutina de
tratare a întreruperilor.
Pentru memorarea automată a adreselor de revenire atât din întreruperi cât și din
subrutine, dar și a cuvântului de stare a procesorului se utilizează fie o stivă hardware, fie
o stivă software.
Într-un sistem bazat pe microprocesor (eventual un sistem de comandă), pot exista
sute de diferite întreruperi (întreruperi multiple).
Un sistem practic de întreruperi multiple va trebui să:
- asigure devierea programului spre diferite locații de memorie,
corespunzătoare unor întreruperi individuale specifice
- aloce priorități întreruperilor simultane sau succesive
- trateze cererile de întrerupere cu priorități reduse după ce rutinele cu
proporitate mai mare au fost terminate
- permită întreruperilor cu prioritate ridicată să întrerupă rutinele de
tratare cu prioritate mai mică, odată ce adresa de revenire și toate
registrele salvate sunt memorate în locații corespunzătoare.
Imbricarea întreruperilor succesive implică salvarea corectă, prin program sau
prin hardware, a nivelelor succesive de adrese de revenire, stări ale procesorului și
conținuturi ale registrelor, în vederea restaurării lor în succesiunea dorită (acest lucru
prespune utilizarea stivelor hardware și/sau software).
Circuitul de întreruperi cu mai multe nivele de prioritate asociat unui sistem de
întreruperi cu prioritate stabilită prin hardware poate fi încorporat într-un procesor sau
poate fi un circuit separat pentru sistemele cu o singură linie de întrerupere.
Procesorul permite trecerea semnalelor de la bistabilii de cerere (request) pentru
toate întreruperile, odată pe instrucțiune. În acest mod, toate liniile de cerere de tratare
(service request) își compară între ele prioritățile la același moment de timp, determinat
de procesor. Bistabilii de cerere cu intrări active vor fi stabiliți în poziția 1, iar circuitele
de arbitrare a priorității transmit un singur 1 pe linia corespunzătoare nivelului celui mai
prioritar. Logica de codificare a priorității transformă acest cod 1-din-2n într-un cod de n
biți, care determină una din cele 2n adrese ale rutinelor de tratare a întreruperilor.
Prioritățile cererilor de tratare sunt comparate în momentul emiterii impulsului de
eșantionare a priorității, de obicei o dată pe parcursul execuției unei instrucțiuni a
procesorului. Circuitele de arbitrare a priorității transmit numai cererea de pe nivelul de
prioritate cel mai ridicat, al cărui nume este codificat în vederea identificării adresei
corespunzătoare rutinei de tratare a întreruperii. Bistabilii pentru aplicarea de mască pot
să activeze sau să dezactiveze liniile individuale de cerere. Bistabilii de mască sunt
furnizați de obicei de către utilizator ca biți în registrul de comandă al interfețelor
dispozitivelor, astfel încât întreruperile asociate unui anumit dispozitiv periferic pot fi
activate sau dezactivate prin instrucțiuni programate.
Dispozitiv
Procesor
Cerere de tratare (de la
Bistabili de cerere indicatorul de stare al
dispozitivului)
Circuite de arbitrare a priorității
Q D Nivel 0
Q
C
Cod de identificare a
întreruperii R

Q D Nivel 1
Logica de Q
codificare
C
1 din 2n
R
Q D Nivel 2
Q
C
R
Q D Nivel 3
Q
C

Codificator prioritate R
Bistabili pentru aplicare
de mască
Recunoaștere

Cerere de întrerupere

Dezactivare a întreruperilor

Impuls de eșantionare a priorității

O a doua metodă pentru determinarea priorităților, presupune utilizarea unui


codificator de prioritate ce produce codul unui întreg pe n biți I  0,1, 2,
corespunzător unui număr de 2n întreruperi, cu priorități în ordine crescătoare. Acest cod
este comparat cu codul pe n biți al nivelului de prioritate K , memorat în registrul de stare
a procesorului. Cererea de întrerupere este transmisă procesorului dacă și numai dacă
I K.
În acest mod se pot controla 2n întreruperi cu numai n biți de stare dar în schimb
nu mai putem dezactiva întreruperile individuale. Putem dezactiva toate întreruperile cu
un nivel inferior nivelului 1, nivelului 2, etc.

Codul pe n biți, K , al Codul I, întreg, în binar,


nivelului de prioritate pe n biți, pentru
stabilit în registrul de identificarea cererii de
stare a procesorului Logica de întrerupere
comparare pe n
biți
Dinspre registrul
de stare a
procesorului

Cerere de întrerupere
spre procesor dacă I  K

Întreruperile interne corespund cazurilor de funcționare defectuoasă a


procesorului (cădere a tensiunii de alimentare, erori de paritate la transferurile de date în
memorie), precum și erorile de programare (adrese ilegale, depășirea stivei, etc.).
Întreruperile interne au de obicei priorități superioare întreruperilor I/O. Pentru o serie de
procesoare aceste ăntreruperi nu pot fi activate/dezactivate prin mască.
Întreruperile software sunt instrucțiuni programate care emulează o întrerupere cu
un vector specific (adresa rutinei de tratare și noul cuvânt de stare). Principala utilizare a
întreruperilor software o constituie salturile la subrutine plasate în partiții diferite de
memorie. Întreruperile software au propriile lor nivele de prioritate.
Așa cum deja s-a precizat, întreruperile reprezintă mecanismul principal utilizat
pentru partajarea unui calculator între diferite taskuri, care în mod frecvent sunt și critice
în timp. Eficiența unui sistem de întreruperi depinde e timpul necesar pentru tratarea unor
situații care pot fi critice, de numărul de întreruperi disponibile, și de flexibilitatea și
ușurința programării.
Timpul total scurs între o cerere de întrerupere și prima instrucțiune a rutinei de
tratare a întreruperii este compus din trei părți ce trebuie însumate, și anume:
1. Timpul “brut” de latență, adică timpul necesar pentru execuția
instrucțiunii procesorului cu cea mai mare lungime posibilă (inclusiv
orice adresare indirectă)
2. Timpul necesar hardware-ului sistemului de întreruperi și/sau unui
microprogram pentru a ajunge la prima instrucțiune a rutinei de tratare.
3. Timpul suplimentar utilizat de instrucțiunile “suplimentare
neproductive” necesare pentru identificarea întreruperii și salvării stării
procesorului, a registrelor, etc.
Timpul suplimentar, inclusiv timpul necesar pentru restaurarea stării procesorului
după tratarea unei întreruperi reduce viteza de răspuns a sistemului la întreruperile cu
prioritate redusă.
În cazul sistemelor de măsurare, precum și a sistemelor de comandă lucrurile pot
deveni critice, deoarece întreruperile de la ceasul de timp real, utilizate pentru
înregistrarea timpului, măsurarea unor instrumente sau pentru efectuarea unor operații de
comandă (control), nu trebuie pierdute.
În perioadele de solicitare maximă, devine utilă alocarea dinamică a priorităților
sau reducerea relativă a programului principal din calculator prin activarea prin mască a
unor întreruperi suplimentare.
Sisteme multiprocesor

Majoritatea sistemelor integrate din mediul industrial şi


comercial folosesc procesoare multiple.
Proiectarea sistemelor multiprocesor permite distribuirea
puterii de calcul între procesoarele componente.
Un sistem multiprocesor este un sistem ce conține două sau
mai multe unități centrale de procesare ce accesează aceeași
memorie RAM.
Deși, individual, procesoarele pot lucra încet, prin operarea
în paralel se accelerează viteza de procesare. Schemele de
interconectare fizică a procesoarelor pot fi de tip hipercub, inel
sau latice.
Utilizarea mai multor procesoare se datorează unui număr
de motive, cum ar fi modularitatea – de exemplu un anumit
subsistem trebuie să fie instalat numai dacă o anumită opţiune
este instalată.
Există două categorii de sisteme multiprocesor: arhitectura
centralizată și arhitectura distribuită.
Arhitectura centralizată necesită o intercomunicare între
procesoare, fiind uitilizată pentru sisteme complexe.
În cazul arhitecturii distribuite deciziile se iau la nivelul
procesoarelor periferice.
Procesoarele distribuite pot simplifica programarea.
Practic, soft-ul este împărţit în funcţii ce pot fi administrate
independent pe diferite procesoare.
De asemenea, procesoarele distribuite pot reduce costul.
Puterea de procesare a două task-uri independente pe
procesoare separate poate fi mult mai mică decât dacă un
procesor trebuie să realizeze ambele task-uri.
Procesarea paralelă presupune sincronizarea între
procesoare. Atunci când se folosește un singur spațiu de
adresare, mecanismul utilizat pentru sincronizare este o
abordare de tipul “lock” – la un anumit moment un singur
procesor poate manipula date.
Multiprocesoarele ce împart un singur spațiu de adresare
pot fi clasificate astfel:
- multiprocesoare simetrice (SMP) sau cu acces
uniform (UMA) la memorie – sunt acelea ce
realizează accesul la memoria principală în
același timp (cu aceeași viteză);
- multiprocesoare cu acces neunifom la memorie
(NUMA) – în acest caz există timpi diferiți de
acces la memorie.
Pe lîngă sistemele multiprocesor ce folosesc memorie
comună, există și varianta de sisteme la care un procesor nu
poate avea acces nicicum la memoria altuia. În acest caz
comunicația se realizează prin mesaje.
În funcție de tipul comunicării, sistemele multiprocesor
sunt organizate astfel:
- sisteme cu procesoare conectate la o singură
magistrală
- sisteme cu procesoare conectate într-o rețea.
Multiprocesoarele conectate la o singură magistrală au o
serie de avantaje, cum ar fi:
- pot fi plasate un număr mare de procesoare cu
acces la magistrală, datorită dimensiunilor
reduse,
- memoriile de tip cache (memorie tampon) pot
gestiona un trafic scăzut de magistrală,
- au fost dezvoltate mecanisme pentru a realiza
compatibilitatea dintre memorie, cache și
procesoare, respectiv memorie, cache și
dispozitivele de I/O.
Numărul de procesoare dintr-un sistem multiprocesor (în
mod uzual între 2 și 32 de procesoare) este determinat de
schimbul de informații la nivel de procesor și de lățimea de
bandă a magistralei.
Sistemele multiprocesor în care procesoarele sunt conectate
în rețea au apărut ca urmare a limitărilor, introduse de
sistemele cu procesoare conectate la o magistrală. Limitările
sunt legate de: lățime de bandă mare, întârziere mică și
lungime mare.
Procesor 1 Procesor 2 … Procesor n

Cache 1 Cache 2 … Cache n

Magistrală

Memorie Dispozitive
de I/O

Procesor 1 Procesor 2 … Procesor n

Cache 1 Cache 2 … Cache n

Memorie 1 Memorie 2 … Memorie n

Rețea

O alternativă la sistemele cu mai multe procesoare o


constituie procesoarele pe același cip. Într-o astfel de
configurație, procesoarele, în mod uzual, împart o parte din
cache și interfața memoriei externe.
Desigur, în acest caz, dispar întârzierile datorate
comunicațiilor dintre diversele procesoare.
Multithreading (execuție cu fire multiple) permite firelor
de execuție mutiple (thread) să împartă prin suprapunere
unitățile funcționale ale unui singur procesor. Pentru a permite
acest lucru, procesorul trebuie să multiplice starea
independentă a fiecărui thread (pentru fiecare thread sunt
necesare o copie separată a fișierului registru, a numărătorului
program și a tabelului de paginare). De asemenea, memoria
poate fi împărțită prin mecanismul memoriei virtuale.
Pe scurt, conceptul de multithreading extinde ideea de
multitastking la aplicații, astfel încât acestea pot fi împărțite în
operații specifice în interiorul unei singure aplicații.
Practic, două procese care execută același program au
memorii diferite, dar două thread-uri care execută același
program folosesc același segment de date.

Aplicații de măsurare și control

Achiziții de Interfața cu Sistem de


date utilizatorul control

Sistem de operare

Procesor

Nucleu 1 Nucleu 2

În figura următoare este prezentat un sistem multiprocesor


simplu pentru aplicaţii de control.

Procesorul CPU1 este utilizat pentru a interfaţa operaţiile


cu tastatura şi display-ul. Procesorul comunică cu CPU2,
utilizat pentru comunicaţiile cu sistemul gazdă de la nivelul
superior. CPU2 comunică la rândul său cu CPU3, ce
controlează în timp real motoarele şi monitorizează senzorii de
eveniment.
Tipul legăturii dintre procesoare depinde de aplicaţie.
Comunicaţia dintre CPU1 şi CPU2 poate fi o comunicaţie
bazată pe standardul RS232. Comunicaţia dintre CPU2 şi
gazdă poate fi o comunicaţie ce foloseşte orice tip de mediu, de
la RS232 până la conexiune de tipul SCSI, ethernet sau
infraroşu, în funcţie de cantitatea de date şi viteza de transmisie
a datelor. Comunicaţia dintre CPU2 şi CPU3 poate fi o
comunicaţie directă dacă ambele sunt pe aceeaşi placă.
Numărul de procesoare utilizate într-un astfel de sistem,
precum şi modul de distribuire a acestora depinde, în general,
de trei factori:
- interdependenţa sau modularitatea soft-ului
- Frecvenţa procesorului (numărul de
instrucţiuni/sec.)
- Locaţia fizică
Pentru exemplu considerat, este normal ca acelaşi procesor
(CPU3) să împartă funcţii interdependente, cum ar fi citirea
poziţiei motorului (pe reacţie negativă) de la senzori şi
controlul poziţiei motorului.
Codul poate deveni complex şi dificil dacă din schemă se
elimină CPU3. Procesorul CPU2 trebuie să mânuiască atât
mesajele spre şi dinspre gazdă, cât şi întreruperile provenite de
la senzori şi motoare.
Locaţia fizică poate determina împărţirea taskurilor.
Procesorul CPU3 poate fi situat la distanţă, în apropierea
motoarelor.

Comunicaţia dintre procesoare


Pentru sistemele multiprocesor ce conţin două sau mai
multe procesoare pe aceeaşi placă, există mai multe posibilităţi
de comunicare.
Cel mai simplu mecanism de comunicare pentru două
procesoare aflate pe aceeaşi placă este cel prezentat în figura
următoare:
Procesorul CPU2 citeşte datele prin intermediul unui strob
de citire decodificator. Cei mai puţin semnificativi biţi (biţii
D0-D6) sunt utilizaţi pentru transferul datelor, în timp ce bitul
D7 este utilizat ca strob. Atunci când CPU1 doreşte să
transmită date către CPU2, va scrie datele în registru, setând
linia de strobare.
Se observă că există două cicluri de scriere realizate de
CPU1. Pentru o scurtă perioadă de timp CPU1 poate scrie
datele în registru, concomitent cu citirea registrului de către
CPU2. CPU2 poate citi date eronate, datorate modificării
biţilor.
Pentru a preveni acest lucru, CPU1 realizează două operaţii
de scriere: prima pentru a modifica biţii de date (D0-D6), iar a
doua pentru a seta strobul. Dacă CPU1 vrea să transmită 23h,
urmat de 77h către CPU2, atunci va scrie 23h, urmat de A3h,
apoi F7h şi 77h. Prin cele două cicluri de scriere per octet se
garantează că biţii de date rămân stabili, în momentul în care
CPU2 detectează datele noi ce urmează a fi scrise.
Dezavantajul acestui mod de comunicare este viteza. De
asemenea nu se poate garanta că CPU2 a citit datele. CPU1 nu
poate trimite datele mai rapid decât cea mai mică viteză la care
CPU2 interoghează registrul.
Pentru creşterea vitezei se foloseşte un circuit flip-flop,
setat atunci când CPU1 scrie registrul şi resetat atunci când
CPU2 citeşte datele. După ce CPU1 a scris un octet de date, va
monitoriza ieşirea circuitului flip-flop (indică registru plin).
Atâta timp cât registrul rămâne plin CPU1 nu va putea scrie un
alt octet de date. Pe de altă parte CPU2 monitorizează ieşirea
“registru plin”, iar atunci când registrul este plin, CPU2 va citi
datele şi va reseta bitul “de registru plin”, activând CPU1 să
trimită alte date.
Bitul “de registru plin” poate fi monitorizat de oricare
procesor, folosind orice bit al portului de intrare, un bit al
portului dacă unul dintre procesoare este un microcontroller
sau un circuit integrat de I /O.

Pentru a creşte şi mai mult viteza de comunicare, bitul “de


registru plin” poate fi conectat la o intrare de întrerupere a
unuia sau a ambelor procesoare. În acest caz, CPU2 acceptă o
întrerupere, atunci când registrul este plin, iar CPU1 acceptă o
întrerupere la golirea registrului.
1. În cazul procesoarelor ce suportă tehnologia DMA,
se poate utiliza o schemă de comunicaţie foarte rapidă.
Ieşirea “de plin” a registrului este conectată la linia de
cerere DMA a procesorului CPU2, inversa (registru gol)
este conectată la linia de cerere DMA a procesorului
CPU1.
O altă posibilitate de comunicare între procesoarele aflate
pe acceaşi placă este utilizarea bufferelor FIFO. Bufferele
FIFO înlocuiesc registrele studiate anterior (un procesor scrie
bufferul FIFO, în timp ce alt procesor citeşte bufferul FIFO).
Majoritatea bufferelor au un pin ce indică atunci când acesta
este gol.
Dezavantajul acestei metode este modul de stocare a
mesajelor. Desigur, în unele sisteme, mesajele au diferite
priorităţi. În cazul mesajelor cu prioritate scăzută, procesorul
CPU2 poate lăsa mesajele în bufferul FIFO până când acestea
pot fi accesate. Practic mesajele cu prioritate scăzută sunt citite
şi stocate în RAM după care sunt procesate.

Comunicaţia între procesoare aflate pe plăci diferite

Pentru sistemele, unde două sau mai multe procesoare


aflate pe plăci diferite trebuie să comunice, există mai multe
metode. Dintre acestea amintim:
- comunicaţie serială utilizând o legătură de tipul
RS-232
- comunicaţie serială asincronă
- interfaţă diferenţială utilizând o legătură de tipul
RS-485
- interfaţă paralelă

Magistrale CAN
Controllerul de reţea (CAN) este o magistrală serială
dezvoltată iniţial pentru industria auto. Este o magistrală
multimaster ce suportă noduri multiple, egale. Nodurile nu au o
adresă specifică. Informaţia de adresă este specificată în
mesajele transmise. Nodurile pot fi introduse sau eliminate în
timp ce sistemul funcţionează.
Magistrala CAN este o magistrală serială diferenţială.
Liniile CAN au două stări: în una ambele linii sunt conduse de
2.5V, iar în cealaltă stare o linie este condusă de 1.2V, în timp
ce cealaltă este condusă de 3.5V.
Un mesaj CAN constă dintr-un bit de start, urmat de un
câmp de 12 biţi de arbitraj. Dintre aceştia 11 biţi sunt biţii de
identificare ce reflectă conţinutul şi prioritatea mesajului, iar 1
bit este bitul de cerere a transmisiei controlate. Câmpul de
arbitraj este utilizat pentru arbitrarea transmisiilor. Dacă mai
multe transmisii încearcă să preia controlul magistralei la
acelaşi moment de timp, nodurile cu mesaje de prioritate
scăzută se vor dezactiva pe parcursul câmpului de arbitraj,
lăsând nodurile cu mesaje de prioritate ridicată să preia
controlul asupra magistralei.
Urmează un câmp de control format din 6 biţi: primul bit
este numit IDE (extensia identificatorului), iar următorul bit
este rezervat; biţii rămaşi (4 biţi) specifică numărul de octeţi de
date conţinuţi în mesaj (0-8 octeţi).
După acest câmp de control, urmează datele şi un câmp
de 15 biţi pentru verificarea erorilor (CRC). Dup CRC,
urmează un câmp de confirmare, în care nodurile receptoare
introduc un bit de confirmare pentru a notifica transmiţătorul
că mesajul a fost corect recepţionat. Ultimii biţi sunt 7 biţi
neocupaţi.

Alegerea unei modalități de comunicare în sistemele


multiprocesor, depinde de mai mulți factori, dintre care
amintim:
- Viteza – necesitatea sincronizării dintre magistrală și
procesoare
- Siguranță – necesitatea de a verifica eventualele erori
- Standard – spre exemplu utilizarea unei magistrale standard
de transmisie.
- Suportul sistemului de operare – necesitatea de a folosi un
sistem de operare care să asigure suport pentru comunicațiile
dorite
- Modalitatea de transmitere (bidirecțională sau
unidirecțională)
- Master/Slave – verificarea comunicației între dispozitivul
master și dispozitivele slave. Există situații în care dispozitivul
master trebuie să interogheze fiecare dispozitiv slave până la
găsirea celui cu care trebuie să comunice
- Rețea/Punct la punct – O interfață de tip rețea este complexă
atât la nivel hardware cât și software. Pe de altă parte, o reșea
punct la punct necesită un circuit de interfață separat pentru
fiecare cale de comunicare.
- Complexitatea.
Microcontrolere

Microcontrolerele sunt circuite specializate, utilizate cu


precădere în aplicații de conducere, ce presupun integrarea pe
același cip a unui microprocesor, a unei memorii, precum și a
unui anumit număr de interfețe periferice.
Desigur, într-o astfel de configurație unitatea centrală de
procesare (CPU) este conectată cu celelalte subsisteme prin
intermediul magistralelor de date și adrese.
În funcție de modul de conectare, se disting două arhitecturi
pentru microcontrolere: arhitectura Von Neumann și arhitectura
Harvard.
Arhitectura Von Neumann presupune ca toate resursele
(memorie, regiștrii de I/O) sunt conectate la CPU prin magistrale
unice de adrese și date.

Magistrală de adrese
Magistrală de date

Memorie CPU Interfețe de Memorie


program I/O de date

Logică de
întreruperi

În general microcontrolere cu acest tip de arhitectură au un


număr mare de instrucțiuni, unele foarte complexe (arhitectură
CISC).
Principalul dezavantaj al acestei arhitecturi este legat de
timpul mare necesar pentru aducerea, decodificarea și execuția
instrucțiunilor (necesitatea mai multor cicluri mașină în vederea
executării instrucțiunilor).
Arhitectura Harvard are o viteză de procesare a
instrucțiunilor superioară prin includerea unor magistrale separate
în vederea accesării memoriei program.
Pentru această arhitectură sunt posibile următoarele
facilități:
- utilizarea conceptului de pipelining – poate fi adusă
următoarea instrucțiune, în timp ce se execută
instrucțiunea curentă
- memoria program poate fi organizată în cuvinte ce
au diferite dimenisuni. Instrucțiunile “mari” implică
un flux mare de date către CPU, deci o creștere a
vitezei de procesare.

Magistrală de adrese
Magistrală de date
Magistrală de adrese

Memorie CPU Interfețe de Memorie


program I/O de date

Magistrală de date Logică de


întreruperi

O astfel de arhitectură, pe lângă un set redus și optimizat de


instrucțiuni (arhitectură RISC), presupune ca majoritatea
instrucțiunilor să se execute într-un singur ciclu de magistrală.
Magistrala separată pentru memoria program conduce către
un acces mai dificil al constantelor (tabele, șir de caractere)
localizate în memoria ROM.
Microcontrolerul I8051
Microcontrolerul I8051 a apărut în anul 1980 fiind dezvoltat
de firma Intel. Structura relativ simplă, a permis utilizarea
acestuia pe scara largă. Mai mult, studiul arhitecturii interne a
acestui microcontroler poate fi privită ca un punct de plecare
pentru studiere altor configurații complexe.
Microntrolerele din familia 8051 sunt caracterizate prin
următoarele:
- Unitate centrală de procesare pe 8 biți
- Memorie program de 4KB
- Memorie de date de 256B
- Set de 111 instrucțiuni
- Spațiu de adresare extern pentru memoria program
de 64K
- Spațiu de adresare extern pentru memoria de date
de 64K
- 2 timere/numărătoare pe 16 biți
- 32 de linii bidirecționale de I/O organizate sub
forma a 4 porturi
- Port serial full duplex
- Oscilator intern

Structura internă a microcontrolerelor din familia 8051 poate


fi reprezentată astfel:

Referitor la arhitectura internă se consideră că


microcontrolerul 8051 are o arhitectură Harvard, dar setul de
instrucțiune conține un număr de 111 instrucțiuni, prin urmare
I8051 este CISC. În plus, procesoarele din această familie nu
permit operația de pipelining, prin urmare se apropie de o
arhitectură Von Neumann, dar cu capacitatea de a accesa
memoria program și memoria de date ca și “pagini” diferite.
Pinii corespunzători circuitului I8051 sunt reprezentați în
figura următoare:

Portul 0 (Pinii 32 – 39) – este un port cu două funcționalități: pe


de o parte este un port de I/O de uz general, iar pe de altă parte,
atunci când circuitul este interfațat cu o memorie externă, liniile
portului sunt utilizate drept magistrală de adrese și date
multiplexate în timp.
Portul 1 (Pinii 1 - 8) – este un port dedicat pentru operații de I/O.
Pinii sunt destinații interfațării cu dispozitivele externe.
Portul 2 (Pinii 21 - 28) – ca și portul 0 este un port cu două
funcționalități: port de I/O sau liniile portului sunt utilizate pentru
a transmite octetul superior de adresă, atunci când circuitul este
interfațat cu o memorie externă.
Portul 3 (Pinii 10 - 17) – este, de asemenea un port cu două
funcționalități: port de I/O de uz general. În acest caz, pinii
portului sunt pini multifuncționali, astfel:
- P3.0 – pin pentru recepționarea datelor de către
portul serial
- P3.1 - pin pentru transmisia datelor de către portul
serial
- P3.2 – pin destinat întreruperii externe 0
- P3.3 – pin destinat întreruperii externe 1
- P3.4 – pin de intrare pentru timerul/numărătorul 0
- P3.5 – pin de intrare pentru timerul/numărătorul 1
- P3.6 – pin destinat scrierii în memoria de date
externă
- P3.7 - pin destinat citirii din memoria de date
externă
________
PSEN (program store enable) – este un semnal de control, activ
pe zero, ce realizează activarea memoriei program externe. De
____
obicei acest pin se conectează la pinul OE (output enable) al unei
memorii de tipul EPROM pentru a permite citirea codului.
Semnalul se activează în etapa de aducere a unei instrucțiuni.
Codurile binare (op-codurile) sunt citite de la memoria EPROM,
sunt transmise pe magistrala de date și apoi sunt stocate în
registrele instrucțiunilor (ACC sau B).
Dacă se execută un program din memoria ROM internă, semnalul
________
PSEN rămâne inactiv.
ALE (address latch enable) – semnalul este utilizat pentru
demultiplexarea magistralelor de adrese și date. Dacă portul 0
lucrează ca și magistrală de date/adrese, semnalul ALE activează
stocarea într-un latch (registru extern) a octetul inferior de adresă,
în timpul primei jumătăți a unui ciclu de acces la memorie. După
această operație, liniile portului 0 sunt utilizate ca linii de I/O
pentru date, în timpul celei de-a doua jumătăți a unui ciclu de
acces la memorie.
____
EA (external access) – este un semnal menținut în starea high (la
5V) sau low (la masă). Când semnalul este în starea high,
microcontrolerul execută programele din memoria internă ROM.
Când este în starea low, 8051 execută programele din memoria
____
externă (EPROM). În acest caz, semnalul EA trebuie corelat cu
________
semnalul PSEN .
RST (reset) - este un pin de intrare utilizat pentru reinițializarea
circuitului. Semnalul trebuie menținut activ (în starea high) pentru
cel puțin 2 cicluri mașină.
XTAL1 și XTAL 2 sunt semnale de ceas, utilizate pentru generarea
frecvenței nominale de lucru a circuitului. În mod normal această
frecvență este egală cu 12MHz.
ACC - acumulatorul este un registru general pe 8 biți, utilizat
pentru stocarea rezultatelor obținute ca urmare a executării unui
număr foarte mare de instrucțiuni. De asemenea, toate
transferurile de date de la/spre memoria de date externă sunt
realizate prin intermediul acumulatorului.
Registrele “ R ” - un set de 8 registre, numerotate R0  R7 ,
utilizate în multe operații ca și registre auxiliare. Registrele sunt
utilizate împreună cu acumulatorul în operații de transfer (mov),
adunare (add), scădere (subb), etc.
Registrul ” B ’’ – este un registru pe 8 biți similar acumulatorului.
Registrul este utilizat, împreună cu acumulatorul, doar de două
instrucțiuni: înmulțire (mul) și împărțire (div). Cu excepția celor
două operații realizate, registrul mai poate fi utilizat ca și registru
auxiliar de stocare.
DPTR - este un registru pe 16 biți utilizat pentru a indica date din
memoria externă. DPTR va indica către o adresă din memoria
externă. Registrul mai poate fi utilizat și pentru a stoca o valoare
pe 2 octeți, rezultată în urma execuției unor instrucțiuni.
PC - numărătorul program – este o adresă pe 16 biți utilizată
pentru a indica următoarea instrucțiune ce se va executa.
Instrucțiunile ce necesită mai mult de 1 octet pentru execuție, vor
conduce la incrementarea numărătorului program cu valoarea
corespunzătoare numărului de octeți.
SP (stack pointer) – registru pe 8 biți, utilizat pentru a indica
locul din stivă de unde se extrage următoarea valoare.
Când o valoare este introdusă în stivă, se incrementează valoarea
lui SP și apoi se stochează valoarea în locația de memorie
rezultată.
La extragerea unei valori din stivă, se va extrage valoarea indicată
de către SP , după care valoarea lui SP va fi decrementată.
Acest pointer la stivă poate fi modificat direct prin intermediul a 6
instrucțiuni: push, pop, acall, lcall, ret și reti.
PSW (program status word) – conține biții de stare, de exemplu:
bitul de transport (carry flag), bitul de depășire (overflow flag),
biții pentru selecția unui grup de registre R , bitul de paritate.

Cicluri mașină

Unitatea de control a microntrolerului este responsabilă


pentru manipularea corespunzătoare a instrucțiunilor. Fiecare
instrucțiune necesită unul sau mai mulți pași (cicluri mașină). Prin
execuția unei instrucțiuni (la un nivel inferior – realizarea unor
acțiuni specifice), unitatea de control realizează interfațarea
procesorului cu memoria program.
Un ciclu mașină corespunzător procesoarelor din familia
I8051 constă din 12 perioade ale oscilatorului de ceas. Cum
oscilatorul lucrează la o frecvență egală cu 12MHz, rezultă că
fiecare perioadă durează o microsecundă.
Fiecare ciclu este divizat în 6 stări - S1  S 6 . Fiecare stare
constă din 2 faze P1 și P 2 .
În mod normal două extrageri de cod sunt generate în timpul
fiecărui ciclu maşină, chiar dacă instrucţiunea executată nu
necesită acest lucru. Dacă instrucţiunea executată (în curs de
execuţie) nu necesită baiţi suplimentari de cod, CPU ignoră ciclul
suplimentar de extracţie şi numărătorul program (PC) nu este
incrementat.
Semnalul ALE este activat, în general, de două ori în timpul
fiecărui ciclu maşină: în S1P2 - S2P1 şi apoi în S4P2 - S5P1.
Execuţia unei instrucţiuni de un ciclu începe în S1P2, când
codul operaţie este memorat în registrul de instrucţiuni. Dacă
aceasta este o instrucţiune de un bait, există încă o extragere în
S4, dar citirea baitului (care ar trebui să fie următorul cod de
operaţie) este ignorată şi contorul program (PC) nu este
incrementat. Majoritatea instrucţiunilor se execută într-un singur
ciclu. Operaţiile de înmulţire şi împărţire sunt singurele
instrucţiuni care necesită mai mult de două cicluri pentru execuţie
(şi anume, 4 cicluri).

Organizarea memoriei la microcontrolerul I8051

Memoria microcontrolerului I8051 este împărțită în


memorie pentru programe (cod) și memorie pentru date. Atât
memoria de date, cât și memoria program pot fi interne (pe cip).
Pe de altă parte, capacitatea memoriei poate fi extinsă prin
adăugarea de circuite de memorie externe pentru date și cod.
Memoria internă constă dintr-un singur cip de memorie
program de 4KB și un cip de 256B memorie de date.
Memoria program și memoria de date pot fi extinse până la
64KB.
Așa cum s-a precizat anterior, prin intermediul semnalului
_______
PSEN se accesează memoria program externă. În plus, dacă
___
semnalul EA este în starea low se va accesa memoria program
externă, indiferent de valoarea numărătorului program. Daca
___
semnalul EA este în starea high se accesează memoria program
internă, dacă numărătorul program nu depășește valoarea maximă
0FFFh.
Separarea logică a memoriei de date și program permite ca
memoria de date internă să fie accesată prin adrese de 8 biți ce
sunt mai rapid manipulate. Totuși, sunt generate și adrese pe 16
biți. Memoria de date externă poate fi accesată prin inetrmediul
____ ____
semnalelor de citire și scriere ( RD și WR ).

Memoria program
Memoria program este primul spațiu de emmorie adresabilă.
După inițializarea circuitului (semnalul RST ), unitatea centrală de
procesare va începe execuția de la locația 0000h. O reprezentare a
părții inferioare a memoriei, rezervată tratării cererilor de
întrerupere de la diverse surse, poate fi reprezentată astfel:
Apariția întreruperilor determină CPU să execute un salt din
programul curent la locația de memorie unde începe execuției
subrutinei de deservire. Sunt rezervate câte 8 locații pentru fiecare
întrerupere.
Subrutinele mai lungi pot utiliza o instrucțiune de salt la o
adresă unde se continuă tratarea întreruperii respective.
Conectarea hardware a memoriei program externe la
dispozitivele din familia 8051 se face conform următoarei
scheme:

16 linii de I/O (porturile P0 și P2) sunt dedicate funcțiilor de


magistrală în timpul ciclurilor de extragere a codurilor
instrucțiunilor din memoria externă. Portul P0 emite octetul
inferior al numărătorului de program (PCL) ca adresă, și apoi
trece în starea de intrare, așteptând octetul de cod din memoria
program. În timp ce octetul inferior al numărătorului program
(PCL) este valid la ieșirea la P0, semnalul ALE înscrie acest octet
într-un latch de adresă extern. Portul 2 emite octetul superior al
_______
adresei (PCH), apoi PSEN activează ieșirea EPROM-ului și
octetul de cod este citit.

Memoria de date
Adresele memoriei de date externe pot fi de 1 sau 2 octeți.
Adresele de 1 octet sunt utilizate în conjucție cu una sau mai
multe linii I/O suplimentare pentru a pagina memoria RAM. Un
exemplu e conectare a unei memorii externe de date de 2KB
utilizând paginarea este prezentat în figura următoare:

În acest caz se utilizează ROM-ul intern. Portul P0 servește


drept magistrală de adrese și date multiplexată în timp pentru
memoria RAM, iar 3 linii ale portului P2 sunt utilizate pentru a
____
pagina RAM-ul. CPU generează semnalele de scriere și citire RD
____
și WR necesare pentru accesarea memoriei RAM externe,
utilizând două linii ale portului P3. Dacă memoria ROM este
internă, ceilalți biți ai portului P2 sunt disponibili ca linii de I/O.
Se pot utiliza și adrese pe 2 octeți, caz în care octetul
superior este emis folosind liniile portului P2.
Memoria RAM internă este divizat în 3 blocuri: blocul
inferior de 128 de octeți, blocul superior de 128 de octeți și blocul
registrelor de funcții speciale (SFR).
Blocul SFR conține 21 de registre de funcții speciale: starea
porturilor, biți de control, registrele acumulator, registrele de
configurare pentru timere/numărătoare, indicatorul stivei, registre
pentru configurarea portului serial, etc.
Spațiul SFR are următoarea configurație:

Spațiul superior de memorie și SFR ocupă același bloc de


adrese, deși ele sunt entități fizice separate. Delimitarea între cele
2 spații de memorie se realizează prin intemediul modului de
adresare. Astfel, adresarea directă peste adresa 7Fh accesează un
anumit spațiu de memorie, iar adresarea indirectă peste acceași
adresă accesează un alt spațiu.
Cei 128 de octeți din spațiul inferior al RAM-ului sunt
configurați astfel:

Primii 32 de octeți sunt grupați în 4 blocuri de 8 registre


fiecare ( R0  R7 ). Doi biți din cuvântul de stare al programului
(PSW) selectează blocul de registre ce se utilizează. Aceasta
permite utilizarea mai eficientă a spațiului de program, deoarece
instrucțiunile cu registre sunt mai scurte decât instrucțiunile care
utilizează adresarea directă.
Următorii 16 octeți formează un spațiu de memorie
adresabil la nivel de bit. Setul de instrucțiuni al
microcontrolerului 8051 include un număr mare de instrucțiuni la
nivel de bit, iar cei 128 de biți din acest spațiu pot fi adresați
direct prin aceste instrucțiuni.

Setul de instrucțiuni și moduri de adresare


Instrucțiunile microcontrolerelor din familia 8051 se pot
grupa astfel:
- instrucțiuni aritmetice
- instrucțiuni logice
- instrucțiuni pentru transferul datelor
- instrucțiuni pentru manipularea variabilelor
booleene
- instrucțiuni pentru ramificarea programului.
Termenul “mod de adresare” desemnează modul în care se
realizează adresarea unei locații specifice de memorie.
Modurile de adresare pot fi grupate astfel:
- adresare imediată
- adresare directă
- adresare indirectă
- adresarea la registru
- adresarea la registre speciale
- adresarea indexată
- adresare directă a memoriei externe
- adresare indirectă a codului (programului)

Adresarea imediată presupune transferul unei valori


(constante) direct în memorie.
Ex: mov A,#20h
Acumulatorul va fi încărcat cu valoarea 20 (în hexazecimal).
Acest mod de adresare este foarte rapid, deoarece valoarea
transferată în memorie este inclusă în instrucțiune. Acest mod de
adresare nu este flexibil, deoarece valoarea transferată este
constantă.
Adresarea directă – valoarea ce se va transfera în memorie
este obținută de la un câmp de adresă pe 8 biți cuprins în câmpul
instrucțiunii.
Ex: mov A,20h
Instrucțiunea va transfera în acumulator valoarea stocată în
RAM la adresa 20h.
Acest mod de adresare este rapid și flexibil, deoarece
valoarea transferată poate fi accesată rapid din RAM-ul intern al
microcontrolerului și, în plus valoarea de la adresa respectivă
poate fi variabilă.
Adresarea indirectă – În acest caz instrucțiunea specifică
un registru care conține adresa operandului. Atât memoria RAM
internă, cât și cea externă pot fi adresare indirect. Registrul de
adrese pe 8 biți poate fi R0 sau R1, sau SP din blocul de registre
selectat. Registrul de adresă pentru adrese de 16 biți poate f
inumai registrul indicator de date DPTR.
Ex.: mov A, @R0
În acumulator se va transfera valoarea din RAM-ul intern de
la adresa specificată prin registrul R0.
Adresarea la registru – Blocurile de registre, ce conțin
registrele R0  R7 , pot fi accesate prin anumite instrucțiuni care
conțin codul pe 3 biți al registrului utilizat, în codul operație al
instrucțiunii respective. Instrucțiunile care accesează registrele în
acest mod sunt eficiente deoarece elimină un octet de adresă.
La execuția unei astfel de instrucțiuni se selectează unul
dintre cele 8 registre, specificat prin cei 3 biți din opcode, din
blocul selecta prin cei doi biți ai registrului PSW.
Ex.: ADD A,R7
Adresarea la registre speciale – anumite instrucțiuni sunt
destinate lucrului numai cu anumite registre. De exemplu anumite
instrucțiuni operează întotdeauna asupra acumulatorului sau
asupra registrului DPTR.
Ex.: INC A
MUL AB
DIV AB
INC DPTR
Adresarea indexată – numai memoria program poate fi
accestă cu acest tip de adresare. Adresarea indexată este destinată
citirii tabelelor din memoria program. Un registru de bază de 16
biți (DPTR sau PC) indică baza tabelului, iar acumulatorul este în
încărcat cu numărul de ordine al elementului din tabel. Adresa
elementului din tabelul din memoria program se formează prin
adunarea conținutului acumulatorului la indicatorul de bază.
Un alt tip de adresare indexată este utlizat în cazul
instrucțiunilor de salt. În acest caz adresa de destinație este
calculată ca suma dintre indicatorul de bază DPTR și conținutul
acumulatorului.
Adresarea directă a memoriei externe – memoria externă
este accesată printr-o instrucțiune dedicată.
Ex. movx A, @DPTR
Pentru început registrul DPTR este încărcat cu adresa
memoriei externe implicată în operațiile de citire sau scriere.
Instrucțiunea realizează transferul conținutului adresei externe de
memorie indicat prin registrul DPTR.
Pentru operanzi pe 8 biți, operandul poate fi unul dinre
registrele R0 sau R1. Acest mod de adresare utilizînd cei 2
regiștrii se mai numește și adresare indirectă a memoriei externe.
Adresarea indirectă a memorie ROM externe – sunt
disponibile 2 instrucțiuni pentru citirea tabelelor din memoria
program.
Ex.: movc A, @A+DPTR
Instrucțiunea anterioară poate mânui 256 de intrări în tabel.
Numărul de intrări dorite din tabe leste încărcat în acumulator, și
apoi, regsitrul pointer DPTE este inițializat la începutul tabelului.
Instrcuțiunea mov A, @A+PC, este identică cu instrucțiunea
anterioară, cu exepția faptului că, în acest caz numărătorul
program este utilizat ca și adresă de bază, iar tabelul este accesat
prin intermediul unei subrutine.
Structura şi funcţionarea porturilor

Circuitul intern corespunzător porturilor de I/O este


reprezentat în figura de mai jos:

Operația de scriere la un pin al portului presupune încărcarea


datelor în latch-ul portului. Ieșirea latch-ului conduce un
tranzistor cu efect de câmp conectat la pinul portului.
În cazul operației de citire, există două posibilități de citire a
latch-ului sau citire a pinului. Instrucțiunile ce necesită operații de
tipul “citire-modificare-scriere” citesc latch-ul pentru a evita
interpretările greșite ale nivelului tensiunii de pe pin.
Instrucțiunile de transfer, de tipul “mov”, citesc pinul.
Latch-ul este reprezentat ca un bistabil de tip D, care va
prelua o valoare de pe magistrala internă ca răspuns la un semnal
de "scriere în latch" transmis de CPU. Ieşirea Q a bistabilului este
plasată pe magistrala internă ca răspuns la un semnal de "citire a
latch-ului" transmis de CPU. Nivelul de pe pinul portului este
plasat pe magistrala internă ca răspuns la un semnal de "citire a
pinului" transmis de CPU.
Ieșirile porturilor 0 şi 2 sunt comutabile la o magistrală
internă de Adrese/Date şi Adrese printr-un semnal de control
intern pentru utilizare în accesarea memoriei externe.
Dacă un bit al latch-ului P3 conţine un 1, atunci nivelul de
ieşire este controlat prin semnalul notat "funcţie specială de
ieşire". Pinul P3.x real (nivelul său) este întotdeauna disponibil la
"funcţia de intrare specială".
Portul 0 are ieşiri în gol (de tip "open collector"). Fiecare linie
I/O poate fi utilizată independent ca intrare sau ieşire (Porturile 0
şi 2 nu pot fi utilizate ca linii I/O de uz general când sunt utilizate
ca magistrale de adrese/date).
Pentru a fi utilizat ca intrare, bitul din latch-ul portului trebuie
să conţină un 1, ceea ce conduce la blocarea tranzistorului.
Pentru porturile 1, 2 şi 3 pinul este forţat în "1" printr-o
schemă internă de tragere la alimentare (pull-up).
Portul 0 diferă de celelalte prin aceea că nu are "pull-up"
intern. În consecinţă liniile lui P0 care sunt utilizate ca linii de
ieşire sunt "open drain".
Deoarece porturile 1, 2 şi 3 au "pull-up" intern fixat, ele sunt
uneori denumite porturi "quasi-bidirecţionale". Când sunt
configurate ca intrări ele sunt forţate în "1", şi vor genera curent
când sunt forţate în 0 din exterior. Portul 0, pe de altă parte, este
considerat cu adevărat bidirecţional, deoarece când este
configurat ca intrare, acesta este flotant. Toate latch-urile
porturilor din 8051 sunt înscrise cu "1" după RESET.

Timere/Numărătoare

Microcontrolerul 8051 are două registre Timer/Numărător:


Timer 0 şi Timer1.
Acestea pot configurate să opereze fie ca timere, fie ca
numărătoare de evenimente.
Un timer este format dintr-o înseriere de circuite flip-flop, ce
realizează împărțirea la 2 a frecvenței ceasului.
Un timer cu n circuite va realiza o împărțire a frecvenței
ceasului cu 2n .
Ieșirea ultimului circuit flip-flop este un fanion de depășire,
ce poate fi testat software sau poate fi utilizat în generarea unei
întreruperi.
Valoarea binară din circuitele flip-flop poate fi considerată
drept o numărare a ciclurilor mașină.
Un timer pe 16 biți va număra de la valoarea 0000h la
valoarea FFFFh, până când fanionul de depășire este setat.
Din diagrama anterioară se observă că ieșirea primului circuit
comută la ½ din frecvența ceasului, ieșirea celui de-al doilea
circuit comută la ¼ din frecvența ceasului, ș.a.m.d.
Numărul zecimal 3, pe diagramă, corespunde ieșirilor celor 3
circuite flip-flop ( Q2  0, Q1  1, Q0  1 ).
Prin urmare, în funcţia "Timer", registrul este incrementat în
fiecare ciclu maşină. Astfel, acesta poate fi privit ca un numărător
de cicluri maşină. Întrucât un ciclu maşină constă din 12 perioade
de ceas, viteza de numărare este 1/12 din frecvenţa oscilatorului.
În funcţia de "Numărător", registrul este incrementat ca
răspuns la o tranziţie din 1 în 0 la pinii de intrare T0, T1. Viteza
maximă de numărare este 1/24 din frecvenţa oscilatorului.
În plus faţă de selecţia "Timer" sau "Numărător", există patru
moduri de operare ce pot fi stabilite pentru Timer 0 şi Timer 1:
"Captură", "Auto-Încărcare" şi "Generator al vitezei de
transmisie".
Funcţia "Timer" sau "Numărător" este selectată prin biţii de
control C/T din registrul de funcţii speciale TMOD. Cele patru
moduri de operare pentru fiecare din cele două
Timere/Numărătoare, sunt selectate prin perechile de biţi (M1,
M0) din TMOD. Modurile 0, 1 şi 2 sunt identice pentru ambele
Timere/Numărătoare, în timp ce modul 3 este diferit.
Structura registrului de control al modului Timer/Numărător
TMOD este:

unde:
GATE - este utilizat pentru controlul validării pentru
Timer/Numărător x (x = 0, 1).
Dacă GATE = 1, Timer/Numărătorul x este validat numai atunci
când pinul INTx (x = 0,1) este "high" iar pinul de control TRx este
setat. (TRx, x = 0,1, sunt biţi de control din registrul TCON).
Dacă GATE = 0, Timer x este validat ori de câte ori bitul de
control TRx este setat.
C / T - selectează funcţionarea ca Numărător (C/T = 1, intrarea
provine de la pinul de intrare Tx) sau Timer (C/T = 0, intrarea
provine de la ceasul intern)
M 1, M 0 - selectează modurile de operare 0 - 3.

Modul 0 – este modul de lucru caracteristic unui timer pe 13


biți.
Modul 1 – este modul de lucru caracteristic unui timer pe 16
biți. Fanionul de depășire este setat la trecerea din valoarea
maximă FFFFh în valoarea de inițializare 0000h.
Modul 2 – este un mod de lucru al unui timer pe 8 biți cu
autoreîncărcare. Octetul inferior al timerului (TLx) operează ca
un timer pe 8 biți, în timp ce octetul superior (THx) stochează o
valoare de reîncărcare. Atunci când apare o depășire ca urmare a
tranziției de la valoarea FFh la valoarea 00h, se realizează două
operații: se va seta fanionul de depășire și valoarea din THx este
încărcată în TLx, după care se continuă numărarea de la această
valoare și până la următoarea tranziție FFh-00h.
Acest mod de lucru este avantajos, deoarece depășirile apar la
intervale specifice, periodice.
Modul 3 – este un mod de lucru particularizat pentru fiecare
timer.
Timerul 0 este împărțit în două timere pe 8 biți, fiecare cu
propriul fanion de depășire.
Timerul 1 este oprit în acest mod de lucru, dar poate fi pornit
prin comutarea într-unul din celelalte moduri. Singura limitare
este introdusă de faptul că fanionul de depășire obișnuit al
timerului 1 TF1, nu este setat, din moment ce este conectat la
TH0.
Figura următoare prezintă modul 1 de lucru pentru Timerul 1
(timer pe 16 biți).
Se observă că atunci când Gate  1, timerul este controlat de
întreruperea externă 1.
Structura registrului de control (TCON) din spaţiul registrelor
de funcţii speciale este:

unde:
TF1,TF 0 - fanioane de depăşire ale timerelor 1 şi, respectiv 0.
Sunt setate prin hardware la apariţia unei depăşiri (a unui
transport) la Timerul 1 sau 0. Sunt şterse prin hardware când
procesorul apelează rutina corespunzătoare de întreruperi.
TR1,TR0 - biţi de control ai funcţionării timerelor 1 şi 0. Sunt
setaţi/şterşi prin software pentru a activa/dezactiva timerele.
IE1, IE 0, IT 1, IT 0 - biţi care se referă la întreruperi externe și cele
corespunzătoare celor 2 timere.

Interfaţa serială
Portul serial este complet duplex, în sensul că acesta poate
transmite şi recepţiona simultan. Acesta are, de asemenea, un
buffer de recepţie, în sensul că se poate începe recepţia unui al
doilea octet înainte ca octetul recepţionat anterior să fi fost citit
din registrul de recepţie.
Totuşi, dacă primul octet nu a fost încă citit în timpul
recepţiei complete a celui de-al doilea octet, unul dintre octeți va
fi pierdut. Registrele de transmisie şi recepţie ale portului serial
sunt ambele accesate ca registrul de funcţii speciale SBUF.
Scrierea lui SBUF încarcă registrul de transmisie, iar citirea
SBUF accesează un registru de recepţie, distinct din punct de
vedere fizic.
Portul serial poate funcţiona în 4 moduri:
Modul 0: Datele seriale intră şi ies prin RxD. TxD furnizează
frecvenţa de transmisie/recepţie. Se transmit/recepţionează 8 biţi
(8 biţi de date), primul fiind LSB. Frecventa biţilor este fixată la
1/12 din frecvenţa oscilatorului.
Transmisia datelor este initiată prin orice instrucțiune ce scrie
date în registrul SBUF. Datele sunt deplasate către linia RxD, cu
o frecvență transmisă prin linia TxD.
Recepția este inițiată cînd bitul de activare REN din registrul
de control SCON este 1 și bitul de întrerupere RI este 0. În
general, bitul REN se va seta la începutul programului pentru
inițializarea transmisiei seriale, după care bitul RI este resetat
pentru a realiza operația de citire a datelor.
Structura registrului de stare și control SCON este
următoarea:
unde:
SM0, SM1 - specifică modul de operare al portului serial:
0 0 - modul 0
0 1 - modul 1
1 0 - modul 2
1 1 - modul 3
SM2 - validează caracteristica de comunicaţii multiprocesor în
modurile 2 şi 3.
REN - validează recepţia serială. Se setează/resetează prin
software pentru a activa/dezactiva recepţia.
TB8 - este cel de-al 9-lea bit care va fi transmis în modurile 2 şi 3.
Se setează sau şterge prin software, după dorinţă.
RB8 - In modurile 2 şi 3, este cel de-al 9-lea bit de date care a fost
recepţionat.
TI - este fanionul de întreruperi pentru transmisie.
RI - este fanionul de întreruperi pentru recepţie.

Modul 1:
În acest mod, portul serial operează ca un UART pe 8 biți cu
o rată de transmisie variabilă. În acest mod cei 8 biți de date sunt
precedați de un bit de start (este tot timpul zero) și urmați de un
bit de stop (este tot timpul 1). Uneori între ultimul bit de date și
bitul de stop este introdus un bit de paritate. Prin urmare, în acest
mod 10 biţi sunt transmişi (prin TxD) sau recepţionaţi (prin RxD).
La recepţie, bitul de stop se introduce în RB8 din registrul de
funcţii speciale SCON. Frecvenţa de transmisie a biţilor (baud
rate) este variabilă, fiind dată de frecvența de umplere a bufferului
de depășire corespunzător timerului 1.

Modul 2:
În acest mod, portul serial funcționează ca un UART pe 9 biți.
Sunt transmiși 11 biţi (prin TxD) sau recepţionaţi (prin RxD): un
bit de start (0), 8 biţi de date (LSB - primul), un al 9-lea bit de
date programabil şi un bit de stop (1). La transmisie, cel de-al 9-
lea bit de date (TB8 din SCON) poate fi asignat la valoarea 0 sau
1. Sau, de exemplu, bitul de paritate (P, din PSW) poate fi mutat
în TB8. La recepţie cel de-al 9-lea bit de date se introduce în RB8
din registrul SCON (din SFR), pe când bitul de stop este ignorat.
Frecvenţa biţilor este programabilă fie la 1/32 fie la 1/64 din
frecvenţa oscilatorului.

Modul 3:
11 biţi sunt transmişi (prin TxD) sau recepţionaţi (prin RxD): un
bit de start (0), 8 biţi de date (LSB - primul), un al 9-lea bit de
date programabil, şi un bit de stop (1). In fapt, Modul 3 este
acelaşi cu Modul 2 sub toate aspectele cu excepţia frecvenţei
biţilor. Frecvenţa biţilor în Modul 3 este variabilă (poate fi
programată la o anumită valoare, fiind furnizată de timer).

Comunicaţii multiprocesor
Modurile 2 şi 3 au o facilitate specială pentru comunicatiile
multiprocesor. In aceste moduri, sunt recepţionaţi 9 biţi de date.
Cel de-al 9-lea este trecut în RB8. Apoi soseşte un bit de stop.
Portul poate fi programat astfel încât atunci când bitul de stop este
recepţionat, întreruperea portului serial va fi activată numai dacă
RB8 = 1.
Această caracteristică este validată prin setarea bitului SM2
din SCON. O cale de utilizare a acestei trăsături în sistemele
multiprocesor este următoarea:
Când procesorul master doreşte să transmită un bloc de date
unuia din mai multe slave-uri, acesta transmite iniţial un octet de
adresă care identifică slave-ul destinaţie. Un octet de adresă diferă
de un octet de date prin aceea că cel de-al 9-lea bit este 1 într-un
octet de adresă şi 0 într-un octet de date. Cu SM2 =1 nici un slave
nu va fi întrerupt printr-un octet de date. Un octet de adresă,
totuşi, va întrerupe toate slave-urile, astfel încât fiecare slave
poate examina octetul recepţionat şi poate vedea dacă acesta i-a
fost adresat. Slave-ul adresat va şterge bitul său SM2 şi se
pregăteşte să recepţioneze baiţii de date care vor sosi.

Slave-urile care nu au fost adresate păstrează setarea biţilor


SM2 proprii şi îşi văd de sarcinile lor, ignorând baiţii de date care
vin.
SM2 nu are nici un efect în Modul 0, iar în Modul 1 poate fi
utilizat pentru a verifica valabilitatea (corectitudinea) bitului de
stop. Într-o recepţie în Modul 1, dacă SM2 = 1, întreruperea de
recepţie nu va fi activată decât dacă un bit corect de stop a fost
recepţionat.

Viteza de transmitere pentru portul serial


Așa cum s-a precizat, în modurile 0 și 2 viteza de transmisie a
datelor este fixată. În modul 0 frecvența de transmisie este egală
cu 1MHz (frecvența ceasului intern 12 MHz împărțită prin 12). În
modul 2, frecvența oscilatorului este împărțită prin 64. Totuși,
această frecvență poate fi modificată prin bitul SMOD, astfel,
dacă SMOD = 1, atunci frecvența de transmisie este 1/32 din
frecvența ocilatorului.
În modurile 1 și 3 frecvență de transmisie este determinetă de
rata de umplere a registrului de depășire corespunzător timerului
1.
Formula pentru determinarea frecvenței de transmitere (baud
rate) în aceste moduri este:
Baud rate = (frecvența de depășire a timerului 1) / 32.
De exemplu, pentru un baud rate = 2400 bps, frecvența de
depășire a timerului 1 este egală cu 76.8 kHz.
Dacă frecvența oscilatorului intern este egală cu 12 MHz,
atunci ceasul timerului 1 este setat la o frecvență egală cu 1MHz ,
deci, rezultă, că o depășire a timerului 1 o să apară după fiecare
13.02 cicluri (aproximativ 13 cicluri).
Prin urmare, vor fi necesare 13 numărări (de la 00h la FFh)
pentru viteza de transmitere selectată pentru portul serial.
Dacă se lucrează în modul reîncărcare, atunci în registrul TH1
trebuie încărcată valoarea -13 (F3h).

Întreruperi
8051 furnizează 5 surse de întreruperi: 2 întreruperi externe, 2
întreruperi pentru timere şi întreruperea portului serial.
Întreruperile externe INT0 şi INT1 pot fi fiecare activate fie pe
nivel fie pe o tranziţie 1→0, în funcţie de biţii IT0 şi IT1 din
registrul TCON. Fanioanele care generează în realitate aceste
întreruperi sunt biţii IE0 şi IE1 din registrul TCON.
Registrul TCON

TF1, TF0, TR1, TR0 – fanioane de depăşire şi biţi de control.


IE1, IE0 - fanioane de întreruperi externe. Se setează prin
hardware la detectarea unor întreruperi externe. Se şterg software
când întreruperile sunt tratate.
IT0, IT1 - biţi pentru controlul tipului întreruperii. Sunt
setaţi/şterşi prin soft pentru a specifica triggerarea întreruperilor
externe pe frontul descrescător/nivel scăzut.
Când o întrerupere externă este generată, fanionul care a
generat-o este şters prin hardware când rutina de deservire este
apelată numai dacă întreruperea a fost activată pe tranziţie. Dacă
întreruperea a fost activată pe nivel, atunci sursa solicitatoare
externă este cea care controlează fanionul, mai degrabă decât
hardware-ul intern (din chip).
Întreruperile Timer 0 şi Timer 1 sunt generate prin TF0 şi
TF1 care sunt setaţi de o depăşire (umplere) în registrele
corespunzătoare Timer/Numărător (excepţie, Timer 0 în modul
3). Când o întrerupere de la timer este generată, fanionul care a
generat-o este şters de hardware-ul intern când rutina de deservire
este apelată.
Întreruperea portului serial este generată printr-o poartă SAU
logic de RI şi TI. Nici unul din aceste fanioane nu este şters prin
hardware când rutina de deservire este apelată. De fapt, rutina de
deservire va determina, în mod normal, dacă întreruperea a fost
generată de RI sau TI şi bitul va trebui şters prin software.
Toţi biţii care generează întreruperi pot fi setaţi sau şterşi prin
soft, cu acelaşi efect ca şi atunci când sunt setaţi sau şterşi prin
hardware. Adică, întreruperile pot fi generate sau întreruperile
netratate pot fi eliminate (dezactivate) prin soft.
Fiecare din aceste surse de întreruperi pot fi activate sau
dezactivate individual prin setarea sau ştergerea unui bit din
registrul de funcţii speciale IE. Registrul IE conţine, de asemenea,
un bit de dezactivare globală, EA, care dezactivează toate
întreruperile deodată.

Structura nivelelor de prioritate


Fiecare sursă de întreruperi poate fi programată individual pe unul
din cele două nivele de prioritate prin setarea sau ştergerea unui
bit din registrul de funcţii speciale IP (Interrupt Priority).
Structura registrului IP pentru 8052 este:

IP7, IP6 - rezervaţi


PT2, PT1, PT0 - definesc nivelul de prioritate pentru timerele 2, 1
şi respectiv 0. Dacă PTi=1 (i = 0, 1, 2), timerul "i" se
programează pe nivelul superior de prioritate.
PS - defineşte nivelul de prioritate pentru întreruperea de la portul
serial. PS = 1,
programează această întrerupere pe nivelul superior de prioritate.
PX1, PX0 - definesc nivelul de prioritate pentru întreruperile
externe 1 şi respectiv 0.
PXi=1, programează întreruperea externă i (i = 0, 1) pe nivelul
superior de prioritate.
O întrerupere de pe nivelul inferior poate fi întreruptă de o
întrerupere de pe nivelul superior, dar nu şi de o altă întrerupere
de pe nivelul inferior. O întrerupere de nivel superior nu poate fi
întreruptă de nici o altă sursă de întreruperi .
Dacă două cereri de priorităţi diferite sunt recepţionate
simultan, cererea de prioritate superioară este deservită. Dacă
cereri de aceeaşi prioritate sunt recepţionate simultan, o secvenţă
internă de interogare determină care dintre cereri va fi deservită.
Astfel, în cadrul fiecărui nivel de prioritate există o a doua
structură de prioritate determinată prin următoarea secvenţă de
interogare:

Observaţie: "Prioritatea în cadrul nivelului" este utilizată numai


pentru a rezolva cererile simultane de pe acelaşi nivel de
prioritate!
In 8051, pe lângă IP.7, IP.6, nu este implementat nici IP.5.
Sistemul de control al întreruperilor bazat pe cele două registre IE
şi IP şi pe secvenţa de interogare, în cazul microcontrolerului
8052, este reprezentat in figura de mai jos:
Fanioanele de întreruperi sunt eşantionate în S5P2 a fiecărui
ciclu maşină. Eşantioanele sunt testate în timpul ciclului maşină
următor. Dacă unul din fanioane a fost găsit setat în S5P2 a
ciclului precedent, ciclul de testare îl va determina şi sistemul de
întreruperi va genera o "instrucţiune" LCALL la subrutina de
deservire corespunzătoare, cu condiţia ca această LCALL
generată prin hardware să nu fie blocată prin una din următoarele
condiţii:
1. O întrerupere cu nivel de prioritate egal sau mai mare este în
curs de tratare.
2. Ciclul curent (de testare) nu este ciclul final în execuţia
instrucţiunii curente.
3. Instrucţiunea curentă este RETI sau orice instrucţiune de
scriere în registrele IE sau IP.
Procesorul acceptă o cerere de întrerupere prin executarea
unei LCALL (Long Subroutine Call), generată hardware, spre
subrutina de deservire corespunzătoare. In anumite cazuri acesta
şterge, de asemenea, fanionul care a generat întreruperea, în altele
nu. Niciodată nu şterge fanioanele portului serial sau timerului 2.
Aceasta trebuie realizată de software-ul utilizatorului.
Se şterge un fanion de întreruperi extern (IE0 sau IE1) numai
dacă acesta a fost activat pe o tranziţie. LCALL generată
hardware salvează conţinutul numărătorului program (PC) în stivă
(dar nu salvează şi PSW) şi reîncarcă PC cu o adresă care depinde
de sursa de întreruperi ce va fi tratată, astfel:

Sursă Adresă vector


IE0 0003H
TF0 000BH
IE1 0013H
TF1 001BH
RI+TI 0023H
TF2+EXF2 002BH

Execuţia se realizează de la acea locaţie până la întâlnirea


instrucţiunii RETI. Instrucţiunea RETI informează procesorul că
această rutină de întreruperi s-a terminat, apoi extrage primii doi
octeţi din vârful stivei şi reîncarcă PC. Execuţia programului
întrerupt continuă din punctul în care a fost întrerupt.
Observaţie: O instrucţiune RET simplă ar returna, de asemenea,
execuţia programului întrerupt, dar aceasta ar lăsa sistemul de
control al întreruperii să creadă că o întrerupere este încă în curs
de execuţie!

Întreruperi externe
Sursele externe pot fi programate să fie activate pe nivel sau
pe tranziţie prin setarea sau ştergerea biţilor IT1 sau IT0 din
registrul TCON. Dacă ITi = 0, întreruperea externă i este
triggerată prin detectarea nivelului "low" la pinul INTi (i = 0, 1).
Dacă ITi = 1, întreruperea externă i este triggerată pe front. În
acest mod, dacă eşantioane succesive ale pinului INTi arată "high"
într-un ciclu şi "low" în ciclul următor, fanionul cererii de
întrerupere IEi din TCON este setat. Fanionul IEi solicită apoi
întreruperea.
Întrucât pinii întreruperilor externe sunt eşantionaţi odată în
fiecare ciclu maşină, o intrare "high" sau "low" trebuie păstrată
pentru cel puţin 12 perioade de ceas pentru a asigura eşntionarea.
Dacă întreruperea externă este activată pe tranziţie, sursa
externă trebuie să păstreze pinul de întrerupere "high" pentru cel
puţin un ciclu şi apoi să-l păstreze "low" pentru cel puţin un ciclu
pentru ca tranziţia să fie detectată şi fanionul IEi să fie setat. IEi
va fi şters automat de CPU când rutina de deservire este apelată (i
= 0, 1).
Dacă întreruperea externă este activată pe nivel, sursa externă
trebuie să păstreze cererea activă până ce întreruperea solicitată
este efectiv generată. Apoi aceasta trebuie dezactivată înainte ca
subrutina de deservire să se termine, altfel o altă întrerupere va fi
generată.
Sisteme de control digitale
Majoritatea aplicaţiilor de control actuale sunt bazate pe calculator. În acest
caz, un calculator sau un microcontroller este folosit pentru funcţia de control (de
reglare). Un sistem de control bazat pe calculator este prezentat în figura de mai jos:

În acest caz s-a presupus că semnalul de eroare este analog, iar pentru
transformarea în format digital se foloseşte un convertor analog-numeric (CAN).
Convertorul eşantionează periodic semnalul, convertind apoi eşantioanele în cuvinte
numerice ce sunt procesate de calculator. Calculatorul rulează un algoritm de control
(o bucată de soft) pentru implementarea acţiunilor cerute, astfel încât ieşirea
instalaţiei răspunde conform cerinţelor. Ieşirea calculatorului este un semnal digital,
convertit într-un semnal analogic prin utilizarea unui convertor numeric-analogic (în
mod obişnuit operaţia convertizorului este aproximată printr-o funcţie de transfer de
tipul ZOH – extrapolator de ordinul zero).
Majoritatea microcontrollerelor actule includ convertoare A/D şi D/A pe
acelaşi cip. Astfel, microcontrollerele sunt conectate direct la semnalele analogice
ale instalaţiei.

Există şi alte variante ale sistemului de control digital. În figura de mai jos,
referinţa este citită de la tastatură sau este inclusă în algoritmul de control. Ieşirea
senzorului este convertită în format numeric folosind un convertor analog-numeric,
iar semnalul numeric rezultant este trimis către calculator pentru determinarea erorii
şi implementarea algoritmului de control.
Convertoare analog-numerice
Sunt utilizate pentru transformarea semnalelor analogice, în semnale numerice
ce pot fi citite de microprocesor sau microcontroller. Un convertor ce realizează
citirea unui semnal de intrare măsurat şi transmite la ieşire un cuvânt pe 8 biţi este
prezentat în figura următoare:

Tensiunea de referinţă este valoarea maximă pe care CAN-ul o poate converti.


CAN-ul de mai sus poate converti valori cuprinse între 0V şi tensiunea de referinţă.
Tensiunea de referinţă este divizată în 256 de valori sau paşi. Dimensiunea pasului
este dată prin:
5V
(Tensiune de referinţă)/256 =  0.0195V  19.5mV
256
Dimensiunea pasului defineşte, de asemenea, rezoluţia CAN-ului.
Ieşirea convertorului este un cuvânt pe 8 biţi, iar cel mai semnificativ bit indică
ori de câte ori tensiunea de intrare este mai mare decât jumătate din tensiunea de
referinţă. Fiecare din biţii următori reprezintă jumătate din bitul anterior, astfel:
Bit: Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Volţi: 2.5 1.25 0.625 0.3125 0.156 0.078 0.039 0.0195
De exemplu, cuvântul 0100 0110 este reprezentat prin:
Bit: Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Volţi: 2.5 1.25 0.625 0.3125 0.156 0.078 0.039 0.0195
Valoare de ieşire: 0 1 0 0 0 1 1 0
Tensiunea de intrare se obţine prin relaţia:
1.25  0.078  0.039  1.367 V
Rezoluţia CAN-ului este determinată de intrarea de referinţă şi de lăţimea
cuvântului. Rezoluţia defineşte cea mai mică modificare de tensiune ce poate fi
măsurată de CAN. Pentru CAN-ul definit anterior aplicarea oricărei tensiuni mai
mici de 19.5 mV, va avea ca efect transmiterea unui 0 la ieşire. Orice tensiune între
19.5 mV şi 39 mV va transmite la ieşire pe 1, dacă tensiunea este între 39 mV şi
58.6 mV se va transmite la ieşire 2, s.a.m.d.
Singura posibilitate de a creşte rezoluţia fără schimbarea referinţei este
utilizarea unui CAN cu mai mulţi biţi. De exemplu, un CAN pe 10 biţi, ce foloseşte
un semnal de referinţă de 5 V, va avea o rezoluţie de 4.88 mV (5 V/1024).

Tipuri de CAN-uri
1. CAN de urmărire
CAN-ul de urmărire conţine un comparator, un numărător şi un CNA.
Comparatorul realizează comparaţia dintre tensiunea de intrare şi tensiunea de ieşire
a CNA-ului. Dacă intrarea este mai mare decât tensiunea CNA-ului, atunci
numărătorul se incrementează, dacă intrarea este mai mică decât tensiunea CNA-
ului, atunci numărătorul se decrementează.
Numărătorul va începe să numere de la zero şi se va incrementa la fiecare puls
al ceasului până când va transmite valoarea binară ce reprezintă tensiunea de intrare.
După această fază, ieşirea comparatorului va comuta, iar numărătorul se va
decrementa. Eventual, numărătorul va oscila în jurul valorii ce reprezintă tensiunea
de intrare.

Conversia unei tensiuni de intrare de 0.37V pentru CAN-ul studiat este


reprezentată în figura următoare:

Viteza maximă a unui CAN de urmărire depinde de întârzierea de propagare a


comparatorului şi a CNA-ului.
În general, astfel de CAN-uri sunt utilizate atunci când semnalul de intrare se
modifică lent relativ la perioada de eşantionare.

2. CAN flash
CAN-ul flash este cel mai rapid CAN existent. Un astfel de dispozitiv are un
comparator la fiecare pas de tensiune. Astfel, un CAN pe 4 biţi va avea 16
comparatoare, unul pe 8 biţi va avea 256 de comparatoare, s.a.m.d. O intrare a
tuturor comparatoarelor este conectată la intrarea ce trebuie măsurată. Celelalte
intrări ale comparatoarelor sunt conectate la un lanţ de rezistenţe. Toate ieşirile
comparatoarelor sunt conectate la un circuit logic ce determină ieşirea pe baza stării
comparatoarelor (high sau low). Viteza de conversie a unui CAN flash este dată de
suma întârzierilor comparatoarelor. CAN-urile flash sunt foarte rapide, dar necesită
un consum mare de putere.
3. CAN cu aproximare succesivă
Acest tip de CAN este similar cu cel de urmărire. Diferenţa dintre cele două
este că registrul aproximărilor succesive realizează o căutare binară în locul
numărării.

Conversia unei tensiuni de 3 V este prezentată în figura următoare:

Iniţial registrul aproximărilor succesive setează bitul 7. Tensiunea CAN-ului


este 2.5V. Deoarece, ieşirea comparatorului este high, bitul 7 rămâne setat, deci
ieşirea CAN-ului este: 1000 0000. Următorul pas este setarea bitului 6. În acest caz
tensiunea CAN-ului devine 2.5V+1.25V=3.75V. Deoarece ieşirea comparatorului
este low, bitul 6 se va reseta. Ieşirea CAN-ului este identică cu ieşirea de la pasul
precedent. Procesul continuă până la bitul 0, iar ieşirea CAN-ului depinde de starea
comparatorului (high sau low). În acest caz la ieşirea CAN-ului se va obţine
secvenţa de biţi: 1001 1001, ce corespunde unei tensiuni de 2.988V.
Un astfel de CAN pe 8 biţi realizează o conversie în 8 paşi a tensiunii de
intrare.
Viteza de conversie este mai mare decât în cazul CAN-ului de urmărire, dar în
acest caz este necesară utilizarea unei logici extinse.

4. CAN integrator
Acest tip de CAN foloseşte un integrator în serie cu un comparator şi un circuit
logic. Intrarea integratorului este comutată prima la semnalul de intrare, iar ieşirea
integratorului se încarcă prin intermediul tensiunii de intrare. După un anumit număr
de paşi, intrarea integratorului este comutată la un semnal de referinţă (Ref. 1), iar
integratorul se descarcă prin intermediul acestei valori. La apariţia unei comutări a
tensiunii de referinţă (Ref. 1), este pornit numărătorul, care va număra folosind
acelaşi ceas ce determină timpul de integrare. Atunci când ieşirea integratorului
scade sub un al doilea semnal de tensiune (Ref. 2), ieşirea comparatorului va fi high,
numărătorul se opreşte, iar numărul reprezintă tensiunea analogică de intrare.
Tensiunile de intrare mari vor permite integratorului să se încarce la o tensiune
mai mare, având ca efect direct o numărare mai mare la ieşire.
Acest tip de convertor are nevoie de un timp relativ mare pentru realizarea
conversiei, dar acţiunea de filtrare introdusă de integrator elimină zgomotul.
Circuitul de eşantionare şi memorare (reţinere)
Circuitele realizează eşantionarea şi reţinerea pe nivel a semnalelor de intrare
în CAN, fiind utilizate pentru cazurile în care apar modificări ale tensiunilor de
intrare. Circuitul are un comutator analogic cu o intrare de control. Atunci când
comutatorul este închis, semnalul de intrare este conectat la condensatorul de
menţinere, iar ieşirea buffer-ului urmăreşte intrarea. Atunci când comutatorul este
deschis, intrarea este deconectată de la condensator.
Funcţionarea unui astfel de circuit poate fi descrisă astfel:
- Atunci când semnalul de control este low (eşantionare), ieşirea urmăreşte
intrarea.
- Atunci când semnalul de control devine high (reţinere), deconectând
condensatorul de la intrare, ieşirea rămâne la valoarea pe care intrarea a avut-o
înainte de comutarea la modul de memorare(reţinere).
- Atunci când comutatorul se închide din nou, condensatorul se încarcă rapid, iar
ieşirea urmăreşte din nou intrarea.
În mod uzual, circuitul va comuta la modul de memorare înainte de începutul
conversiei CAN-ului, şi va comuta înapoi la modul de eşantionare după ce conversia
este terminată.
Capacitatea unui astfel de circuit de a ţine ieşirea în modul de memorare este
dependentă de calitatea condensatorului, de caracteristicile amplificatorului utilizat
pentru buffer (impedanţa intrării), precum şi de calitatea comutatorului.
Un circuit de eşantionare şi memorare real are o impedanţă de intrare finită,
prin urmare în modul de eşantionare, condensatorul de reţinere este încărcat prin
intermediul unor rezistenţe. Timpul în care circuitul rămâne în modul de eşantionare,
pentru achiziţia unei intrări complet scalate este numit timp de achiziţie, fiind
specificat în nanosecunde sau microsecunde.
Deoarece în momentul eşantionării circuitul conţine anumite impedanţe
conectate în serie cu condensatorul de reţinere se produce un efect de filtru RC trece
jos. Acest lucru limitează frecvenţa maximă la care eşantioanele pot fi achiziţionate.
Frecvenţa este cunoscută sub denumirea de bandă de putere fiind specificată în kHz
sau MHz.
Diferenţa de tensiune dintre intrare şi ieşire este cunoscută ca offset-ul ieşirii,
fiind exprimată în milivolţi.
Valoarea de deviaţie a ieşirii în modul de reţinere este numită rată de scădere,
fiind specificată în milivolţi /secunde, sau microvolţi /microsecunde.

Multe CAN-uri includ un circuit S/H intern. Un astfel de CAN trebuie să aibă
un pin separat ce controlează tranziţia dintre cele două moduri, sau să comute la
modul de menţinere, automat la începutul unei conversii.

Convertoare numeric-analogice (CNA)


În multe situaţii nu este de ajuns ca un microcontroller să măsoare semnale
analogice, dar să şi genereze astfel de semnale. În cazul echipamentelor industriale
controlate prin semnale analogice, sistemul microcontroller trebuie să fie capabil să
genereze semnale analogice cu amplitudine controlată pentru a comunica cu aceste
echipamente.
O modalitate de a realiza această sarcină este utilizarea unui timer PWM. Prin
aplicarea unui semnal PWM la un filtru trece-jos, va rezulta un semnal de ieşire ce
are amplitudinea Vout  K  VM , unde VM este amplitudinea semnalului VPWM , iar
K este factor de umplere (duty cycle).

Dacă nu este disponibil un timer PWM, sau numărul canalelor PWM este mai
mic decât numărul necesar de ieşiri analogice, soluţia este utilizarea unui CNA.
Există o mare varietate de CNA-uri, de rezoluţii diferite, timpi de conversie
diferiţi, sau modalităţi diferite de transmitere a rezultatului (serial sau paralel).
Majoritatea CNA-urilor funcţionează după acelaşi principiu: divizarea curentului cu
o reţea de rezistenţe. În figura următoare se prezintă un CNA pe 4 biţi:
Amplificatorul operaţional lucrează astfel încât potenţialul celor două intrări
este identic. Prin urmare, reţeaua lucrează ca şi când toate rezistenţele 2R, au un
capăt conectat la masă. Rezistenţa echivalentă a sarcinii Vref este constantă şi egală
cu R. Curenţii totali absorbiţi de cele 4 comutatoare (S3, S2, S1, S0) sunt
I 3  I ref / 2 , I 2  I ref / 4 , I1  I ref / 8 , I 0  I ref / 16 . Tensiunea de ieşire este:
Vout   I F  RF .
Curentul I F poate fi definit astfel:
I F  I ref b0 / 2  b1 / 4  b 2 / 8  b3 / 16 
unde b3  b0 sunt biţii cuvântului ce trebuie convertit într-o valoare analogică.
Prin urmare, tensiunea de ieşire Vout este proporţională cu valoarea binară ce
trebuie convertită.

Interfaţarea CAN-ului cu microprocesorul

1. Interfeţe paralele
CAN-urile vin într-o mare varietate de interfeţe, fiind capabile să lucreze cu
procesoare multiple. Maxim MAX151 este un convertor tipic de 10 biţi cu o
interfaţă paralelă „universală„ pe 8 biţi. Interfaţa cu microprocesorul a acestui tip de
CAN cuprinde o magistrală de date pe 8 biţi, un semnal de selecţie a circuitului
(CS), un semnal de citire (RD) şi o ieşire BUSY. Circuitul include, de asemenea un
S/H intern. Pe frontul descrescător al semnalelor RD şi CS, S/H este trecut în modul
reţinere, fiind pornită conversia. Dacă, CS şi RD nu trec în starea low în acelaşi
timp, ultimul front descrescător porneşte conversia. Odată cu pornirea conversiei,
semnalul BUSY devine activ (egal cu 0). Semnalul rămâne în starea low până când
conversia este terminată.
Există două moduri de operare: modul memoriei lente şi modul ROM. În
primul mod de operare, procesorul aşteaptă, forţând CS şi RD să rămână în starea
low până când conversia este terminată. Într-un astfel de sistem, de obicei semnalul
BUSY este conectat la semnalele RDY şi WAIT ale procesorului. Acestea ţin
procesorul într-o stare de aşteptare până când conversia este terminată. Timpul
maxim de conversie în acest caz este de 2.5s .
În modul ROM de operare, procesorul realizează un ciclu de citire, plasând S/H
în modul reţinere şi iniţiind o conversie. În timpul citirii curente, procesorul citeşte
rezultatele conversiei anterioare. Semnalul BUSY nu este utilizat pentru a extinde
ciclul de citire. În schimb, BUSY este conectat la o întrerupere sau este verificat de
către procesor pentru a indica când conversia este terminată. Atunci când BUSY
trece din 0 în 1, procesorul realizează o nouă citire, pentru a extrage rezultatul şi
astfel, o nouă conversie să înceapă.

2. Interfeţe seriale
Avantajul acestora este acela de a oferi o interfaţă independentă de procesor, ce
nu afectează stările de aşteptare ale procesorului, timpii de reţinere sau frecvenţele
ceasului. Dezavantajul este legat de viteză, deoarece datele trebuie transferate bit cu
bit.
SPI este o interfaţă serială, ce foloseşte un ceas, un semnal de selecţie a
circuitului, precum şi biţi de intrare şi de ieşire.
Maxim MAX1242 este un CAN SPI tipic pe 10 biţi ce foloseşte o aproximare
succesivă, având şi un S/H intern.
Conversia începe pe frontul descrescător a lui CS şi durează aproximativ
7.5s . Atunci când CS este în starea low, circuitul MAX1242 trece pinul de ieşire a
datelor în starea low. După terminarea conversiei, pinul de ieşire a datelor este trecut
în starea high. Procesorul poate citi datele (câte un bit) prin comutarea ceasului şi
prin monitorizarea pinului de ieşire a datelor. După ce cei 10 biţi sunt citiţi,
MAX1242 trimite 2 sub-biţi, S1 şi S0. Pentru alte tranziţii ale ceasului, ce apar după
cele 13 perioade, ieşirea circuitului va fi zero.
În timpul conversiei, magistrala SPI nu este disponibilă pentru comunicaţia cu
alte periferice. Acest lucru este posibil abia după ce conversia este completă, iar
rezultatul a fost citit. Dacă există o subrutină de tratare a întreruperii ce comunică cu
dispozitivele SPI, atunci acestea trebuie să fie dezactivate în timpul conversiei.
Pentru evitarea acestei probleme, MAX1242 poate comunica cu microcontroller-ul
peste o magistrală dedicată SPI.
La terminarea conversiei se va genera un semnal de întrerupere către
microcontroller prin intermediul semnalului DOUT (DOUT=1).

CAN-uri interne
Multe microcontrollere conţin CAN-uri pe acelaşi cip. Exemple de astfel de
microcontrollere sunt Atmel AT90S4434 şi PIC167C7xx. CAN-urile lucrează prin
aproximări succesive.
Microcontrollere din familia PIC16C7xx conţin un CAN pe 8 biţi cu
aproximări succesive şi multiplexoare analogice pe intrare. Microcontrollerele au de
la 4 până la 8 canale. Registrele interne dictează ce canal va fi selectat, precum şi
începerea conversiei. Odată ce o intrare este selectată, există un timp de stabilizare
ce trebuie să treacă pentru a permite condensatorului S/H să se încarce, înainte ca
operaţia de conversie să înceapă.
Dispozitivele permit utilizarea unui pin de intrare pentru tensiunea de referinţă.
Valoarea citită de la CAN după terminarea conversiei este:
 
Digital word  Vin / Vref  256
Circuitele permit setarea internă a tensiunii de alimentare, astfel pinul de
intrare pentru referinţă este o altă intrare analogică.
Măsurarea unui semnal de 3.2V într-un sistem cu o referinţă de 5V, va conduce
către următorul rezultat:
Vin  256 3.2V  256
  16310  A316
Vref 5V
Rezultatul este dependent de tensiunea de alimentare (5V). Dacă tensiunea de
alimentare este crescută cu 1% (5.05V), valoarea conversiei va fi:
Vin  256 3.2V  256
  16210  A216
Vref 5.05V
Prin urmare o creştere cu 1% a tensiunii de alimentare produce o modificare a
rezultatului prin o numărare. În mod uzual, sursele de tensiune pot varia cu 2% sau
3%. Deci, variaţiile de tensiune pot avea un efect semnificativ asupra ieşiri. Ieşirea
sursei de tensiune poate varia datorită sarcinii, a temperaturii, a variaţilor de curent
alternativ sau de la o sursă la alta.
Convertoare analog-numerice
Sunt utilizate pentru transformarea semnalelor analogice, în semnale numerice
ce pot fi citite de microprocesor sau microcontroller. Un convertor ce realizează
citirea unui semnal de intrare măsurat şi transmite la ieşire un cuvânt pe 8 biţi este
prezentat în figura următoare:

Tensiunea de referinţă este valoarea maximă pe care CAN-ul o poate converti.


CAN-ul de mai sus poate converti valori cuprinse între 0V şi tensiunea de referinţă.
Tensiunea de referinţă este divizată în 256 de valori sau paşi. Dimensiunea pasului
este dată prin:
5V
(Tensiune de referinţă)/256 =  0.0195V  19.5mV
256
Dimensiunea pasului defineşte, de asemenea, rezoluţia CAN-ului.
Ieşirea convertorului este un cuvânt pe 8 biţi, iar cel mai semnificativ bit indică
ori de câte ori tensiunea de intrare este mai mare decât jumătate din tensiunea de
referinţă. Fiecare din biţii următori reprezintă jumătate din bitul anterior, astfel:
Bit: Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Volţi: 2.5 1.25 0.625 0.3125 0.156 0.078 0.039 0.0195
De exemplu, cuvântul 0100 0110 este reprezentat prin:
Bit: Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Volţi: 2.5 1.25 0.625 0.3125 0.156 0.078 0.039 0.0195
Valoare de ieşire: 0 1 0 0 0 1 1 0
Tensiunea de intrare se obţine prin relaţia:
1.25  0.078  0.039  1.367 V
Rezoluţia CAN-ului este determinată de intrarea de referinţă şi de lăţimea
cuvântului. Rezoluţia defineşte cea mai mică modificare de tensiune ce poate fi
măsurată de CAN. Pentru CAN-ul definit anterior aplicarea oricărei tensiuni mai
mici de 19.5 mV, va avea ca efect transmiterea unui 0 la ieşire. Orice tensiune între
19.5 mV şi 39 mV va transmite la ieşire pe 1, dacă tensiunea este între 39 mV şi
58.6 mV se va transmite la ieşire 2, s.a.m.d.
Singura posibilitate de a creşte rezoluţia fără schimbarea referinţei este
utilizarea unui CAN cu mai mulţi biţi. De exemplu, un CAN pe 10 biţi, ce foloseşte
un semnal de referinţă de 5 V, va avea o rezoluţie de 4.88 mV (5 V/1024).

Tipuri de CAN-uri
1. CAN de urmărire
CAN-ul de urmărire conţine un comparator, un numărător şi un CNA.
Comparatorul realizează comparaţia dintre tensiunea de intrare şi tensiunea de ieşire
a CNA-ului. Dacă intrarea este mai mare decât tensiunea CNA-ului, atunci
numărătorul se incrementează, dacă intrarea este mai mică decât tensiunea CNA-
ului, atunci numărătorul se decrementează.
Numărătorul va începe să numere de la zero şi se va incrementa la fiecare puls
al ceasului până când va transmite valoarea binară ce reprezintă tensiunea de intrare.
După această fază, ieşirea comparatorului va comuta, iar numărătorul se va
decrementa. Eventual, numărătorul va oscila în jurul valorii ce reprezintă tensiunea
de intrare.

Conversia unei tensiuni de intrare de 0.37V pentru CAN-ul studiat este


reprezentată în figura următoare:

Viteza maximă a unui CAN de urmărire depinde de întârzierea de propagare a


comparatorului şi a CNA-ului.
În general, astfel de CAN-uri sunt utilizate atunci când semnalul de intrare se
modifică lent relativ la perioada de eşantionare.

2. CAN flash
CAN-ul flash este cel mai rapid CAN existent. Un astfel de dispozitiv are un
comparator la fiecare pas de tensiune. Astfel, un CAN pe 4 biţi va avea 16
comparatoare, unul pe 8 biţi va avea 256 de comparatoare, s.a.m.d. O intrare a
tuturor comparatoarelor este conectată la intrarea ce trebuie măsurată. Celelalte
intrări ale comparatoarelor sunt conectate la un lanţ de rezistenţe. Toate ieşirile
comparatoarelor sunt conectate la un circuit logic ce determină ieşirea pe baza stării
comparatoarelor (high sau low). Viteza de conversie a unui CAN flash este dată de
suma întârzierilor comparatoarelor. CAN-urile flash sunt foarte rapide, dar necesită
un consum mare de putere.
3. CAN cu aproximare succesivă
Acest tip de CAN este similar cu cel de urmărire. Diferenţa dintre cele două
este că registrul aproximărilor succesive realizează o căutare binară în locul
numărării.

Conversia unei tensiuni de 3 V este prezentată în figura următoare:

Iniţial registrul aproximărilor succesive setează bitul 7. Tensiunea CAN-ului


este 2.5V. Deoarece, ieşirea comparatorului este high, bitul 7 rămâne setat, deci
ieşirea CAN-ului este: 1000 0000. Următorul pas este setarea bitului 6. În acest caz
tensiunea CAN-ului devine 2.5V+1.25V=3.75V. Deoarece ieşirea comparatorului
este low, bitul 6 se va reseta. Ieşirea CAN-ului este identică cu ieşirea de la pasul
precedent. Procesul continuă până la bitul 0, iar ieşirea CAN-ului depinde de starea
comparatorului (high sau low). În acest caz la ieşirea CAN-ului se va obţine
secvenţa de biţi: 1001 1001, ce corespunde unei tensiuni de 2.988V.
Un astfel de CAN pe 8 biţi realizează o conversie în 8 paşi a tensiunii de
intrare.
Viteza de conversie este mai mare decât în cazul CAN-ului de urmărire, dar în
acest caz este necesară utilizarea unei logici extinse.

4. CAN integrator
Acest tip de CAN foloseşte un integrator în serie cu un comparator şi un circuit
logic. Intrarea integratorului este comutată prima la semnalul de intrare, iar ieşirea
integratorului se încarcă prin intermediul tensiunii de intrare. După un anumit număr
de paşi, intrarea integratorului este comutată la un semnal de referinţă (Ref. 1), iar
integratorul se descarcă prin intermediul acestei valori. La apariţia unei comutări a
tensiunii de referinţă (Ref. 1), este pornit numărătorul, care va număra folosind
acelaşi ceas ce determină timpul de integrare. Atunci când ieşirea integratorului
scade sub un al doilea semnal de tensiune (Ref. 2), ieşirea comparatorului va fi high,
numărătorul se opreşte, iar numărul reprezintă tensiunea analogică de intrare.
Tensiunile de intrare mari vor permite integratorului să se încarce la o tensiune
mai mare, având ca efect direct o numărare mai mare la ieşire.
Acest tip de convertor are nevoie de un timp relativ mare pentru realizarea
conversiei, dar acţiunea de filtrare introdusă de integrator elimină zgomotul.
Circuitul de eşantionare şi memorare (reţinere)
Circuitele realizează eşantionarea şi reţinerea pe nivel a semnalelor de intrare
în CAN, fiind utilizate pentru cazurile în care apar modificări ale tensiunilor de
intrare. Circuitul are un comutator analogic cu o intrare de control. Atunci când
comutatorul este închis, semnalul de intrare este conectat la condensatorul de
menţinere, iar ieşirea buffer-ului urmăreşte intrarea. Atunci când comutatorul este
deschis, intrarea este deconectată de la condensator.
Funcţionarea unui astfel de circuit poate fi descrisă astfel:
- Atunci când semnalul de control este low (eşantionare), ieşirea urmăreşte
intrarea.
- Atunci când semnalul de control devine high (reţinere), deconectând
condensatorul de la intrare, ieşirea rămâne la valoarea pe care intrarea a avut-o
înainte de comutarea la modul de memorare(reţinere).
- Atunci când comutatorul se închide din nou, condensatorul se încarcă rapid, iar
ieşirea urmăreşte din nou intrarea.
În mod uzual, circuitul va comuta la modul de memorare înainte de începutul
conversiei CAN-ului, şi va comuta înapoi la modul de eşantionare după ce conversia
este terminată.
Capacitatea unui astfel de circuit de a ţine ieşirea în modul de memorare este
dependentă de calitatea condensatorului, de caracteristicile amplificatorului utilizat
pentru buffer (impedanţa intrării), precum şi de calitatea comutatorului.
Un circuit de eşantionare şi memorare real are o impedanţă de intrare finită,
prin urmare în modul de eşantionare, condensatorul de reţinere este încărcat prin
intermediul unor rezistenţe. Timpul în care circuitul rămâne în modul de eşantionare,
pentru achiziţia unei intrări complet scalate este numit timp de achiziţie, fiind
specificat în nanosecunde sau microsecunde.
Deoarece în momentul eşantionării circuitul conţine anumite impedanţe
conectate în serie cu condensatorul de reţinere se produce un efect de filtru RC trece
jos. Acest lucru limitează frecvenţa maximă la care eşantioanele pot fi achiziţionate.
Frecvenţa este cunoscută sub denumirea de bandă de putere fiind specificată în kHz
sau MHz.
Diferenţa de tensiune dintre intrare şi ieşire este cunoscută ca offset-ul ieşirii,
fiind exprimată în milivolţi.
Valoarea de deviaţie a ieşirii în modul de reţinere este numită rată de scădere,
fiind specificată în milivolţi /secunde, sau microvolţi /microsecunde.

Multe CAN-uri includ un circuit S/H intern. Un astfel de CAN trebuie să aibă
un pin separat ce controlează tranziţia dintre cele două moduri, sau să comute la
modul de menţinere, automat la începutul unei conversii.

Convertoare numeric-analogice (CNA)


În multe situaţii nu este de ajuns ca un microcontroller să măsoare semnale
analogice, dar să şi genereze astfel de semnale. În cazul echipamentelor industriale
controlate prin semnale analogice, sistemul microcontroller trebuie să fie capabil să
genereze semnale analogice cu amplitudine controlată pentru a comunica cu aceste
echipamente.
O modalitate de a realiza această sarcină este utilizarea unui timer PWM. Prin
aplicarea unui semnal PWM la un filtru trece-jos, va rezulta un semnal de ieşire ce
are amplitudinea Vout  K  VM , unde VM este amplitudinea semnalului VPWM , iar
K este factor de umplere (duty cycle).

Dacă nu este disponibil un timer PWM, sau numărul canalelor PWM este mai
mic decât numărul necesar de ieşiri analogice, soluţia este utilizarea unui CNA.
Există o mare varietate de CNA-uri, de rezoluţii diferite, timpi de conversie
diferiţi, sau modalităţi diferite de transmitere a rezultatului (serial sau paralel).
Majoritatea CNA-urilor funcţionează după acelaşi principiu: divizarea curentului cu
o reţea de rezistenţe. În figura următoare se prezintă un CNA pe 4 biţi:
Amplificatorul operaţional lucrează astfel încât potenţialul celor două intrări
este identic. Prin urmare, reţeaua lucrează ca şi când toate rezistenţele 2R, au un
capăt conectat la masă. Rezistenţa echivalentă a sarcinii Vref este constantă şi egală
cu R. Curenţii totali absorbiţi de cele 4 comutatoare (S3, S2, S1, S0) sunt
I 3  I ref / 2 , I 2  I ref / 4 , I1  I ref / 8 , I 0  I ref / 16 . Tensiunea de ieşire este:
Vout   I F  RF .
Curentul I F poate fi definit astfel:
I F  I ref b0 / 2  b1 / 4  b 2 / 8  b3 / 16 
unde b3  b0 sunt biţii cuvântului ce trebuie convertit într-o valoare analogică.
Prin urmare, tensiunea de ieşire Vout este proporţională cu valoarea binară ce
trebuie convertită.

Interfaţarea CAN-ului cu microprocesorul

1. Interfeţe paralele
CAN-urile vin într-o mare varietate de interfeţe, fiind capabile să lucreze cu
procesoare multiple. Maxim MAX151 este un convertor tipic de 10 biţi cu o
interfaţă paralelă „universală„ pe 8 biţi. Interfaţa cu microprocesorul a acestui tip de
CAN cuprinde o magistrală de date pe 8 biţi, un semnal de selecţie a circuitului
(CS), un semnal de citire (RD) şi o ieşire BUSY. Circuitul include, de asemenea un
S/H intern. Pe frontul descrescător al semnalelor RD şi CS, S/H este trecut în modul
reţinere, fiind pornită conversia. Dacă, CS şi RD nu trec în starea low în acelaşi
timp, ultimul front descrescător porneşte conversia. Odată cu pornirea conversiei,
semnalul BUSY devine activ (egal cu 0). Semnalul rămâne în starea low până când
conversia este terminată.
Există două moduri de operare: modul memoriei lente şi modul ROM. În
primul mod de operare, procesorul aşteaptă, forţând CS şi RD să rămână în starea
low până când conversia este terminată. Într-un astfel de sistem, de obicei semnalul
BUSY este conectat la semnalele RDY şi WAIT ale procesorului. Acestea ţin
procesorul într-o stare de aşteptare până când conversia este terminată. Timpul
maxim de conversie în acest caz este de 2.5s .
În modul ROM de operare, procesorul realizează un ciclu de citire, plasând S/H
în modul reţinere şi iniţiind o conversie. În timpul citirii curente, procesorul citeşte
rezultatele conversiei anterioare. Semnalul BUSY nu este utilizat pentru a extinde
ciclul de citire. În schimb, BUSY este conectat la o întrerupere sau este verificat de
către procesor pentru a indica când conversia este terminată. Atunci când BUSY
trece din 0 în 1, procesorul realizează o nouă citire, pentru a extrage rezultatul şi
astfel, o nouă conversie să înceapă.

2. Interfeţe seriale
Avantajul acestora este acela de a oferi o interfaţă independentă de procesor, ce
nu afectează stările de aşteptare ale procesorului, timpii de reţinere sau frecvenţele
ceasului. Dezavantajul este legat de viteză, deoarece datele trebuie transferate bit cu
bit.
SPI este o interfaţă serială, ce foloseşte un ceas, un semnal de selecţie a
circuitului, precum şi biţi de intrare şi de ieşire.
Maxim MAX1242 este un CAN SPI tipic pe 10 biţi ce foloseşte o aproximare
succesivă, având şi un S/H intern.
Conversia începe pe frontul descrescător a lui CS şi durează aproximativ
7.5s . Atunci când CS este în starea low, circuitul MAX1242 trece pinul de ieşire a
datelor în starea low. După terminarea conversiei, pinul de ieşire a datelor este trecut
în starea high. Procesorul poate citi datele (câte un bit) prin comutarea ceasului şi
prin monitorizarea pinului de ieşire a datelor. După ce cei 10 biţi sunt citiţi,
MAX1242 trimite 2 sub-biţi, S1 şi S0. Pentru alte tranziţii ale ceasului, ce apar după
cele 13 perioade, ieşirea circuitului va fi zero.
În timpul conversiei, magistrala SPI nu este disponibilă pentru comunicaţia cu
alte periferice. Acest lucru este posibil abia după ce conversia este completă, iar
rezultatul a fost citit. Dacă există o subrutină de tratare a întreruperii ce comunică cu
dispozitivele SPI, atunci acestea trebuie să fie dezactivate în timpul conversiei.
Pentru evitarea acestei probleme, MAX1242 poate comunica cu microcontroller-ul
peste o magistrală dedicată SPI.
La terminarea conversiei se va genera un semnal de întrerupere către
microcontroller prin intermediul semnalului DOUT (DOUT=1).

CAN-uri interne
Multe microcontrollere conţin CAN-uri pe acelaşi cip. Exemple de astfel de
microcontrollere sunt Atmel AT90S4434 şi PIC167C7xx. CAN-urile lucrează prin
aproximări succesive.
Microcontrollere din familia PIC16C7xx conţin un CAN pe 8 biţi cu
aproximări succesive şi multiplexoare analogice pe intrare. Microcontrollerele au de
la 4 până la 8 canale. Registrele interne dictează ce canal va fi selectat, precum şi
începerea conversiei. Odată ce o intrare este selectată, există un timp de stabilizare
ce trebuie să treacă pentru a permite condensatorului S/H să se încarce, înainte ca
operaţia de conversie să înceapă.
Dispozitivele permit utilizarea unui pin de intrare pentru tensiunea de referinţă.
Valoarea citită de la CAN după terminarea conversiei este:
 
Digital word  Vin / Vref  256
Circuitele permit setarea internă a tensiunii de alimentare, astfel pinul de
intrare pentru referinţă este o altă intrare analogică.
Măsurarea unui semnal de 3.2V într-un sistem cu o referinţă de 5V, va conduce
către următorul rezultat:
Vin  256 3.2V  256
  16310  A316
Vref 5V
Rezultatul este dependent de tensiunea de alimentare (5V). Dacă tensiunea de
alimentare este crescută cu 1% (5.05V), valoarea conversiei va fi:
Vin  256 3.2V  256
  16210  A216
Vref 5.05V
Prin urmare o creştere cu 1% a tensiunii de alimentare produce o modificare a
rezultatului prin o numărare. În mod uzual, sursele de tensiune pot varia cu 2% sau
3%. Deci, variaţiile de tensiune pot avea un efect semnificativ asupra ieşiri. Ieşirea
sursei de tensiune poate varia datorită sarcinii, a temperaturii, a variaţilor de curent
alternativ sau de la o sursă la alta.
Compresia datelor
Conversia analog-numerică realizează conversia semnalelor provenite de la
echipamentele analogice în semnale numerice sau discrete.
Compresia datelor poate fi privită ca un caz particular al conversiei A/N, pentru
care putem evidenţia două mari ramuri:
1. Cuantizarea – proces prin care semnalul analogic este cuantizat într-un secvenţă
finită de numere. În acest caz, datorită apariţiei anumitor distorsiuni o parte a
informaţiei se pierde, iar informaţia pierdută nu mai poate fi recuperată. În cadrul
acestei clase de conversie se pot încadra diversele tipuri de modulaţie (modulaţia
impulsurilor în cod, modulaţia impulsurilor în cod diferenţială, modulaţia delta),
precum şi cuantizarea uniformă, neuniformă sau vectorială.
2. Codificarea fără zgomot – în care datele numerice (de obicei cele rezultate ca
urmare a unui proces de cuantizare) sunt comprimate, în vederea reprezentării lor,
prin utilizarea unui număr cât mai mic de biţi, astfel încât secvenţa iniţială poate fi
recuperată în totalitate. Din această categorie fac parte tehnicile de codificare a
sursei, cum ar fi: codificarea Huffman, codificarea Lempel-Ziv, codificarea
aritmetică, etc. În acest caz, nu apar pierderi de informaţie.
Cel mai simplu tip de sursă discretă este cel ce emite o secvenţă de litere dintr-un
alfabet finit. Spre exemplu, o sursă binară emite o secvenţă binară de forma 1011011…,
în timp ce alfabetul este format din simbolurile {0, 1}.
În general, o sursă discretă de informaţie cu un alfabet de L simboluri posibile, de
exemplu  x1 , x2 , , xL  , emite o secvenţă de simboluri selectată din alfabet.

Probabilitatea de apariţie a fiecărui simbol din alfabet, este:


pk  P  X  xk  , 1  k  L
L (46)
p
k 1
k 1

Ieşirea unei surse de informaţie (data, audio, video, etc) poate fi modelată ca un
proces aleatoriu. Pentru un proces aleatoriu staţionar, fără memorie, cantitatea medie de
informaţie emisă de sursă sau entropia este definită prin:
H  X     p  x  log p  x   log L (47)
xX
unde X este alfabetul sursei, iar p  x  este probabilitatea simbolului x .

Dacă baza logaritmului este 2, atunci unitatea de măsură pentru entropie este bitul.
Pentru alfabetul binar, cu probabilităţile p şi, respectiv 1  p , entropia este definită prin:

H b  p    p log p  1  p  log 1  p  (48)

Relaţia (48) determină numărul de biţi necesar pentru reprezentarea unei surse, astfel
încât aceasta să fie recuperată în totalitate.

Cuvinte de cod de lungime fixată


Dacă se consideră un codificator ce atribuie o combinaţie, unică, de R biţi fiecărui
simbol, atunci, atunci numărul de biţi necesari pentru fiecare simbol este:
 log 2 L dacă L este par
R (49)
 log 2 L   1 dacă L este impar
unde, simbolul   desemnează cel mai mare întreg

Eficienţa codificării, în acest caz este definită prin raportul H  X  / R şi este de 100%.

Metoda de codificare nu introduce distorsiuni, deoarece codificarea simbolurilor


sursei este unică. Acest tip de codificare se numeşte fără zgomot.

Cuvinte de cod de lungime variabilă


Atunci când simbolurile sursei au probabilităţi diferite, o metodă de codificare
mai eficientă este utilizarea unui cod de lungime variabilă.
Un exemplu de astfel de codificare este codul Morse. În codul Morse, simbolurile
cu probabilitate mai mare sunt codificate prin cuvinte scurte, pe când simbolurile ce apar
mai rar sunt codificate prin cuvinte lungi.
Problema ce apare ca urmare a acestei abordări este găsirea unei metode de
selectare şi atribuire a cuvintelor de cod către simbolurile sursei.
Simbol Probabilitate Cod 1 Cod 2 Cod 3
a1 1/2 1 0 0

a2 1/4 00 10 01

a3 1/8 01 110 011

a4 1/8 10 111 111

Spre exemplu, conform tabelului precedent, avem de codificat 4 simboluri cu


probabilităţi diferite. Codul 1 este un cod cu lungime variabilă ce are o bază ambiguă.
Dacă se consideră secvenţa 001001…, atunci primul simbol ce corespunde lui 00 este a2 ,

în timp ce următorii 4 biţi sunt neclari (nu pot fi în mod unic decodaţi). Decodarea se
poate face fie prin perechea a4a3 , fie prin perechea a1a2 a1 . Codurile ar trebui să fie
decodate în mod unic şi instantaneu.
Pe de altă parte, codul 2 este decodat în mod unic. Cuvintele de cod pot fi
reprezentate printr-un structură arborescentă.

a1 a2 a3

0 0 0
a4

Figura 32 1 1 1
Se observă că primele 3 cuvinte de cod au ultimul bit 0, şi nici un cuvânt nu este
mai mare de 3 biţi. Aceste caracteristici fac ca acest cod să fie decodat în mod
instantaneu.
Codul 3 are o structură arborescentă, prezentată în figura 33. Codul este în mod
unic decodat, dar nu este decodat în mod instantaneu.
a2 a3
a1 1 1

0
a4

1 1 1
Figura 33
Algoritmul de codificare Huffman
Algoritmul Hufmann este o codificare de lungime variabilă ce se bazează pe
probabilităţile simbolurilor sursei P  xi  , i  1, , L . Algoritmul este unul optimal,

astfel încât numărul mediu necesar pentru a reprezenta simbolurile sursei, este minim,
desigur cu îndeplinirea condiţiei privind decodificarea unică şi instantanee a secvenţei
recepţionate.
Se consideră o secvenţă de şapte posibile simboluri x1 , x2 , , x7  cu următoarele

probabilităţi: p  0.35,0.30,0.20,0.10,0.04,0.005,0.004 .

Prima etapă a codificării presupune ordonarea simbolurilor în funcţie de


probabilitatea de apariţie. În cazul studiat, entropia, definită prin relaţia (47) este:
7
H  X     pi log pi  x   2.10 biţi/simbol
i 1

iar, numărul mediu de numere binare (digiţi) per simbol sursă este:
7
R   i  p  i   2.21 numere binare/simbol.
i 1

Procesul de codificare începe cu simbolurile ce au probabilitatea cea mai mică,


respectiv x şi x . Acestea sunt conectate împreună prin două ramuri, cărora li se atribuie

valorile 0 şi 1, rezultând un nou simbol cu probabilitatea p = 0.09. Procesul continuă,


până la ultimul simbol, conform structurii arborescente, reprezentate în figura 34.
0
0.35

0
0.30
0.649
0
0.20 1
0.349
0
0.10 1
0.149
0
0.04 1
0.049
0
0.005 0.009 1
1
0.004
1

În final, codificarea simbolurilor sursei, se poate realiza astfel:


Simbol Cod binar
x1 0

x2 10

x3 110

x4 1110

x5 11110

x6 111110

x7 111111
Sisteme de microcalculatoare și decizii de proiectare

Versatilitatea circuitelor de tip microprocesor reprezintă cheia succesului lor.


Aplicațiile în care acestea sunt utilizate sunt diverse și reflectă importanța crucială a
microprocesoarelor:
- înlocuirea circuitelor logice, a sistemelor cu relee și a cuplajelor mecanice. Programe
relativ simple, implementate în ROM-uri, realizează funcții logice, de secvențiere, de
numărare și de sincronizare în timp.
- conducerea numerică (digitală) directă a mașinilor-unelte, a proceselor chimice,
deseori combinată cu generarea de rapoarte (control centralizat). O gamă largă de
aplicații, cu tendința de a înlocui minicalculatoarele de capacitate mai mare printr-o
ierarhie de microprocesoare distribuite.
- aplicații ce combină culegerea de date cu cerința de a comunica cu calculatore și
programe de nivele superioare.
- operații logice simple sau asupra unor șiruri de caractere, cu cerințe deosebite în
ceeea ce privește viteza de lucru și/sau volumul datelor prelucrate (telecomunicații,
calculator “frontal” pentru alte calculatoare de capacitate mai mare, supravegherea
unor procese critice ca timp). Asemenea aplicații favorizează sistemele dezvoltate de
întrerupere, transferurile cu acces direct la memoriile interne și prelucrările rapide
însă cu seturi simple de instrucțiuni.
- calcule “on-line” mai complicate (prelucrări de date, filtrare numerică, simulare) . În
aceste cazuri se pot utiliza procesoare specializate (de exemplu DSP-uri).
- aplicații complexe specializate (de exemplu comanda unui sistem de afișare,
proiectare asistată de calculator, grafică prin calculator).
- “utilizatori finali” de tipul unor echipe de cercetători care doresc să dispună de
capacității proprii de calcul, inclusiv sisteme de operare evaluate și intrare/ieșire
convențională.
- sisteme numerice înglobate de control (embedded systems) cu o creștere exponențială
în ceea ce privește domeniile de utilizare.
Ciclul rapid de proiectare/reproiectare în cazul utilizării de microcalculatoare
permite lansarea pe piață a unui produs competitiv fiind posibilă o rapidă recuperare a
cheltuielilor de elaborare. Reprogramarea relativă simplă permite o promptă
modificare și/sau adăugarea de facilități produsului ca răspuns la noile cerințe.
O putere de prelucrare crescută – operații logice mai rapide, lungimi mai mari ale
cuvîntului, mai multe registre, mai multe moduri de adresare și instrucțiuni – pot
reduce costurile de programare.
Costul sistemelor cu microcalculatoare este determinat prin relația:
cost pe sistem = cost hardware pe sistem + costuri de proiectare/N
unde N este numărul de sisteme produse.
Costurile hardware includ costurile pentru componentele electronice, circuite
imprimate, cablaje, sertare și surse de alimentare, precum și manopera și cheltuielile
de regie pentru fabricație și testare.
Costurile de proiectare sunt în mare reprezentate de costurile de programare și de
testare a programelor, plus unele costuri de proiectare de interfețe și testare a
prototipului.
În general, orice proiect de utilizare a calculatoarelor trebuie să fie prevăzut
pentru extindere.
Dacă numărul de sisteme produse (N) este mic, atunci costurile de proiectare a
aplicației devin importante. Pe de altă parte costul de proiectare se poate minimiza pe
seama costurilor pentru echipamente, astfel:
- programarea într-un limbaj de nivel înalt
- utlizarea unei capacități suplimentare a memoriei și/sau a unor
procesoare mai puternice
- achiziția de module funcționale complete în loc de componente
elementare
Costul pentru echipament devine critic în cazul sistemelor produse în serie foarte
mare, când costul de proiectare a aplicației se divide la un N mare (care poate fi de
ordinul milioanelor, dacă este vorba, de exemplu de un sistem de aprindere electronică cu
microprocesor pentru automobile). În acest caz, se preferă utilizarea unor programe
optimizate, utilizarea unui spațiu minim de memorare, precum și utilizarea unui procesor
cât mai ieftin.
Pentru a minimiza costurile de fabricație și de testare, se poate încerca reducerea
sistemului la posibilitățile unui singur microprocesor și eventual merge mai departe și
proiecta un circuit larg integrat special.
Așa cum s-a precizat, în cursurile anterioare, un sistem complet de
microcalculator cuprinde ca părți componente principale:
- microprocesorul (circuit sau circuite de unitate centrală)
- memorie de program
- memorie de date
- porți de intrare/ieșire (interfețe) pentru transmisia paralelă și/sau serială
a datelor,
plus elemente logice suplimentare, cum ar fi:
- ceas pentru unitatea centrală
- amplificatoare tampon și cu reținere, pentru semnale de magistrală
- memorie suplimentară sau decodificatoare de adresă de interfețe
- bistabili de comutare
Costul proiectării, realizării, testării și întreținerii ansamblului face ca numărul
circuitelor componente utilizate să constituie un factor important în proiectare, în special
pentru sisteme mici, fabricate în serie mare. Numărul componentelor poate fi redus prin
combinarea într-un mod inteligent a circuitelor de unitate centrală, ceas, memorii și porți
de intrare/ieșire.
Magistralele pe care sunt transmise semnale de date, adresă și control reprezintă
modalitatea de comunicație dintre procesor și memorie sau porțile de intrare/ieșire
(porturi I/O).
Un ciclu de magistrală reprezintă o operație pe magistrală prin care un cuvânt de
date sau de instrucțiune este transferat între procesor și memorie sau porturile de I/O.
Fiecare instrucțiune a calculatorului necesită cel puțin un ciclu de magistrală
(ciclul FETCH de citire a instrucțiunii), care adresează memoria de program și transferă
un cuvânt instrucțiune în registrul de instrucțiuni al procesorului.
Majoritatea magistralelor microcalculatoarelor au atâtea circuite bidirecționale de
date câți biți are un cuvânt calculator.
Adresele complete sunt transmise prin linii separate de adresă.
Memoria de program, eventual prin utilizarea unei lungimi mai mare a cuvântului,
dispune de o magistrală separată, ceea ce conduce la o viteză foarte mare de calcul, în
special datorită faptului că citirea din memorie a instrucțiunilor și a datelor pot fi parțial
suprapuse.
În ceea ce privește etapa de testare a unui sistem cu microprocesor, problemele
apar ca urmare a conceptului de “sistem în buclă închisă” specific unui astfel de sistem.

CPU Memorie

Reg. instrucțiunii Mag. de adrese


Date

Unitatea de control
Mag. de date

Calea inversă de reacție

Unitatea centrală calculează, intern, o adresă folosită pentru a citi următoarea


instrucțiune din memorie. Op-codul circulă pe magistrala de date către unitatea centrală,
unde este interpretat. Rezultatul interpretării conduce, eventual, către generarea unei noi
adrese, și secvența se repetă la infinit.
Dacă, însă, conținutul unei locații de memorie este deteriorat, atunci datele citite
de la acea locație poate conduce către o adresă a instrucțiunii următoare diferită de cea
dorită. Acțiunea poate avea drept efect un salt fals, ce conduce către un comportament
impredictibil.
Alte posibile defecte ce produc același efect observabil, sunt:
- adresa de la unitatea centrală este greșită, datorită unei defecțiuni în
unitate. Același efect se poate observa dacă unitatea funcționează
perfect, dar circuitele sale suplimentare (reinițializare, ceas, întreruperi)
sunt defecte
- adresa la memorie este greșită ca urmare a unei defecțiuni a magistralei
de adrese. În această categorie sunt incluse și efectele erorilor în
adresele circuitului de decodificare
- datele de pe magistrala de date sunt greșite ca urmate a defectării
memoriei sau a magistralei de date. Erorile generate de magistrala de
date pot apare și ca urmare a unei defecțiuni a registrelor magistralei.
O metodă de a depista defectele enunțate anterior este monitorizarea operațiilor
sistemului într-o perioadă de timp și analizarea comportamentului sistemului pentru a
găsi cauza defectului.

Proiectarea unui sistem de control folosind microcontrollerul


Așa cum s-a precizat dezvoltarea din ultimele decenii a sistemelor cu
microprocesoare, în spetă a microntrollerelor a permis modificarea strategiilor de
proiectare a unui sistem de control (de reglare).
În locul regulatoarelor analogice, realizate cu elemente electronice (amplificatoare
opereaționale, rezistențe. condesantoare, etc), ce implementau o clasă restrânsă de legi de
control (de regulă legile tipizate, de tip PID), în ultimii ani s-a impus utilizarea legilor
discrete de reglare implementate la nivelul unui echipament numeric (μC). Folosind
limbaje de programare adecvate (limbaj C, limbaj de asamblare, etc.) este posibilă
implementarea unei game variate de legi de control (reglare) de la cele mai simple, până
la cele mai complexe, destinate conducerii unor procese dintre cele mai variate.
Așa cum s-a precizat, componentele unui sistem de reglare numeric pot fi:
microcontroller (microprocesor, memorii, convertoare analog numerice și numeric
analogice - PWM), instalație analogică, senzori(traductoare), filtre, etc.
Etapele necesare implementării unui control numeric, pot fi sintetizate astfel:
1. Identificarea instalației analogice
2. Validarea modelului obținut
3. Proiectarea legii de reglare (control) continue
4. Implementarea la nivelul μC a legii de reglare discrete obținută prin discretizarea
legii de reglare de la punctul anterior
5. Validarea algoritmului de control propus

+5V

AVDD (25) VDD (10, 26, 38, 57)


RA0
RC2
RA1
RA2 RE2
RA3
Modul ECCP1 RE5
(PWM)
RA4 RG4
RA5
RF0
RF1
RF2 PIC18F8722
RF3 Convertor A/D
RF4
RF5
RF6
RH4
RH5
RC6
RH6
RC7
RH7 Modul EUSART1

VSS
AVSS (26) OSC1(RA6) OSC2(RA7) (9,25,41,56)

XTAL

C1 C2

Prima etapă presupune ridicarea unor caracteristici intrare – ieșire, pe baza cărora
instalația este descrisă printr-un model adecvat în domeniul timp continuu.
Spre exemplu, dacă se consideră o aplicație de control a unui motor de curent
continuu, prin intermediul unui μC (PIC18F8722), atunci în această etapă se poate aplica
la intrarea motorului prin intermediul modului ECCP1 o treaptă de tensiune constantă de
5V. Ieșirea motorului poate fi citită prin intermediul unui traductor (encoder) și transmisă
μC prin intermediul convertorului A/D . Pentru ridicarea caracteristicilor dorite, mărimea
de ieșire poate fi transmisă către un PC prin intermediul modulului EUSART1 și a
protocolului RS232.
Etapa următoare presupune validarea modelului obținut prin identificare cu
modelul matematic al instalației studiate.
Pe baza modelului obținut se va realiza proiectarea legii de reglare în domeniul
timp continuu ce asigură urmărirea unei referințe prestabilite. Spre exemplu, în cazul unui
motor de c.c. referința poate fi o amplitudine dorită pentru viteza de rotație asociată
axului motorului.
Pentru a putea fi implementată la nivelul μC legea de reglare trebuie discretizată.
În acest sens, există o serie de metode de discretizare, printre cele mai cunoscute fiind:
substituția Tustin, metoda Euler, etc.
Spre exemplu, o lege de reglare PID discretă poate fi implementată la nivelul μC,
prin următoarea relație cu diferențe:
u  k   u  k  1  a  e  k   b  e  k  1  c  e  k  2 
 T k 
a   k p  ki  d 
 2 T 
 T 2k 
b    k p  ki  d 
 2 T 
k
c d
T
unde: u  k  este mărimea de control la pasul curent k aplicată instalației, e  k  este

eroarea sistemului la pasul curent k , k p , ki , kd sunt coeficienții legii de reglare în timp

t de  t 
continuu de forma: u  t   k p e  t   ki  e  t  dt  kd , fiind obținuți pe baza modelului
0 dt
instalației, T este perioada de eșantionare.
În plus e  k   r  k   y  k  , unde r  k  este referința la momentul curent k , iar

y  k  este ieșirea instalației la momentul curent k .

Din punct de vedere matematic, ultima etapă în proiectarea unui astfel de sistem
de control (validarea legii de reglare propus) trebuie să asigure îndeplinirea următoarei
cerințe: lim e  k   0 .
k 
Pe lângă elementele componente ale sistemului de control, deja enunțate, în
funcție de aplicație pot să apară și alte componente. Spre exemplu, în cazul discutat al
unui motor de c.c., între microcontroller și instalație trebuie intercalată o punte H utilizată
pentru aplicarea unei tensiuni pe o sarcină în orice sens. Acest lucru permite acționarea în
sensul acelor de ceasornic sau invers a motorului de c.c.

You might also like