Sunteți pe pagina 1din 30

Facultatea de Electronică, Telecomunicat, ii s, i

Tehnologia Informat, iei

Laborator x8051
Curs - Microcontrolere

Îndrumar de laborator
Cuprins

1 Prezentarea arhitecturii 8051 5


1.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Schema bloc a arhitecturii 8051 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 Setul de instruct, iuni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.4 Simulatorul EdSim51 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4.1 Instalarea simulatorului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4.2 Descrierea EdSim8051 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5 Problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.5.1 Descrierea algoritmului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.6 Exercit, ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2 Utilizarea întreruperilor s, i interfat, area cu un sistem de conversie analog-digital 19


2.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2 Întreruperile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2.1 Surse s, i vectori de întrerupere . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2.2 Configurarea întreruperilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3 Timer-e/Numărătoare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.4 Sistemul de conversie analog-digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.4.1 Interfat, area 8051 cu sistemul ADC . . . . . . . . . . . . . . . . . . . . . . . . 25
2.4.2 Configurarea frecvent, ei de es, antionare . . . . . . . . . . . . . . . . . . . . . . 25
2.5 Problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.5.1 Descrierea algoritmului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.6 Exercit, ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

3
1 | Prezentarea arhitecturii 8051

Lucrarea de fat, ă urmăres, te înt, elegerea unor not, iuni de bază ale arhitecturii 8051 s, i exemplificarea
acestora sub forma unor aplicat, ii. Exemplele din acest laborator folosesc dispozitive periferice de
bază s, i sunt implementate în mediul de simulare EdSim51.

1.1 Introducere
Proiectarea unui sistem cu microcontroler presupune, într-o primă fază, înt, elegerea capabilităt, ilor
de care dispune mas, ina de calcul folosită pentru implementarea logicii aplicat, iei. Deoarece în timpul
dezvoltării proiectului trebuie avute în vedere anumite limitări (de exemplu, legate de dimensiune,
de energia consumată, de puterea de procesare etc.), este important ca studentul să cunoască micro-
controlerul în raport cu particularităt, ile aplicat, iei care se dores, te a fi implementată.
Pentru a descoperi capabilităt, ile, este necesară studierea schemei bloc a circuitelor interne s, i de-
terminarea tipului arhitecturii, a numărului s, i dimensiunii registrelor s, i a altor periferice de care
dispune microcontrolerul.
Odată cu identificarea acestor informat, ii, se poate trece la studiul setului de instruct, iuni ce oferă
funct, ionalitate suportului fizic. Ulterior, se poate avansa către proiectarea propriu-zisă a sistemului.
Scopul actualei lucrări de laborator este familiarizarea cu toate aspectele unei arhitecturi specifice,
anume Intel 8051.

1.2 Schema bloc a arhitecturii 8051


Arhitectura pe care se bazează 8051 este de tip Harvard. Spre deosebire de arhitectura von Ne-
umann, unde aceeas, i memorie este folosită atât pentru stocarea datelor, cât s, i pentru stocarea
instruct, iunilor, arhitectura Harvard foloses, te memorii fizic separate pentru date, respectiv instruct, iuni,
cele două împărt, ind spat, iul adreselor, după cum este ilustrat în Figura 1.1. Accesul la memoria de
date sau memoria de program se face folosind instruct, iuni specifice.

Figura 1.1: Arhitecturi de tip von Neumann vs. Harvard 8051

5
Laborator 1

În Figura 1.2 se poate observa schema bloc a unui microcontroler 8051 generic având următoarele
caracteristici:

• Unitate Centrală de Procesare pe 8 bit, i cu registrele ACC (acumulator) s, i B

• Numărator de Program (PC) s, i Pointer Date (DPTR) pe 16 bit, i

• Registru de fanioane – "Program Status Word" (PSW) pe 8 bit, i

• Indicator de stivă (SP) pe 8 bit, i

• Memorie internă ROM / EPROM1 de până la 64 kB, folosită pentru stocarea programului

• Memorie RAM de 128 de octet, i compusă din:

1. 4 seturi de registre, fiecare cont, inând câte 8 registre pe 8 bit, i


2. 16 octet, i adresabili la nivel de bit
3. 80 de octet, i folosit, i pentru uz general

• Un număr de 32 de pini de intrare/ies, ire organizat, i sub forma a 4 porturi pe 8 bit, i fiecare: P0-P3

• Două Timer-e/Numărătoare pe 16 bit, i: T0 s, i T1

• Registru de date pentru comunicat, ia serială full duplex: SBUF

• Registre de control: TCON, TMOD, SCON, PCON, IP s, i IE

• Două surse de întreruperi interne s, i trei externe

• Oscilatorul s, i circuitele care asigură semnalul de ceas.

Memoria de program – ROM/EPROM


Memoria de program constă în 64 kB de memorie cu adrese de la 0x0000 la 0xFFFF (vezi Fi-
gura 1.3). Memoria de program poate fi accesată cu ajutorul instruct, iunilor MOVC.

Memoria de date
Pentru 8051, memoria de date este compusă din 2 blocuri având dimensiunea de 128 de octet, i.
Primul bloc cuprinde registrele de uz general (de la 0x00 la 0x1F), o zonă adresabilă pe bit (de la
0x20 la 0x2F) s, i 80 octet, i de uz general (de la 0x30 la 0x7F). Al doilea bloc este reprezentat de zona
registrelor speciale (SFR). Unele versiuni de 8051 dispun s, i de un al 3-lea bloc de dimensiune de 128
de octet, i, de uz general, care împarte spat, iul adreselor cu zona SFR. În acel caz, adresarea în blocul
suplimentar de memorie se face indirect, iar, în zona SFR, în mod direct.

Registre de uz general
Locat, iile de memorie de la 0x00 la 0x1F pot fi adresate ca patru seturi de registre de uz general.
Fiecare set este format din opt registre de câte un octet, etichetate R0 până la R7. Numai unul dintre
aceste seturi este activ la un moment dat. Setul de registre activ este selectat prin intermediul bit, ilor
RS1 (PSW.4) s, i RS0 (PSW.3) din registrul special Program Status Word (PSW).
1
Erasable Programmable Read Only Memory

6
Laborator 1

Figura 1.2: Schema bloc a arhitecturii 8051

Locat, ii adresabile pe bit


În plus fat, ă de accesul direct la memoria organizată pe octeti, 8051 pune la dispozit, ie un spat, iu
de memorie de 16 octet, i (de la 0x20 la 0x2F) adresabil pe bit. Fiecare bit are o adresă între 0x00 s, i
0x7F. Exemple:
• bitul 0 al octetului cu adresa 0x20 are adresa de bit 0x00
• bitul 7 al octetului cu adresa 0x20 are adresa de bit 0x07
• bitul 7 al octetului cu adresa 0x2F are adresa de bit 0x7F

7
Laborator 1

Diferent, a între accesarea memoriei pe bit sau pe octet este dată de tipul instruct, iunii folosite (operanzi
sursă s, i destinat, ie pe bit sau pe octet). De exemplu, instruct, iunea MOV C, 0x7F va muta valoarea
de bit de la adresa 0x7F (bitul 7 al octetului cu adresa 0x2F) în fanionul Carry.

Registre speciale
Registrele speciale sunt definite sub forma unei zone de memorie cu adrese de la 0x80 până la
0xFF. Acestea oferă control asupra schimbului de date dintre microcontroler s, i periferice. Unele
dintre registre sunt accesabile pe bit, după cum se poate observa în Figura 1.3. Unele adrese sunt
neocupate, iar accesarea acestora nu are un efect bine determinat s, i trebuie evitată.

Stiva
Stiva este localizată în primii 128 de octet, i ai memoriei de date. Zona de stivă este definită cu
registrul special Stack Pointer (SP). Stack Pointer-ul va indica întotdeauna ultima locat, ie folosită.
Următoarea valoare introdusă în stivă va fi plasată la locat, ia SP+1, apoi registrul SP este incremen-
tat. La reset, SP-ul este init, ializat cu valoarea 0x07.

Memoria externa de date


Microcontrolerul 8051 oferă posibilitatea de a adăuga o memorie externă de date cu dimensiunea
maximă de 64kB. Accesarea acestei memorii se face cu magistrala de date s, i adrese, folosind Port 0
s, i eventual Port 2. Validarea se face folosind pinii RD s, i WR ai Port 3. Dimensiunea magistralei de
adrese poate fi 1 octet sau 2 octet, i spre deosebire de memoria internă de date unde magistrala de
adrese are 1 octet.

Figura 1.3: Elementele cheie în programarea 8051

8
Laborator 1

1.3 Setul de instruct, iuni

Mnemonic Description Bytes Clock Cycles


Arithmetic Operations
ADD A, Rn Add Register to A 1 12
ADD A, direct Add direct byte to A 2 12
ADD A, @Ri Add indirect RAM to A 1 12
ADD A, #data Add immediate to A 2 12
ADDC A, Rn Add Register to A with Carry 1 12
ADDC A, direct Add direct byte to A with Carry 2 12
ADDC A, @Ri Add indirect RAM to A with Carry 1 12
ADD A, #data Add immediate to A with Carry 2 12
SUBB A, Rn Subtract Register from A with borrow 1 12
SUBB A, direct Subtract direct byte from A with borrow 2 12
SUBB A, @Ri Subtract indirect RAM from A with borrow 1 12
SUBB A, #data Subtract immediate from A with borrow 2 12
INC A Increment A 1 12
INC Rn Increment Rn 1 12
INC direct Increment direct byte 2 12
INC @Ri Increment indirect RAM 1 12
DEC A Decrement A 1 12
DEC Rn Decrement Rn 1 12
DEC direct Decrement direct byte 2 12
DEC @Ri Decrement indirect RAM 1 12
INC DPTR Increment data pointer 1 24
MUL AB Multiply A and B 1 48
DIV AB Divide A by B 1 48
DA A Decimal adjust A 1 12
Logical Operations
ANL A, Rn AND Register to A 1 12
ANL A, direct AND direct byte to A 2 12
ANL A, @Ri AND indirect RAM to A 1 12
ANL A, #data AND immediate to A 2 12
ANL direct, A AND A to direct byte 2 12
ANL direct, #data AND immediate to direct byte 3 24
ORL A, Rn OR Register to A 1 12
ORL A, direct OR direct byte to A 2 12
ORL A, @Ri OR indirect RAM to A 1 12
ORL A, #data OR immediate to A 2 12
ORL direct, A OR A to direct byte 2 12
ORL direct, #data OR immediate to direct byte 3 24
XRL A, Rn Exclusive–OR Register to A 1 12
XRL A, direct Exclusive–OR direct byte to A 2 12
XRL A, @Ri Exclusive–OR indirect RAM to A 1 12
XRL A, #data Exclusive–OR immediate to A 2 12
XRL direct, A Exclusive–OR A to direct byte 2 12
XRL direct, #data Exclusive–OR immediate to direct byte 3 24

9
Laborator 1

CLR A Clear A 1 12
CPL A Complement A 1 12
RL A Rotate A left 1 12
RLC A Rotate A left through Carry 1 12
RR A Rotate A right 1 12
RRC A Rotate A right through Carry 1 12
SWAP A Swap nibbles of A 1 12
Data transfer
MOV A, Rn Move Register to A 1 12
MOV A, direct Move direct byte to A 2 12
MOV A, @Ri Move indirect RAM to A 1 12
MOV A, #data Move immediate to A 2 12
MOV Rn, A Move A to Register 1 12
MOV Rn, direct Move direct byte to Register 2 24
MOV Rn, #data Move immediate to Register 2 12
MOV direct, A Move A to direct byte 2 12
MOV direct, Rn Move Register to direct byte 2 24
MOV direct, direct Move direct byte to direct byte 3 24
MOV direct, @Ri Move indirect RAM to direct byte 2 24
MOV direct, #data Move immediate to direct byte 3 24
MOV @Ri, A Move A to indirect RAM 1 12
MOV @Ri, direct Move direct byte to indirect RAM 2 24
MOV @Ri, #data Move immediate to indirect RAM 2 12
MOV DPTR, #data16 Load DPTR with 16-bit constant 3 24
MOVC A, @A+DPTR Move code byte relative DPTR to A 1 24
MOVC A, @A+PC Move code byte relative PC to A 1 24
MOVX A, @Ri Move external data (8–bit address) to A 1 24
MOVX @Ri, A Move A to external data (8–bit address) 1 24
MOVX A, @DPTR Move external data (16–bit address) to A 1 24
MOVX @DPTR, A Move A to external data (16–bit address) 1 24
PUSH direct Push direct byte onto stack 2 24
POP direct Pop direct byte from stack 2 24
XCH A, Rn Exchange Register to A 1 12
XCH A, direct Exchange direct byte with A 2 12
XCH A, @Ri Exchange indirect RAM with A 1 12
XCHD A, @Ri Exchange low nibble of indirect RAM with A 1 12
Boolean Manipulation
CLR C Clear Carry 1 12
CLR bit Clear direct bit 2 12
SETB C Set Carry 1 12
SETB bit Set direct bit 2 12
CPL C Complement Carry 1 12
CPL bit Complement direct bit 2 12
ANL C, bit AND direct bit to Carry 2 24
ANL C, /bit AND complement of direct bit to Carry 2 24
ORL C, bit OR direct bit to Carry 2 24
ORL C, /bit OR complement of direct bit to Carry 2 24

10
Laborator 1

MOV C, bit Move direct bit to Carry 2 12


MOV bit, C Move Carry to direct bit 2 24
JC rel Jump if Carry is set 2 24
JNC rel Jump if Carry is not set 2 24
JB bit, rel Jump if direct bit is set 3 24
JNB bit, rel Jump if direct bit is not set 3 24
JBC bit, rel Jump if direct bit is set and clear bit 3 24
Program Branching
ACALL addr11 Absolute subroutine call 2 24
LCALL addr16 Long subroutine call 3 24
RET Return from subroutine 1 24
RETI Return from interrupt 1 24
AJMP addr11 Absolute jump 2 24
LJMP addr16 Long jump 3 24
SJMP rel Short jump (relative address) 2 24
JMP @A + DPTR Jump indirect relative to DPTR 1 24
JZ rel Jump if A equals zero 2 24
JNZ rel Jump if A does not equal zero 2 24
CJNE A, direct, rel Compare direct byte to A and jump if not 3 24
equal
CJNE A, #data, rel Compare immediate to A and jump if not 3 24
equal
CJNE Rn, #data, rel Compare immediate to Register and jump if 3 24
not equal
CJNE @Ri, #data, rel Compare immediate to indirect and jump if 3 24
not equal
DJNZ Rn, rel Decrement Register and jump if not zero 2 24
DJNZ direct, rel Decrement direct byte and jump if not zero 3 24
NOP No operation 1 12

Parameter Description
Rn Register R0–R7 of the currently selected register bank
@Ri Data RAM location addressed indirectly through R0 or R1
rel 8–bit, signed (two’s complement) offset relative to the first byte of the following
instruction. Used by SJMP and all conditional jumps
direct 8–bit internal data location’s address. This Could be a direct–access Data
RAM location (0x00–0x7F) or an SFR (0x80–0xFF)
#data 8–bit constant
#data16 16–bit constant
bit Direct–accessed bit in Data RAM or SFR
addr11 11–bit destination address used by ACALL and AJMP. The destination must be
within the same 2kB page of the program memory as the first byte of the following
instruction
addr16 16–bit destination address used by LCALL and LJMP. The destination may be
anywhere within the 64kB program memory space.
Obs: There is one unused opcode(0xA5) that performs the same function as NOP.
All mnemonics copyrighted c
Intel Corporation 1980.

11
Laborator 1

1.4 Simulatorul EdSim51


Simulatorul EdSim51 oferă funcţionalitatea arhitecturii microcontrolerului Intel MCS-51 (8051).
Acesta conţine toate registrele specifice arhitecturii şi, în plus, aduce posibilitatea de interfaţare cu
diferite periferice. Simulatorul poate fi descărcat de la următoarea adresă web 2 sau de pe pagina de
moodle a cursului de Microcontrolere.
Pentru a putea executa simulatorul, este necesară instalarea JAVA Runtime Environment (JRE)
pentru sistemul de operare utilizat. JAVA Runtime Environment poate fi descărcat de la următoarea
adresă web 3 .

1.4.1 Instalarea simulatorului


Simulatorul rulează pe orice sistem de operare care are JRE instalat. Se dezarhivează arhiva ed-
sim51di.zip în directorul dorit, apoi se intră în directorul edsim51di. Pentru Windows, se rulează fişi-
erul edsim51di.jar prin dublu-click. Pentru Linux, este necesară acordarea permisiunilor de execut, ie
pentru fis, ierul edsim51di.jar, apoi rularea acestuia cu JAVA. Se va deschide o fereastră asemănătoare
celei din Figura 1.4.

Figura 1.4: Fereastra simulatorului EdSim51

Atent, ie: Pentru întrebări, nelămuriri s, i probleme întâmpinate la instalare vă rugăm să vă adresat, i
asistentului de laborator.
2
https://www.edsim51.com/8051simulator/edsim51di.zip
3
https://www.java.com/en/download/

12
Laborator 1

1.4.2 Descrierea EdSim8051


Interfat, a simulatorului este compusă din mai multe sect, iuni, conform Figurii 1.5, care vor fi descrise
în continuare.

Figura 1.5: Sect, iunile interfet, ei simulatorului EdSim51

Fereastra microcontrolerului
Această secţiune cont, ine elementele de arhitectură utilizate pentru programarea microcontrolerului,
ilustrate în Figura 1.3.

Fereastra pentru cod


Simulatorul suportă scrierea codului în limbaj de asamblare cu opţiuni de debugging pas cu pas.
De asemenea, codul scris poate fi salvat sub forma unui fis, ier .asm s, i încărcat fie dintr-un fis, ier salvat
în prealabil, fie dintr-un fis, ier binar de tipul Intel Hex.

Fereastra pentru asocierea porturilor


În această fereastră sunt afis, ate Porturile 0-3, valorile logice de la intrare/ies, ire s, i pinii dispozitivelor
periferice la care sunt conectate.

Fereastra perifericelor
Această fereastră este utilizată pentru a simula interact, iunea cu diverse periferice. Dispozitivele
periferice asigură legătura microcontrolerului cu lumea exterioară. Astfel, putem comanda microcon-

13
Laborator 1

trolerul folosind perferice de intrare sau vizualiza rezultatul unei procesări prin intermediul afis, ajelor.
Perifericele şi schema hardware pot fi observate apăsând butonul din stânga ecranului, numit LD
(Logic Diagram).
Simulatorul dispune de următoarele periferice, ilustrate în Figura 1.6, care pot fi legate la diverse
porturi ale microcontrolerului, în funcţie de aplicaţie:

• 8 LED-uri

• Tastatură 4 × 3

• ADC (pe 8 biţi) – Convertor analog-digital

• DAC (pe 8 biţi) – Convertor digital-analog

• 8 butoane

• 4 afişaje cu 7 segmente

• Interfat, ă UART

• Osciloscop

• Motor

• LCD 2 × 16

Figura 1.6: Perifericele simulatorului EdSim51

14
Laborator 1

1.5 Problema
Să se implementeze un sistem care să comande aprinderea periodică a unui LED cu o frecvent, ă
oarecare. Se va folosi, pentru implementarea sistemului, LED-ul LED 7 atas, at la portul 1, pinul 7
al microcontrolerului conform schemei din Figura 1.6.

1.5.1 Descrierea algoritmului


În general, codul sursă al unui program scris în limbaj de asamblare este structurat astfel:

• Zona EQUATES – în această zonă se etichetează resursele hardware ale microcontrolerului


pentru a lucra mai us, or cu acestea.

• Zona RESET and INTERRUPT VECTORS - în această zonă se definesc vectorii de întrerupere
(dacă nu se lucrează cu întreruperi, este necesar să se definească doar vectorul de reset).

• Zona MAIN PROGRAM CODE SEGMENT - în această zonă se scrie rutina principală a
programului.

• Zona FUNCTION CODE - prin convent, ie, în această zonă se scriu subrutinele programului ce
vor fi apelate în secţiunea descrisă anterior.

În solut, ia propusă în acest laborator, programul va avea mai multe rutine denumite main, delay,
init. Rutina principală (main) apelează o subrutină de întârziere, apoi schimbă starea LED-ului.
Ultima instruct, iune a programului reapelează rutina principală, creând astfel o buclă infinită.
Subrutina de întârziere (delay) constă în două bucle imbricate, având drept contoare registrele
R6, respectiv R7. În cadrul fiecărei bucle apare instrucţiunea DJNZ Rx, etichetă, cu dublu rol
(decrementează registrul Rx s, i face un salt la eticheta specificată în cazul în care valoarea stocată în
Rx este nenulă).
Subrutina de init, ializare dezactivează întreruperile s, i resetează pinul 7 al portului 1 asociat etichetei
LED.

Figura 1.7: Organigrama aplicat, iei Blinky

15
Laborator 1

1.6 Exercit, ii
1. Modificat, i programul astfel încât frecvent, a cu care se aprinde LED-ul să fie mai mică.

2. Calculat, i frecvent, a cu care se aprinde LED-ul s, tiind că frecvent, a de ceas a procesorului este
12 MHz.

3. Modificat, i programul astfel încât LED-ul să se aprindă cu o frecvent, ă crescătoare.

4. Modificat, i programul astfel încât LED-ul să stea mai mult aprins decât stins.

5. Modificat, i programul astfel încât, într-o perioadă, LED-ul să pâlpâie de trei ori, apoi să stea
stins un interval de timp mai mare.

6. Modificat, i programul astfel încât apăsarea switch-ului SW7 din interfat, ă să determine aprin-
derea LED-ului.

16
Laborator 1

Anexa 1 – Codul aplicat, iei Blinky


;------------------------------------------
; EQUATES
;------------------------------------------

LED equ P1.7 ; Label port P1.7 as LED

;------------------------------------------
; RESET and INTERRUPT VECTORS
;------------------------------------------

ORG 0x0000
ljmp main ; Locate a jump to the start of code

;------------------------------------------
; MAIN PROGRAM CODE SEGMENT
;------------------------------------------

ORG 0x0030
main:
acall init
mainLoop:
mov A, #0x01
call delay
cpl LED
jmp mainLoop

;------------------------------------------
; FUNCTION CODE
;------------------------------------------

delay:
mov R7, A
loop1:
mov R6, #0x00
djnz R6, $
djnz R7, loop1
ret
init:
clr EA ; Disable global interrupts
setb LED ; Turn off led
ret

17
Laborator 1

18
2 | Utilizarea întreruperilor s, i interfat, area
cu un sistem de conversie analog-digital

Lucrarea de fat, ă urmăres, te înt, elegerea funct, ionalităt, ii unui convertor analog-digital (ADC) într-
un sistem cu microcontroler. Exemplele din acest laborator folosesc sistemul ADC implementat în
mediul de simulare EdSim51.

2.1 Introducere
Fără o capabilitate a măsurării unor mărimi fizice, nu se poate pune problema unei funct, ii automate
de control s, i decizie într-un sistem cu microcontroler. Sistemul ADC are rolul de a asocia tensiunii
electrice de la intrare o valoare numerică direct proport, ională cu aceasta. În acest mod, se pot culege
date asupra unei mărimi fizice ce pot fi stocate s, i procesate de către microcontroler. Figura 2.1
ilustrează un astfel de sistem.
Dacă tensiunea de intrare variază în timp, atunci viteza de conversie a sistemului ADC trebuie să
fie suficient de mare fat, ă de aceste variat, ii, iar procesarea acestor date de către microcontroler să fie
suficient de rapidă. De aceea este necesară cunoas, terea mecanismului de întreruperi s, i a timer-elor.

2.2 Întreruperile
În dezvoltarea unui program, există două moduri de a determina stările circuitelor interne sau
externe. Prima metodă constă în folosirea instruct, iunilor de salt condit, ionat, care efectuează un salt
în funct, ie de valoarea logică a unui fanion sau a unui pin. A doua metodă este folosirea întreruperilor
care obligă microcontrolerul să apeleze o subrutină în momentul în care apare un eveniment. Atunci
când apare o cerere de întrerupere, se salvează valoarea numărătorului de program în stivă s, i se face
un salt către adresa corespunzătoare rutinei de deservire a întreruperii. O subrutină de întrerupere se
termină de fiecare dată cu instruct, iunea RETI, care extrage din stivă adresa următoarei instruct, iuni,
salvată anterior, la momentul aparit, iei cererii de întrerupere, s, i o încarcă înapoi în numărătorul de
program. În plus, fanionul care a generat întreruperea este resetat, pentru a putea acoperi cazul în
care mai apare o cerere de întrerupere de acelas, i tip.

Figura 2.1: Arhitectura unui sistem cu microcontroler s, i ADC

19
Laborator 2

2.2.1 Surse s, i vectori de întrerupere


Microcontrolerul 8051 dispune de 5 surse de întreruperi. Trei dintre acestea sunt generate intern
de fanionul timer-ului 1, fanionul timer-ului 2 s, i fanionul comunicat, iei seriale. Celelalte două sunt
declans, ate de semnale externe aplicate la pinii INT0 s, i INT1.
Vectorii de întrerupere sunt adrese dedicate în memoria de program, prezentate în tabelul următor.

Interrupt Address (Hex)


IE0 0x0003
TF0 0x000B
IE1 0x0013
TF1 0x001B
SERIAL 0x0023

2.2.2 Configurarea întreruperilor


Activarea s, i setarea priorităt, ii întreruperilor se face cu ajutorul registrelor speciale IE (Interrupt
Enable) s, i IP (Interrupt Priority).

Registrul IE

Figura 2.2: Registrul IE.

Bit Symbol Function


7 EA Enable interrupts bit. Cleared to 0 by program to disable all interrupts; set to 1
to permit individual interrupts to be enabled by their enable bit
6 – Not implemented.
5 ET2 Reserved for future use.
4 ES Enable serial port interrupt. Set to 1 by progrm to enable serial port interrupt;
cleared to 0 to disable serial port interrupt.
3 ET1 Enable timer 1 overflow interrupt. Set to 1 by progrm to enable timer 1 overflow
interrupt; cleared to 0 to disable timer 1 overflow interrupt.
2 EX1 Enable external interrupt 1. Set to 1 by progrm to enable INT1 interrupt; cleared
to 0 to disable INT1 interrupt.
1 ET0 Enable timer 0 overflow interrupt. Set to 1 by progrm to enable timer 0 overflow
interrupt; cleared to 0 to disable timer 0 overflow interrupt.
0 EX0 Enable external interrupt 0. Set to 1 by progrm to enable INT0 interrupt; cleared
to 0 to disable INT0 interrupt.
Bit addresable as IE.0 to IE.7

20
Laborator 2

Registrul IP

Figura 2.3: Registrul IP.

Bit Symbol Function


7 – Not implemented.
6 – Not implemented.
5 PT2 Reserved for future use.
4 PS Priority of serial port interrupt. Set/cleared by program.
3 PT1 Priority of timer 1 overflow interrupt. Set/cleared by program.
2 PX1 Priority of external interrupt 1. Set/cleared by program.
1 PT0 Priority of timer 0 overflow interrupt. Set/cleared by program.
0 PX0 Priority of external interrupt 0. Set/cleared by program.
Note: Priority may be 1 (highest) or 0 (lowest)
Bit addresable as IP.0 to IP.7

În cazul în care mai multe cereri de întrerupere apar în acelas, i timp, având acelas, i nivel de prioritate,
atunci acestea vor fi executate în următoarea ordine implicită:
1. IE0
2. TF0
3. IE1
4. TF1
5. Serial

2.3 Timer-e/Numărătoare
Microcontrolerul 8051 dispune de două timer-e/numărătoare pe 16 bit, i, T0 s, i T1. În funct, ie de
semnalul de intrare, se defines, te funct, ionalitatea de timer (având la intrare un semnal derivat din
semnalul de ceas al microcontrolerului, având frecvent, a de 12 ori mai mică) sau cea de numărător
(având la intrare un semnal digital extern – Figura 2.6). Modul de funct, ionare al acestora este
configurabil prin registrele TCON s, i TMOD (Figura 2.7).

Registrul TCON

Figura 2.4: Registrul TCON.

21
Laborator 2

Bit Symbol Function


7 TF1 Timer 1 Overflow flag. Set when timer rolls from all ones to zero. Cleared when
processor executes interrupt service routine located at program address 0x001B
6 TR1 Timer 1 run control bit. Set to 1 by program to enable timer to count; cleared
to 0 by program to halt timer. Does not reset timer.
5 TF0 Timer 0 Overflow flag. Set when timer rolls from all ones to zero. Cleared when
processor executes interrupt service routine located at program address 0x000B.
4 TR0 Timer 0 run control bit. Set to 1 by program to enable timer to count; cleared
to 0 by program to halt timer. Does not reset timer.
3 IE1 External interrupt 1 edge flag. Set to 1 when a high to low edge signal is received
on port 3 pin 3 (INT1). Cleared when proccessor executes interrupt service
routine located at program address 0x0013. Not related to timer operations.
2 IT1 External interrupt 1 signal type control bit. Set to 1 by program to enable
external interrupt 1 to be triggered by a falling edge signal. Set to 0 by program
to enable a low level signal on external interrupt 1 to generate an interrupt.
1 IE0 External interrupt 0 edge flag. Set to 1 when a high to low edge signal is received
on port 3 pin 2 (INT0). Cleared when proccessor executes interrupt service
routine located at program address 0x0003. Not related to timer operations.
0 IT0 External interrupt 0 signal type control bit. Set to 1 by program to enable
external interrupt 1 to be triggered by a falling edge signal. Set to 0 by program
to enable a low level signal on external interrupt 1 to generate an interrupt.
Bit addresable as TCON.0 to TCON.7

Registrul TMOD

Figura 2.5: Registrul TMOD.

Bit Symbol Function


7/3 Gate Or gate enable bit which controls RUN/STOP of timer 1/0. Set to 1 by program
to enable timer to run if bit TR1/0 in TCON is set and signal on external
interrupt INT1/0 pin is high. Cleared to 0 by program to enable timer to run if
bit TR1/0 in TCON is set.
6/2 C/T Set to 1 by program to make timer 1/0 act as a counter by counting pulses from
external input pins 3.5 (T1) or 3.4 (T0). Cleared to 0 by program to make timer
act as timer by counting internal frequency.
5/1 M1 Timer/counter operating mode select bit 1. Set/cleared by program to select
mode.
4/0 M1 Timer/counter operating mode select bit 0. Set/cleared by program to select
mode.
TMOD is not bit addresable

22
Laborator 2

Figura 2.6: Schema bloc pentru configurarea intrării timer-elor.

Timer-ele pot fi configurate să opereze în unul dintre cele 4 moduri de operare, indiferent dacă
îndeplinesc funct, ia de timer sau numărător. Select, ia modului de operare se realizează prin bit, ii M1
s, i M0 ai registrului TMOD. Schemele bloc ce detaliază modurile de operare sunt ilustrate în Figura 2.7.

Modul 0
Modul 0 este selectat prin resetarea bit, ilor M1 s, i M0, i.e. M1 = 0 s, i M0 = 0. În acest mod, partea mai
put, in semnificativă a registrului de timer, TLX, funct, ionează ca un numărător pe 5 bit, i, iar partea
mai semnificativă a registrului de timer, THX, funct, ionează ca un numărător pe 8 bit, i.

Modul 1
Modul 1 este selectat prin resetarea bitului M1 s, i setarea bitului M0, i.e. M1 = 0 s, i M0 = 1. În acest
mod, s, i THX, s, i TLX, funct, ionează ca numărătoare pe 8 bit, i.

Modul 2
Modul 2, numit s, i Auto-Reload, este selectat prin setarea bitului M1 s, i resetarea bitului M0, i.e. M1
= 1 s, i M0 = 0. În acest mod, TLX funct, ionează ca numărător pe 8 bit, i iar THX stochează valoarea
care va fi folosită pentru reinit, ializarea TLX de fiecare dată când are loc o depăs, ire (overflow).

Modul 3
Dacă modurile 0, 1 s, i 2 puteau fi configurare fără restrict, ii pentru fiecare timer în parte, în cazul
în care se utilizează modul 3, prin setarea bit, ilor M1 s, i M1, i.e. M1 = 1 s, i M0 = 1, ambele fanioane ce
semnalizează o depăs, ire vor fi folosite de timer-ul 0. Astfel, cele 2 registre, TH0 s, i TL0, funct, ionează
ca 2 timer-e independente pe 8 bit, i conform Figura 2.7. Setarea timer-ului 1 în modul 3 implică
oprirea acestuia, dar poate fi folosit totus, i în modurile 0, 1 s, i 2 t, inând cont că nu va avea loc o
întrerupere atunci când acesta ajunge la o depăs, ire.

Funct, ia de numărător
Pentru a selecta acest mod de funct, ionare trebuie setat bitul C/T din registrul TMOD. Astfel incre-
mentarea are loc doar atunci când semnalul de intrare de la pinul T0, pentru Timer 0, sau T1, pentru
Timer 1, îs, i va schimba valoarea logică din 1 în 0.

23
Laborator 2

Figura 2.7: Modurile de lucru ale timer-elor.

2.4 Sistemul de conversie analog-digital


Semnalele analogice sunt unele dintre cele mai comune semnale de intrare folosite în sistemele cu
microcontrolere, deoarece majoritatea senzorilor s, i traductoarelor sunt dispozitive cu ies, iri analogice.
Astfel, dacă sistemul dezvoltat implică măsurarea unor mărimi fizice precum temperatura, presiunea,
umiditatea etc., este necesară folosirea unui sistem ADC.
Sistemul ADC pe 8 bit, i, implementat în EdSim51, este ilustrat în Figura 2.8. Pe lângă terminalele
de intrare s, i ies, ire ilustrate, trebuie specificat că ADC-ul are cât, iva parametri suplimentari, precum
tensiunea de referint, ă (în acest caz, 5 V), s, i durata conversiei (în acest caz, aproximativ 25 µs).

Figura 2.8: Modulul ADC oferit de EdSim51.

24
Laborator 2

PinFunction
RD Enables the tri-state outputs, when logic 0.
WR On a positive edge, initiates conversion.
INTRGoes to logic 0 when conversion is complete and remains low until another con-
version is initiated.
i/p Analog input signal applied here.
CS Enables the device when logic 0.
D0 – D7 Tri-state digital outputs.

2.4.1 Interfat, area 8051 cu sistemul ADC


Având în vedere că ADC-ul pe 8 bit, i are ies, ire paralelă, acesta dispune de 8 pini de date corespun-
zători rezultatului conversiei. Pinii de comandă ai ADC-ului sunt legat, i la portul 3 al microcontro-
lerului. Toate legăturile pot fi vizualizate în Figura 2.9.

Figura 2.9: Interfat, area cu ADC-ul.

Etapele realizării unei conversii sunt:


1. Valoarea logică a pinului WR trece de la 0 la 1
2. ADC-ul realizează conversia în aproximativ 25 µs
3. Finalizarea conversiei este semnalizată prin schimbarea valorii logice a lui INTR din 1 în 0
4. Valoarea logică aplicată pinului RD trebuie schimbată în 0 pentru ca ADC-ul să activeze pinii
de date de ies, ire
5. Citirea rezultatului de pe pinii D0 – D7 de către microcontroler

2.4.2 Configurarea frecvent, ei de es, antionare


Frecvent, a de es, antionare a ADC-ului este configurabilă prin repetarea etapelor realizării unei con-
versii la întreruperea realizată de unul dintre timer-e. Principalele limitări în alegerea unei frecvent, e
de es, antionare cât mai ridicate sunt durata de conversie a ADC-ului, care impune o frecvent, ă maximă
de es, antionare de 50 kHz, s, i timpul de procesare a datelor provenite de la ADC.

25
Laborator 2

2.5 Problema
Să se implementeze un sistem care să măsoare în mod automat valoarea tensiunii aplicate la intrarea
ADC-ului s, i să indice, folosind bara de leduri existentă în EdSim51, această valoare.

2.5.1 Descrierea algoritmului


Solut, ia propusă în cadrul laboratorului utilizează două întreruperi. Prima este generată de timer-ul
0, care init, iază o conversie a ADC-ului la o depăs, ire. A doua întrerupere este generată de pinul INT0,
la care este legat pinul INTR al ADC-ului, s, i are rolul de a procesa s, i afis, a valoarea măsurată.
Programul începe cu sect, iunea EQUATES, în care sunt etichetat, i pinii de ies, ire asociat, i ledurilor
s, i pinii de ies, ire asociat, i semnalelor de comandă pentru ADC. Următoarea sect, iune, RESET and
INTERRUPT VECTORS, configurează vectorul de reset, care efectuează un salt la rutina principală,
main, s, i ceilalt, i vectori de întrerupere care efectuează salturi către subrutinele de întrerupere co-
respunzătoare, timer0ISR respectiv ext0ISR. Programul principal efectuează, în primul rând, un
salt către subrutina de init, ializare, unde sunt configurate cele 2 întreruperi s, i modul de operare al
timer-ului 0. Apoi, prin setarea bitului TR0, pornes, te timer-ul 0 s, i prin instruct, iunea jmp $, as, teaptă
generarea întreruperilor.

26
Laborator 2

2.6 Exercit, ii
1. Determinat, i valoarea maximă care poate fi folosită pentru încărcarea registrului TL0 astfel încât
rezultatul conversiei de la ADC să poată fi stocat corect.
2. Modificat, i programul astfel încât afis, area să se facă folosind LED1, LED2 s, i LED3 astfel:

• LED1 să se aprindă doar atunci când valoarea tensiunii de la intrarea în ADC este mică.

• LED2 să se aprindă doar atunci când valoarea tensiunii de la intrarea în ADC este medie.

• LED3 să se aprindă doar atunci când valoarea tensiunii de la intrarea în ADC este mare.

3. Modificat, i programul astfel încât valoarea tensiunii de la intrarea în ADC să fie afis, ată cu o
zecimală folosind ultimele două cifre ale afis, ajului cu 7 segmente.

27
Laborator 2

Anexa 2 – Codul aplicat, iei ADCValue


;------------------------------------------
; EQUATES
;------------------------------------------

LED0 equ P1.0


LED1 equ P1.1
LED2 equ P1.2
LED3 equ P1.3
LED4 equ P1.4
LED5 equ P1.5
LED6 equ P1.6
LED7 equ P1.7
ADC_WR equ P3.6
ADC_RD equ P3.7

;------------------------------------------
; RESET and INTERRUPT VECTORS
;------------------------------------------

org 0x0000 ; Reset Vector


ljmp main ; Locate a jump to the start of code
;at the reset vector.
ORG 0x0003 ; external 0 interrupt vector
ljmp ext0ISR ; jump to the external 0 ISR

ORG 0x000B ; timer 0 interrupt vector


ljmp timer0ISR ; jump to timer 0 ISR

;------------------------------------------
; MAIN PROGRAM CODE SEGMENT
;------------------------------------------

ORG 30H ; main program starts here


main:
call init ; Initialization of interrups and timer0

start:
setb TR0 ; start timer 0
jmp $

;------------------------------------------
; FUNCTION CODE
;------------------------------------------

init:
clr EA ; Disable global interrupts
setb IT0 ; set external 0 interrupt as edge-activated
setb EX0 ; enable external 0 interrupt

28
Laborator 2

mov TMOD, #0x02 ; set timer 0 as 8-bit auto-reload interval timer


mov TH0, #0x00 ; put 0x00 into timer 0 high-byte - this reload value,
;with system clock of 12 MHz, will result in a
;timer 0 overflow every 256 us
mov TL0, #0x00 ; put the same value in the low byte
setb ET0 ; enable timer 0 interrupt
setb EA ; set the global interrupt enable bit
mov P1, #0xFF ; Turn off all leds
ret

lightLedBar:
mov P1, #0xFF
jz endLight
clr LED0
dec ACC
jz endLight
clr LED1
dec ACC
jz endLight
clr LED2
dec ACC
jz endLight
clr LED3
dec ACC
jz endLight
clr LED4
dec ACC
jz endLight
clr LED5
dec ACC
jz endLight
clr LED6
dec ACC
jz endLight
clr LED7
endLight:
ret

; timer 0 ISR - starts an ADC conversion


timer0ISR:
clr ADC_WR ; clear ADC WR line
setb ADC_WR ; then set it - this results in the
;required positive edge to start a conversion
reti ; return from interrupt

; external 0 ISR - responds to the ADC conversion complete interrupt


ext0ISR:
clr ADC_RD ; clear the ADC RD line - this enables the data lines

29
Laborator 2

mov ACC, P2 ; take the data from the ADC on P2 and send it to ACC
setb ADC_RD ; disable the ADC data lines by setting RD
mov B, #0x1C
div AB
call lightLedBar
reti ; return from interrupt
;------------------------------------------
; End of file.
;------------------------------------------
END

30

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