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
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
RST EW/
24
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
(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
(00 00H) 0
MEMO RIE DE DA TE
INTE RNA
MEMO RIE DE DA TE
EXTERNA
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
AC
F0
RS1
RS0
OV
28
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
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
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
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
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
1 octet
1 octet
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
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
33
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
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
34
C/T
M1
Timer T1
M0
GATE
C/T
Timer T0
M1
M0
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
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/
/12
C/T = 0
TL1
(8 biti)
C/T = 1
Pin T1
TR1
Intrerupere
Control
TH1
(8 biti)
Gate
TF1
Reincarcare
Pin INT1/
37
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
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
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
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 )
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
CTN0
CTP0
CTI0
42
RTE
TP47
TP46
RP45
RP44
RP43
RP42
unde: TP47 - daca este "1", P4.7 comuta daca coincid CM2 si T2
RP41
RP40
Ftimer
Fosc
12 2048
Fosc/12
Divizor
(11 biti)
Stergere
T3
(8 biti)
Depasire
Reset extern la pinul RST
Incarcare
Reset intern
Stergere bit
Pin
EW/
Scriere
T3
44
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
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>
// Variabile
unsigned contor, val_cap0;
sbit tact = P1 ^ 0;
47
// Initializeaza Timer 2
void InitTimer2(void)
{
TM2CON = 0x01;
CTCON = 0x01;
ECT0 = 1;
EA = 1;
}
// 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
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
FPWM
Fosc
2 (1 PWMP) 255
49
PWMP
Fosc
1
FPWM 2 255
ADC3
ADC4
ADC5
VREF-
STADC
ADC2
ANALOGIC
MULTIPLEXOR
ADC1
AVSS
AVDD
ADC0
VREF+
CONVERTOR ANALOG/NUMERIC
( 10 biti )
ADC6
ADC7
ADCON
MAGISTRALA INTERNA
50
ADCH
52
VDD
T
De pa sire
time r T3
Trigge r
Schmitt
P in RST
C ircuit
RESET
53
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
D0
D1
D2
D3
D4
Linie
inactiva
D5
D6
D7
Bit de
paritate
D8
STOP
START
55
SM1
SM2
REN
TB8
RB8
TI
RI
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
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
Master
Slave 1
01H
Slave 2
02H
Slave 3
03H
59
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
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
61
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
63
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
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
Subrutina de
intrerupere
66