Documente Academic
Documente Profesional
Documente Cultură
Aşa cum s-a precizat, UCP a unui SPN execută un program reprezentat printr-o
secvenţă de instrucţiuni. Aceste instrucţiuni pot fi, în cazul cel mai general, de forma:
adună două numere, transferă un număr în memorie, la o adresă dată, deplasează un
număr cu o unitate spre dreapta, etc. Fiecare instrucţiune este reprezentată printr-un
număr de octeţi (în general, între 1 şi 8) care reprezintă codul maşină al instrucţiunii.
Secvenţa de instrucţiuni obţinută în acest fel este memorată în memoria program.
Execuţia unei instrucţiuni înseamnă extragerea codului maşină din memorie,
decodificarea, iar apoi execuţia propriu zisă.
Codul maşină al unei instrucţiuni trebuie să furnizeze următoarele informaţii:
-operaţia care trebuie executată; această informaţie este precizată de primul
octet sau cuvânt de 16 biţi din codul maşină, numit şi cod operaţie; uneori acest octet
(cuvânt) poate specifica şi operandul destinaţie;
-operandul sau operanzii sursă, care pot fi conţinuţi în clar în codul maşină, sau
trebuie extraşi din memorie (caz în care trebuie cunoscută adresa) sau din registre;
-operandul destinaţie.
Codul maşină este înţeles de sistemul de prelucrare numerică, dar mult mai
dificil de utilizat în această formă de operatorul uman. De aceea, acesta scrie programul
(instrucţiunile) într-un limbaj mai accesibil, numit limbaj de asamblare, în care
instrucţiunile sunt reprezentate prin aşa numitele mnemonici urmate de operanzi. O
mnemonică este o scriere prescurtată a funcţiei implementată de instrucţiune. În practică
există programe speciale numite compilatoare sau asambloare, care transformă limbajul
de asamblare în cod maşină.
Exemplu:
Instrucţiune în limbaj de asamblare: LDAA #3Ah. Mnemonica este LDAA
(prescurtarea de la Load Accumulator A) iar câmpul #3Ah reprezintă operandul.
Codul maşină al instrucţiunii: 86h 3Ah
Efectul instrucţiunii: încarcă acumulatorul A (operand destinaţie) cu numărul
3Ah (operand sursă).
Primul octet al codului maşină, 86h, reprezintă codul operaţiei şi după
decodificare are efectul: încarcă acumulatorul A cu numărul care urmează în codul
maşină al instrucţiunii. Operandul sursă (3Ah), apare atât în formatul instrucţiunii în
limbaj de asamblare, cât şi în codul maşină.
Limbajul de asamblare este specific fiecărui dispozitiv (procesor,
microcontroler, sau procesor de semnal), chiar dacă în general există elemente comune,
cum ar fi mnemonici ca MOV, JUMP, ADD, etc. De aceea, trecerea la un alt dispozitiv
poate ridica probleme, datorită diferenţelor între limbajele de asamblare. O variantă mai
simplă de a scrie programe pentru astfel de dispozitive este folosirea unui limbaj de
nivel înalt, cum ar fi C, care este acelaşi, indiferent de tipul dispozitivului. Şi în acest
caz există compilatoare care transformă liniile de program C în cod maşină specific
fiecărui dispozitiv. Totuşi, aceste compilatoare nu generează acelaşi cod maşină ca şi în
1 - Consideraţii generale 13
cazul în care funcţia implementată de secvenţa de program C ar fi fost scrisă în limbaj
de asamblare.
Orice UCP are un circuit de iniţializare sau Reset. Efectul acestui circuit este de
a permite începerea execuţiei programului de la început (de la o adresă prestabilită).
Funcţia unui astfel de circuit devine efectivă la conectarea tensiunii de alimentare sau la
aplicarea unui semnal (activ pe nivel coborât de obicei) la un pin dedicat al UCP, numit
chiar Reset.
De asemenea, UCP conţine un număr de registre de uz general. Acestea sunt
folosite ca sursă şi destinaţie pentru operanzi sau pot fi încărcate cu numere care
reprezintă adrese de operanzi. În plus, mai există 3 registre cu funcţii standard care se
găsesc în aceeaşi formă în fiecare variantă de UCP. Acestea sunt: registrul PC (Program
Counter, numărător de adrese sau de program), registrul SP (Stack Pointer, indicator al
vârfului stivei) şi registrul SR (Status Register, registru de stare sau al indicatorilor de
condiţii, acesta neavând o denumire standard, valabilă pentru toate dispozitivele).
Registrul PC indică adresa din memorie a instrucţiunii care urmează să fie
executată (adresa primului octet al instrucţiunii). Rezultă că după fiecare instrucţiune
registrul PC îşi măreşte conţinutul cu numărul de octeţi ai codului maşină ai instrucţiunii
respective. Acest lucru este valabil când execuţia programului este liniară, adică nu
există ramificaţii în program. O ramificaţie înseamnă că următoarea instrucţiune
executată nu este cea de la adresa care urmează după ultimul octet al instrucţiunii
curente, ci una situată la o adresă mai mare sau mai mică. Există trei posibilităţi de
ramificaţii: instrucţinui de salt, apeluri de subrutine sau răspunsuri la cereri de
întrerupere. În aceste situaţii, registrul PC va fi încărcat cu adresa instrucţiunii unde se
va face saltul. Această adresă este cu un număr de unităţi mai mare sau mai mică decât
conţinutul registrului PC înainte de salt.
Exemplu:
În figura 1.2 se prezintă o secvenţă de program în limbaj de asamblare. În
prima coloană sunt adresele, în a doua codurile maşină, iar în a treia instrucţiunile în
limbaj de asamblare. Astfel, începând cu prima instrucţiune, IDIV, şi până la
instrucţiunea BRA *–6, execuţia programului este liniară, încât registrul PC are
succesiv, valorile: 4023h, 4025h, 402Ah, 402Fh, 4031h, 4034h, 4037h. Instrucţiunea
BRA *–6 este o instrucţiune de salt (necondiţionat), execuţia ei înseamnă un salt la o
adresă situată cu 6 locaţii mai sus. Ca urmare, registrul PC va fi încărcat cu valoarea
4031h şi nu cu 4039h, care este adresa instrucţiunii care urmează după BRA *–6.
MEMORIE PROGRAM
PROGRAM APELANT SUBRUTINA S_1 SUBRUTINA S_2
ADRESE INSTRUCŢIUNI ADRESE INSTRUCŢIUNI ADRESE INSTRUCŢIUNI
RET
a) b)
Fig. 1.4 Program în limbaj de asamblare
a) b)
Fig. 1.5 Program în limbaj C.
pin pin
bit 0/1 bit 0/1
ieşire intrare
Fig. 1.6 Funcţiile de ieşire şi, respectiv, de intrare ale unui pin.
Pinii unui microcontroler sunt grupaţi în porturi de 8 sau 16 biţi. Fiecare pin
poate fi programat individual ca intrare sau ieşire, folosind biţii din registrele de direcţie.
O facilitate importantă pe care o au perifericele Digital I/O este posibilitatea ca
la fiecare pin al unui port să se conecteze un rezistor intern. Celălalt terminal al
rezistorului poate fi conectat fie la borna pozitivă a tensiunii de alimentare (1 logic) fie
la borna de masă (0 logic), figura 1.7. În primul caz, rezistorul se numeşte de tip „pull-
up”, iar în al doilea caz de tip „pull-down”. Starea unui pin conectat la un rezistor pull-
up, obţinută printr-o operaţie de citire de către microcontroler, este 1 logic, chiar dacă
pinul este neconectat în exterior. Dacă ulterior pinul este conectat în exterior la masă,
atunci prin citire se obţine 0 logic. În acest fel se pot detecta tranziţii de pe 1 logic pe 0
logic ale pinului, fără a fi necesar ca rezistorul să fie conectat în exterior, ceea ce
înseamnă că se face economie de componente şi, mai ales, de spaţiu pe cablajul
imprimat. Similar, un pin conectat la un rezistor pull-down este „văzut” la nivel 0 logic
de microcontroler, iar conctarea lui în exterior la tensiunea de alimentare pozitivă
permite citirea nivelului 1 logic sau detecţia unei tranziţii de pe 0 logic pe 1 logic a
pinului respectiv.
Microcontroler Microcontroler
+Vcc pin
pin
operaţia
U in = qN ADC − U ref / 2 . (1.7)
unde NADC este rezultatul conversiei, iar qNADC reprezintă aproximarea U in' .
Dacă se foloseşte formatul cu semn, nu mai este necesară scăderea dată prin
relaţia (1.7) pentru obţinerea Uin. Rezultatele obţinute sunt prezentate în tabelul 1.2.
Astfel, prin înmulţirea cuantei cu rezultatele obţinute, rezultă valori conforme cu Uin (se
ştie că 100…00= –2n–1 în codul complementul lui 2).
1.3. Întreruperi
IF1
IE1
IF2 Cerere de
.. întrerupere
IE2
..
..
..
GIE
Fig. 1.12 Generarea cererilor de întrerupere.
MEMORIE PROGRAM
.........
Întrerup. sursă i
ADR1 Adr. subr. sursă i ........
ADR1+n ......... .........
RETI
După cum se cunoaşte, stiva este folosită pentru salvarea adresei de revenire din
întrerupere. De aceea, registrul care indică vârful stivei trebuie iniţializat la limita
superioară a memoriei RAM (deoarece în majoritatea cazurilor, la accesarea acesteia
pentru salvare, vârful se modifică descrescător). Această iniţializare este realizată
automat la scrierea programelor în limbajul C, iar în majoritatea cazurilor şi pentru
limbajul de asamblare (proiectul iniţial conţine o instrucţiune corespunzătoare).