Sunteți pe pagina 1din 41

4.

Periferice standard integrate în microcontrolerele MCS-51


Toţi membrii familiei MCS-51 dispun de un set de periferice interne standard:
 Două numărătoare/temporizatoare de 16 biţi sau timere (Timer 0 şi Timer 1);
 Un controler pentru tratarea cererilor de întrerupere multiple de la surse interne şi
externe;
 O interfaţă serială (Port serial).

4.1. Timerele 0 şi 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. Funcţionarea celor două timere poate fi controlată prin
intermediul a două registre cu funcţii speciale: TCON şi TMOD.
Timerele 0 şi 1 pot realiza două tipuri de funcţii:
 temporizator (timer)
 numărător (counter)

1
Funcţionarea ca temporizator
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.
Funcţionarea ca numărător de evenimente
Un registru de 8 sau 16 biţi este incrementat la fiecare front descrescător al semnalului aplicat
pe pinul de intrare T0/ P3.4, respectiv T1/P3.5.
Pinii T0 şi T1 sunt testaţi în starea S5P2 a fiecărui ciclu maşină.
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 activă.
Semnalul pe pinul de intrare trebuie să fie menţinut nemodificat pe durata a cel puţin un ciclu
maşină (12 perioade ale oscilatorului).

2
Rezultă - frecvenţa maximă a semnalului pe pinul de intrare (respectiv intervalul minim dintre
două evenimente), nu trebuie să depăşească 1/24 din frecvenţa oscilatorului (500 KHz la fOSC = 12
Mhz, respectiv 2 μs).
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.
Modurile 0, 1 şi 2 sunt identice pentru ambele timere, fiind ilustrate în fig.1.
Modul 0
Semnalul de numărare poate să provină de la oscilatorul local (temporizator) sau din exterior,
de la pinul T0/T1 (numărător de evenimente), în funcţie de valoarea bitului C/ T din TMOD.
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.
Deci, în modul 0, numărătorul are în total 13 biţi.
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.
3
Timer 0, 1
OSC ÷12 Modul 0 - M1M0 = 00 : TL0/1 - divizor cu 32 (5 biţi)
Modul 1 - M1M0 = 01 : TL0/1 - divizor cu 256 (8 biţi)
C/ T = 0
Incr. Depăşire Întrerupere
TL0/1 TH0/1 TF0/1

C/ T = 1 Control
T0/1 (P3.4/5)
TL0/1
TR0/1 Timer 0, 1 - Modul 2
M1M0 = 10 - autoload
GATE
TH0/1

INT0/1 (P3.2/3)
8Fh 8Eh 8Dh 8Ch 8Bh 8Ah 89h 88h
TCON = 88h TF1 TR1 TF0 TR0 IEI IT1 IE0 IT0
TMOD = 89h GATE C/T M1 M0 GATE C/T M1 M0
Timer 1 Timer 0

Fig.4.1. Timerele 0 şi 1 - funcţionarea în modurile 0, 1 şi 2


4
Incrementarea numărătorului de 13 biţi poate fi controlată:
 numai prin program, cu ajutorul bitului TR0/TR1 (Timer Run) din TCON, dacă bitul GATE
corespunzător din TMOD este poziţionat pe “0”;
 atât prin program (bitul TR0/TR1), cât şi prin semnalul aplicat la pinul INT0 /P3.2 respectiv INT1
/P3.3, dacă bitul GATE corespunzător este poziţionat pe “1”. Astfel, aplicarea unui nivel “1”
logic pe linia de întrerupere externă validează incrementarea numărătorului, în timp ce un
nivel “0” blochează numărarea.
Aşa cum se observă în fig.1, incrementarea se produce numai atât timp cât ambele mecanisme
de control descrise mai sus validează numărarea.

Modul 1
Este identic cu modul 0, cu excepţia faptului că registrele TH0 şi TL0, respectiv TH1 şi TL1 se
utilizează complet, formând câte un numărător de 16 biţi pentru fiecare timer.
Modul 2
Se utilizează un numărător de 8 biţi format numai din registrul TL (mai puţin semnificativ).
Depăşirea la numărare determină, pe lângă setarea bistabilului TF şi lansarea unei cereri de

5
întrerupere, copierea automată în registrul numărător (TL) a valorii conţinute în registrul
constantei de timp TH, aşa cum se arată în fig.1 (Autoload).

Modul 3
Cele două registre ale timerului 0 formează două canale independente de 8 biţi. Logica de
control a numărării este prezentată în fig.2.
Canalul format cu registrul TL0 foloseşte biţii de control specifici Timerului 0, cunoscuţi de la
modurile 0 şi 1. Funcţionarea acestuia este identică cu cea descrisă la aceste moduri.
Cel de-al doilea canal, format cu registrul TH0, utilizează bitul de control TR1 de la Timerul 1,
precum şi întreruperea acestuia (bistabilul TF1), dar poate funcţiona doar ca temporizator.

6
TR1
Control
Increm. Depăşire Întrerupere
OSC ÷12 TH0 TF1

C/ T = 0
Increm. Depăşire Întrerupere
TL0 TF0

C/ T = 1 Control
T0 (P3.4)

TR0
Timer 0
Modul 3 - M1M0 = 11
GATE

INT0 (P3.2)

Fig.4.2. Timerul 0 - funcţionarea în modul 3

7
Drept urmare, atunci când timerul 0 este programat să lucreze în modul 3, timerul 1 poate să
funcţioneze în oricare din modurile 0, 1 sau 2, fie ca temporizator fie ca numărător cu
următoarele două modificări:
 locul lui TR1 este luat de biţii de selecţie mod M1 şi M0, oprirea numărării realizându-se prin
programarea timerului 1 în modul 3 (M1M0=11).
 nu se poate semnaliza depăşirea.
În acest caz, Timerul 1 este utilizat de regulă ca generator de tact pentru Portul serial.
Flagurile TF0 şi TF1 se poziţionează pe “1” la depăşirea capacităţii numărătorului, şi pot genera
întreruperi.

Ei sunt resetaţi automat la acceptarea întreruperilor respective de către unitatea centrală.

Dacă nu se utilizează întreruperile, aceşti biţi trebuie resetaţi prin program la programarea
taskurilor de timp şi pot fi testaţi prin program (polling - interogare), pentru a detecta apariţia
depăşirii numărătoarelor asociate timerelor.

8
Exemplul 1: Să se genereze pe pinul P1.3 un impuls cu durata de
8051 10 ms
10ms (la fOSC=12 MHz).
Întrucât contoarele timerelor sunt incrementate la fiecare 1 µs P1.3

(12/fosc), pentru a realiza întârzierea de 10 ms este nevoie de un


număr de 10 ms / 1 µs = 10000 incrementări succesive.
Se va folosi Timerul 0, deci pentru a obţine această întârziere trebuie ca înainte de pornirea
timerului să se încarce în TL0 şi TH0 valoarea 65536 – 10000 = 55536 = D8F0h (sau -10000),
adică F0h în TL0 şi D8h în TH0.
CLR P1.3 ; Forţează P1.3 pe nivel LOW.
MOV TMOD, #01 ; Timer 0 în modul 1 (16 biţi), controlabil soft (GATE=0).
MOV TL0,#0F0h ; Iniţializare contor Timer 0.
MOV TH0,#0D8h
SETB P1.3 ; Forţează P1.3 pe nivel HIGH.
SETB TR0 ; Pornire Timer 0.
delay: JNB TF0, delay ; Aşteaptă apariţia depăşirii la Timerul 0.
CLR P1.3 ; Forţează revenirea pinului P1.3 pe nivel LOW.

9
CLR TR0 ; Oprire Timer 0.
CLR TF0 ; Şterge fanionul de depăşire al Timerului 0.
JMP $ ; Oprire în buclă infinită

Exemplul 2: Se va genera pe pinul P1.3 un semnal de tip undă


dreptunghiulară simetrică de 2 kHz (la fOSC=12 MHz). 8051 f = 2 kHz

P1.3
Trebuie ca pinul P1.3 să basculeze de două ori într-o perioadă,
adică la fiecare 0,5 / 2KHz = 250 µs.
Pentru realizarea acestei temporizări cu Timerul 1 este nevoie de 250 µs / 1 µs = 250 de
incrementări.
În acest caz se poate folosi un contor de 8 biţi, aşa cum se arată în secvenţa următoare de
program, care utilizează Timerul 1 programat în modul 2.
În acest caz, contorul TL1 se va încărca cu diferenţa 256 – 250 = 6.
MOV TMOD, #20h ; Timer 1 în modul 2 (8 biţi, cu reîncărcare), controlabil soft
MOV TL1,#6 ; Iniţializează contorul Timerului 1.
MOV TH1,#6 ; Iniţializează registrul de reîncărcare al Timerului 1.
10
SETB TR1 ; Pornire Timer 1.
delay: JNB TF1, delay ; Aşteaptă apariţia depăşirii Timerului 1.
CPL P1.3 ; Basculează nivelul la pinul P1.3.
CLR TF1 ; Şterge fanionul de depăşire al Timerului 1.
SJMP delay ; Continuă în buclă infinită.

11
4.2. Timerul 2

Există la seria 8052 şi are asociate două semnale externe: T2 şi T2EX. Selectarea funcţionării ca
numărător sau temporizator se face prin bitul C/ T2 din registrul T2CON.
(msb) (lsb)
T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2 (C8h)
7 EXF2
6 5 4 3 2 1 0

Cu ajutorul biţilor RCLK, TCLK, CP/ RL2 şi TR2 din T2CON pot fi selectate prin program cele trei
moduri de operare ale Timerului 2.

RCLK+TCLK CP/ RL2 TR2 Mod de operare


0 0 1 Reîncărcare pe 16 biţi
0 1 1 Captură pe 16 biţi
1 x 1 Generator de semnal de tact pentru interfaţa serială
x x 0 Deconectat
Modurile de operare ale Timerului 2

12
Modul “captură” - există două opţiuni care pot fi selectate prin bitul EXEN2 din T2CON.

Dacă EXEN2=0 - 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: o tranziţie 10 pe intrarea T2EX determină “captarea” conţinutului registrelor
TL2 şi TH2 în registrele RCAP2L şi respectiv RCAP2H.

OSC ÷12

C/T2= 0
TL2 TH2
TF2
(8 biţi) (8 biţi)
T2 (pin) C/T2= 1
Control
TR2

Captură
Detector de RCAP2L RCAP2H Întreruperea
tranziţie (8 biţi) (8 biţi) generată de
T2EX (pin) T2
EXF2

Control EXEN2
Timerul 2 - funcţionarea în modul “captură”

13
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
10 pe T2EX, va fi realizată reîncărcarea pe 16 biţi şi EXF2 va fi setat.

OSC ÷12

C/T2= 0
TL2 TH2
TF2
(8 biţi) (8 biţi)
C/T2= 1
T2 (pin)
Control
TR2

Reîncărcare
Întreruperea
Detector de RCAP2L RCAP2H generată de
tranziţie (8 biţi) (8 biţi) T2
T2EX (pin)
EXF2

Control EXEN2

Timerul 2 - funcţionarea în modul “reîncărcare”

14
5. Sistemul de întreruperi

Microcontrolerele din familia MCS 51 şi Tabelul 1


compatibile dispun de un controler de întreruperi
pentru tratarea cererilor multiple. Sursa Generare Validare Tratare
INT0 /P3.2 IE0 EX0 0003h
Numărul de linii de întrerupere şi de niveluri de
prioritate pe care se pot afla acestea variază de la Timer 0 TF0 ET0 000Bh
o variantă de microcontroler la alta. INT1 /P3.3 IE1 EX1 0013h
Spre exemplu, 8051 are 5 surse de întreruperi,
Timer 1 TF1 ET1 001Bh
care pot fi amplasate pe 2 niveluri de prioritate.
Serială RI+TI ES 0023h
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 şi INT1 ai microcontrolerului.
Cele 5 surse de întrerupere se regăsesc la toate microcontrolerele compatibile MCS 51.
După caz, lor li se adaugă şi alte surse de întrerupere atât interne, corespunzătoare unor
periferice suplimentare integrate pe cip, cât şi externe, accesibile la pinii microcontrolerelor.

15
Generarea întreruperilor
Flagurile de generare a întreruperii sunt biţi din regiştrii SFR TCON şi SCON.
Fiecare sursă de întreruperi are propria sa adresă de tratare în spaţiul de memorie program
0003h÷0023h (vezi Tabelul 1).

SFR implicate în generarea întreruperilor


Numele Adresa 7 6 5 4 3 2 1 0

TCON 88h TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
SCON 98h SM0 SM1 SM2 REN TB8 RB8 TI RI

16
Validarea întreruperilor
Fiecare sursă de întreruperi poate fi validată sau inhibată individual, prin setarea, respectiv
resetarea unui bit din registrul cu funcţii speciale IE.
În plus, 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ă.

Validarea întreruperilor
Numele Adresa 7 6 5 4 3 2 1 0

IE A8h EA - - ES ET1 EX1 ET0 EX0

Microcontrolerele care dispun de mai multe surse de întreruperi utilizează pentru validarea lor
şi poziţiile rezervate din SFR IE.

17
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. Aceasta însemnă că:

 O întrerupere poate fi generată şi prin program, prin setarea flagului asociat. Excepţie fac
întreruperile externe 0 şi 1 atunci când sunt active pe nivel, când flagurile IE0 şi IE1 sunt
afectate numai de starea pinilor INT0 /P3.2 respectiv INT1 /P3.3.
 O cerere de întrerupere în aşteptare poate fi anulată înainte de a fi acceptată dacă
întreruperea respectivă era invalidată la momentul apariţiei.
 O cerere de întrerupere poate fi achitată în rutina de tratare prin resetarea flagului care a
generat-o, dacă acest lucru nu s-a produs deja, în mod automat, odată cu acceptarea ei de
către unitatea centrală.

18
Prioritatea întreruperilor
Există 2 niveluri de prioritate, notate cu 0 (minimă), respectiv cu 1 (maximă).

Programare nivel Sursa de Prioritate în cadrul


Nivel 0 Nivel 1 întrerupere aceluiaşi nivel
PX0=0 PX0=1 INT0 /P3.2 maximă
PT0=0 PT0=1 Timer 0
PX1=0 PX1=1 INT1 /P3.3
PT1=0 PT1=1 Timer 1
PS=0 PS=1 Serială minimă
Fiecare sursă de întrerupere poate fi programată pe oricare din cele 2 niveluri cu ajutorul bitului
corespunzător din SFR IP (vezi tabelul 2).
Tabelul 2

Programarea priorităţilor
Numele Adresa 7 6 5 4 3 2 1 0

IP B8h - - - PS PT1 PX1 PT0 PX0

19
Î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 (vezi fig.5.1):
 prioritatea nivelului de întrerupere;
 prioritatea individuală, în interiorul aceluiaşi nivel.

Numărul cererilor de întrerupere


în aşteptare (maxim 5, minim 0)
=0 =1
>1
Se selectează nivelul cel mai
Selecţie bazată pe
prioritar (0 sau 1) pe care există
prioritatea de nivel cereri în aşteptare

Numărul cererilor de
întrerupere (maxim 5, minim 1) de
pe nivelul selectat anterior =1
>1
Selecţie bazată pe Se selectează cererea cea mai
prioritatea în cadrul nivelului prioritară din cadrul nivelului

=1
Tratare întrerupere

Fig.5.1. Procedura de rezolvare a cererilor multiple de întrerupere

20
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.
Drept urmare, tratarea unei întreruperi de pe nivelul cel mai prioritar din sistem nu poate fi
întreruptă de nici o altă cerere.
Tratarea întreruperilor
Flagurile de generare a întreruperilor sunt eşantionate în starea S5P2 a fiecărui ciclu maşină
(vezi fig.5.2).

CM1 CM2 CM3 CM4 CM5


S5 P2 S6

Întreruperea Întreruperea Întreruperea Apel la adresa Rutina de tratare


devine este este testatã vectorului de a întreruperii
activã eşantionată întrerupere (LCALL)

Fig. 5.2. Răspunsul la întreruperi al microcontrolerelor din familia MCS-51

21
Valorile memorate sunt testate în ciclul maşină următor.
Dacă există cel puţin o solicitare de întrerupere în aşteptare (având flagurile de generare şi de
validare setate), după rezolvarea priorităţilor 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 (vezi tab.1), numai dacă:
 nu există o altă cerere, pe un nivel cu prioritate mai mare sau egală, în curs de tratare;
 ciclul curent este ultimul ciclu maşină al unei instrucţiuni;
 instrucţiunea curentă nu este RETI (revenire din întrerupere) şi nici una care să acceseze
regiştrii cu funcţii speciale IE sau IP, implicaţi în gestiunea întreruperilor.

Solicitările generate de flagurile de întrerupere trebuie să rămână în aşteptare până când ajung
să fie deservite. Dacă un flag de întrerupere este resetat prin program înainte ca întreruperea în
aşteptare asociată să ajungă să fie acceptată de unitatea centrală, atunci cererea de întrerupere
se pierde, fără a mai fi tratată.
În unele cazuri, flagul de întrerupere este resetat automat, prin hardware, în momentul în care
întreruperea asociată este acceptată:
 TF0, TF1, precum şi IE0, IE1 - dacă sunt active pe front ().
22
În alte cazuri, rămâne în sarcina rutinei de tratare a întreruperii să reseteze flagul:
 RI+TI, precum şi IE0, IE1 - dacă sunt active pe nivel.

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.
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.

Instrucţiunea RETI are două funcţii:


- informează sistemul de întreruperi despre terminarea rutinei de tratare şi permite astfel şi
tratarea cererilor de pe acelaşi nivel sau de pe nivelurile inferioare (EOI);
- reface de pe stivă (la fel ca şi o instrucţiune RET) conţinutul registrului PC salvat la intrarea în
rutina de întrerupere, permiţând astfel continuarea programului întrerupt.

23
Întreruperile externe 0 şi 1
Liniile de întrerupere externe INT0 /P3.2 şi INT1 /P3.3 pot fi programate să fie active:
 pe nivel coborât, dacă IT0/1=0 în SFR TCON. În lipsa unei solicitări, linia trebuie menţinută pe
nivel ridicat.
 Dispozitivul care solicită întreruperea trebuie să menţină linia pe nivel coborât până când
microcontrolerul acceptă întreruperea şi îi confirmă acest lucru printr-o operaţie denumită
achitarea întreruperii.
 Flagul de întrerupere este resetat abia atunci când dispozitivul solicitant îşi anulează
cererea.
 Aceasta trebuie să se producă înainte de terminarea rutinei de tratare, altfel, imediat după
revenire, se va genera o nouă întrerupere.
 pe front descrescător, dacă IT0/1=1 în SFR TCON. Dacă linia de întrerupere este găsită pe “1”
logic într-un ciclu maşină şi pe “0” logic în următorul ciclu maşină, atunci este setat flagul de
întrerupere corespunzător, care generează o cerere de întrerupere.
 Resetarea flagului de întrerupere se realizează automat la acceptarea întreruperii (la fel ca
la timere).

24
Exemplul 1: Se va genera pe pinul P1.3 un scurt impuls „1” la
fiecare 1 ms (la fOSC=12 MHz).
8051 1 ms
Întrucât contoarele timerelor sunt incrementate la fiecare 1 µs
(12/fosc), pentru a realiza întârzierea de 1 ms este nevoie de un P1.3
număr de 1 ms / 1 µs = 1000 incrementări succesive.
Valoarea care trebuie încărcată în numărătorul Timerului 0, programat în modul 1 este 65536 –
1000 = 64536 = FC18h.
În programul principal se stabileşte poziţia iniţială pentru P1.3, se programează Timerul 0 şi se
validează întreruperile acestuia.
Generarea impulsului pe pinul P1.3 are loc în rutina de tratare a întreruperii.
Aceasta va fi lansată în execuţie periodic, la expirarea temporizărilor lansate succesiv, prima din
programul principal, iar următoarele din rutina de întrerupere.

ORG 0 ; Punct de intrare la resetare.


LJMP main ; Salt peste zona vectorilor de întrerupere.
; Zona vectorilor de întrerupere
25
CSEG AT 000Bh ; Selectează segmentul de cod la adresa 000Bh.
LJMP rutim0 ; Salt la rutina de servire a întreruperii Timerului 0.
; Programul principal
main: CLR P1.3 ; Pregăteste P1.3 pe nivel coborât.
MOV TMOD, #01h ; Timer 0 în modul 1 (16 biţi), controlabil soft (GATE=0).
MOV TL0,#18h ; Iniţializează contorul Timerului 0.
MOV TH0,#0FCh
SETB EA ; Validare globală a întreruperilor.
SETB ET0 ; Validează întreruperile de la Timerul 0.
SETB TR0 ; Pornire Timer 0.
SJMP $ ; Buclă infinită.

26
; Rutina de tratare a întreruperii Timerului 0
rutim0:
SETB P1.3 ; Comandă pinul P1.3 pe nivel ridicat.
CLR P1.3 ; Comandă pinul P1.3 pe nivel coborât.
MOV TL0,#18h ; Reiniţializează Timerul 0.
MOV TH0,#0FCh
RETI ; Revenire din întrerupere.

27
6.1. Portul serial
Toate microcontrolerele MCS-51 şi compatibile conţin o interfaţă serială standard (Serial Port),
având structura şi funcţionarea descrise în cele ce urmează.
Portul serial integrat pe chip poate să transmită şi să recepţioneze date simultan (full-duplex) în
modul asincron, sau half-duplex în modul sincron.
Receptorul
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.
Registrele de interfaţă cu unitatea centrală sunt fizic distincte, dar pot fi accesate printr-o
singură adresă de SFR: SBUF.
Pentru controlul funcţionării portului serial şi selectarea modului de lucru se utilizeaza registrul
SFR SCON.

28
SFR de lucru cu interfaţa serie (control, date, validare întreruperi
şi viteza de comunicaţie)
Numele Adresa 7 6 5 4 3 2 1 0

SCON 98h SM0 SM1 SM2 REN TB8 RB8 TI RI


SBUF 99h D7 D6 D5 D4 D3 D2 D1 D0
IE A8h EA - - ES ET1 EX1 ET0 EX0
PCON 87h SMOD Rezervaţi, nu trebuie să fie modificaţi

Există 4 moduri de lucru:


Modul 0: (sincron) datele în format serie (8 biţi, mai întâi LSB) ies sau intră prin aceeaşi linie,
SM0 SM1 RxD.
0 0
Linia TxD furnizează, respectiv primeşte semnalul de tact necesar pentru refacerea
datelor, la recepţie, în format paralel.
Viteza de comunicaţie este fixă şi egală cu 1/12 din frecvenţa de lucru a oscilatorului
intern.
29
Modul 1: (asincron) caracterele (10 biţi) formate dintr-un bit de START (0), 8 biţi de date (mai
SM0 SM1
întâi LSB) şi un bit de STOP (1) sunt transmise pe linia TxD şi recepţionate pe linia
0 1 RxD.
La recepţie, bitul de STOP este încărcat în bitul RB8 din SCON. Viteza de
comunicaţie este variabilă.
Modul 2: (asincron) caracterele (11 biţi) formate dintr-un bit de START (0), 8 biţi de date (mai
SM0 SM1
întâi LSB), un al 9-lea bit de date, programabil (TB8 din SCON) şi un bit de STOP (1)
1 0 sunt transmise pe linia TxD şi recepţionate pe linia RxD.
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.
Viteza de comunicaţie este programabilă: 1/32 sau 1/64 din frecvenţa oscilatorului
intern.
Modul 3: asincron, identic cu modul 2, dar viteza de comunicaţie este variabilă.
SM0 SM1

1 1

30
Modul de lucru al interfeţei Viteza de comunicaţie în [Baud], la FOSC = 12 MHz
serie
0 Oscilator Viteză fixă 1
 FOSC
106
intern 12

2 Oscilator Viteză 2SMOD SMOD=0 187.500


 FOSC
intern programabilă 64 SMOD=1 375.000
Modurile 0,1 2SMOD
 (rata de depăşire a Timerului 1)
sau 2 (timer 32
1
sau counter)
şi Timer 1
Modul 2, ca 2SMOD Fosc SMOD=0 75÷9.600
3 
timer (cu 32 12  [256 - (TH1)] SMOD=1 150÷62.500
autoîncărcare)
Tabelul 6.1. Modurile de lucru şi vitezele de comunicaţie
În modurile 1 şi 3 viteza de comunicaţie este variabilă. La 8051 semnalul de tact poate proveni
de la Timerul 1, folosit ca divizor de frecvenţă.
În tabelul 6.1 se prezintă relaţiile de calcul şi limitele permise pentru viteza de comunicaţie serie
în fiecare din cele 4 moduri de lucru descrise mai sus pentru 8051. La 8052 se poate folosi şi
Timerul 2 (nu există la 8051).

31
Atunci când se foloseşte Timerul 1 în modul 2, cu auto-încărcare, viteza de comunicaţie se
calculează cu relaţia:
2SMOD fOSC
VBaud  
32 12 256  TH1 ,
unde SMOD este bitul cel mai semnificativ al registrului PCON, iar (TH1) este valoarea de
reîncărcare, memorată de TH1.
În tab.6.2 sunt prezentate vitezele de comunicaţie uzuale şi modul lor de obţinere atunci când
se foloseşte ca generator de tact Timerul 1, pe baza relaţiei de mai sus.
Viteza de comunicaţie fOSC Bitul Timer 1
(Baud) (MHz) SMOD C/ T Mod Valoarea în TH1
62500 12 1 0 2 FFh
19200 11,0592 1 0 2 FDh
9600 11,0592 0 0 2 FDh
4800 11,0592 0 0 2 FAh
2400 11,0592 0 0 2 F4h
1200 11,0592 0 0 2 E8h
300 11,0592 0 0 2 CCh

32
110 12 0 0 1 FEEBh
Tab.2. Vitezele de comunicaţie la folosirea Timerului 1 ca generator de tact

Posibilităţi de lucru cu Portul serial


Iniţierea transmisiei se realizează la fiecare operaţie de scriere în SBUF.
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.

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.

33
Î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.
În cazul în care nu se lucrează cu întreruperi (linia de întrerupere a serialei este invalidată),
flagurile TI şi RI pot fi utilizate într-o procedură de interogare (polling).
Deoarece există o singură linie de întrerupere pentru serială, o procedură de interogare este
necesară chiar şi atunci când se lucrează cu întreruperile validate.
Astfel, în rutina de tratare trebuie să se identifice exact cauza care a produs întreruperea:
recepţia unui nou caracter (RI=1), terminarea transmisiei unui caracter (TI=1) sau ambele
evenimente.
Aceste două flaguri trebuie şterse apoi prin program, înainte de revenirea din întrerupere.

Modurile 2 şi 3 utilizează un al 9-lea bit de date, programabil, preluat la transmisie din TB8 şi
care la recepţie este încărcat în RB8.

34
Acest bit poate fi folosit, de exemplu, pentru implementarea generării/controlului bitului de
paritate al datelor transferate, dacă la transmisie în TB8 este încărcat indicatorul de paritate P
(PSW.0) iar la recepţie se compară RB8 cu bitul de paritate recalculat. În acest caz SM2=0.

Dar cea mai frecventă utilizare a celui de-al 9-lea bit se regăseşte la comunicaţia serială
multipunct, într-o reţea RS-485.
În acest caz, SM2 se utilizează pentru a face distincţie între diferite tipuri de date care circulă în
reţea: la recepţie se va genera o întrerupere numai dacă cel de-al 9-lea bit primit are valoarea
“1”.
SM2 nu are nici un efect în modul 0, iar în modul 1, SM2=1 poate fi folosit pentru a determina
corectitudinea bitului de STOP (dacă este “1”).

Astfel, se va genera o întrerupere de recepţie numai dacă bitul de STOP recepţionat şi încărcat
în RB8 are valoarea “1”.

Aceasta indică recepţia unui caracter terminat corect, cu un bit de STOP=1.

35
STOP
Exemplul 1: Să se transmită caracterul ‘a’ 8051 ‘a’ = 61h = 01100001b
continuu pe linia serială, la viteza de 9600 Baud P3.1/TxD
1 0 0 0 0 1 1 0 1 0 0 0 0 1 1
(fOSC=11,0592 MHz).
START START
Se va utiliza Portul serial în modul 1 şi Timerul 1
în modul 2, ca generator de tact (vezi tab.2).
MOV TMOD, #20h ; Timerul 1 - generator de tact, în modul 2.
MOV TL1, #0FDh ; Viteza de comunicaţie este 9600 Baud.
MOV TH1, #0FDh ; Iniţializează registrul de reîncărcare
SETB TR1 ; Pornire Timer 1
MOV SCON,#52h ; Programare Port serial: mod=1, REN=1, TI=1
loop:
JNB TI,loop ; Aşteaptă transmisia caracterului anterior
CLR TI ; Şterge fanionul de transmisie.
MOV SBUF,# 'a' ; Transmite caracterul 'a'
SJMP loop ; Continuă să transmită 'a' în buclă infinită.

36
Prin monitorizarea fanionului de transmisie TI este evitată scrierea unui nou caracter în SBUF
peste cel înscris anterior, dar incomplet transmis.
Varianta cu utilizarea întreruperilor
ORG 0 ; Punct de intrare la resetare.
LJMP main ; Salt peste zona vectorilor de întrerupere.
; Zona vectorilor de întrerupere
CSEG AT 0023h ; Selectează segmentul de cod la adresa 0023h.
LJMP rutser ; Salt la rutina de servire a întreruperii PS.
; Programul principal
main:
MOV TMOD, #20h ; Timerul 1 - generator de tact, în modul 2.
MOV TL1, #0FDh ; Viteza de comunicaţie este 9600 Baud.
MOV TH1, #0FDh ; Iniţializează registrul de reîncărcare
SETB TR1 ; Pornire Timer 1.
MOV SCON,#50h ; Programare Port serial: mod=1, REN=1, TI=0.
SETB EA ; Validare globală a întreruperilor.
SETB ES ; Validează întreruperile de la PS.

37
MOV SBUF,# 'a' ; Transmite caracterul 'a'.
SJMP $ ; Buclă infinită.
; Rutina de tratare a întreruperii Portului serial
rutser:
JNB TI,revine
CLR TI ; Anulează cererea de întrerupere de transmisie serială.
MOV SBUF,# 'a' ; Transmite caracterul ’a’.
revine:
RETI ; Revenire din întrerupere.

38
8051
Exemplul 2. Să se iniţializeze Portul serial la fel ca în exemplul P1
1, iar toate caracterele recepţionate pe linia RxD să fie
P3.0/RxD
trimise în Portul 1.
MOV TMOD, #20h ; Timerul 1 - generator
; de tact, în modul 2.
MOV TH1, #0FDh ; Viteza de comunicaţie este 9600 Baud.
MOV TL1, #0FDh ; Iniţializează registrul de reîncărcare.
SETB TR1 ; Pornire Timer 1
MOV SCON,#52h ; Programare Port serial: mod=1, REN=1, TI=1.
wait:
JNB RI,wait ; Aşteaptă recepţia unui caracter.
MOV P1,SBUF ; Trimite în P1 caracterul recepţionat.
CLR RI ; Şterge fanionul de recepţie.
SJMP wait ; Continuă să aştepte următorul caracter.
Prin monitorizarea fanionului de recepţie, RI, se asigură citirea următorului caracter recepţionat
de îndată ce el este disponibil în SBUF.

39
Varianta cu utilizarea întreruperilor:
ORG 0 ; Punct de intrare la resetare.
LJMP main ; Salt peste zona vectorilor de întrerupere.
; Zona vectorilor de întrerupere
CSEG AT 0023h ; Selectează segmentul de cod la adresa 0023h.
LJMP rutser ; Salt la rutina de servire a întreruperii PS.
; Programul principal
main:
MOV TMOD, #20h ; Timerul 1 - generator de tact, în modul 2.
MOV TH1, #0FDh ; Viteza de comunicaţie este 9600 Baud.
MOV TL1, #0FDh ; Iniţializează registrul de reîncărcare.
SETB TR1 ; Pornire Timer 1.
SETB EA ; Validare globală a întreruperilor.
SETB ES ; Validează întreruperile de la Portul serial.
MOV SCON,#50h ; Programare Port serial: mod=1, REN=1, TI=0.
SJMP $ ; Buclă infinită.

40
; Rutina de tratare a întreruperii Portului serial
rutser:
JNB RI,revine ; Testează dacă este o întrerupere de recepţie.
MOV P1,SBUF ; Trimite în P1 caracterul recepţionat.
CLR RI ; Achită întreruperea de recepţie serială.
revine:
RETI ; Revenire din întrerupere.

41

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