Colocviu SMP
1. Limbaj mașină – limbaj de asamblare
Limbajul masina este acel limbaj ce executa instructiunile(compuse din cuvinte
binare)amplasate in memorie in sensul crescator al adreselor in mod direct de
catre microprocessor.
Limbajul de asamblare= un limbaj simbolic care atribuie câte un nume fiecărui
tip de instrucțiune din limbajul mașină, precum și resurselor interne ale unui
microprocesor;un program in lumbajul de asamblare se scrie intr-un fisier text cu ajutorul
unui editor si se stocheaza pe un support de memorie de masa
2. Unelte de dezvoltare programe – asamblor (assembler),
compilator (compiler), editor de legături (linker), simulator,
programator, depanator (debugger).
Asamblor: cunoașterea instrucțiunilor microprocesorului: numele lor,
operanzii pe care îi utilizează, efectul produs în urma execuției lor, contextul în care
se pot folosi, precum și o serie de reguli pentru organizarea fișierului sursă:
formatul unei linii de text, modul de indicare a adreselor instrucțiunilor, modul de
definire al secvențelor de instrucțiuni (codul programului), al constantelor și
variabilelor (datele programului), modul de amplasare al codului și datelor în
spațiul de memorie, definirea adreselor de memorie, accesul la dispozitivele de I/E,
etc. Toate aceste reguli, împreună cu setul de instrucțiuni al microprocesorului sunt
stabilite de el
Compilator:este un limbaj de translatare care impreuna cu un limbaj de nivel
mai inalt(ex:C)ajuta la executia programelor cu o complexitate ridicata,prin
simplificarea programelor sursa dar afectand viteza de executie si dimensiunea
codului masina generat.
Editor de linkuri: pune modulele generate de asamblor/compilator într-un
singur fișier binar executabil;mai intai,codul sursa se imparte de obicei in mai multe
fisiere care se asambleaza separat.
Simulator+Programator+Depanator:
Pentru a fi executat de către microprocesor, fișierul executabil trebuie încărcat
în memoria sistemului cu microprocesor. Încărcarea programului executabil în
memorie se poate face prin programarea memoriei înafara sistemului (într-un
dispozitiv numit programator de memorii) sau în sistem (ISP – In System
Programming), prin aducerea memoriei ROM/FLASH în regim de programare. Altă
variantă este încărcarea programului executabil ca un bloc de date într-o zonă de
memorie RAM, de unde apoi microprocesorul îl poate extrage și executa
instrucțiune cu instrucțiune (memorie comună sau von Neumann).
Pentru aceasta se folosesc programe utilitare de încărcare care comunică cu
sistemul țintă, adică cu sistemul cu microprocesor pentru care a fost scris
programul. Aceleași programe utilitare pot avea facilități de lansare în execuție a
programului încărcat și de testare/depanare (debugger): execuție pas cu pas,
instrucțiune cu instrucțiune, inserare a unor puncte de oprire (breakpoint),
vizualizarea unor variabile din registre și din memorie, astfel încât să se poată
urmări și verifica modul de execuție al codului, evoluția datelor și evenimentele
apărute pe parcursul rulării.
Simulator:utilizaat pentru testare/depanare a codului si a anumitor functii in
absenta unui sistem fizic cu microprocessor.
3. Instrucțiuni de transfer – descriere operație, surse și
destinații posibile, localizarea operanzilor, efecte asupra
indicatorilor de condiții
Utilizate pentru copierea continutului unei locatii sursa intr-o locatie
destinatie.Conditie:Dimensiunea celor doua locatii sa fie aceeasi.
Putem avea instructiuni de transfer intre oricare doua locatii de tip
registre,memorii si porturi I/E;Cazuri particulare: cel al instrucțiunilor de
inițializare al unor locații, cu o valoare precizată explicit sau implicit de codul
instrucțiunii (setare/resetare locații de 1 bit, inițializare a unei locații de 8 biți cu
o valoare indicată de instrucțiune sau implicit cu 0, etc.); salvarea și refacerea
din vârful stivei a conținutului registrelor de uz general
Instructiunile de transfer nu afecteaza indicatorii de conditii,daca in transfer
nu este implicat ALU.
4. Instrucțiuni aritmetice – tipuri de operații, localizarea
operanzilor, efecte asupra indicatorilor de condiții
Utilizare:efectuarea unor operatii aritmetice de
adunare/scadere/inmultire/impartire intre operanza de tip intreg cu sau fara semn.
Instrucțiunile trebuie să indice tipul operației, numărul de operanzi (1, 2 sau mai
mulți), valorile sau localizarea acestora (registre, memorie, porturi de I/E), precum și
locul unde se va memora rezultatul operației. De regulă, tipul operației este indicat
de numele instrucțiunii, cele mai multe instrucțiuni aritmetice au 2 operanzi
principali, iar unul dintre aceștia este amplasat implicit în registrul acumulator, care
memorează și rezultatul operației (dacă arhitectura este orientată pe acumulator).
Excepție fac instrucțiunile de incrementare/decrementare, când unul din
operanzi are implicit valoarea 1, precum și cazul în care se utilizează un al treilea
operand, care este indicatorul detransport/împrumut (Carry). Instrucțiunile
aritmetice afectează indicatorii de condiții și pot aduce prin valorile lor informații
suplimentare referitoare la rezultatul obținut.
5. Instrucțiuni logice - tipuri de operații, localizarea operanzilor,
efecte asupra indicatorilor de condiții
Utilizare:efectuarea unor operatii boolene de tip Si/Sau/Sau Exclusiv intre
operanzi de tip intreg fara semn
De regulă, tipul operației este indicat de numele instrucțiunii, cele mai multe
instrucțiuni logice au 2 operanzi principali, iar unul dintre aceștia este amplasat
implicit în registrul acumulator, care memorează și rezultatul operației (dacă
arhitectura este orientată pe acumulator).
Excepție fac instrucțiunile de deplasare/rotire, când se utilizează un singur
operand, amplasat de regulă în acumulator (dacă există). Instrucțiunile logice
afectează indicatorii de condiții și pot aduce astfel informații suplimentare
referitoare la rezultatul obținut
6. Instrucțiuni de ramificare – tipuri de ramificare, moduri de
realizare, utilizarea stivei
Utilizare:modificarea secventei liniare de instructiuni in ordinea crescatoare a
adreselor de memorie program indicate de numaratorul de program.
Se executa prin modificarea continutului registrului PC,care determina efectuarea
unui salt in program la o alta instructiune decat cea care ar fi urmat in mor
implicit,prin incrementarea PC.
Există două tipuri de instrucțiuni de ramificare:
- Instrucțiuni de salt (Jump) - fără posibilitatea de întoarcere și reluare a execuției
din locul din care se face saltul - instrucțiuni care pur și simplu modifică conținutul
registrului PC, fără memorarea valorii anterioare, care indică instrucțiunea
următoare în ordine naturală
- Instrucțiuni de apel (Call)/revenire (Return) - cu posibilitatea de întoarcere
ulterioară și de continuare a execuției cu instrucțiunea care urma în ordine
naturală, deoarece înainte de modificarea registrului PC de către instrucțiunea de
apel, conținutul acestuia este salvat în vârful stivei. Ulterior, o instrucțiune de
revenire extrage adresa din vârful stivei și prin încărcarea ei în registrul PC permite
continuarea execuției cu instrucțiunea care urma în program imediat după cea de
apel, în ordinea crescătoare a adreselor.
7. Instrucțiuni de control – tipuri de operații
Utilizare:modificarea unor locatii interne speciale care determina comportarea
microprocesorului in diverse situatii,cum ar fi oprirea in asteptarea unor
evenimente externe sau validarea/inhibarea cererilor de intrerupere
8. Modul de adresare directă – unde și cum este localizat
operandul, exemple
Operandul este specificat în instrucţiune printr-o adresă de 1 octet;numai RAM-
ul intern şi zona SFR pot fi adresate direct.
Ex:MOV A,30h ;in A se incarca octetul din memoria interna de date la adresa 30h
9. Modul de adresare indirectă – unde și cum este localizat
operandul , ce registre se folosesc, exemple
In care instrucţiunea precizează registrul care conţine adresa operandului. Prin
adresare indirectă pot fi specificaţi operanzi atât din RAM-ul intern, cât şi din cel
extern.Pentru adrese din RAM-ul intern (de 8 biţi), se utilizează registrele R0 sau R1
ale bancului de registre curent sau registrul indicator al vârfului stivei, SP. Pentru o
pagină de 256 octeţi din memoria RAM externă se utilizează tot unul din registrele
R0 sau R1 şi portul P2. În cazul adresării întregului spaţiu RAM extern de 64 Ko se
utilizează numai registrul DPTR. În sintaxa instrucţiunilor, numele acestor registre
trebuie precedate de caracterul ‘@’.
Ex: MOV @R0, A ; octetul din A este stocat în memoria internă de date, la adresa din
R0
MOVX A, @R1 ; transferă în A conţinutul locaţiei din RAM extern adresată cu R1
MOVX A, @DPTR ; transferă în A conţinutul locaţiei din RAM extern adresată cu
DPTR
10. Modul de adresare implicită - unde și cum este localizat
operandul, exemple
In care nu se specifică explicit registrul care conţine operandul. Ca şi la
microprocesoarele de uz general adresarea implicită foloseşte registrele speciale, în
acest caz A, B, DPTR, sau fanionul de transport, C. Instrucţiunile care folosesc acest
mod de adresare codifică registrul sau fanionul folosit implicit în opcodul
instrucţiunii.
Ex: MUL AB ; înmulţeşte valoarea octetului din A cu ce a octetului din B; rezultatul în
BA
11. Modul de adresare imediată - unde și cum este localizat
operandul, exemple
In care operandul se află cuprins în instrucţiune, imediat după opcod. În sintaxa
instrucţiunilor cu adresare imediată operandul trebuie precedat de caracterul “# ”.
MOV A,#30h ; în A se încarcă constanta 30h
12. Modul de adresare indexată - unde și cum este localizat
operandul , ce registre se folosesc, exemple
In care drept registre index se utilizează DPTR sau PC. Acestea conţin adresa de
bază, iar deplasamentul locaţiei adresate se află implicit în acumulator, ceea ce
permite codificarea instrucţiunilor cu adresare indexată pe un singur octet. Acest
mod de adresare se foloseşte doar la adresarea operanzilor stocaţi în memoria
program, facilitând procedura de consultare a tabelelor organizate în această
memorie (“lookup tables”), precum şi la o instrucţiune de salt indirect.
MOVC A, @A+DPTR ; în A se încarcă octetul din memoria program de la adresa
dată de A+DPTR
13. Modul de adresare relativă – cum se calculează adresa
efectivă (cea la care se face saltul), registrul folosit, exemple
In care deplasamentul, de un octet cu semn (-128-:-127), se adună la conţinutul
registrului PC pentru a calcula adresa la care va avea loc saltul. Acest mod de
adresare se utilizează în instrucţiunile de ramificare, deplasamentul fiind indicat
simbolic prin rel.
JNZ rel ; salt relativ la adresa instrucţiunii curente, dacă valoarea din A e diferită de
0
14. Instrucțiunile MCS-51 – dată fiind o instrucțiune sau o
secvență de instructiuni, să se indice în ce constă execuția ei
(care este efectul asupra registrelor/memoriei/indicatorilor
de condiții)
Trebuie vazuta in tabele instructiunea si interpretat de acolo
Note extra:
Scrierea programelor sursă în limbaj de asamblare necesită cunoaşterea:
- setului de instrucţiuni;
- directivelor de asamblare;
- regulilor sintactice de scriere a codului sursă
Din punct de vedere logic, un program poate avea acces la mai multe tipuri de
segmente de memorie:
de cod (CODE);
de date externe (DATA);
de date externe (XDATA);
de date interne (IDATA);
de biţi în memoria RAM internă (BIT).
Un astfel de segment poate fi absolut:
definit cu una din directivele CSEG, DSEG, XSEG, ISEG, BSEG;
având adresa de încărcare stabilită de programator la scrierea programului sursă;
sau poate fi relocabil:
definit cu directiva RSEG;
caz în care adresa de încărcare va fi fixată ulterior, de către editorul de legături
Câmpul operand poate specifica:
un nume de registru;
o adresă de SFR;
o constantă numerică sau simbolică de 1 sau 2 octeţi;
o etichetă dintr-un segment de cod sau de date;
o expresie aritmetică;
Dacă sunt doi operanzi:
- primul operand specifică destinaţia operaţiei;
- al doilea specifică sursa;
- cei doi operanzi se separă prin virgulă.
Operanzii de tip constantă pot fi exprimaţi în următoarele moduri:
1. O constantă zecimală precedată de caracterul ‘#’.
2. O constantă hexazecimală, care de asemenea trebuie să înceapă cu ‘#’ şi cu o cifră
(0-:-9) şi să se termine cu litera 'h’ (sau ‘H’).
3. O constantă octală care trebuie să înceapă cu ‘#’ şi să se termine cu litera ‘q’ (‘Q’).
4. O constantă binară, care trebuie să înceapă cu ‘#’ şi să se termine cu litera ‘b’ (‘B’).
5. Valoarea curentă a contorului de program (PC) sau adresa instrucţiunii curente, care
se specifică prin caracterul ‘$’.
6. O constantă ASCII inclusă între ghilimele simple.
7. Numele unei constante simbolice căreia asamblorul i-a atribuit o valoare numerică
8. Numele unei adrese simbolice (etichete), definite în segmentul de cod sau de date.
9. Numele unui registru SFR, adresa unei locaţii de memorie de RAM interne
adresate direct sau o adresă de bit.
10 . Expresii aritmetice şi logice - folosesc toate tipurile de date descrise mai sus şi
care constituie operanzii expresiei.
15. Din ce este compus și cum funcționează un numărător
de evenimente (counter)?
Numaratorul de evenimente este o functie a timerelor 0 si 1.Fiecare timer
conţine câte două registre de 8 biţi (TH0 şi TL0, respectiv TH1 şi TL1), folosite ca
numărător cu incrementare.
16. Din ce este compus și cum funcționează un
temporizator (timer)?
Un numărător de 8 sau 16 biţi este incrementat în mod automat la fiecare ciclu
maşină, deci cu o frecvenţă egală cu 1/12 din frecvenţa oscilatorului.
17. Surse posibile pentru impulsurile de incrementare a
numărătoarelor la T0 și T1
Se consideră că a apărut un front descrescător dacă un pin este găsit în “0” logic,
după ce în ciclul maşină anterior fusese găsit pe “1” logic.
Incrementarea se produce în starea S3P1 a ciclului maşină următor celui în care
a fost detectată tranziţia active
Nota: timerele 0 si 1 taskuri tipice de timp: realizarea de întârzieri programabile
(2.26), generarea unor semnale periodice la pinii porturilor I/E (2.27, 2.28),
măsurarea duratei unui impuls (2.29), numărător de evenimente externe
18. Cum poate fi pornită/oprită prin program numărarea la
timerele 0 și 1?
19. Cum poate fi pornită/oprită prin semnal extern
numărarea la timerele 0 și 1?
Funcţionarea celor două timere poate fi controlată prin intermediul a două
registre cu funcţii speciale: TCON şi TMOD.De la pinul T0/T1 (numărător de
evenimente), în funcţie de valoarea bitului C/din TMOD. T
20. Cum poate fi detectată depășirea numărătoarelor la T0
și T1?
Depăşirea unui contor divizor prin 16, fapt ce asigură sincronizarea transferului
biţilor.
În modul “reîncărcare”, ilustrat în fig.1.22, există de asemenea două opţiuni,
selectabile tot prin EXEN2 din T2CON. Dacă EXEN2=0, depăşirea Timerului 2 setează
TF2 şi determină reîncărcarea registrelor TL2 şi TH2 cu valoarea de 16 biţi presetată
în registrele RCAP2L, respectiv RCAP2H.
21. Cum se incrementează numărătoarele la T0 și T1 în
modurile 0 și 1?
După ce semnalul de numărare este divizat modulo 32 de registrul TL
(numărător format cu cei mai puţin semnificativi 5 biţi), incrementează registrul TH,
care lucrează ca un numărător pe 8 biţi.
22. Cum se incrementează numărătoarele la T0 și T1 în
modul 2?
configurează registrele TLx ca numărătoare cu reîncărcare automată, cu
valoarea preprogramată în THx
23. Cum se selectează modul de lucru pentru T0 și T1?
Funcţiile de temporizator şi numărător pot fi îndeplinite în 4 configuraţii
hardware distincte, numite moduri de lucru. Ele se pot selecta, în mod
independent pentru fiecare din timerele 0 şi 1, prin perechea de biţi M1M0 din
TMOD.
24. Cum funcționează T0 în modul 3?
Registrele TL0 şi TH0 formează două numărătoare/temporizatoare
independente de 8 biţi. Canalul realizat cu TL0 foloseşte biţii de control de la
Timerul 0: C/, GATE, TR0, şi TF0.
25. Ce se întâmplă cu T1 în modul 3?
Timerul 1 este oprit. Canalul realizat cu TH0 poate lucra doar ca temporizator
(numărător de cicluri maşină) şi foloseşte semnalele TR1 şi TF1 de la Timerul 1. La
depăşire, ambele canale pot lansa cereri de întrerupere: TL0 prin TF0, iar TH0
controlează întreruperea Timerului 1.
26. Cum funcționează T2 în modul captură?
În modul “captură” există două opţiuni care pot fi selectate prin bitul EXEN2 din
T2CON. Dacă EXEN2=0, atunci Timerul 2 lucrează ca un numărător/temporizator de
16 biţi obişnuit, care îşi setează fanionul TF2 la depăşire şi poate lansa o cerere de
întrerupere. Dacă EXEN2=1, Timerul 2 va avea o facilitate suplimentară: o tranziţie
1->0 pe intrarea T2EX determină “captarea” conţinutului registrelor TL2 şi TH2 în
registrele RCAP2L şi respectiv RCAP2H. Odată cu captarea informaţiei Timerului 2,
se setează şi fanionul EXF2 din T2CON şi se poate lansa o cerere de întrerupere
spre CPU.
27. Cum funcționează T2 în modul reîncărcare?
În modul “reîncărcare”, există de asemenea două opţiuni, selectabile tot prin
EXEN2 din T2CON. Dacă EXEN2=0, depăşirea Timerului 2 setează TF2 şi determină
reîncărcarea registrelor TL2 şi TH2 cu valoarea de 16 biţi presetată în registrele
RCAP2L, respectiv RCAP2H. Dacă EXEN2=1, Timerul 2 funcţionează ca mai înainte,
dar cu o nouă facilitate: la o tranziţie 10 pe T2EX, va fi realizată reîncărcarea pe 16
biţi şi EXF2 va fi setat.
Modul generator de semnal de tact pentru Portul serial este selectat prin
RCLK=1 şi/sau TCLK=1. Mai multe informaţii asupra acestui mod de funcţionare vor
fi prezentate în paragraful următor.
28. Ce sunt întreruperile?
Întreruperile sunt vectorizate şi vectorilor respectivi le sunt rezervate locaţii fixe
de tratare aflate la intervale de 8 octeţi, începând cu adresa 0003h. Întreruperilor
externe INT0 şi INT1 li se poate programa modul de prezentare a cererii (activare p
nivel sau pe front), prin intermediul biţilor IT0 şi respectiv IT1 din TCON
29. Cum funcționează mecanismul de întreruperi?
Mecanism: Generarea întreruperilor+ Validarea întreruperilor+ Prioritatea
întreruperilor+ Tratarea întreruperilor
30. De ce sunt utilizate întreruperile, care sunt avantajele
lor?
Sistemul de întreruperi este prevăzut şi cu posibilitatea programării individuale
a fiecărei surse de întreruperi pe unul din cele două niveluri de prioritate
permise. Acest lucru este posibil prin intermediul registrului IP (Interrupt
Priority),
31. Care sunt sursele de întrerupere la 8051 (cele 5 surse
standard)?
Trei dintre sursele de întreruperi sunt ataşate componentelor interne (timere şi
port serial), iar celelalte două sunt accesibile numai din exterior, de la pinii INT0!
INT1! şi ai microcontrolerului
32. Care sunt evenimentele care determină setarea
flagurilor de întrerupere?
Flagurile TF0 şi TF1 se poziţionează pe “1” la depăşirea capacităţii numărătorului,
şi pot genera întreruperi.
Flagurile de întrerupere pot fi setate/resetate prin program, cu acelaşi efect ca şi
cum ar fi fost comandate de logica internă de întreruperi.
33. Care sunt bistabilele care se setează atunci când apar
cereri de întrerupere (flag-urile de întreruperi)?
Atunci când conţinutul registrului TH se schimbă din FFh în 00h (la depăşire),
este setat bistabilul de întrerupere asociat TF0/TF1, generându-se o cerere de
întrerupere.
34. Care sunt flagurile de validare individuală a cererilor de
întrerupere și ce rol au ele?
Fiecare sursă de întreruperi poate fi validată sau inhibată individual, prin
setarea, respectiv resetarea unui bit din registrul cu funcţii speciale IE.
35. Care este rolul flagului de validare globală a
întreruperilor?
acest registru mai conţine şi un bit de validare/inhibare globală a tuturor liniilor
de întrerupere, EA (Enable All), care are prioritate asupra biţilor de
validare/inhibare individuală.
36. Când și cum sunt detectate cererile de întrerupere?
Prin intermediul registrului IE (Interrupt Enable), adresabil la nivel de bit pot fi
validate/inhibate individual sau global toate cele 5 (6) surse de întreruperi.
Trebuie menţionat faptul că biţii neutilizaţi IE.6 şi IE.5 (ultimul numai la seria
8051) nu pot fi înscrişi cu “1” logic la programarea registrului IE.
37. Care sunt condițiile în care este acceptată o cerere de
întrerupere?
Conditii propriu-zise:
- nu există o întrerupere de prioritate mai mare sau egală în curs de tratare
- este ultimul ciclu maşină al unei instrucţiuni
- instrucţiunea curentă nu este RETI şi nici una care să acceseze registrele cu funcţii
speciale IE sau IP.
Prima condiţie amână răspunsul la o solicitare de întrerupere de prioritate mai
mică sau egală cu cea în curs de tratare.
A doua condiţie asigură terminarea instrucţiunii în curs înainte de a răspunde la
o solicitare de întrerupere
Cea de-a treia condiţie indică faptul că, dacă instrucţiunea curentă este RETI sau
accesează IE sau IP, se va mai executa încă cel puţin o instrucţiune până când se
va răspunde la o solicitare de întrerupere.
38. Ce se întâmplă la acceptarea unei cereri de întrerupere?
Odată acceptată o cerere de întrerupere, rutina de tratare a acesteia poate fi
întreruptă de o cerere apărută ulterior pe un nivel
superior, dar nu şi de o cerere de pe acelaşi nivel sau de pe un nivel
inferior.
39. Care sunt adresele la care trebuie să se afle amplasate
rutinele de tratare a întreruperilor?
adresa vectorului de întrerupere (LCALL)
40. Ce se întâmplă dacă apar cereri de întrerupere, acestea
sunt validate, dar nu a fost prevăzută o secvență de tratare
pentru acea întrerupere la adresa corespunzătoare?
sistemul de întreruperi va genera un apel (echivalent cu o instrucţiune LCALL
(Long Call) – dar care nu apare în program) la adresa de tratare corespunzătoare
41. Odată acceptată cererea, ce se întâmplă cu flagul de
întrerupere (se șterge automat/trebuie șters prin
program/poate să nu fie șters?
Se sterge automat
42. Cum se ajunge la secvență de tratare a întreruperii
(rutina de întrerupere)?
rutina de tratare a acesteia poate fi întreruptă de o cerere apărută ulterior pe un
nivel superior, dar nu şi de o cerere de pe acelaşi nivel sau de pe un nivel
inferior. Secvenţa de instrucţiuni care începe la această adresă (denumită şi
rutină de tratare a întreruperii) se execută până la apariţia unei întreruperi pe
un nivel mai prioritar sau până la execuţia unei instrucţiuni RETI.
43. Cum se revine la instrucțiunea următoare din
programul principal, la terminarea tratării întreruperii?
la revenirea dintr-o rutină de tratare, prin RETI, nu se acceptă nici o altă cerere
decât după execuţia următoarei instrucţiuni din program.
44. Într-o rutină de tratare a întreruperii putem modifica
valorile registrelor? Ce se întâmplă dacă le modificăm?
45. Ce se întâmplă dacă există mai multe cereri de
întrerupere active la un moment dat? Care dintre cereri e
servită mai întâi?
În cazul în care, la un moment dat, există mai multe cereri de întrerupere,
cererea de prioritate maximă se alege folsind două reguli care se aplică
succesiv :
- prioritatea nivelului de întrerupere;
-prioritatea individuală, în interiorul aceluiaşi nivel .
46. Pe câte nivele de prioritate se poate afla o sursa de
întrerupere și care este regula de prioritate aplicată pentru
cererile de la surse amplasate pe același nivel, dacă sunt mai
multe active la un moment dat?
Atunci când apar simultan cereri de pe acelaşi nivel de prioritate, se
declanşează o secvenţă internă de interogare (“polling sequence”) care
determină cererea ce va fi servită. Acest procedeu asigură în interiorul
fiecărui nivel de prioritate rezolvarea ordinii de servire
47. Ce se întâmpla odată ce a fost acceptată o cerere de
întrerupere, mai sunt acceptate alte cereri înainte de a se
termina tratarea celei în curs?
La acceptarea întreruperii, efectul instrucţiunii de apel (LCALL) salvează în stivă
adresa următoarei instrucţiuni din programul întrerupt, apoi încarcă
registrul PC cu adresa de tratare corespunzătoare întreruperii.
48. Cum află microcontrolerul că s-a terminat tratarea unei
cereri de întrerupere și de ce are nevoie să știe acest lucru?
49. Ce este un port serial, cum se face transferul
informației, prin comparație cu transferul paralel?
Este prevăzut cu două registre tampon: un registru serie/paralel şi un registru de
interfaţă cu unitatea centrală, iar transmiţătorul are doar un singur registru, care
îndeplineşte ambele funcţii. Transfer serial sincron vs. asincron – comparație.
50. Structura transmițătorului portului serial.
transmiţătorul are doar un singur registru, care îndeplineşte ambele funcţii.
posedă registre distincte pentru date: SBUF–T, respectiv SBUF–R, dar care sunt
“văzute” de către utilizator ca un singur registru – SBUF (Serial BUFfer register).
51. Structura receptorului portului serial.
Receptorul este dublu bufferizat, ceea ce permite începerea recepţionării unui
octet înainte ca precedentul să fi fost citit din registrul de recepţie.
52. Modul 0 de funcționare al portului serial (modul sincron)
– sursa semnalului de tact, linia de transmisie/recepție date,
linia de transmisie/recepție a semnalului de tact, viteza de
comunicație.
asigură o funcţionare de tip registru de deplasare, având intrarea şi ieşirea
datelor pe linia RxD/P3.0, iar tactul de deplasare primit/generat pe linia
TxD/P3.1. Rata de comunicaţie în acest mod este fixă şi are valoarea fOSC /12,
fiind de 1Mbps la fOSC=12 MHz.
Transmisia este iniţiată de orice instrucţiune care foloseşte ca registru destinaţie
SBUF. De asemenea, blocul de control al transmisiei forţează în “1” logic cea de-a
9-a poziţie a registrului de deplasare. Transmisia începe cu bitul cel mai puţin
semnificativ al octetului de date şi se face în ritmul de 1 bit/ciclu. Odată cu
deplasarea biţilor la ieşire, în ritmul fixat prin TxD, registrul se completează cu
zerouri. Când şi cel mai semnificativ bit al cuvântului a fost transmis, cel de-al 9-
lea bit, care a fost setat pe “1”, ajunge în poziţia cea mai puţin semnificativă a
registrului de deplasare şi blocul de control dezactivează transmisia. Totodată se
realizează o ultimă deplasare şi se setează fanionul de întrerupere la transmisie
- TI din SCON, în al 10-lea ciclu maşină.
Recepţia este iniţiată printr-o comandă cu REN=1 în SCON, precedată de
resetarea bitului RI. Blocul de control al recepţiei înscrie biţii 11111110b în
registrul de deplasare .Iniţierea recepţiei are loc la detectarea bitului de start al
unui caracter. La fiecare bit recepţionat pe linia RxD, în acest registru are loc o
deplasare la stânga cu o poziţie, tot în ritmul de 1 bit/ciclu stabilit prin TxD.
Atunci când bitul “0” ajunge în poziţia din extrema stângă a registrului de
deplasare, blocul de control comandă încă o deplasare şi încărcarea registrului
SBUF cu valoarea recepţionată. În cel de-al 10-lea ciclu maşină de la înscrierea
comenzii în SCON recepţia este oprită şi se setează fanionul de întrerupere RI.
53. Transferul serial asincron – formatul unui caracter în
modul 1 (10 biti/caracter) – rolul bitului de START și al bitului
de STOP
permite o funcţionare de tip asincron (UART) cu un bit de START (“0” logic), 8 biţi
de date şi un bit de STOP (“1” logic). Viteza de comunicaţie este variabilă (110 Baud
÷ 62,5 KBaud) şi este controlată de Timerul 1 la 8051 sau de Timerul 2 (numai la
8052). De obicei, Timerul 1 se foloseşte în modul 2, cu auto-încărcare
Dacă valoarea acceptată la eşantionarea primului bit pe linia RxD nu este “0” (bitul
de START), logica de recepţie se resetează şi se aşteaptă o nouă tranziţie 10.
Procedura menţionată asigură rejecţia unor biţi de start falşi. Dacă bitul de start
este corect, acesta încărcarea registrului SBUF cu octetul recepţionat, setarea
fanionului RI şi încărcarea bitului de STOP în RB8. este transmis la intrarea
registrului de deplasare şi apoi sunt transmişi şi restul biţilor (data şi bitul de STOP).
Când bitul de START ajunge în poziţia extremă-stânga a registrului cu deplasare,
blocul de control al recepţiei determină încă o deplasare la stânga,
54. Transferul serial asincron – formatul unui caracter în
modurile 2 și 3 (11 biti/caracter) – rolul celui de-al 9-lea bit de
date (de unde este transmis, unde este recepționat, la ce ar
putea să fie folosit.
La recepţie, cel de-al 9-lea bit de date este încărcat în bitul RB8 din SCON, iar bitul
de STOP este ignorat.
un al 9-lea bit de date programabil
La transmisie, cel de-al 9-lea bit de date (TB8) poate fi forţat fie pe “0”, fie pe “1”. La
recepţie, cel de-al 9-lea bit de date ajunge în RB8 din SCON
55. Sursa semnalului de tact pentru portul serial în modul 2.
Frecventa oscilatorului intern
56. Sursa semnalului de tact pentru portul serial în
modurile 1 și 3.
Viteza de comunicaţie este variabilă (110 Baud ÷ 62,5 KBaud) şi este controlată
de Timerul 1-folosit ca divisor de frecventa-la 8051 sau de Timerul 2 (numai la
8052)
57. Cum se declanșează transmisia unui caracter?
Iniţierea transmisiei se realizează la fiecare operaţie de scriere în SBUF.
58. Cum se declanșează recepția unui caracter?
Iniţierea recepţiei are loc:
- în modul 0 (sincron) - de către condiţiile: RI=0 şi
REN=1
-în modurile 1, 2 şi 3 (asincrone) - de către bitul de
START recepţionat, dacă REN=1.
59. Ce indică flag-ul TI și ce trebuie să facă programul când
acesta este setat?
Pentru sincronizarea fluxului de date la transmisie este prevăzut indicatorul TI
(buffer de transmisie gol), care este setat hardware imediat după terminarea
transmisiei unui caracter. Acest flag generează o întrerupere de transmisie, care
poate fi utilizată de unitatea centrală pentru a înscrie în SBUF următorul caracter
al unui mesaj.
60. Ce indică flag-ul RI și ce trebuie să facă programul când
acesta este setat?
În acelaşi scop, pentru recepţie este prevăzut indicatorul RI (buffer de recepţie plin),
care este setat hardware de îndată ce un nou caracter a fost recepţionat şi este
disponibil în SBUF. Acest flag generează o întrerupere de recepţie, care poate fi
utilizată de unitatea centrală pentru a prelua din SBUF caracterul recepţionat.