You are on page 1of 44

CAP.3.

MICROCONTROLERUL 80C552

CAPITOLUL 3
MICROCONTROLERUL 80C552.
3.1. Arhitectura interna. Organizarea memoriei.
Registre cu functii speciale
3.1.1. Arhitectura interna

INT0/ I NT1/
3

V DD

V SS

PWM0/ P WM1/

ADC0-7

T1
3

AVDD
AVREFAVR EF+
STADC

T0
3

AVSS

80C552 este un microcontroler performant pe 8 biti, fabricat in tehnologie


CMOS, bazat pe arhitectura lui 80C51 si care poate fi folosit pentru o gama larga de
aplicatii industriale. Sunt disponibile versiuni care difera prin memoria ROM interna:
- 89C552 - 8Kocteti memorie FLASH
- 87C552 - 8Kocteti memorie EPROM
- 83C552 - 8Kocteti memorie ROM
- 80C552 - fara memorie ROM interna
Structura interna a circuitului este prezentata in figura 3.1.1_1.
SDA

SCL
1

XTA L1
XTA L2

T0, T1
TIMER/
NUMARATOR

EA /

UNITATE

MEMORIE

CENTRALA

PROGRAM

MEMORIE

CONVERTOR

IESIRI

DE DATE

SERIALA

NUMERIC

256 x 8

PE 16 BITI

INTERFATA

ANALOG

PWM

I2C

A LE
80C51

P SEN/

MA GISTRA LA I NTERNA

WR/
3
RD/
3
A D0-7
0
A 8-15
2

T2

PORTURI

INTERFATA

PARALELE SI

PORTURI

SISTEM

SERIALA

MAGISTRALE

8 BITI

CAPTURARE

UART

TIMER/
NUMARATOR

T3
TIMER
WATCHDOG

16 BITI

EXTERNE

3
P 0 P1 P 2 P 3

SISTEM
COMPARARE

TxD RxD

1
P 5 P4

CT0I -C T3I

1
T2

RT2

4
CMSR0 - C MSR5
C MT0, C MT1

FUNC TIE A LTERNA TI V A A PO RTULUI P0

FUNC TI E A LTERNA TI V A A P O RTULUI P 3

FUNC TIE A LTERNA TI V A A PO RTULUI P1

FUNC TI E A LTERNA TI V A A P O RTULUI P 4

FUNC TIE A LTERNA TI V A A PO RTULUI P2

FUNC TI E A LTERNA TI V A A P O RTULUI P 5

Fig. 3.1.1_1. Structura interna a microcontrolerului 8xC552


23

RST EW/

CAP.3. MICROCONTROLERUL 80C552

Microcontrolerul 80C552 contine in structura sa urmatoarele elemente:


- unitate centrala, aritmetica si logica, pe 8 biti
- oscilator si circuit de ceas incorporat
- sase porturi paralele pe 8 biti, din care 5 porturi de intrare/iesire (I/O) si
unul (P5) numai de intrare, care poate prelua semnale analogice sau
digitale
- doua numaratoare/temporizatoare standard pe 16 biti
- un numarator/temporizator pe 16 biti cu facilitati de capturare si comparare
- un temporizator de tip "watchdog"
- interfata seriala UART (Universal Asynchronous Receiver Transmiter)
- interfata seriala I2C (Inter Integrated Circuits)
- doua iesiri, cu rezolutie pe 8 biti, pentru semnale modulate in frecventa si
factor de umplere (PWM Pulse With Modulation)
- convertor analog/numeric pe 10 biti cu 8 intrari analogice multiplexate
- memorie program externa de pina la 64Kocteti
- memorie de date formata din: RAM intern 256 octeti si extern pina la
64Kocteti
- sistem de intreruperi cu 15 surse de intrerupere si doua nivele de prioritate
- doua moduri de reducere a puterii consumate
- frecventa de tact : 1.2 la 24 MHz.
Microcontrolerul are spaii de adrese separate pentru memoria program i pentru
memoria de date.
Citeva din registrele de uz general sunt:
- Acumulator - ACC;
- Registrul B - este folosit de operaiile de nmultire i mpartire;
- Program Counter - PC - numaratorul de program;
- Program Status Word - PSW - registrul PSW conine informatii de stare
(registrul de fanioane);
- Stack Pointer - SP - registru indicator de stiva, pe 8 biti. Stiva poate fi
pozitionata n orice zona a memoriei de date interne, iar la initializarea circuitului n
registrul SP se incarca valoarea 07h;
- Data Pointer - DPTR - registru pe 16 biti folosit la adresarea memoriei. Este
format din doua registre pe 8 biti, DPH - octetul superior respectiv DPL - octetul
inferior si poate fi folosit atit ca registru pe 16 biti cit si pe 8 biti;
Functiile pinilor sunt prezentate in continuare ( vezi si figura 3.1.1_1 ) :
VDD - tensiunea de alimentare digitala +5V
STADC - start extern pentru conversia analog-numerica
PWM0\, PWM1\ - iesiri PWM
EW\ - validare timer watchdog T3 si invalidare mod special Power down

24

CAP.3. MICROCONTROLERUL 80C552

P0.0-0.7 - este un port de I/O pe 8 biti cu iesiri de tip colector in gol. In timpul
accesarii memoriei externe liniile portului au functii de magistrala de adrese/date,
multiplexata n timp.
P1.0-1.7 - este un port de I/O pe 8 biti. Liniile portului pot avea si functii alternative.
P2.0-2.7 - este un port de I/O pe 8 biti. In timpul accesarii memoriei externe, liniile
portului au functii de magistrala de adrese continind octetul mai semnificativ al
adresei.
P3.0-3.7 - este un port de I/O pe 8 biti. Liniile portului pot avea si functii alternative.
P4.0-4.7 - este un port de I/O pe 8 biti. Liniile portului pot avea si functii alternative.
P5.0-5.7 - este un port de intrare pe 8 biti. Liniile portului pot avea si functia
alternativa de intrari pentru convertorul analog-numeric.
RST - intrare/iesire RESET - ca intrare un nivel 1 realizeaza initializarea
circuitului; ca iesire genereaza un impuls la depasirea capacitatii timer T3 (se
realizeaza si un reset intern).
XTAL1, XTAL2 - intre cei doi pini se conecteaza cristalul de cuart pentru
oscilatorul intern sau la XTAL1 se aduce semnalul de tact extern cind se utilizeza
un oscilator extern.
VSS - masa digitala.
PSEN\ - Program Store Enable - iesire "0" activa; reprezint strobul de citire din
memoria program externa si este activ n fiecare ciclu masina de extragere a
codului operatiei . PSEN/ nu este activat la accesarea memoriei de date externa.
ALE - Address Latch Enable - iesire "1" activa; semnal folosit pentru memorarea
octetului mai putin semnificativ al adresei, intr-un latch extern, pentru adresarea
memoriei externe.
EA\ - External Access - intrare pentru circuit; cind valoarea adusa la pin este "0"
logic procesorul executa instructii din memoria program externa, daca valoarea
adusa este "1" logic se executa instructii din memoria program interna atit timp cit
numaratorul de program este mai mic decit 8192 (vezi organizarea memoriei).
AVREF- - tensiunea de referinta low pentru convertorul analog- numeric.
AVREF+ - tensiunea de referinta high pentru convertorul analog- numeric.
AVSS - masa analogica.
AVDD - tensiunea de alimentare analogica.
3.1.2. Organizarea memoriei
Microcontrolerul 80C552 are spatiul de adrese separat pentru memoria
program (MP) si pentru memoria de date (MD). Organizarea memoriei este
prezentata in figura 3.1.2_1.
MP este de 64 Kocteti, intreg spatiul fiind extern circuitului, situatie in care
pinul EA/ este conectat la 0 logic. MP este de tip ROM ea putind fi numai citita.

25

CAP.3. MICROCONTROLERUL 80C552

MD este de tip RAM si este mpartita n doua blocuri: interna si externa. In


interiorul circuitului se gasesc 256 octeti iar n exterior este disponibil un spaiu de
64 de Kocteti.
(FFFFH) 6 4K

(FFFFH) 64K

EXTERNA

(2000H) 8 192
SP A TII SUP RA PUSE
(1 FFFH) 819 1
REGISTRE
C U FUNC T II
SPE C IA LE

(FFH) 255
INTERNA
(EA \ = 1)

EXTERNA
(EA \ = 0)

(0000 H) 0

(7FH) 127
RA M DE DA TE
INTERN
(00H) 0

MEMO RIE PRO GRA M

(00 00H) 0
MEMO RIE DE DA TE
INTE RNA

MEMO RIE DE DA TE
EXTERNA

Fig. 3.1.2_1. Organizarea memoriei


MD interna ( figura 3.1.2_2 ) este impartita in trei zone distincte:
adresele 00H-7FH (128 octeti "low") - poate fi adresata direct i indirect.
adresele 80H-FFH (128 octeti "high") - poate fi adresata numai indirect prin
registru.
adresele 80H - FFH (spatiul registrelor cu functii speciale ) - este rezervata pentru
SFR (Special Function Registers) (porturi, PSW-ul, timere, SP-ul, acumulator
etc.), si poate fi adresata numai direct.
Ultimele doua zone, desi au aceeasi adresa, sunt separate fizic.
Cind o instructie adreseaza o locatie interna cu adresa mai mare decit 7FH, CPU stie
daca accesul se face la octetii 128 superiori sau la registrele SFR prin modul de
adresare utilizat in instructie. Instructiile care utilizeaza adresare directa acceseaza
spatiul SFR. De exemplu:
MOV 0A0H, data
acceseaza spatiul SFR, locatia 0A0H (care este adresa portului P2).
Instructiile care folosesc adresare indirecta, acceseaza octetii 128 mai
semnificativi. De exemplu:
MOV @R0, data
unde registrul R0 contine valoarea 0A0H si acceseaza octetul de date la adresa 0A0H
si nu portul P2.
26

CAP.3. MICROCONTROLERUL 80C552


255
128 octeti
superiori

Numai
adresare
indirecta

Re gis tre
cu functii
s peciale

Numai
adres are
directa

128
127
48
128 de biti
a dres abili

Registre

127
32 7
R7
24 R0
R7
16 R0
R7
8 R0
R7
0 R0

120
0
Banca 3

Adresare
directa sau
indirecta

Banca 2
Banca 1
Banca 0

Fig. 3.1.2_2. Organizarea memoriei interne de date


Zona de adrese 00H 7FH a RAM-ului intern este impartita astfel :
zona pentru registrii R0-R7, de 32 octeti (de la 00H la 1FH), mpartita la rindul ei
n 4 "banci" a cite 8 octeti, fiecare octet reprezentind un registru general R0-R7.
Numai o singura banca poate fi activa la un moment dat, ea fiind selectata prin
program cu ajutorul bitilor RS1 i RS0 din registrul de stare PSW ( figura
3.1.2_3). Dup o operatie de reset este activa banca 0 i registrul SP este
initializat la 07H.
zona de lucru pentru procesorul boolean considerata ca memorie adresabila pe bit
de la 20H pn la 2FH (128 de biti).
zona de lucru generala de la 30H pina la 7FH.
PSW
CY

AC

F0

RS1

RS0

OV

unde: CY - fanionul de transport (carry); poate fi setat/resetat hard sau soft


AC - fanion carry auxiliar ( pentru operatii BCD-Binar Codificat Zecimal )
F0 - fanion ce poate fi definit de catre utilizator
RS1 RS0 - se folosesc la stabilirea grupei de registre folosita
0
0 - se selecteaza Banca 0
0
1 - se selecteaza Banca 1
1
0 - se selecteaza Banca 2
1
1 - se selecteaza Banca 3
27

CAP.3. MICROCONTROLERUL 80C552

OV - fanion depasire; este setat/resetat hard daca se constata depasire de


capacitate
P - fanion de paritate; este setat/resetat hard
Fig. 3.1.2_3. Registru de stare PSW
Pentru conectarea memoriei externe, adresele necesare selectiei sunt obtinute
de la porturile P0 i P2. Liniile portului P0 au functii de magistrala de adrese/date
multiplexate in timp. In momentul n care pe liniile P0.0 - P0.7 se afla adrese (A0A7) microcontrolerul activeaza semnalul ALE care este strobul de validare a
adreselor, si este folosit pentru memorarea adreselor ntr-un latch de adresa. Liniile
portului P2 vor conine adresele A8-A15.
Pentru accesarea MP microcontrolerul activeaza semnalul PSEN/ (Program
Strobe Enable) care are rolul de strob de citire.
Accesarea MD n ciclurile de citire respectiv scriere se face prin folosirea
semnalelor RD/ si WR/ (semnale obtinute de la pinii P3.7 i P3.6 ai portului P3) ca
stroburi de citire respectiv scriere din / in MD. In cazul accesarii MD interna
semnalele RD/ si WR/ nu se activeaza.
Accesarea MP se face n cicluri de extragere a codului instructiunii utilizind
adrese pe 16 biti generate prin intermediul registrului PC. Pentru accesarea MD
externe se pot utiliza adrese pe 16 biti, folosind registrul DPTR , sau adrese pe 8 biti,
folosind adresarea indirecta prin registru .
3.1.3. Registre cu functii speciale ( SFR )
Registrele cu functii speciale sunt prezentate in Tabelul 3.1.3_1.
Registrele SFR includ porturile, numaratoarele, registre pentru controlul perifericelor,
etc., si pot fi accesate doar prin adresare directa. Rolul acestora este de a configura
functionarea fiecarei resurse a microcontrolerului si va fi prezentat pe parcursul
acestei prezentari.
Nu toate adresele din spatiul 80H-0FFH sunt ocupate. Adresele libere nu sunt
implementate in circuit. Citirea lor va returna valori aleatoare, iar scrierea lor nu va
avea nici un efect. De asemenea registrele IP1, B, IEN1, ACC, S1CON, PSW,
TM21R, P4, IP0, P3, IEN0, P2, S0CON, P1, TCON, P0 pot fi accesate la nivel de
bit, adresa celui mai putin semnificativ bit fiind adresa registrului, iar adresa celui
mai semnificativ bit fiind adresa registrului + 7.

28

CAP.3. MICROCONTROLERUL 80C552

Tabelul 3.1.3_1. Registre cu functii speciale ( SFR )


Simbol
ACC*
ADCH
ADCON
B*
CTCON
CTH3
CTH2
CTH1
CTH0
CMH2
CMH1
CMH0
CTL3
CTL2
CTL1
CTL0
CML2
CML1
CML0
DPH
DPL
IEN0*
IEN1*
IP0*
IP1*
P5
P4
P3*
P2*
P1*
P0*
PCON
PSW*
PWMP
PWM1
PWM0
RTE
SP
S0BUF
S0CON*
S1ADR
S1DAT
S1STA
S1CON*
STE
TH1
TH0
TL1
TL0
TMH2
TML2
TMOD
TCON*
TM2CON
TM2IR*
T3

Adresa
E0H
C6H
C5H
F0H
EBH
CFH
CEH
CDH
CCH
CBH
CAH
C9H
AFH
AEH
ADH
ACH
ABH
AAH
A9H
83H
82H
A8H
E8H
B8H
F8H
C4H
C0H
B0H
A0H
90H
80H
87H
D0H
FEH
FDH
FCH
EFH
81H
99H
98H
DBH
DAH
D9H
D8H
EEH
8DH
8CH
8BH
8AH
EDH
ECH
89H
88H
EAH
C8H
FFH

Adresa bit, simbol sau functia alternativa a portului


MSB
E7

LSB
E6

E5

E4

E3

E2

E1

E0

ADC.1
F7
CTN3

ADC.0
F6
CTP3

ADEX
F5
CTN2

ADCI
F4
CTP2

ADCS
F3
CTN1

AADR2
F2
CTP1

AADR1
F1
CTN0

AADR0
F0
CTP0

EA
ET2
PT2
ADC7
CMT1
RD/
A15
SDA
AD7
SMOD
CY

EAD
ECM2
PAD
PCM2
ADC6
CMT0
WR/
A14
SCL
AD6
AC

ES1
ECM1
PS1
PCM1
ADC5
CMSR5
T1
A13
RT2
AD5
F0

ES0
ECM0
PS0
PCM0
ADC4
CMSR4
T0
A12
T2
AD4
WLE
RS1

ET1
ECT3
PT1
PCT3
ADC3
CMSR3
INT1/
A11
CT3I
AD3
GF1
RS0

EX1
ECT2
PX1
PCT2
ADC2
CMSR2
INT0/
A10
CT2I
AD2
GF0
OV

ET0
ECT1
PT0
PCT1
ADC1
CMSR1
TXD
A9
CT1I
AD1
PD
F1

EX0
ECT0
PX0
PCT0
ADC0
CMSR0
RXD
A8
CT0I
AD0
IDL
P

TP47

TP46

RP45

RP44

RP43

RP42

RP41

RP40

SM0
SM1
SM2
REN
TB8
RB8
TI
----------------------------- ADRESA SLAVE ------------------------------

RI
GC

SC4
CR2
TG47

SC3
ENS1
TG46

SC2
STA
SP45

SC1
STO
SP44

SC0
SI
SP43

0
AA
SP42

0
CR1
SP41

0
CR0
SP40

GATE
TF1
T2IS1
T2OV

C/T/
TR1
T2IS0
CMI2

M1
TF0
T2ER
CMI1

M0
TR0
T2B0
CMI0

GATE
IE1
T2P1
CTI3

C/T/
IT1
T2P0
CTI2

M1
IE0
T2MS1
CTI1

M0
IT0
T2MS0
CTI0

unde :
* - registrul SFR este adresabil pe bit.

29

Valoare la
RESET
00H
xxxxxxxxB
xx000000B
00H
00H
xxxxxxxxB
xxxxxxxxB
xxxxxxxxB
xxxxxxxxB
00H
00H
00H
xxxxxxxxB
xxxxxxxxB
xxxxxxxxB
xxxxxxxxB
00H
00H
00H
00H
00H
00H
00H
x0000000B
00H
xxxxxxxxB
FFH
FFH
FFH
FFH
FFH
00xx0000B
00H
00H
00H
00H
00H
07H
xxxxxxxxB
00H
00H
00H
F8H
00H
C0H
00H
00H
00H
00H
00H
00H
00H
00H
00H
00H
00H

CAP.3. MICROCONTROLERUL 80C552

3.2. Mediul de dezvoltare al aplicatiilor cu microcontroler 80C552


3.2.1. Preliminarii
Un program pentru familia de microcontrolere 8051 se compune din unitati
functionale numite module. Un modul este o sectiune de cod care este separat
creat, editat si compilat sau asamblat. Un program scurt poate fi cuprins intr-un
singur modul; un program complex poate contine mai multe module la care pot
lucra, in paralel, mai multi programatori.
Modulele pot fi scrise in limbaj C sau in limbaj de asamblare utilizind un
editor. Fisierele sursa sunt apoi compilate ( compilatorul C51 ) sau asamblate (
asamblorul A51 ) rezultind module obiect relocatabile. Acestea sunt legate
impreuna intr-un singur program ( numit modul obiect executabil ) de utilitarul
L51 ( linker/locator ).
Modulele obiect relocatabile pot fi grupate intr-o colectie speciala numita
librarie, folosind utilitarul LIB51. Cind se utilizeaza o librarie, L51 selecteaza
din aceasta doar modulele obiect necesare si le leaga impreuna cu alte module in
programul executabil.
Utilitarul OH51 transforma un modul obiect executabil intr-un fisier de tip
HEX care poate fi incarcat serial pe un sistem hard; in continuare poate urma
rularea si depanarea programului.
3.2.2. Compilatorul C51
3.2.2.1. Tipuri de date
Compilatorul C51 suporta urmatoarele tipuri de date :
Tipul
bit
signed char
unsigned char
signed int
unsigned int
signed long

Marime
1 bit
1 octet
1 octet
2 octeti
2 octeti
4 octeti

unsigned long
float

4 octeti
4 octeti

pointer

1-3 octeti

Valori
0 sau 1
-128 la +127
0 la 255
-32768 la +32767
0 la 65535
-2147483648
la
+2147483647
0 la 4294967295
+/-1,176E-38
la
+/-3,40E+38
adresa obiectului
30

CAP.3. MICROCONTROLERUL 80C552

Exista si alte trei tipuri speciale de date pentru simplificarea accesului la


registrele SFR :
Tipul
sbit
sfr
sfr16

Marime
1 bit
1 octet
2 octeti

Valori
0 sau 1
0 la 255
0 la 65535

Directive de acest tip sunt continute si in fisierul header reg552.h din directorul
INCLUDE al compilatorului C51.
Urmatoarele exemple arata utilizarea tipurilor de date :
sbit p01 = P1 ^ 0; (variabila p01 se refera la bitul 0 al portului P1)
Dupa declaratia de mai sus, in programul in limbaj C se poate scrie p01=1;
pentru a pune pe 1 bitul 0 al portului P1.
sbit flag0 = flags ^ 0;
( bitul flag0, cel mai putin semnificativ bit al datei
flags )
sfr P0 = 0x80;
(defineste variabila P0 pentru portul 0 - adresa 0x80 ).
Tipul este automat convertit cind rezultatul implica un alt tip de data.
3.2.2.2. Tipuri de memorie
Compilatorul C51 permite accesul la toate componentele hard ale
microcontrolerelor din familia 8051 ( deci si 80C552 ). Fiecare variabila poate fi
explicit locatata in orice zona de memorie prin tipurile : DATA, BDATA, IDATA,
PDATA, XDATA si CODE. Datele din memoria interna sunt accesate mai rapid
decit cele din memoria externa; din acest motiv este recomandabil sa memoram
variabilele mai des utilizate in program in memoria interna.
Tipul
data
bdata
idata
pdata
xdata
code

Descriere
memoria interna adresabila direct ( 128 octeti low ); permite
accesul cel mai rapid pentru o variabila
memoria interna adresabila pe bit ( 16 octeti ); permite accesul
pe bit sau pe octet
memoria interna adresabila indirect ( 256 octeti ); permite
accesul la toata memoria interna
prima pagina din memoria externa de date ( 256 octeti );
accesul se face cu instructia MOVX @Ri
memoria externa de date ( 64 Kocteti ); accesul se face cu
instructia MOVX @DPTR
memoria program( 64 Kocteti ); accesul se face cu instructia
MOVC @A+DPTR
31

CAP.3. MICROCONTROLERUL 80C552

Urmatoarele exemple arata utilizarea tipurilor de memorie la declaratiile de


variabile:
bit fanion; (variabila fanion de tip bit, definita in zona bdata)
char data var1; (variabila var1 de tip char, definita in zona data)
char code text[] = ENTER PARAMETER : ;
static unsigned long xdata array [100];
extern float idata x, y,z;
extern unsigned int pdata dimension;
unsigned char xdata vector [10][4][4];
char bdata flags;
(variabila flags, de tip char, definita in bdata)
sbit flag0 = flags ^ 0; (bitul flag0, cel mai putin semnificativ al datei flags)
Daca tipul de memorie este omis in declaratiile de variabile, compilatorul
utilizeaza automat tipul implicit, care depinde de modelul de memorie utilizat
( SMALL, COMPACT sau LARGE ).
3.3.2.3. Modele de memorie
Variabilele fara tip precizat si parametrii sunt plasati in registrii daca acestia
sunt disponibili, iar apoi in zone de memorie in functie de modelul de memorie
declarat ( implicit SMALL ).
Model
SMALL
COMPACT
LARGE

Descriere
zona memoriei de date interne ( tipul DATA - max. 120 octeti )
prima pagina din memoria de date externa ( tipul PDATA - max.
120 octeti )
zona memoriei de date externa ( tipul XDATA - max. 64 Kocteti )

3.2.2.4. Pointeri
Compilatorul permite declararea a doua tipuri de pointeri : specifici unei
zone de memorie sau generici, adica valabili in orice zona de memorie.
Declaratie
float *p;

Marime
3 octeti

char data *dp


char data *data dp

1 octet
1 octet

int idata *ip


long pdata *pp
char xdata *xp
int code *cp

1 octet
1 octet
2 octeti
2 octeti

Descriere
pointeaza un obiect float in orice zona de
memorie ( pointer generic )
pointeaza un obiect char din zona data
pointeaza un obiect char din zona data,
pointerul fiind definit tot in zona data
pointeaza un obiect int din zona idata
pointeaza un obiect long din zona pdata
pointeaza un obiect char din zona xdata
pointeaza un obiect int din zona code (
memoria program )
32

CAP.3. MICROCONTROLERUL 80C552

3.2.2.5. Intreruperi
Compilatorul C51 permite declararea simpla a unei rutine de intrerupere prin
precizarea atributului interrupt n ( cu n intre 0 si 31 ) la definirea functiei.
Optional poate fi folosit si atributul using i ( cu i intre 0 si 3 ) care permite
alegerea setului de registre dorit ( R0-R7 ).
Exemplu :
Functia de intrerupere pentru Timer 0 poate avea urmatorul prototip:
Timer0 () interrupt 1 using 2
{ }
Intreruperea pentru Timer 0 are codul 1 in tabelul intreruperilor (vezi sistemul de
intreruperi), iar using 2 solicita utilizarea setului 2 (banca 2) de registre.
Codul obiect generat de compilator realizeaza urmatoarele :
continutul registrelor speciale ACC, B, DPH, DPL si PSW sunt salvate in stiva
daca atributul using nu este utilizat, toate registrele de lucru ( Ri ) folosite de
rutina de intrerupere sunt salvate in stiva
inainte de revenirea din functie se reface continutul registrelor salvate in stiva
functia se incheie cu instructiunea RETI

3.2.2.6. Functii de intrare-iesire


Functiile de intrare-iesire opereaza prin intermediul interfetei seriale UART,
care trebuie initializata in prealabil.
Functia printf() construieste un sir formatat concatenind siruri de caractere si
valori numerice:
extern int printf(char * control_string, );
argumentele functiei pot fi pointeri la siruri, caractere sau valori numerice, iar
primul argument este un pointer la sirul formatat de iesire. Sirul de control
(control_string) contine caracterele ce trebuie afisate si specificatorul de format
care determina modul de afisare al argumentului care ii corespunde.
Forma generala a specificatorului de format este (elementele optionale sunt
cuprise in paranteze mari []):
%[prefix][lungimea cimpului][.precizia] tip specificator

33

CAP.3. MICROCONTROLERUL 80C552

unde:
Prefix
#
+
b, B
l, L

Semnificatie
Aliniere in stinga
Prefixul # utilizat cu tipurile o (octal), x, X (hexazecimal) determina
afisarea numereleor cu prefixul 0, 0x sau 0X
Se afiseaza + sau pentru valoarea numerica daca tipul de data este
cu semn (signed)
Se utilizeaza cu tipurile d, i, o, u, x sau X si se refera la tipul de
variabila unsigned char; de exemplu %bu, %bx
Se utilizeaza cu tipurile d, i, o, u, x sau X si se refera la tipul de
variabila unsigned long; de exemplu %lu, %lx

Tip specificator determina modul in care este interpretat un argument: ca si


valoare numerica, caracter sau sir de caractere.

Simbol
d
u
o
x, X
f
e, E
c
s

Tipul
int
unsigned int
unsigned int
unsigned int
float
float
char
pointer la sir

Semnificatie
Numar zecimal cu semn
Numar zecimal fara semn
Numar octal fara semn
Numar hexazecimal fara semn
Numar real in forma [-]dddd.dddd
Numar real in forma [-]d.ddddE[semn]dd
Caracter
Sir de caractere

Functia sprintf() construieste un sir formatat concatenind siruri de caractere si


valori numerice:
extern int sprintf(char *sir, char * control_string, );
Functia lucreza asemanator cu printf() cu deosebirea ca sirul formatat nu este
transmis la portul serial ci este depus intr-un buffer (sir de caractere) punctat de
pointerul sir.
De exemplu:
sprintf( Buffer, "var1: %4u var2: %f", var1, var2 );

34

CAP.3. MICROCONTROLERUL 80C552

3.3. Sistemul de numarare/temporizare al microcontrolerului 80C552


3.3.1. Preliminarii
Microcontrolerul 8xC552 contine trei numaratoare/temporizatoare de 16 biti
denumite Timer 0 - T0 , Timer 1 - T1, Timer 2 - T2 i un temporizator de 8 biti,
Timer 3 - T3 .
In principiu, un numarator/temporizator pentru microcontrolerul 8xC552 este
format dintr-un registru de numarare (8 16 biti) care se incrementeaza la fiecare
impuls de actionare extern sau intern (ciclu masina).
In momentul depasirii capacitatii registrului, se seteaza un fanion de intrerupere si se
genereaza o intrerupere ( daca intreruperile sunt validate).
Numararea este declansata explicit prin control hard sau soft si porneste din zero sau
dintr-o valoare care se incarca prealabil in registrul de numarare.
In modul de lucru numarator ("counter"), continutul registrului este
incrementat la fiecare tranzitie din "1" n "0" (front negativ) a semnalului de intrare
In acest mod, semnalul extern este testat n timpul strii S5P2 a fiecarui ciclu
masina. Cnd testul gaseste "1" logic urmat n ciclul urmator de "0" logic, registrul
este incrementat in starea S3P1 a ciclului masina urmator. Deoarece sunt necesare
dou cicluri masina (24 perioade de tact) pentru recunoasterea unei tranzitii,
frecventa maxima de numarare este de 1/24 din frecventa de tact.
In modul de lucru temporizator ("timer"), continutul registrului este
incrementat la fiecare ciclu masina executat. Astfel, deoarece un ciclu masina
contine 12 perioade de tact, frecventa maxima de numarare este de 1/12 din
frecventa de tact.
3.3.2. Timer 0 si Timer1
Registrele utilizate pentru control sunt TMOD (Timer MODe) si TCON
(Timer CONtrol) si sunt prezentate in fig.3.3.2_1 si 3.3.2_2.
Registrul TMOD contine patru biti de control pentru fiecare timer.
Bitii M0, M1 selecteaza unul din cele patru moduri de operare. Modurile 0,1 i 2 sunt
identice pentru ambele timere.
Bitul C/T selecteaza intre numarator sau temporizator.
Bitul GATE selecteaza modul de validare (de pornire) a numararii: validare hard
(GATE=1) sau validare soft (GATE=0).
TMOD
GATE

C/T

M1

Timer T1
M0

GATE

C/T

Timer T0
M1
M0

unde : primii patru biti se refera la T0 iar urmatorii patru se refera la T1


35

CAP.3. MICROCONTROLERUL 80C552

GATE - daca GATE=1 si bitul de control TRx = 1, Tx este validat doar daca
pinul /INTx=1 ( control hard ); daca GATE =0 numaratorul este validat doar daca
TRx=1 ( control soft)
C/T\ - 0 Tx functioneaza ca temporizator, 1 ca numarator;
M1 M0 - stabileste modul de operare;
0
0 - Modul 0
1 0 - Modul 2
0
1 - Modul 1
1 1 - Modul 3
Fig. 3.3.2_1. Structura registrului TMOD
Registrul TCON utilizeaza pentru control doar cei patru biti mai semnificativi
(ceilalti patru biti se folosesc pentru intreruperile externe).
Bitul TRx (x=0,1) valideaza (porneste) numararea in cazul controlului soft
(GATE=0).
Bitul TFx (x=0,1) este fanionul de intrerupere
TCON
TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

unde: TF1 - setat hard la depasire T1 ; resetat hard la saltul in rutina de tratare
intrerupere
TR1 - setat/resetat prin program pentru a porni/opri pe T1
TF0 - setat hard la depasire T0 ; resetat hard la saltul in rutina de tratare
intrerupere
TR0 - setat/resetat prin program pentru a porni/opri pe T0
IE1 - setat hard la detectie intrerupere externa 1; resetat hard cind intreruperea
este tratata
IT1 - setat/resetat prin program pentru a stabili semnalul activ la INT1: front
negativ/nivel 0
IE0 - setat hard la detectie intrerupere externa 0 ; resetat hard cind
intreruperea este tratata
IT0 - setat/resetat prin program pentru a stabili semnalul activ la INT0: front
negativ/nivel 0
Fig. 3.3.2_2. Structura registrului TCON
Modul 0
Modul 0, prezentat in figura 3.3.2_3, este un numarator/temporizator pe 13
biti, 8 biti ai registrului THx plus cei mai putini semnificativi 5 biti ai registrului
TLx (ceilalti 3 biti fiind neutilizati).
In cazul in care toti bitii registrului sunt pe "1" la urmatorul impuls de incrementare
toti bitii se pun pe "0", si se seteaz fanionul de ntrerupere TFx din registrul
36

CAP.3. MICROCONTROLERUL 80C552

TCON. Incrementarea este validata daca, pe de o parte bitul TRx=1 (din TCON) si
pe de alta parte bitul GATEx=0 (din TMOD) sau semnalul /INTx=1. Daca se pune
GATEx = 1, registrul numarator/ temporizator este controlat prin intrarea /INTx .
Fosc

/12

C/T = 0
TH1
TL1
(8 biti) (5 biti)
C/T = 1

Pin T1
TR1

TF1
Intrerupere

Control

Gate

Pin INT1/

Fig. 3.3.2_3. Modul 0 pentru T1 : Numarator / temporizator pe 13 biti


Modul 1
Acest mod de operare este similar cu modul 0 cu diferenta c registrul de
numarare este pe 16 biti .
Modul 2
In modul 2, prezentat in figura 3.3.2_4, registrul de numarare este configurat
pe 8 biti (TLx) cu incarcare automata din registrul THx. Astfel, la depasirea
capacitatii registrului TLx, se seteaz fanionul de ntrerupere TFx din TCON si se
incarca TLx cu continutul lui THx (THx trebuie incarcat in prealabil prin program).
Fosc

/12

C/T = 0
TL1
(8 biti)
C/T = 1

Pin T1
TR1

Intrerupere

Control
TH1
(8 biti)

Gate

TF1

Reincarcare

Pin INT1/

Fig. 3.3.2_4. Modul 2 : Numarator / temporizator pe 8 biti cu reincarcare

37

CAP.3. MICROCONTROLERUL 80C552

Modul 3
In acest mod T1 isi opreste numararea (efectul este acelasi cu a pune TR1=0)
In modul 3, prezentat n figura 3.3.2_5 , T0 este configurat in doua numaratoare /
temporizatoare separate pe 8 biti.
Timerul TL0 poate fi utilizat ca numarator sau temporizator si foloseste
pentru control bitii C/T, GATE (din TMOD), TR0 i TF0 (din TCON) impreuna cu
semnalul /INT0.
Timerul TH0 poate fi utilizat numai ca temporizator si foloseste pentru
control bitii TR1 i TF1 (TCON).
Modul de operare 3 este prevazut pentru aplicatii care necesita un numarator
suplimentar de 8 biti. Cind T0 este programat n modul 3 de operare, T1 poate fi
programat n modurile 0,1 sau 2 dar fara posibilitatea de a genera intreruperi
(de exemplu, poate fi utilizat pentru generarea ratei de transfer pentru portul serial
UART).
Fosc

/12

C/T = 0
TL0
(8 biti)
C/T = 1

Pin T0
TR0

TF0
Intrerupere

Control

Gate

Pin INT0/

Fosc

TH0
(8 biti)

/12

TR1

Control

TF1
Intrerupere

Fig. 3.3.2_5. Modul 3 pentru T0 : Doua numaratoare / temporizatoare pe 8 biti

3.3.3. Timer 2 ( T2 )
Registrele utilizate pentru control sunt TM2CON, CTCON, TM2IR, STE si
RTE si vor fi prezentate in continuare. In figura 3.3.3_1 se prezinta registrul
TM2CON.

38

CAP.3. MICROCONTROLERUL 80C552

TM2CON
T2IS1
T2IS0
T2ER
T2BO
T2P1
T2P0
T2MS1 T2MS0
unde: T2IS1 - valideaza generare intrerupere la depasire capacitate T2 ( pe 16 biti )
T2IS0 - valideaza generare intrerupere la depasire capacitate T2 ( pe 8 biti octetul inferior )
T2ER - validare reset extern pentru T2;
T2B0 - fanion intrerupere depasire capacitate T2, pe octet;
T2P1 T2P0 - stabilesc continutul registrului de divizare;
0
0 - factor de divizare 1
0
1 - factor de divizare 2
1
0 - factor de divizare 4
1
1 - factor de divizare 8
T2MS1 T2MS0 - selectare mod de lucru pentru T2;
0
0 - T2 este oprit;
0
1 - temporizator (se foloseste tact intern - fosc /12);
1
0 - mod test (rezervat)
1
1 - numerator (semnalul de tact este extern la pinul T2);
Fig. 3.3.3_1. Structura registru TM2CON pentru controlul T2
Timer 2 este un numarator/temporizator pe 16 biti cu facilitti de "capturare"
si "comparare". Schema bloc este prezentata n figura 3.3.3_2.
Intrarea de numarare a lui T2 este legata la un divizor de frecvena pe 3 biti,
cu factor de divizare programabil la 1,2,4 sau 8 prin bitii T2P0, T2P1 din TM2CON,
actionat la rindul sau din trei surse posibile ( selectabile prin bitii T2MS0, TM2S1
din TM2CON ) :
1/12 din frecvena de tact (temporizator)
frontul pozitiv al semnalului de la intrarea ( pinul ) T2 (numerator)
blocare numarare ( pozitia "off" )
In cazul modului de lucru numarator, tranzitia pozitiva la pinul T2 este
recunoscuta ntr-un singur ciclu masina ( starile S2P1 i S5P1 ) avind deci o
frecventa maxima de numarare de 1/12 din frecventa de tact.
Divizorul este resetat daca se reprogrameaza factorul de divizare, daca sursa
de intrare este schimbata sau dac Timer 2 este resetat. Resetarea T2 nu se poate
face soft ci doar prin semnalul de reset al procesorului ( RST ) sau pe frontul pozitiv
al semnalului RT2 daca acest lucru este validat prin bitul T2ER ( TM2CON.5 ).
T2 nu poate fi incarcat prin program, dar poate fi citit in timpul numararii
("on the fly"). Deoarece nu exista registre de citire, trebuie luate precautii in soft
privind interpretarea eronata ce ar putea apare din cauza depasirii de capacitate de la
octetul mai puin semnificativ spre cel mai semnificativ n timpul operatiei de citire.
39

CAP.3. MICROCONTROLERUL 80C552

CT0I
Se mna l
extern

INT

CT0I
Se mna l
extern

Bit
C TI0

CT0
( 16 Biti )

INT

CT0I
Se mna l
extern

Bit
C TI0

CT1
( 16 Biti )

INT
Bit
C TI0

CT3I
Se mna l
extern

CT2
( 16 Biti )

INT
Bit
C TI3

CT3
( 16 Biti )

Off

Fosc

1/12

Divizor

T2
( 16 Biti )

Intre rupere depasire capacita te 8 biti


Intre rupere depasire capacita te 16 biti

P in T2
P in RT2
Bit T2ER
Valida re RESET extern

COMP

P4.0

P4.0

P4.2

P4.3

P4.4

P4.5

BS

P4.6

BS

P4.7

STE

RTE

COMP

COMP
INT

CM0(S)
( 16 Biti )

INT
CM1(R)
( 16 Biti )

INT
CM2(B)
( 16 Biti )

S = Se ta re ( pune re pe "1" )
R = Re setare ( pune re pe "0" )
B = Ba sculare
BS = Bascula re sta re

Fig. 3.3.3_2. Schema bloc pentru Timer 2


Sistemul de capturare
Sistemul de capturare este controlat prin registrul CTCON prezentat in figura
3.3.3_3 si registrul TM2IR prezentat in figura 3.3.3_4.
Sistemul de capturare contine patru canale de capturare identice si
independente prezentate in partea superioara a figurii 3.3.3_2.
Canalul zero (de exemplu), contine un registru de capturare pe 16 biti (CT0), un pin
de intrare pentru un semnal extern (CT0I) si un fanion de intrerupere (bitul CTI0).
La recepia semnalului de intrare CT0I, registrul de capturare este incarcat cu
continutul curent al registrului T2, se seteaza fanionul CTI0 si se genereaza o
intrerupere ( daca intreruperile sunt validate).
In acest timp, Timerul 2 poate fi programat ca numarator sau temporizator.
Semnalul de intrare poate declansa capturarea i genera cererea de intrerupere pe
front pozitiv, negativ sau pe ambele fronturi, prin setarea bitilor corespunzatori din
registrul de control CTCON. Testarea intrarilor se face n starea S1P1 si deci o
tranzitie este detectata n doua cicluri masina consecutive. Copierea lui T2 n
40

CAP.3. MICROCONTROLERUL 80C552

registrele de capturare si setarea fanioanelor de intrerupere se face la sfirsitul celui


de-al doilea ciclu masina.
Sistemul de capturare poate fi folosit, de exemplu, la masurarea duratei unor
impulsuri sau a frecventei acestora.
CTCON
CTN3
CTP3
CTN2
CTP2
CTN1
CTP1
unde: CTN3 - capturare pe frontul negativ (pentru CT3I)
CTP3 - capturare pe frontul pozitiv (pentru CT3I)
CTN2 - capturare pe frontul negativ (pentru CT2I)
CTP2 - capturare pe frontul pozitiv (pentru CT2I)
CTN1 - capturare pe frontul negativ (pentru CT1I)
CTP1 - capturare pe frontul pozitiv (pentru CT1I)
CTN0 - capturare pe frontul negativ (pentru CT0I)
CTP0 - capturare pe frontul pozitiv (pentru CT0I)

CTN0

CTP0

Fig. 3.3.3_3. Structura registru CTCON pentru sistemul de capturare


TM2IR
T20V
CMI2
CMI1
CMI0
CTI3
CTI2
CTI1
unde: T20V - fanion de intrerupere la depasire capacitate T2, pe 16 biti
CMI2 - fanion de intrerupere corespunzator lui CM2
CMI1 - fanion de intrerupere corespunzator lui CM1
CMI0 - fanion de intrerupere corespunzator lui CM0

CTI0

CTI3 - fanion de intrerupere corespunzator lui CT3


CTI2 - fanion de intrerupere corespunzator lui CT2
CTI1 - fanion de intrerupere corespunzator lui CT1
CTI0 - fanion de intrerupere corespunzator lui CT0
Fig. 3.3.3_4. Structura registru TM2IR cu fanioane de intrerupere
Sistemul de comparare
Sistemul de comparare este controlat prin registrul STE prezentat in figura
3.3.3_5 si registrul RTE prezentat in figura 3.3.3_6.
Sistemul de comparare contine trei canale de comparare independente
prezentate in partea inferioara a figurii 3.3.3_2.
Fiecare canal contine un registru de comparare pe 16 biti si un fanion de intrerupere.
Continutul registrelor CM0, CM1 sau CM2 este permanent comparat cu
continutul registrului T2 i la coincidenta se seteaza fanionul de intrerupere
corespunzator si se genereaza o ntrerupere prin bitii CMI0, CMI1 sau CMI2 din
registrul TM2IR.
41

CAP.3. MICROCONTROLERUL 80C552

In acest timp, Timerul 2 poate fi programat ca numarator sau temporizator.


La coincidenta cu CM0 procesorul seteaza bitii 0 - 5 ai portului P4 daca bitii
corespunzatori ai registrului STE sunt pe "1" logic.
La coincidenta cu CM1 procesorul reseteaz bitii 0 - 5 ai portului P4 dac bitii
corespunzatori ai registrului RTE sunt pe "1" logic.
La coincidenta cu CM2 procesorul comut bitii 6 i 7 ai portului P4 dac bitii
corespunzatori ai registrului RTE sunt pe "1" logic. De fapt, nu sunt comutate latchurile portului, ci exista doi bistabili aditionali, care memoreaza ultima operatie de
comutare si care sunt in fapt comutati la coincidenta CM2 cu T2. Dupa RESET hard,
prima comutare seteaza latch-ul portului. Continutul celor doi bistabili poate fi citit
in bitii STE.6 si STE.7 ai registrului STE ( biti care pot fi doar cititi ).
Valoarea logica 1 arata ca la urmatoarea comutare va fi setat latch-ul
corespunzator al portului; 0 logic arata ca la urmatoarea comutare va fi resetat
latch-ul corespunzator.
Registrele CM0, CM1 sau CM2 sunt sterse de semnalul de reset al procesorului.
Portul P4 poate fi citit sau scris prin program in orice moment, dar operatiile de
setare si resetare determinate de sistemul de comparare, sunt prioritare, daca apar in
acelasi ciclu .
Sistemul de comparare poate fi utilizat, de exemplu, pentru generarea unui set de
iesiri a caror tranzitie este direct comandata in timp de Timerul T2.
STE
TG47
TG46
SP45
SP44
SP43
SP42
SP41
SP40
unde:
TG47- daca este 1, P4.7 este setat la urmatoarea comutare; daca este 0,
P4.7 este resetat la urmatoarea comutare
TG46- daca este 1, P4.6 este setat la urmatoarea comutare; daca este 0,
P4.6 este resetat la urmatoarea comutare
SP45 - daca este "1", P4.5 este setat daca coincid CM0 si T2
SP44 - daca este "1", P4.4 este setat daca coincid CM0 si T2
SP43 - daca este "1", P4.3 este setat daca coincid CM0 si T2
SP42 - daca este "1", P4.2 este setat daca coincid CM0 si T2
SP41 - daca este "1", P4.1 este setat daca coincid CM0 si T2
SP40 - daca este "1", P4.0 este setat daca coincid CM0 si T2
Daca STE.i este 0, atunci P4.i nu este afectat de coincidenta CM0 si T2 ( i = 0, 1, 2,
3, 4, 5 )
Fig. 3.3.3_5. Structura registru STE

42

CAP.3. MICROCONTROLERUL 80C552

RTE
TP47
TP46
RP45
RP44
RP43
RP42
unde: TP47 - daca este "1", P4.7 comuta daca coincid CM2 si T2

RP41

RP40

TP46 - daca este "1", P4.6 comuta daca coincid CM2 si T2


RP45 - daca este "1", P4.5 este resetat daca coincid CM1 si T2
RP44 - daca este "1", P4.4 este resetat daca coincid CM1 si T2
RP43 - daca este "1", P4.3 este resetat daca coincid CM1 si T2
RP42 - daca este "1", P4.2 este resetat daca coincid CM1 si T2
RP41 - daca este "1", P4.1 este resetat daca coincid CM1 si T2
RP40 - daca este "1", P4.0 este resetat daca coincid CM1 si T2
Daca RTE.i este 0, atunci P4.i nu este afectat de coincidenta CM1 si T2 sau CM2
si T2
Fig. 3.3.3_6. Structura registrului RTE
Intreruperi
Se poate genera o cerere de ntrerupere la depasire capacitate registru pe 8 biti
( octetul mai puin semnificativ din T2 ) prin bitul T2BO ( TM2CON.4 ) si/sau la
depasire capacitate registru pe 16 biti ( T2 ) prin bitul T2OV ( TM2IR.7 ). Se poate
programa ca una sau amindoua din depasirile de capacitate sa genereze intreruperi
prin bitii T2IS0 ( TM2CON.6 ) si T2IS1 ( TM2CON.7 ). Ambele intreruperi au
acelasi vector de adresa.
Toate fanioanele de intrerupere asociate lui T2 trebuie resetate prin program.
3.3.4. Timer 3 ( T3 )
Microcontrolerul 80C552 include un timer de control ("watchdog") alcatuit
dintr-un divizor de frecventa pe 11 biti si un temporizator de 8 biti (T3). Schema
bloc este prezentata in figura 3.3.4_1.
Frecventa cu care este incrementat T3 rezulta din formula:

Ftimer

Fosc
12 2048

La depasirea capacitatii registrului T3, microcontrolerul este resetat si este generat si


un impuls la pinul RST. Pentru a prevenii acest lucru, T3 trebuie reincarcat periodic
de programul care ruleaza. Astfel, daca procesorul functioneaza anormal (hard sau
soft) programul care ruleaz nu efectueaza la timp reincarcarea T3, fapt ce duce la
generarea unui reset intern, care impiedeca astfel o functionare anormala a
microcontrolerului.
43

CAP.3. MICROCONTROLERUL 80C552

Fosc/12

Divizor
(11 biti)
Stergere

T3
(8 biti)

Depasire
Reset extern la pinul RST

Incarcare
Reset intern
Stergere bit

Pin
EW/
Scriere
T3

Fig. 3.3.4_1. Schema bloc pentru Timer 3


T3 poate fi reincarcat doar dac fanionul WLE ( PCON.4 ) a fost setat prin
soft. In momentul reincarcarii T3 fanionul este automat resetat. Intervalul de timp
dupa care poate apare automat resetul depinde de valoarea care se incarca n
numarator si poate varia de exemplu ntre 2 ms i 0.5 s pentru frecventa de oscilatie
de 12 Mhz.
T3 este controlat extern prin semnalul /EW : "0" logic valideaza timerul si
invalideaza modul "Power-down", iar "1" logic face actiunea inversa. In modul
"Idle" timerul ramine activ.
In principiu, un program care utilizeaza un timer trebuie sa cuprinda o functie
de initializare si o functie de intrerupere ( daca se lucreaza cu intreruperi ).
Functia de initializare ( pentru Timer0, de exemplu : void InitTimer0(void) {...} )
trebuie sa realizeze urmatoarele actiuni :
programare TMOD ( modul de lucru, selectie numarator/temporizator, etc. )
incarcarea in TL0 si TH0 a unei constante calculate corespunzator ( valoare de la
care incepe incrementarea registrului )
validare intrerupere Timer0 si stabilire nivel prioritate intrerupere
pornire Timer0
autorizare globala intreruperi
Functia de intrerupere ( de exemplu : Timer0() interrupt 1 {...} ) trebuie sa
realizeze urmatoarele actiuni :
reincarcarea in TL0 si TH0 a constantei calculate ( mai putin in cazul modului 2
de lucru cind reincarcarea se face automat )
alte actiuni specifice aplicatiei

44

CAP.3. MICROCONTROLERUL 80C552

Pentru utilizarea in aplicatie a sistemului de capturare, programatorul trebuie


sa scrie o functie de initializare pentru T2 si cite o functie de intrerupere pentru
fiecare din canalele de capturare folosite.
Functia de initializare ( pentru Timer2, de exemplu : void InitTimer2(void) {...} )
trebuie sa realizeze urmatoarele actiuni :
programare TM2CON ( modul de lucru, factor de divizare, etc. )
programare CTCON ( selectie front activ )
validare intrerupere pentru canalele folosite
autorizare globala intreruperi
Functia de intrerupere ( de exemplu pentru canalul 0 : Capture0() interrupt 6 {...} )
trebuie sa realizeze urmatoarele actiuni :
resetare fanion de intrerupere CTI0
alte actiuni specifice aplicatiei
Pentru utilizarea facilitatii de watchdog, programatorul trebuie sa plaseze o
secventa de instructiuni intr-o zona a programului unde, in functionare normala, se
garanteaza revenirea ciclica ( de obicei o functie asociata unei intreruperi care
ramine validata permanent ). Secventa de instructiuni ar trebui sa realizeze
urmatoarele actiuni :
setare fanion WLE ( PCON.4 )
incarcare registru T3 cu o valoare corespunzatoare aplicatiei

Problema:
Se cere sa se utilizeze Timer 0 pentru a numara impulsuri externe aduse la intrarea
(pinul) T0.
Pe prima linie LCD se afiseaza numarul de impulsuri iar pe linia a doua frontul
curent al impulsului (0-front negativ, 1-front pozitiv).
Solutie:
Pentru a simula semnalul extern generam prin program impulsuri pe pinul de port
care are ca functie alternativa intrarea de numarare T0 (P3.4).
Pentru a numara impulsuri externe timer-ul 0 se programeaza ca si numarator.
Alegem modul 1 de operare (16 biti) si control (pornire) soft.
In acest caz, registrul de numarare (RN) se incrementeaza la fiecare impuls (front
negativ) de actionare. Daca alegem valoarea de incarcare (VI) egala cu valoarea
maxima (VM), adica VI=0xFFFF, la fiecare impuls numarat se produce depasirea
de capacitate, se genereaza o intrerupere, iar in functia de tratare a intreruperii
utilizam un contor pentru a numara impulsurile.
45

CAP.3. MICROCONTROLERUL 80C552

Functiile lcd_InitDisplay() si Delay() sunt functii de biblioteca ale sistemului de


dezvoltare (Anexa 2)
// Programul foloseste Timer 0 in mod 1 ca numarator
#include <reg552.h>
#include <stdio.h>
// Header pentru biblioteca sistemului de dezvoltare
#include <..\..\lib\ap_lib.h>
// Buffer-ul unde se obtine sirul ASCII pentru afisare pe LCD
unsigned char buffer[ 5 ] = "0000";
// Variabile
unsigned contor;
sbit tact = P3 ^ 4;
// ....................................
// Initializeaza Timer 0
void InitTimer0(void)
{
TMOD = TMOD | 0x05;
TL0 = 0xFF; TH0 = 0xFF;
ET0 = 1;
TR0 = 1;
EA = 1;
}

// contor pentru impulsuri


// simulare semnal extern

// modul 1(16 biti), numarator, control soft


// valoarea de incarcare maxima
// validare intrerupere Timer 0
// porneste Timer 0
// autorizeaza global intreruperile

// Rutina de intrerupere pentru Timer 0


Timer0() interrupt 1
{
// Reincarca valoarea
TL0 = 0xFF; TH0 = 0xFF;
contor++;
// incrementeaza contor
// Afiseaza contor
sprintf( buffer, "%4u", contor );
lcd_Write( 1, buffer );
}
void main(void)
{
lcd_InitDisplay();
contor = 0;
46

CAP.3. MICROCONTROLERUL 80C552

tact = 1;
InitTimer0();
while( 1 ) {
// Simulare semnal extern
tact = 0;
// front negativ
lcd_Write( 2, "0" );
Delay( 1000 );
tact = 1;
lcd_Write( 2, "1" );
Delay( 1000 );

// front pozitiv

}
}
// ....................................
// end

Problema:
Se cere sa se utilizeze sistemul de capturare al Timer 2 pentru a numara impulsuri
externe.
Numarul de impulsuri si valoarea capturata se afiseaza pe LCD.
Solutie:
Pentru a simula semnalul extern generam prin program impulsuri pe pinul de port
care are ca functie alternativa intrarea canalului 0 de capturare (P1.0).
Sistemul de capturare accepta un semnal de intrare logic si poate fi programat sa
genereze o intrerupere pe frontul pozitiv al semnalului.
In functia de tratare a intreruperii utilizam un contor pentru a numara impulsurile.
// Programul foloseste sistemul de capturare al Timer 2, canal 0
#include <reg552.h>
#include <stdio.h>
#include <..\..\lib\ap_lib.h>

// Buffer-ele unde se obtine sirul ASCII pentru afisare


unsigned char buffer[ 5 ] = "0000";
// pentru contor

// Variabile
unsigned contor, val_cap0;
sbit tact = P1 ^ 0;
47

CAP.3. MICROCONTROLERUL 80C552

// Initializeaza Timer 2
void InitTimer2(void)
{
TM2CON = 0x01;
CTCON = 0x01;
ECT0 = 1;
EA = 1;
}

// Timer 2 temporizator, factor divizare 1


// front activ pozitiv pe canal 0
// validare intrerupere canal 0
// autorizeaza global intreruperile

//Rutina de intrerupere pentru Capture 0


Capture0() interrupt 6
{
CTI0 = 0;
// fanion de intrerupere
contor++;
// incrementeaza contor

// Afiseaza contor
sprintf( buffer, "%u", contor );
lcd_WriteString( 1, 1, buffer );
}
void main(void)
{
lcd_InitDisplay();
contor = 0;
tact = 1;
InitTimer2();
while( 1 ) {
// Simulare semnal extern la intrarea de capturare
tact = 0;
// front negativ
lcd_Write( 2, "0" );
Delay( 1000 );
tact = 1;
lcd_Write( 2, "1" );
Delay( 1000 );

// front pozitiv

}
}
// ....................................
// end
48

CAP.3. MICROCONTROLERUL 80C552

3.4. Iesiri PWM. Bloc conversie analog - numerica


Circuitele de tact si de reset. Modurile Idle si Power down
3.4.1. Iesiri PWM
Microcontrolerul 8xC552 contine doua canale (iesiri) pe care se pot genera
impulsuri cu frecventa si factor de umplere programat (Pulse With Modulation
outputs). Schema bloc este prezentata in figura 3.4.1_1
P W M0

Magistrala interna

Compa ra to r

Bufe r
P W M0/

Divizo r

1/12

Numa ra to r
( 8 biti )

P W MP
Fosc

Compa ra to r

Bufe r
P W M1/

P W M1

Fig. 3.4.1_1. Schema bloc pentru iesiri PWM


Blocul PWM contine un registru numarator pe 8 biti actionat cu frecventa de
tact (Fosc/12 - ciclu masina) divizata suplimentar cu un divizor de frecventa (
registrul PWMP). Fiecare canal contine un registru PWMi (i=0,1), un comparator si
un buffer de iesire.
Numaratorul numara modulo 255 (intre 0 si 254 inclusiv). Valoarea acestuia
este comparata permanent cu continutul registrelor PWM0 si PWM1; daca continutul
registrului este mai mare decit continutul numaratorului iesirea corespunzatoare este
pusa pe zero, iar daca este mai mic sau egal, iesirea corespunzatoare este pusa pe
unu. Astfel registrele PWMi determina factorul de umplere al semnalelor generate in
domeniul 0-255/255, programabil in incrementi de 1/255. Frecventa semnalelor
obtinute la cele doua iesiri este data de relatia:

FPWM

Fosc
2 (1 PWMP) 255
49

CAP.3. MICROCONTROLERUL 80C552

iar valoarea PWMP pentru o frecventa dorita FPWM este:

PWMP

Fosc
1
FPWM 2 255

De exemplu pentru frecventa de oscilatie de 12MHz rezulta FPWM intre 92 Hz si 23,5


KHz.
PWMP are rol de registru de divizare, factorul de divizare fiind dat de relatia:
factor de divizare = (PWMP) + 1
Daca registrele PWMi se incarca cu 00H sau FFH iesirile PWMi pot fi
mentinute la un nivel constant de 1 respectiv 0.
3.4.2. Bloc conversie analog - numerica

ADC3
ADC4
ADC5

VREF-

STADC

ADC2

ANALOGIC

MULTIPLEXOR

ADC1

AVSS

AVDD

ADC0

VREF+

Blocul de conversie analog - numerica ( BCAN ) contine un multiplexor


analogic pe 8 canale si un convertor analog - numeric cu rezolutia de 10 biti.
Conversia necesita 50 de cicluri masina, adica 50 microsecunde la frecventa de tact
de 12 MHz. Schema bloc este prezentata in figura 3.4.2_1.

CONVERTOR ANALOG/NUMERIC
( 10 biti )

ADC6
ADC7

ADCON

MAGISTRALA INTERNA

Fig. 3.4.2_1. Schema bloc convertor analog - numeric

50

ADCH

CAP.3. MICROCONTROLERUL 80C552

BCAN este controlat prin registrul ADCON ( figura 3.4.2_2 ).


Selectia, pentru conversie, a uneia din cele 8 intrari analogice ( pe portul de
intrare P5 ), se face prin bitii AADR2, AADR1 si AADR0 din registrul ADCON.
Modificarea acestor biti se poate face doar cind bitii ADCI ( ADCON.4 ) si ADCS
(ADCON.3 ) sunt la 0 logic.
Startul pentru o conversie analog - numerica se poate face extern, de la pinul
STADC, daca bitul ADEX = 1 (ADCON.5 ) sau intern, prin program. In ambele
cazuri se seteaza bitul ADCS ( ADCON.3 ) care ramine pe 1 atit timp cit se
executa conversia. La sfirsitul acesteia ADCS este resetat iar ADCI setat. ADCS nu
poate fi sters iar ADCI setat prin program (numai prin hard).
ADCON
ADC.1
ADC.0
ADEX
ADCI
ADCS
AADR2 AADR1 AADR0
unde:
ADC.1 Bitul 1 al valorii convertite
ADC.0 Bitul 0 al valorii convertite ( cel mai putin semnificativ )
ADEX valideaza posibilitatea startului extern al conversiei la pinul
STADC
ADCI fanion de intrerupere; este setat hard, cind rezultatul unei conversii
este disponibil si trebuie resetat prin program in rutina de tratare a intreruperii
ADCS fanion de start si de stare; setat, permite startul conversiei ( intern,
prin program sau extern prin semnalul de la pinul STADC ). Prin hard se asigura
ca acest semnal sa fie 1 in timpul conversiei. La sfirsitul acesteia ADCS este
resetat si ADCI setat
AADR2, AADR1, AADR0 selectia uneia din cele 8 intrari analogice ca
intrare a convertorului analog numeric. Acesti biti pot fi modificati doar cind
ADCS si ADCI sunt 0
Fig. 3.4.2_2. Structura registrului ADCON
Rezultatul conversiei este memorat in registrul ADCH ( 8 biti mai
semnificativi ) iar ceilalti doi in registrul ADCON ( biti 6 si 7 ). Startul unei noi
conversii se poate face numai dupa ce rezultatul celei curente a fost citit si bitul
ADCI a fost resetat prin program. O conversie in executie este abandonata la intrarea
in unul din modurile Idle sau Power down . Rezultatul unei conversii terminate
( ADCI = 1 ) ramine neafectat de intrarea in modul Idle .
Intr-o aplicatie, utilizarea convertorului analog-numeric se poate realiza, in
principiu, in doua moduri:
prin interogare ( polling ) , asteptind intr-o bucla de program sfirsitul
conversiei. In acest caz, se testeaza bitul ADCI si se asteapta indeplinirea conditiei
ADCI = 1.
51

CAP.3. MICROCONTROLERUL 80C552

prin intreruperi. In acest caz, programatorul trebuie sa scrie o subrutina de tratare


a intreruperii unde se ajunge automat ( prin mecanisme hard ) atunci cind
rezultatul conversiei este disponibil.
In primul caz, functia care programeaza convertorul analog-numeric trebuie sa
realizeze urmatoarele actiuni :
stergere registru ADCON
selectie canal analogic ( dintre cele 8 canale multiplexate )
start conversie ( intern sau extern )
asteptare sfirsit conversie
citirea si asamblarea rezultatului conversiei intr-o variabila pe cel putin 10 biti (
unsigned int )
3.4.3. Circuitele de tact si de reset
Semnalul de tact necesar procesorului se aplica prin intermediul intrarilor
XTAL 1 si XTAL 2 si poate fi generat in doua moduri:
se aplica semnal de tact extern la pinul XTAL1, cu frecventa dorita, in timp ce
pinul XTAL 2 este lasat neconectat;
se conecteaza cuartul de valoare dorita intre cele doua intrari XTAL 1 si XTAL 2,
punindu-le in acelasi timp la masa prin intermediul a doua condensatoare de cite
20 pF fiecare.
Circuitul de RESET este conectat la pinul RST al procesorului, prin
intermediul unui trigger Schmitt necesar pentru eliminarea unor eventuale perturbatii
(figura 3.4.3_1). Iesirea trigger-ului este testata de circuitul de reset in fiecare ciclu
masina. Resetarea procesorului se obtine daca se aplica la acest pin "1" logic pe
durata a cel putin doua cicluri masina (24 perioade de tact), cu conditia ca circuitul de
tact sa functioneze.
Resetarea poate fi generata si de timer-ul "watchdog" T3 daca acesta a fost validat si
s-a ajuns la depasirea de capacitate. In acest caz, impulsul generat de T3 ( 3 cicluri
masina ) va activa trazistorul de pull up care trage la 1 logic linia RST.
Dupa reset, registrele SFR au valori bine determinate, iar continutul RAM-ului intern
nu este afectat.
Resetarea procesorului se poate obtine si la punerea sub tensiune, obtinindu-se asa
numitul reset automat . In acest caz, se leaga pinul RST la VDD prin intermediul
unui condensator de 2,2 F.

52

CAP.3. MICROCONTROLERUL 80C552

VDD
T

De pa sire
time r T3

Trigge r
Schmitt

P in RST

C ircuit
RESET

Fig. 3.4.3_1. Circuitul pentru RESET


Deoarece impulsul scurt generat de T3 nu poate descarca acest condensator,
schema poate fi utilizata doar daca nu se are in vedere validarea watchdog. In caz
contrar, trebuie utilizat un circuit separat pentru reset la punerea sub tensiune.
3.4.4. Modurile Idle si Power down
80C552 dispune de doua moduri speciale de reducere a puterii consumate, Idle
si Power down, activate prin setarea unor biti din registrul PCON( figura 3.4.4_1 ).
Modul Idle, activat prin setarea bitului IDL ( PCON.0 ), permite ca
intreruperile, porturile seriale si Timerele 0 si 1, Timer 3 sa continue sa functioneze
in timp ce procesorul, Timer T2, PWM0, PWM1 si ADC sunt oprite.
Odata instalat modul Idle, starea procesorului , continutul RAM si toate
registrele SFR ramin intacte. Exista doua metode de a iesi din starea Idle:
activarea oricarei intreruperi validate va duce la terminarea acestui mod; dupa
procesarea intreruperii (dupa executia instructiunii RETI), se revine la urmatoarea
instructie de executat, dupa cea care a dus la instalarea modului Idle; fanioanele
GF0 si GF1 se pot folosi pentru a sti daca intreruperea a fost receptionata in
timpul executiei normale sau in timpul modului Idle;
prin reset hard extern sau prin reset intern cauzat de depasirea capacitatii lui T3.
Deoarece tactul este validat, resetul hard trebuie sa fie activ cel putin pe durata a
doua cicluri de masina.
Modul Power down, activat prin setarea bitului PD ( PCON.1 ), opreste
generarea tactului. Instructia care seteaza acest bit este ultima executata inainte de
intrarea in acest mod. Este pastrat doar continutul RAM-ului intern. Continutul
registrelor SFR nu este salvat. Singura modalitate de a iesi din aceasta stare este reset
hard. Tensiunea de alimentare poate fi redusa pentru a minimiza consumul, doar
dupa intrarea in acest mod si trebuie refacuta inainte de resetul hard, care porneste
oscilatorul.

53

CAP.3. MICROCONTROLERUL 80C552

PCON
SMOD
WLE
GF1
GF0
PD
IDL
unde:
SMOD - setat, dubleaza rata de transfer pentru portul serial UART in modurile
1, 2, sau 3
WLE - trebuie setat prin program inainte de incarcarea timerului T3; este
resetat cind T3 s-a incarcat
GF1 - fanion cu utilizare generala
GF0 - fanion cu utilizare generala
PD - setat, activeaza modul Power down; bitul poate fi setat doar cind pinul
EW\ este 1. Acest mod este prioritar fata de modul Idle
IDL - setat, se activeaza modul Idle
Fig. 3.4.4_1. Structura registrului PCON

54

CAP.3. MICROCONTROLERUL 80C552

3.5. Interfata seriala a microcontrolerului 8xC552


3.5.1. Preliminarii
Transferul serial al datelor intre doua echipamente se realizeaza sub forma
bit dupa bit pe o singura linie fizica.
Dupa directia de deplasare a datelor, transferurile seriale se impart astfel:
simplex transfer unidirectional, de la un transmitator la un receptor, pe o
singura linie de semnal (plus linia de masa corespunzatoare).
semi-duplex (half-duplex) transfer bidirectional desfasurat la momente de
timp diferite pe o singura linie de semnal.
duplex (full duplex) transfer bidirectional, care poate avea loc simultan si
necesita doua linii de semnal.

D0

D1

D2

D3

D4

Linie
inactiva

D5

D6

D7

Bit de
paritate

D8

STOP

START

Dupa modul de sincronizare intre transmitator si receptor, exista doua


modalitati de transfer: asincron si sincron.
Transferul asincron numit si transfer pe caracter (fig. 3.5.1_1), incepe cu un
bit de START (0 logic) folosit pentru sincronizarea cu receptorul. Urmeaza bitii
caracterului, incepind cu cel mai putin semnificativ (5, 6, 7 sau 8 biti de date pe
caracter). Bitul (optional) de paritate are rolul de a detecta o eroare de transfer
singulara sau un numar impar de erori. Transferul se incheie cu 1, 1si sau 2 biti
de STOP (1 logic) prevazuti pentru a asigura o separare intre doua caractere
consecutive. De asemenea, procesorul poate prelua caracterul asamblat de interfata
seriala pentru a evita suprascrierea acestuia.
Transferul sincron numit si transfer pe bloc (sau mesaj) incepe cu unul pina
la cinci caractere speciale cu rol de sincronizare. Urmeaza bitii caracterului care
alcatuiesc blocul si care sunt transmisi si receptionati sincronizat cu un tact generat
de transmitator. Este necesara, in general, o linie de tact separata, dar exista si
tehnici care permit combinarea datelor si a tactului pe aceeasi linie.

Fig. 3.5.1_1. Structura unui caracter in mod asincron

55

CAP.3. MICROCONTROLERUL 80C552

Informatia alfanumerica se transfera sub forma de caractere. Codul cel mai


utilizat este codul ASCII (American Standard Code for Information Exchange)
unde 96 de octeti corespund la litere, numere sau caractere speciale iar 32 de octeti
reprezinta caractere de comanda [xx].
In timpul unui transfer serial pot apare patru tipuri de erori:
de cadrare (Frame Error) interfata nu detecteaza numarul programat de
biti de STOP.
de paritate (Parity Error) bitul de paritate calculat de receptor nu
corespunde cu cel primit de la transmitator.
de ritm (Overrun Error) se produce o desincronizare intre interfata si
procesor. Caracterul receptionat de interfata nu este citit in timp util de
procesor, astfel incit caracterul este suprascris ( se pierde cel putin un
caracter).
de oprire (Break) conditia de Break este fortata de transmitator care
trece linia la 0 logic pentru o perioada relativ lunga (0.25 0.5 secunde) si
este sesizata de receptor. Conditia poate fi folosita, de exemplu, pentru
modificarea caracteristicilor transferului.
Interfata seriala asincrona - UART (Universal Asynchronous Receiver
Transmitter) a microcontrolerului 8xC552 ofer posibilitatea transmisiei i receptiei
simultane ("full duplex"). De asemenea, receptionarea unui al doilea octet (caracter)
poate incepe nainte ca cel anterior receptionat sa fie citit din interfata (totusi, daca
primul octet nu este citit inainte ca cel de-al doilea sa fie complet receptionat, unul
din ei se pierde).
Registrele pentru transmisie respectiv receptie ale interfetei seriale sunt
adresate prin registrul S0BUF. Dac se scrie n S0BUF, implicit se incarca registrul
de transmisie, iar daca se citeste din S0BUF, procesorul incarca octetul receptionat.
3.5.2. Moduri de lucru
Controlul interfetei seriale se realizeaza prin registrul S0CON prezentat in
figura 3.5.2_1.
Interfata seriala poate opera in patru moduri selectate prin bitii SM0 (S0CON.7) si
SM1 (S0CON.6).
S0CON
SM0
unde:

SM1

SM2

REN

TB8

RB8

SM0 SM1 - Specifica modul de lucru al interfetei seriale


0
0 - modul 0 ; rata fosc/12
0
1 - modul 1 ; rata variabila
56

TI

RI

CAP.3. MICROCONTROLERUL 80C552

1
0 - modul 2 ; rata fosc/64 sau fosc/32
1
1 - modul 3 ; rata variabila
SM2 - setat valideaza comunicatia multiprocesor in modurile 2 si 3; in modul
0, SM2 trebuie pus pe zero
REN - setat valideaza receptia seriala; validarea sau invalidarea se face prin
program
TB8 - bitul 9 de date care va fi transmis in modurile 2 si 3; setat/resetat prin
program
RB8 - bitul 9 de date care a fost receptionat in modurile 2 si 3; in modul 1,
daca SM2=0, RB8 este bitul de stop care a fost receptionat; in modul 0 nu este
utilizat
TI - fanion de intrerupere la transmisie; setat hard la sfirsitul bitului 8 in modul
0 sau la inceputul bitului de stop in celelalte moduri; trebuie resetat prin program
RI - fanion de intrerupere la receptie; setat hard la sfirsitul bitului 8 in modul 0
sau la jumatatea bitului de stop in celelalte moduri (mai putin in cazul precizat la
SM2); trebuie resetat prin program
Fig. 3.5.2_1. Structura registrului S0CON pentru controlul interfetei seriale
Modul 0
Sunt transmisi sau receptionati 8 biti. Rata de transfer este fixa la 1/12 din
frecventa de oscilatie.
Modul 1
Sunt transmisi (prin TxD) sau receptionati (prin RxD) 10 biti : 1 bit de start
("0"), 8 bii de date si 1 bit de stop ("1"). La receptie bitul de stop ajunge n bitul
RB8 (S0CON.2). Rata de transfer este variabila.
Modul 2
Sunt transmisi (prin TxD) sau receptionati (prin RxD) 11 biti : 1 bit de start
("0"), 8 bii de date, 1 bit de date programabil i 1 bit de stop ("1"). La receptie bitul
programabil ajunge n bitul RB8 (S0CON.2) in timp ce bitul de stop este ignorat. La
transmisie bitul programabil se preia din TB8 (S0CON.3) si poate fi pus pe "1" sau
"0" (de exemplu bitul de paritate P (PSW.0) poate fi copiat n TB8). Rata de transfer
este programabila la 1/32 sau 1/64 din frecventa de oscilatie.
Modul 3
Este similar modului 2 cu exceptia ratei de transfer care este variabila.
57

CAP.3. MICROCONTROLERUL 80C552

In oricare din cele patru moduri, transmisia este activata prin orice instructie care
scrie n registrul S0BUF. In modul 0 receptia este activata prin conditiile RI
(S0CON.0) = 0 i REN (S0CON.4) = 1. In celelalte moduri, receptia este activata
numai prin conditia REN=1. REN este un bit care valideaza/invalideaza receptia si
este setat/resetat prin soft. RI si TI sunt flaguri de ntrerupere pentru receptie
respectiv transmisie setate prin hard si resetate prin soft.
Intr-o aplicatie, lucrul cu interfata seriala RS232 se poate realiza, in principiu,
in doua moduri :
prin interogare (polling) cu intreruperea seriala invalidata. In acest caz, se
testeaza prin program bitii RI si TI din S0CON. La receptie, daca RI este setat, in
registru de receptie (S0BUF) exista un caracter disponibil care trebuie citit de
unitatea centrala. La transmisie, daca TI este setat, interfata a trimis caracterul,
registru de transmisie este gol si unitatea centrala poate scrie un alt caracter.
prin intreruperi. In acest caz, programatorul trebuie sa scrie o subrutina de tratare
a intreruperii unde se ajunge automat (prin mecanisme hard) atunci cind bitii de
intrerupere sunt setati. Deoarece exista un singur vector de intrerupere pentru
UART, la inceputul subrutinei se testeraza bitii RI si TI pentru a stabili sursa
intreruperii.
In principiu, un program pentru interfata seriala ar trebui sa cuprinda o functie
de initializare a interfetei, o functie pentru receptie octet respectiv transmisie octet
(daca se lucreaza cu interogare), o functie de intrerupere (daca se lucreaza cu
intreruperi).
Functia de initializare (pentru UART, de exemplu : void InitSerial(void)
{...}) trebuie sa realizeze urmatoarele actiuni :
programare S0CON (modul de lucru, comunicatie multiprocesor, validare
receptie, etc.)
programare Timer1 si bit SMOD (PCON.7) pentru generarea ratei de transfer
seriale conform Tabel 1
pornire Timer1 si invalidare intrerupere pentru Timer1
validare sau invalidare intreruperi pentru UART
validare transmisie (TI = 1)
Functia de intrerupere (de exemplu : Serial0() interrupt 4 {...}) trebuie sa
realizeze urmatoarele actiuni :
testare RI si TI pentru determinarea sursei de intrerupere (receptie sau transmisie)
resetarea fanionului gasit activ
citirea octetului receptionat sau transmiterea unui octet
alte actiuni specifice aplicatiei

58

CAP.3. MICROCONTROLERUL 80C552

3.5.3. Facilitati de comunicatie multiprocesor


Modurile 2 i 3 ofera facilitati pentru comunicatia multiprocesor. Astfel, bitul
programabil ( bitul 9) ajunge la receptie in RB8, dupa care urmeaza bitul de stop.
Interfata seriala poate fi programata prin SM2 ( S0CON.5 ) astfel incit, dupa receptia
bitului de stop, flagul de intrerupere RI va fi activat doar daca RB8=1. O posibilitate
de a exploata aceast facilitate este urmatoarea :
daca un procesor "master" vrea sa transmita un bloc de date unui "slave", va trimite
mai intii un octet de adresa ( cu bitul 9 pe 1 ) ; daca toate procesoarele "slave" au
programat SM2=1 ele vor fi intrerupte de acest octet de adresa si vor putea testa daca
sunt efectiv adresate ; cel adresat va pune SM2=0, pregatindu-se astfel pentru a
receptiona octetii de date ( care au bitul 9 pe 0 ) care vor urma, n timp ce celelalte
procesoare "slave" isi continua activitatea.
Exemplu : Consideram o structura formata dintr-un master si trei module slave
cu adresele 01H, 02H, 03H. Etapele unei comunicatii seriale multiprocesor sunt
urmatoarele :
toate modulele ( master si slave ) au programat bitul SM2 = 1
masterul trimite adresa 01H cu bitul 9 setat ( TB8 = 1 )
toate modulele slave receptioneaza adresa si testeaza daca aceasta corespunde cu
adresa proprie. Numai slave-ul cu adresa 01H va programa bitul SM2 = 0
masterul trimite datele cu bitul 9 resetat ( TB8 = 0 ) care pot fi receptionate doar
de slave-ul cu adresa 01H. Dupa incheierea transferului slave-ul va reprograma
SM2 = 1
masterul trimite adresa 02H cu bitul 9 setat ( TB8 = 1 ) s.a.m.d.

Master

Slave 1
01H

Slave 2
02H

Slave 3
03H

Fig. 3.5.3_1 Comunicatie seriala multiprocesor


3.5.4. Rata de transfer seriala
n modul 0 rata de transfer este fixa i egala cu 1/12 din frecventa de oscilatie.
n modul 2, rata de transfer depinde de valoarea bitului SMOD (PCON.7). Daca
SMOD=0 (dupa reset), rata de transfer este 1/64 din frecveta de oscilatie, iar daca
SMOD=1, rata este 1/32 din frecventa de oscilatie.

59

CAP.3. MICROCONTROLERUL 80C552

In modurile 1 i 3 rata de transfer (RT) este determinata de Timer 1 (rata


determinata de depasirea de capacitate - "overflow rate") si de valoarea bitului
SMOD, astfel :

2 SMOD
RT
T 1(overflow rate)
32
In acest caz, Timer 1 poate fi programat ca temporizator n oricare din cele trei
moduri de functionare, iar generarea intreruperilor trebuie invalidata. Cel mai
frecvent, Timer 1 este configurat ca temporizator n modul 2 (8 biti cu autoincarcare).
In acest caz (vezi si tabelul 3.5.4_1) rata de transfer este :

2 SMOD
Fosc
RT

32 12 [256 (TH 1)]


Tabelul 3.5.4_1. Rate de transfer utilizind Timer 1

Rata de
transfer
19,2K
9,6K
4,8K
2,4K

Frecventa de
tact
11,0592MHz
11,0592MHz
11,0592MHz
11,0592MHz

SMOD
( PCON.7 )
1
0
0
0

bit C / T
0
0
0
0

60

Timer T1
Mod de
lucru
2
2
2
2

Valoare de
incarcare
FDH
FDH
FAH
F4H

CAP.3. MICROCONTROLERUL 80C552

3.6. Sistemul de intreruperi al microcontrolerului 8xC552


3.6.1. Sursele de intreruperi
Sistemul de intreruperi al microcontrolerului 8xC552 recunoaste cereri de
intrerupere de la 15 surse distincte, care sunt:
a) dou intreruperi externe /INT0 si /INT1. Acestea pot fi recunoscute pe
frontul cazator al semnalului sau pe nivel "0" in functie de programarea bitilor IT0
(TCON.0) si IT1 (TCON.2).
pentru intrerupere pe front, la detectia acesteia se seteaza fanioanele de
intrerupere IE0 (TCON.1) respectiv IE1 (TCON.3), iar dupa saltul in subrutina
de intrerupere acestea sunt automat resetate.
pentru intrerupere pe nivel, sursa externa trebuie sa mentina cererea activa pina
cind intreruperea este generata. De asemenea, cererea trebuie dezactivata inainte
de sfirsitul rutinei de tratare a intreruperii, altfel o noua intrerupere va fi generata.
b) dou intreruperi generate de timerele T0 si T1 prin setarea bitilor TF0 si
TF1 din TCON. Acestia sunt resetati automat ( tot prin hard ) dupa saltul in
subrutina de tratare a intreruperii.
c) o intrerupere generata de interfata seriala UART printr-o logica SAU la
activarea unuia din fanioanele RI (ntrerupere la receptie) sau TI (ntrerupere la
emisie) din registrul S0CON. Dup saltul in subrutina de tratare a intreruperii, RI
sau TI trebuie resetati prin soft.
d) opt intreruperi generate de timerul T2- patru intreruperi de capturare, trei
intreruperi de comparare i o intrerupere pentru depasirea de capacitate:
T2 este conectat la 4 registre de comparare CT0,CT1,CT2,CT3. La receptia
semnalelor de intrare CT0I,CT1I,CT2I, registrele de capturare corespunzatoare
sunt incarcate cu continutul lui T2 si se genereaza o cerere de intrerupere
corespunzatoare prin setarea bitilor CTI0,CTI1,CTI2,CTI3 din registrul TM2IR
la coincidenta continutului lui T2 cu cel al registrelor de comparare
CM0,CM1,CM2 se genereaza cereri de intrerupere corespunzatoare pe bitii
CMI0, CMI1,CMI2 din registrul TM2IR
se genereaza o cerere de intrerupere la depasire capacitate registru pe 8 biti
(octetul cel mai puin semnificativ din T2) prin bitul T2BO (TM2CON.4) si/sau
la depasire capacitate registru pe 16 biti (T2) prin bitul T2OV (TM2IR.7)
Ambele intreruperi au acelasi vector de adresa.

61

CAP.3. MICROCONTROLERUL 80C552

e) o intrerupere generata la sfirsitul conversiei analog-numerice prin setarea


bitului ADCI (ADCON.4). Fanionul trebuie resetat prin soft dupa ce valoarea
convertita a fost citit.
f) o intrerupere generata de interfata seriala I2C prin bitul SI (S1CON.3) ca
urmare a apariiei unuia din urmatoarele evenimente:
conditie START generata in modul master
adresa de slave a fost receptionata in timp ce AA = 1
adresa general call a fost receptionata in timp ce S1ADR = 1 i AA = 1
un octet de date a fost trimis sau receptionat in modul master
un octet de date a fost trimis sau receptionat ca slave selectat
conditie START sau STOP a fost receptionata ca slave receptor sau emitator
Fiecare sursa de ntrerupere poate fi validata sau invalidata prin setarea sau
resetarea bitului corespunztor din registrele de validare intreruperi IEN0 si IEN1.
De asemenea se poate face validarea sau invalidarea globala a surselor de
intrerupere prin bitul EA (IEN0.7)
Cele 15 surse de ntreruperi se pot organiza pe dou nivele de prioritate
(superior i inferior) prin intermediul bitilor registrilor pentru stabilirea nivelului de
prioritate al intreruperilor IP0 si IP1. Daca exista cereri simultane de pe ambele
nivele de prioritate, se trateaza mai nti cererea corespunzatoare nivelului superior
de prioritate. Daca exista cereri simultane de pe acelai nivel de prioritate,
intreruperile vor fi servite in urmatoarea ordine:
X0, S1, ADC, T0, CT0, CM0, X1, CT1, CM1, T1, CT2, CM2, S0, CT3, T2
O subrutina de tratare corespunzatoare nivelului inferior poate fi intrerupta doar de o
intrerupere pe nivel superior. O subrutina de tratare corespunzatoare nivelului
superior nu poate fi intrerupta.
Vectorii de adresa corespunzatori celor 15 surse de intreruperi sunt prezentai in
Tabelul 3.6.1_1. Coloana cod intrerupere reprezinta codul (numarul intre 0 si 14)
pe care programatorul trebuie sa-l precizeze la definirea functiei de intrerupere
(atributul interrupt n ).
Structura registrelor IEN0, IEN1, IP0 si IP1 este prezentata in figurile 3.6.1_2,
3.6.1_3, 3.6.1_4, 3.6.1_5.
Cind se lucreaza in limbaj de asamblare, programatorul trebuie sa plaseze
subrutina de tratare a intreruperii la adresa corespunzatoare de memorie, conform cu
Tabelul 3.6.1_1 (de exemplu adresa 0003H pentru intreruperea externa 0).
Cind se lucreaza in limbaj C, programatorul trebuie sa scrie subrutina de
tratare a intreruperii sub forma unei functii C cu atributul interrupt n, compilatorul
fiind cel care plaseaza aceasta functie la adresa corespunzatoare.
62

CAP.3. MICROCONTROLERUL 80C552

De exemplu pentru intreruperea asociata convertorului analog-numeric se scrie:


ReadADC() interrupt 10 {...}
Tabelul 3.6.1_1. Sursele de intreruperi si adresele rutinelor de tratare
Nr.
crt.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.

Sursa de intrerupere

Simbol

Intrerupere externa 0
depasire Timer0
Intrerupere externa 1
depasire Timer 1
Intrerupere UART
Intrerupere I2C
Intrerupere capturare 0
Intrerupere capturare 1
Intrerupere capturare 2
Intrerupere capturare 3
Intrerupere CAN
Intrerupere comparare 0
Intrerupere comparare 1
Intrerupere comparare 2
depasire Timer 2

X0
T0
X1
T1
S0
S1
CT0
CT1
CT2
CT3
ADC
CM0
CM1
CM2
T2

Cod
intrerupere
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14

ES0

ET1

IEN0
EA

EAD

ES1

Vectorul
intrerupere
0003H
000BH
0013H
001BH
0023H
002BH
0033H
003BH
0043H
004BH
0053H
005BH
0063H
006BH
0073H

EX1

ET0

EX0

unde: EA - setat valideaza generarea de intreruperi, iar resetat invalideaza toate


intreruperile
EAD - setat valideaza intreruperea de la ADC
ES1 - setat valideaza intreruperea de la interfata I2C
ES0 - setat valideaza intreruperea de la interfata UART
ET1 - setat valideaza intreruperea de la Timer T1
EX1 - setat valideaza intreruperea externa 1
ET0 - setat valideaza intreruperea de la Timer 0
EX0 - setat valideaza intreruperea externa 0
Fig. 3.6.1_2. Structura registrului IEN0 pentru validare intreruperi

63

CAP.3. MICROCONTROLERUL 80C552

IEN1
ET2

ECM2

ECM1

ECM0

ECT3

EXT2

ECT1

ECT0

unde:
ET2 - valideaza intreruperea data de depasirea capacitatii lui T2
ECM2 - valideaza intreruperea de la comparatorul 2 al T2
ECM1 - valideaza intreruperea de la comparatorul 1 al T2
ECM0 - valideaza intreruperea de la comparatorul 0 al T2
ECT3 - valideaza intreruperea de capturare 3 de la T2
ECT2 - valideaza intreruperea de capturare 2 de la T2
ECT1 - valideaza intreruperea de capturare 1 de la T2
ECT0 - valideaza intreruperea de capturare 0 de la T2
Fig. 3.6.1_3. Structura registrului IEN1 pentru validare intreruperi
Validarea unei surse de intrerupere presupune setarea bitului corespunzator din
unul din registrele IEN0 sau IEN1 precum si setarea bitului EA. Invalidarea unei
surse de intrerupere se poate face prin resetarea bitului corespunzator. Invalidarea
tuturor intreruperilor se poate face prin resetarea bitului EA.
IP0
-

PAD

PS1

PS0

PT1

PX1

PT0

PX0

unde:
PAD - stabileste niv. de intrerupere pentru ADC
PS1 - stabileste niv. de intrerupere pentru I2C
PS0 - stabileste niv. de intrerupere pentru UART
PT1 - stabileste niv. de intrerupere pentru Timer 1
PX1 - stabileste niv. de intrerup. pentru intreruperea externa 1
PT0 - stabileste niv. de intrerupere pentru Timer 0
PX0 - stabileste niv. de intrerup. pentru intreruperea externa 0
Fig. 3.6.1_4. Structura registrului IP0 pentru stabilirea nivelului de prioritate
IP1
PT2

PCM2

PCM1

PCM0

PCT3

PCT2

PCT1

unde:
PT2 - stabileste niv. de intrerupere pentru depasire la T2
PCM2 - stabileste niv. de intrerupere pentru comparatorul 2 al T2
PCM1 - stabileste niv. de intrerupere pentru comparatorul 1 al T2

64

PCT0

CAP.3. MICROCONTROLERUL 80C552

PCM0 - stabileste niv. de intrerupere pentru comparatorul 0 al T2


PCT3 - stabileste nivelul intrerupererii de capturare 3 al T2
PCT2 - stabileste nivelul intrerupererii de capturare 2 al T2
PCT1 - stabileste nivelul intrerupererii de capturare 1 al T2
PCT0 - stabileste nivelul intrerupererii de capturare 0 alT2
0 = Prioritate mica
1 = Prioritate mare
Fig. 3.6.1_5. Structura registrului IP1 pentru stabilirea nivelului de prioritate
3.6.2. Tratarea unei intreruperi
Fanioanele corespunzatoare cererilor de ntrerupere sunt pozitionate n starea
S5P2 a fiecrui ciclu masina i sunt testate n ciclu masina urmator. Daca cel puin
un fanion este setat i sistemul de ntreruperi este validat se genereaza o instructiune
LCALL la subrutina de servire corespunztoare, cu conditia ca aceast proces s nu
fie blocat de una din urmatoarele conditii:
1. O ntrerupere de prioritate egala sau mai mare este n curs de executie
2. Ciclul de testare a fanioanelor nu este ciclul final al instructiunii curente
3. Instructiunea care se executa este RETI sau o instructiune de acces la
registrele IEN0,IEN1,IP0 sau IP1
O cerere de intrerupere trebuie s ramina activa pina la deservirea ei, deoarece
intern nu se realizeaza memorarea acesteia .
La aceptarea unei ntreruperi si generarea hard a instructiunii LCALL se
salveaza automat n stiva continutul registrului PC (dar nu si PSW) i se ncarca n
PC adresa corespunzatoare rutinei de tratare a intreruperii . De asemenea unele
fanioane de intrerupere sunt resetate automat (hard) iar altele trebuie resetate prin
soft.
Revenirea din intrerupere se face prin instructiunea RETI, care informeaza
procesorul c subrutina de tratare a intreruperii a fost incheiata si reface continutul
registrului PC la valoarea de dinaintea acceptari ntreruperii (prin citirea a doi octeti
din stiva). Instructiunea RET reface doar continutul registrului PC.
3.6.3. Intreruperi externe
Sursele de ntreruperi externe pot fi programate sa fie active pe front sau pe
nivel prin setarea sau stergerea bitilor IT1 sau IT0 din registrul TCON.
Dac ITx=0 (x=0,1), ntreruperea externa x va genera o cerere de ntrerupere
pentru un nivel "0" logic la pinul /INTx. Cererea trebuie mentinuta pina la saltul n
subrutina de tratare si dezactivata inainte de revenirea din aceasta.
Dac ITx=1 ntreruperea externa x va fi acceptata pe frontul cazator al semnalului
de la pinul /INTx. In acest mod daca testarea succesiva a pinului /INTx gaseste, ntr65

CAP.3. MICROCONTROLERUL 80C552

un ciclu, nivel "1" logic iar in ciclul urmator "0" logic, fanionul IEx din registrul
TCON este setat. IEx este resetat automat la saltul n subrutina de tratare a
intreruperii.
3.6.4. Timpul de raspuns la o intrerupere externa
Semnalele /INT0 i /INT1 sunt memorate n bitii IE0 i IE1 in starea S5P2 a
fiecarui ciclu maina. Fanioanele de intrerupere sunt testate n urmatorul ciclu
masina i daca sunt ndeplinite conditiile de acceptare a intreruperii in urmatoarele
doua cicluri se executa instructiunea LCALL. Deci timpul minim de raspuns este de
trei ciclii masina (vezi figura 3.6.4_1). Timpul de raspuns crete dac apare una din
cele trei conditii prezentate la punctul 2. In cazul cel mai defavorabil cnd
instruciunea in executie este RETI ( 2 ciclii masina ) iar urmatoarea este MUL sau
DIV ( 4 ciclii masina ) se adauga un timp suplimentar de 5 ciclii masina. Astfel , in
cazul unei singure intreruperi n sistem, timpul maxim de rspuns este de 9 ciclii
main.
C1
S5P 2

Intreruperea
devine a ctiva

C2

C3

C4

C5

S6

Intreruperea
e ste me mo ra ta

Intreruperile
sunt testate

Exe cutie instructiune


LCALL

Subrutina de
intrerupere

Fig. 3.6.4_1. Timpul de raspuns la o intrerupere externa


Daca o intrerupere cu un nivel de prioritate superior devine activa inainte de
starea S5P2 a ciclului masina C3, atunci, in acord cu regulile prezentate, saltul in
subrutina de tratare a intreruperii se face in ciclurile C5 si C6, fara sa fie executata
nici o instructiune din subrutina cu nivel de prioritate scazut.

66