CAP.3.
MICROCONTROLERUL 80C552
CAPITOLUL 3
MICROCONTROLERUL 80C552.
3.1. Arhitectura interna. Organizarea memoriei. Registre cu functii
speciale
3.1.1. Arhitectura interna
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 patru versiuni care difera prin memoria ROM
interna.
Structura interna a circuitului este prezentata in figura 3.1.1_1.
ADC0-7
AVR EF+
AVREF-
STADC
T0 T1 INT0/ I NT1/ V DD V SS PWM0/ P WM1/ 5 SDA SCL
AVDD
AVSS
3 3 3 3 1 1
XTA L1
XTA L2 T0, T1 MEMORIE CONVERTOR INTERFATA
UNITATE MEMORIE IESIRI
TIMER/ ANALOG SERIALA
DE DATE
NUMARATOR CENTRALA PROGRAM PWM
EA / 256 x 8 NUMERIC I2C
PE 16 BITI
A LE
80C51
P SEN/
WR/ MA GISTRA LA I NTERNA
3
RD/
3
A D0-7 PORTURI INTERFATA T2 T3
PORTURI SISTEM SISTEM
0 PARALELE SI SERIALA TIMER/
8 BITI CAPTURARE COMPARARE TIMER
MAGISTRALE UART NUMARATOR
A 8-15 WATCHDOG
EXTERNE 16 BITI
2
3 3 1 1 1 4
P 0 P1 P 2 P 3 TxD RxD P 5 P4 CT0I -C T3I T2 RT2 CMSR0 - C MSR5 RST EW/
C MT0, C MT1
0 FUNC TIE A LTERNA TI V A A PO RTULUI P0 3 FUNC TI E A LTERNA TI V A A P O RTULUI P 3
1 FUNC TIE A LTERNA TI V A A PO RTULUI P1 4 FUNC TI E A LTERNA TI V A A P O RTULUI P 4
2 FUNC TIE A LTERNA TI V A A PO RTULUI P2 5 FUNC TI E A LTERNA TI V A A P O RTULUI P 5
Fig. 3.1.1_1. Structura interna a microcontrolerului 8xC552
31
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 si unul
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 "watchdog"
- interfata seriala RS232
- interfata seriala I2C
- doua iesiri cu rezolutie pe 8 biti pentru semnale modulate in frecventa si
factor de umplere ( PWM )
- 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 XTAL: 1.2 la 24 MHz.
Microcontrolerul are spaţii 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 operaţiile de înmultire şi împartire;
- Program Counter - PC - numaratorul de program;
- Program Status Word - PSW - registrul PSW conţine 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 [Link]
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”
32
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, prin "strapare" la “0” logic. MP este de tip ROM ea putind
fi numai citita.
33
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 spaţiu de
64 de Kocteti.
(FFFFH) 64K (FFFFH) 64K
E XTERNA
(2000H) 8192
SPA TII SUPRA P USE
(1FFFH) 8191
(FFH) 255 REGIST RE
C U FUNC TII
INTERNA EXTERNA SPEC IA LE
(EA \ = 1) (E A \ = 0) (7FH) 127
RA M DE DA TE
INTE RN
(0000H) 0 (00H) 0 (0000H) 0
ME MO RIE PROGRA M MEMO RIE DE DA T E MEMO RIE DE DA TE
INTERNA EXTERNA
Fig. 3.1.2_1. Organizarea memoriei
MD interna ( figura 3.1.2_2 ) este impartita in trei zone distincte:
- zona de adrese 00H - 7FH (128 octeti "low") - poate fi adresata direct şi
indirect.
- zona de adrese 80H - FFH (128 octeti "high") - poate fi adresata numai
indirect prin registru.
- zona de adrese 80H - FFH (spatiul registrelor cu functii speciale ) - este
rezervata pentru SFR-uri (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 este la octetii 128 superiori sau la 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 P2).
Instructiile care folosesc adresare indirecta, acceseaza octetii 128 mai
semnificativi. De exemplu:
MOV @R0,data
34
CAP.3. MICROCONTROLERUL 80C552
unde R0 contine valoarea 0A0H acceseaza octetul de date la adresa 0A0H si nu
portul P2.
255
128 o cte ti Re gistre
Numai s uperiori cu functii Numa i
a dres are specia le a dres are
indirecta dire cta
128
127
48
127 120
128 de biti
adre sa bili
32 7 0
R7 Adres are
Banca 3 dire cta s au
24 R0
R7 indirecta
Banca 2
16 R0
Re gistre
R7
Banca 1
8 R0
R7
Banca 0
0 R0
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 SP este initializat la 07H.
- zona de lucru pentru procesorul boolean considerata ca memorie adresabila
pe bit de la 20H pînă la 2FH (128 de adrese de bit).
- zona de lucru generala de la 30H pina la 7FH.
PSW
CY AC F0 RS1 RS0 OV - P
unde: CY - fanionul “carry”; poate fi setat/ resetat hard sau soft
AC - fanion “carry” auxiliar ( pentru operatii BCD )
F0 - fanion ce poate fi definit de catre utilizator
RS1 RS0 - se folosesc la stabilirea grupei de registre folosita
0 0 - se selecteaza BANK 0
0 1 - se selecteaza BANK 1
35
CAP.3. MICROCONTROLERUL 80C552
1 0 - se selecteaza BANK 2
1 1 - se selecteaza BANK 3
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 în timp. In momentul în care pe liniile P0.0 - P0.7 se afla adrese (A0-
A7) 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 conţine 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 SFR includ porturile, numaratoarele, registre pentru controlul
interfetelor, etc. Acestea pot fi accesate doar prin adresare directa, adresele, care pot
fi atit de octet cit si de bit sunt cuprinse intre 80H si FFH.
Tabelul 3.1.3_1 prezinta registrele SFR .
Se observa ca nu toate adresele sunt ocupate. Adresele neocupate nu sunt
implementate, astfel incit citirea lor va returna valori aleatoare, iar scrierea lor nu va
avea nici un efect. De asemenea, 16 registre, 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.
36
CAP.3. MICROCONTROLERUL 80C552
Tabelul 3.1.3_1. Registre cu functii speciale ( SFR )
Simbol Adresa Adresa bit, simbol sau functia alternativa a portului Valoare la
MSB LSB RESET
ACC* E0H E7 E6 E5 E4 E3 E2 E1 E0 00H
ADCH C6H xxxxxxxxB
ADCON C5H ADC.1 ADC.0 ADEX ADCI ADCS AADR2 AADR1 AADR0 xx000000B
B* F0H F7 F6 F5 F4 F3 F2 F1 F0 00H
CTCON EBH CTN3 CTP3 CTN2 CTP2 CTN1 CTP1 CTN0 CTP0 00H
CTH3 CFH xxxxxxxxB
CTH2 CEH xxxxxxxxB
CTH1 CDH xxxxxxxxB
CTH0 CCH xxxxxxxxB
CMH2 CBH 00H
CMH1 CAH 00H
CMH0 C9H 00H
CTL3 AFH xxxxxxxxB
CTL2 AEH xxxxxxxxB
CTL1 ADH xxxxxxxxB
CTL0 ACH xxxxxxxxB
CML2 ABH 00H
CML1 AAH 00H
CML0 A9H 00H
DPH 83H 00H
DPL 82H 00H
IEN0* A8H EA EAD ES1 ES0 ET1 EX1 ET0 EX0 00H
IEN1* E8H ET2 ECM2 ECM1 ECM0 ECT3 ECT2 ECT1 ECT0 00H
IP0* B8H - PAD PS1 PS0 PT1 PX1 PT0 PX0 x0000000B
IP1* F8H PT2 PCM2 PCM1 PCM0 PCT3 PCT2 PCT1 PCT0 00H
P5 C4H ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0 xxxxxxxxB
P4 C0H CMT1 CMT0 CMSR5 CMSR4 CMSR3 CMSR2 CMSR1 CMSR0 FFH
P3* B0H RD/ WR/ T1 T0 INT1/ INT0/ TXD RXD FFH
P2* A0H A15 A14 A13 A12 A11 A10 A9 A8 FFH
P1* 90H SDA SCL RT2 T2 CT3I CT2I CT1I CT0I FFH
P0* 80H AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 FFH
PCON 87H SMOD - - WLE GF1 GF0 PD IDL 00xx0000B
PSW* D0H CY AC F0 RS1 RS0 OV F1 P 00H
PWMP FEH 00H
PWM1 FDH 00H
PWM0 FCH 00H
RTE EFH TP47 TP46 RP45 RP44 RP43 RP42 RP41 RP40 00H
SP 81H 07H
S0BUF 99H xxxxxxxxB
S0CON* 98H SM0 SM1 SM2 REN TB8 RB8 TI RI 00H
S1ADR DBH ----------------------------- ADRESA SLAVE ------------------------------ GC 00H
S1DAT DAH 00H
S1STA D9H SC4 SC3 SC2 SC1 SC0 0 0 0 F8H
S1CON* D8H CR2 ENS1 STA STO SI AA CR1 CR0 00H
STE EEH TG47 TG46 SP45 SP44 SP43 SP42 SP41 SP40 C0H
TH1 8DH 00H
TH0 8CH 00H
TL1 8BH 00H
TL0 8AH 00H
TMH2 EDH 00H
TML2 ECH 00H
TMOD 89H GATE C/T/ M1 M0 GATE C/T/ M1 M0 00H
TCON* 88H TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 00H
TM2CON EAH T2IS1 T2IS0 T2ER T2B0 T2P1 T2P0 T2MS1 T2MS0 00H
TM2IR* C8H T2OV CMI2 CMI1 CMI0 CTI3 CTI2 CTI1 CTI0 00H
T3 FFH 00H
unde :
* - registrul SFR este adresabil pe bit.
37
CAP.3. MICROCONTROLERUL 80C552
REZUMAT
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.
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 si unul
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 "watchdog"
- interfata seriala RS232
- interfata seriala I2C
- doua iesiri pentru semnale cu frecventa si factor de umplere programabil
( PWM )
- 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 XTAL: 1.2 la 24 MHz.
Microcontrolerul 80C552 are spatiul de adrese separat pentru memoria
program ( MP ) si pentru memoria de date ( MD ).
MP este de 64 Kocteti, intreg spatiul fiind extern circuitului, situatie in care
pinul EA/ este conectat, prin "strapare" la “0” logic. MP este de tip ROM ea putind
fi numai citita.
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 spaţiu de
64 de Kocteti.
MD interna este impartita in trei zone distincte:
- zona de adrese 00H - 7FH (128 octeti "low") - poate fi adresata direct şi
indirect.
- zona de adrese 80H - FFH (128 octeti "high") - poate fi adresata numai
indirect prin registru.
- zona de adrese 80H - FFH (spatiul registrelor cu functii speciale ) - este
rezervata pentru SFR-uri (porturi, PSW-ul, timere, SP-ul, acumulator etc.), si poate
fi adresata numai direct.
38
CAP.3. MICROCONTROLERUL 80C552
Ultimele doua zone, desi au aceeasi adresa, sunt separate fizic.
Registrele SFR includ porturile, numaratoarele, registre pentru controlul
perifericelor, etc. Pot fi accesate doar prin adresare directa. In spatiul SFR exista 16
registre a caror biti sunt adresabili individual. Adresele care pot fi atit de octet cit si
de bit sunt cele cuprinse intre 80H si FFH.
INTREBARI
1. Care sunt elementele din structura microcontrolerului 80C552 ?
2. Cum este organizata memoria externa a microcontrolerului ?
3. Cum este organizata memoria interna a microcontrolerului ?
4. Cum se face diferenta intre cele 2 spatii de memorie suprapuse intre adresele
80H si FFH ?
5. Care este magistrala de adrese, respectiv de date a microcontrolerului ?
6. Cum se face adresarea memoriei program ?
7. Cum se face adresarea memoriei de date ?
8. Ce reprezinta registrele cu functii speciale ( SFR ) ?
39
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 multe persoane.
Modulele pot fi scrise in “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
[Link]. Tipuri de date
Compilatorul C51 suporta urmatoarele tipuri de date :
Tipul Marime Valori
bit 1 bit 0 sau 1
signed char 1 octet -128 la +127
unsigned char 1 octet 0 la 255
signed int 2 octeti -32768 la +32767
unsigned int 2 octeti 0 la 65535
signed long 4 octeti -2147483648 la
+2147483647
unsigned long 4 octeti 0 la 4294967295
float 4 octeti +/-1,176E-38 la
+/-3,40E+38
pointer 1-3 octeti adresa obiectului
40
CAP.3. MICROCONTROLERUL 80C552
Exista si alte trei tipuri speciale de date pentru simplificarea accesului la
registrele SFR :
Tipul Marime Valori
sbit 1 bit 0 sau 1
sfr 1 octet 0 la 255
sfr16 2 octeti 0 la 65535
De exemplu directiva : “ sfr P0 = 0x80; “ defineste variabila P0 pentru portul 0 (
adresa 0x80 ).
Tipul este automat convertit cind rezultatul implica un alt tip de data.
[Link]. 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 utilizate in program in memoria interna.
Tipul Descriere
data memoria interna adresabila direct ( 128 octeti “low” ); permite
accesul cel mai rapid pentru o variabila
bdata memoria interna adresabila pe bit ( 16 octeti ); permite accesul
pe bit sau pe octet
idata memoria interna adresabila indirect ( 256 octeti ); permite
accesul la toata memoria interna
pdata prima “pagina” din memoria externa de date ( 256 octeti );
accesul se face cu instructia MOVX @Ri
xdata memoria externa de date ( 64 Kocteti ); accesul se face cu
instructia MOVX @DPTR
code memoria program( 64 Kocteti ); accesul se face cu instructia
MOVC @A+DPTR
Urmatoarele exemple arata utilizarea tipurilor de memorie la declaratiile de
variabile:
char data var1;
char code text[] = “ ENTER PARAMETER : “;
static unsigned long xdata array [100];
extern float idata x, y,z;
41
CAP.3. MICROCONTROLERUL 80C552
extern unsigned int pdata dimension;
unsigned char xdata vector [10][4][4];
sfr P0 = 0x80;
sbit RI = 0x98;
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 ).
[Link]. 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 Descriere
SMALL zona memoriei de date interne ( tipul DATA - max. 120 octeti )
COMPACT prima “pagina” din memoria de date externa ( tipul PDATA - max.
120 octeti )
LARGE zona memoriei de date externa ( tipul XDATA - max. 64 Kocteti )
[Link]. Pointeri
Compilatorul permite declararea a doua tipuri de pointeri : “specifici” unei
zone de memorie sau “generici”, adica valabili in orice zona de memorie.
Declaratie Marime Descriere
float *p; 3 octeti pointeaza un obiect “float” in orice zona de
memorie ( pointer generic )
char data *dp 1 octet pointeaza un obiect “char” din zona “data”
char data *data dp 1 octet pointeaza un obiect “char” din zona “data”,
pointerul fiind definit tot in zona “data”
int idata *ip 1 octet pointeaza un obiect “int” din zona “idata”
long pdata *pp 1 octet pointeaza un obiect “long” din zona “pdata”
char xdata *xp 2 octeti pointeaza un obiect “char” din zona “xdata”
int code *cp 2 octeti pointeaza un obiect “int” din zona “code” (
memoria program )
42
CAP.3. MICROCONTROLERUL 80C552
[Link]. 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 :
Timer0 () interrupt 1 using 2
{ ……}
Intreruperea pentru Timer 0 are numarul 1 in tabelul intreruperilor, iar “using 2”
solicita utilizarea setului ( “banca”) 3 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
[Link]. 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
unde:
Prefix Semnificatie
- Aliniere in stinga
# Prefixul # utilizat cu tipurile o (octal), x, X (hexazecimal) determina
43
CAP.3. MICROCONTROLERUL 80C552
afisarea numereleor cu prefixul 0, 0x sau 0X
+ Se afiseaza + sau – pentru valoarea numerica daca tipul de data este
cu semn (“signed”)
b, B Se utilizeaza cu tipurile d, i, o, u, x sau X si se refera la tipul de
variabila “unsigned char”; de exemplu %bu, %bx
l, L 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 Tipul Semnificatie
d int Numar zecimal cu semn
u unsigned int Numar zecimal fara semn
o unsigned int Numar octal fara semn
x, X unsigned int Numar hexazecimal fara semn
f float Numar real in forma [-][Link]
e, E float Numar real in forma [-][Link][semn]dd
c char Caracter
s pointer la sir 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 );
44
CAP.3. MICROCONTROLERUL 80C552
REZUMAT
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 multe persoane.
Modulele pot fi scrise in “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.
Compilatorul C51 suporta noua tipuri de date : bit, signed char, unsigned char,
signed int, unsigned int, signed long, unsigned long, float si pointer.
Exista si alte trei tipuri speciale de date pentru simplificarea accesului la
registrele SFR : sbit, sfr, sfr16.
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.
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 ). Sunt disponibile trei tipuri de memorie : SMALL,
COMPACT si LARGE.
Compilatorul permite declararea a doua tipuri de pointeri : “specifici” unei
zone de memorie sau “generici”, adica valabili in orice zona de memorie.
Se poate declara atit tipul obiectului punctat, cit si tipul variabilei pointer.
Compilatorul C51 permite declararea simpla a unei rutine de intrerupere prin
precizarea atributului “ interrupt n “ ( cu “n” intre 0 si 31 ) la definirea functiei.
45
CAP.3. MICROCONTROLERUL 80C552
Optional poate fi folosit si atributul “ using i “ ( cu “i” intre 0 si 3 ) care permite
alegerea setului de registre dorit ( R0-R7 ).
Exemplu :
Timer0 () interrupt 1 using 2
{ ……}
Intreruperea pentru Timer 0 are numarul 1 in tabelul intreruperilor, iar “using 2”
solicita utilizarea setului ( “banca”) 3 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
INTREBARI
1. Care sunt programele utilitare folosite pentru dezvoltarea unei aplicatii cu
microcontroler ?
2. Care tipuri de date sunt acceptate de compilatorul C51 ?
3. Care sunt zonele de memorie unde pot fi plasate variabilele programului ?
4. Cum se definesc variabilele de tip pointer ?
5. Cum se defineste o functie de intrerupere in limbaj C pentru microcontroler ?
46
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 control, de
8 biti, Timer 3 - T3 .
In principiu, un numarator/temporizator pentru microcontrolerul 8xC552 este
format dintr-un registru de numarare (pe 8 sau 16 biti) care se incrementeaza la
fiecare impuls de actionare extern sau intern (ciclu masina).
In momentul depasirii capacitatii registrului de numarare, se seteaza un fanion de
intrerupere, se genereaza o intrerupere ( daca intreruperile sunt validate) si se face un
salt in rutina de tratare a intreruperii.
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.
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
Resursele hard ale T0, respectiv T1, sunt urmatoarele:
2 registre de numarare pe 8 biti, TL0 si TH0 (pentru T0), respectiv TL1 si
TH1 (pentru T1), care pot fi utilizate concatenate, pentru a obtine un
registru pe 16 biti
1 registru pe 8 biti pentru programarea modului de lucru, TMOD (“Timer
MODe”) - fig.3.3.2_1
1 registru pe 8 biti pentru control, TCON (“Timer CONtrol”) - fig.3.3.2_2
Registrul TMOD este comun ambelor timere; cei patru biti mai semnificativi
programeaza T1, iar ceilalti T0.
Bitii M0, M1 selecteaza unul din cele patru moduri de operare. Modurile 0,1 şi 2 sunt
identice pentru ambele timere, iar modul 3 este diferit.
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).
47
CAP.3. MICROCONTROLERUL 80C552
TMOD Timer T1 Timer T0
GATE C/T M1 M0 GATE C/T M1 M0
unde :
GATE - daca GATE=1 si bitul de control TRx = 1 (x=0,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 - stabilesc 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
unde:
TF1 - setat hard la depasire capacitate T1 ; resetat hard la saltul in rutina de
tratare intrerupere
TR1 - setat/resetat prin program pentru a porni/opri procesul de numarare
pentru T1
TF0 - setat hard la depasire capacitate T0 ; resetat hard la saltul in rutina de
tratare intrerupere
TR0 - setat/resetat prin program pentru a porni/opri procesul de numarare
pentru T0
Fig. 3.3.2_2. Structura registrului TCON
Modul 0
Modul 0, prezentat in figura 3.3.2_3 (pentru Timer 1), este un
numarator/temporizator pe 13 biti, 8 biti ai registrului TH1 plus cei mai putin
semnificativi 5 biti ai registrului TL1 (ceilalti 3 biti fiind neutilizati).
48
CAP.3. MICROCONTROLERUL 80C552
Figura 3.3.2_3 ilustreaza un principiu de functionare si nu este o schema electrica
propriu-zisa.
Se observa ca cele doua regimuri de functionare sunt stabilite prin bitul C/T :
temporizator – se numara frecventa de tact divizata cu 12 (Fosc/12)
numarator – se numara semnalul logic extern de la pinul T1
Impulsurile de numarare (interne sau externe) ajung la registrul de numarare (TH1
+ TL1) doar daca Control = 1 (fapt sugerat prin inchiderea comutatorului).
Functia logica realizata de bitii TR1,Gate si semnalul extern de la pinul INT1 este:
Control = TR1 and (not Gate or INT1)
Daca alegem :
Gate = 0 => Control = TR1; astfel, Control = 1 daca bitul TR1 = 1,
ceea ce inseamna un control exclusiv soft
Gate = 1 => Control = TR1 and INT1; astfel, daca TR1 = 1, Control
depinde exclusiv de semnalul extern la pinul INT1, ceea ce inseamna un
control prin hard
La depasirea capacitatii registrului de numarare (TH1 + TL1) se seteaza bitul
(fanionul) de intrerupere TF1 si se genereaza o intrerupere (daca sistemul de
intreruperi a fost validat in prealabil)
Fosc /12 C/T = 0
TH1 TL1 TF1
(8 biti) (5 biti)
Pin T1 C/T = 1 Intrerupere
Control
TR1
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 modului 0 cu diferenta că registrul de
numarare este pe 16 biti.
49
CAP.3. MICROCONTROLERUL 80C552
Modul 2
In modul 2, prezentat in figura 3.3.2_4 (pentru Timer 1), registrul de numarare
este configurat pe 8 biti (TL1) cu incarcare automata din registrul TH1. Astfel, la
depasirea capacitatii registrului TL1, se setează fanionul de întrerupere TF1 din
TCON si se incarca TL1 cu continutul lui TH1 (TH1 trebuie incarcat in prealabil prin
program).
Fosc /12 C/T = 0
TL1 TF1
(8 biti)
Pin T1 C/T = 1 Intrerupere
Control
TR1
TH1
Gate
(8 biti)
Reincarcare
Pin INT1/
Fig. 3.3.2_4. Modul 2 : Numarator / temporizator pe 8 biti cu reincarcare
Modul 3
In modul 3, prezentat în figura 3.3.2_5 , T0 este configurat in doua
numaratoare / temporizatoare separate pe 8 biti.
Fosc /12 C/T = 0
TL0 TF0
(8 biti)
Pin T0 C/T = 1 Intrerupere
Control
TR0
Gate
Pin INT0/
Fosc /12 TH0 TF1
(8 biti)
Intrerupere
TR1 Control
Fig. 3.3.2_5. Modul 3 pentru T0 : Doua numaratoare / temporizatoare pe 8 biti
50
CAP.3. MICROCONTROLERUL 80C552
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).
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).
Modul de operare 3 este prevazut pentru aplicatii care necesita un numarator
suplimentar de 8 biti.
3.3.3. Timer 2 ( T2 )
Timer 2 este un numarator/temporizator pe 16 biti cu facilităti de "capturare"
si "comparare". Schema bloc este prezentata în figura 3.3.3_2.
Cele trei functionalitati vor fi detaliate in continuare.
Numarator / temporizator pe 16 biti
Resursele hard sunt urmatoarele:
un registru de numarare pe 16 biti – T2
un divizor de frecventa pe 3 biti – Divizor (vezi figura)
un registru general de control TM2CON – figura 3.3.3_1.
un registru cu fanioane de intreruperi TM2IR – figura 3.3.3_4.
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 factorul de divizare;
0 0 - factor de divizare 1 1 0 - factor de divizare 4
0 1 - factor de divizare 2 1 1 - factor de divizare 8
T2MS1 T2MS0 - selectare mod de lucru pentru T2;
0 0 - T2 este oprit;
0 1 - se foloseste tact intern - fosc /12;
1 0 - mod test ( nu se foloseste deocamdata )
1 1 - semnalul de tact este extern la pinul T2;
Fig. 3.3.3_1. Structura registru TM2CON pentru controlul T2
51
CAP.3. MICROCONTROLERUL 80C552
CT0I INT CT0I INT CT0I INT CT3I INT
Se mna l Se mna l Se mna l Se mna l
extern Bit extern Bit extern Bit extern Bit
C TI0 C TI0 C TI0 C TI3
CT0 CT1 CT2 CT3
( 16 Biti ) ( 16 Biti ) ( 16 Biti ) ( 16 Biti )
Off
T2 Intre rupere depasire capacita te 8 biti
Fosc 1/12 Divizor
( 16 Biti ) Intre rupere depasire capacita te 16 biti
P in T2
P in RT2
Bit T2ER
Valida re RESET extern COMP COMP COMP
INT INT INT
S R P4.0
S R P4.0 CM0(S) CM1(R) CM2(B)
S R P4.2 ( 16 Biti ) ( 16 Biti ) ( 16 Biti )
S R P4.3
S R P4.4
S = Se ta re ( pune re pe "1" )
S R P4.5
R = Re setare ( pune re pe "0" )
BS B P4.6
B = Ba sculare
BS B P4.7
BS = Bascula re sta re
STE RTE
Fig. 3.3.3_2. Schema bloc pentru Timer 2
Intrarea de numarare a registrului T2 este legata la un divizor de frecvenţa 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 ) :
frecvenţa de tact divizata cu 12 - Fosc/12
frontul pozitiv al semnalului de la intrarea ( pinul ) T2
blocare numarare ( pozitia "off" )
Tranzitia pozitiva la pinul T2 este recunoscuta într-un singur ciclu masina,
avind deci o rata de esantionare dubla fata de T0 şi T1. Registrul T2 este incrementat
în al doilea ciclu masina dupa cel în care s-a detectat tranzitia.
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 ).
Divizorul este resetat daca se reprogrameaza factorul de divizare, daca sursa de
intrare este schimbata sau dacă Timer 2 este resetat.
52
CAP.3. MICROCONTROLERUL 80C552
Timer 2 nu poate fi incarcat prin program, dar poate fi citit în timpul
numararii. Deoarece nu exista registre de citire, trebuie luate precautii soft privind
interpretarea eronata ce ar putea apare din cauza depasirii de capacitate de la octetul
mai puţin semnificativ spre cel mai semnificativ în timpul operatiei de citire.
Sistemul de capturare
Contine 4 canale de capturare identice si independente si un registru de
programare al frontului activ de capturare, CTCON.
Resursele hard ale unui canal (de exemplu canalul 0), sunt urmatoarele:
un registru de capturare pe 16 biti – CT0
un pin de intrare pentru un semnal extern – CT0I
un fanion de intrerupere – CTI0
In figura 3.3.3_3 se prezinta registrul CTCON iar in figura 3.3.3_4 registrul
TM2IR.
Registrul T2 este conectat la patru registre de capturare pe 16 biti : CT0, CT1,
CT2 şi CT3. La recepţia semnalelor de intrare CT0I, CT1I, CT2I sau CT3I,
registrele de capturare corespunzatoare sunt incarcate cu continutul curent al
registrului T2 si se genereaza o cerere de intrerupere corespunzatoare prin setarea
bitilor CTI0, CTI1, CTI2 sau CTI3 din registrul TM2IR.
Semnalele de intrare pot determina capturarea şi genera cererea de intrerupere pe
front pozitiv, negativ sau pe ambele fronturi prin programarea 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 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 CTN0 CTP0
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)
Fig. 3.3.3_3. Structura registru CTCON
53
CAP.3. MICROCONTROLERUL 80C552
TM2IR
T20V CMI2 CMI1 CMI0 CTI3 CTI2 CTI1 CTI0
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
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
Resursele hard sunt urmatoarele:
trei canale de comparare formate din cite un registru pe 16 biti, CM0, CM1,
respectiv CM2 si un fanion de intrerupere pentru fiecare canal
doua registre de control, STE si RTE
In figura 3.3.3_5 se prezinta registrul STE iar in figura 3.3.3_6 registrul RTE.
Continutul registrelor CM0, CM1 sau CM2 este permanent comparat cu
continutul registrului T2 şi, la coincidenta, se genereaza cereri de întrerupere
corespunzatoare pe bitii CMI0, CMI1 sau CMI2 din registrul TM2IR, astfel:
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 latch-urile 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
54
CAP.3. MICROCONTROLERUL 80C552
setare si resetare determinate de sistemul de comparare, sunt prioritare, daca apar in
acelasi ciclu masina.
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
RTE
TP47 TP46 RP45 RP44 RP43 RP42 RP41 RP40
unde: TP47 - daca este "1", P4.7 comuta daca coincid CM2 si T2
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 puţin semnificativ din T2 ) prin bitul T2BO ( TM2CON.4 ) si/sau la
55
CAP.3. MICROCONTROLERUL 80C552
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.
Divizor T3 Depasire
Fosc/12 (11 biti) (8 biti) Reset extern la pinul RST
Stergere Incarcare
Reset intern
Stergere bit
Pin
EW/
Scriere
Fig. 3.3.4_1. Schema bloc pentru Timer 3
Frecventa cu care este incrementat T3 rezulta din formula:
fOSC
ftimer = ----------------
12 * 2048
La depasirea capacitatii registrului T3, microcontrolerul este resetat si este
generat si un impuls la pinul RST. Pentru a preveni acest lucru, registrul 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.
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.
56
CAP.3. MICROCONTROLERUL 80C552
In principiu, un program care utilizeaza un timer trebuie sa cuprinda o functie
de initializare a timerului si o functie de intrerupere ( daca se lucreaza pe 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
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
57
CAP.3. MICROCONTROLERUL 80C552
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.
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; // contor pentru impulsuri
sbit tact = P3 ^ 4; // simulare semnal extern
// ....................................
// Initializeaza Timer 0
void InitTimer0(void)
{
TMOD = TMOD | 0x05; // modul 1(16 biti), numarator, control soft
TL0 = 0xFF; TH0 = 0xFF; // valoarea de incarcare maxima
ET0 = 1; // validare intrerupere Timer 0
TR0 = 1; // porneste Timer 0
58
CAP.3. MICROCONTROLERUL 80C552
EA = 1; // 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;
tact = 1;
InitTimer0();
while( 1 ) {
// Simulare semnal extern
tact = 0; // front negativ
lcd_Write( 2, "0" );
Delay( 1000 );
tact = 1; // front pozitiv
lcd_Write( 2, "1" );
Delay( 1000 );
}
}
// ....................................
// end
Problema:
Se cere sa se utilizeze Timer 0 pentru a genera pe pinul 0 al portului P1 un semnal
logic cu perioada de 2ms si factor de umplere 1/2. Frecventa de tact este 12MHz.
Solutie:
59
CAP.3. MICROCONTROLERUL 80C552
Problema se poate rezolva programind Timer 0 ca si temporizator pentru 1ms.
Astfel, la fiecare milisecunda, procesorul executa functia de tratare a intreruperii in
care se comuta nivelul logic la portul P1.
Timer 0 ca si temporizator numara cicluri masina (Fosc/12). Frecventa de
incrementare Fi (perioada Ti) a registrului de numarare (RN) este:
Fi = Fosc/12 = 1MHz Ti = 1us
Pentru a obtine o intrerupere la fiecare milisecunda, RN trebuie incarcat cu o
valoare de incarcare (VI) mai mica cu 1000 decit valoarea maxima (VM) + 1:
1000 * 1us = 1000us = 1ms
VI = (VM + 1) – 1000 = 65536 – 1000 = 64536 (0xFC18)
// Programul foloseste Timer 0 in mod 1 ca temporizator
#include <reg552.h>
#include <..\..\lib\ap_lib.h>
// Variabile
sbit P1.0 = P1 ^ 0; // bitul de port care se comuta
// ....................................
// Initializeaza Timer 0
void InitTimer0(void)
{
TMOD = TMOD | 0x01; // modul 1(16 biti), temporizator, control soft
TL0 = 0x18; TH0 = 0xFC; // valoarea de incarcare
ET0 = 1; // validare intrerupere Timer 0
TR0 = 1; // porneste Timer 0
EA = 1; // autorizeaza global intreruperile
}
// Rutina de intrerupere pentru Timer0
Timer0() interrupt 1
{
// Reincarca valoarea
TL0 = 0x18; TH0 = 0xFC;
P1.0 = ~P1.0 // comutare nivel logic
}
void main(void)
{
InitTimer0();
60
CAP.3. MICROCONTROLERUL 80C552
while( 1 );
}
// ....................................
// end
Problema:
Se cere sa se utilizeze sistemul de capturare al Timer 2 pentru a numara impulsuri
externe. La fiecare impuls se salveaza intr-o variabila si valoarea “capturata” in
registrele canalului (valoarea curenta a T2 la momentul frontului activ)
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
unsigned char buffer1[ 6 ] = "00000"; // pentru valoarea capturata
// Variabile
unsigned contor, val_cap0;
sbit tact = P1 ^ 0;
// Initializeaza Timer 2
void InitTimer2(void)
{
TM2CON = 0x01; // Timer 2 temporizator, factor divizare 1
CTCON = 0x01; // front activ pozitiv pe canal 0
ECT0 = 1; // validare intrerupere canal 0
EA = 1; // autorizeaza global intreruperile
}
61
CAP.3. MICROCONTROLERUL 80C552
//Rutina de intrerupere pentru Capture 0
Capture0() interrupt 6
{
CTI0 = 0; // fanion de intrerupere
contor++; // incrementeaza contor
// valoarea capturata asamblata intr-o variabila
val_cap0 = CTL0 + ((unsigned)CTH0 << 8 );
// Afiseaza contor
sprintf( buffer, "%u", contor );
lcd_WriteString( 1, 1, buffer );
// Afiseaza valoarea capturata
sprintf( buffer1, "%u", val_cap0 );
lcd_WriteString( 1, 8, buffer1);
}
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; // front pozitiv
lcd_Write( 2, "1" );
Delay( 1000 );
}
}
// ....................................
// end
62
CAP.3. MICROCONTROLERUL 80C552
REZUMAT
Microcontrolerul 80C552 contine trei registre numaratoare/temporizatoare de
16 biti denumite Timer 0 - T0 , Timer 1 - T1, Timer 2 - T2 şi un temporizator de
control pe 8 biti, Timer 3 - T3 . Registrele pe 16 biti pot fi adresate şi pe 8 biti THx
(octetul mai semnificativ) şi TLx (octetul mai putin semnificativ).
In modul de lucru numarator ("counter"), continutul registrului este
incrementat la fiecare tranzitie din "1" în "0" a semnalului de intrare.
In modul de lucru temporizator ("timer"), continutul registrului este
incrementat la fiecare ciclu masina executat.
Timer 0 si Timer 1
Timer 0 si Timer 1 utilizeaza pentru control registrele TMOD si TCON si pot
fi programate patru moduri de operare. Modurile 0,1 şi 2 sunt identice pentru ambele
timere, iar modul 3 este diferit.
Modul 0 este un numarator/temporizator pe 13 biti ( 8 biti ai registrului THx
plus cei mai putini semnificativi 5 biti ai registrului TLx, ceilalti biti sunt ignorati ).
Modul 1 este similar cu modul 0 cu diferenta că registrele sunt pe 16 biti .
Modul 2 este un numarator/temporizator pe 8 biti ( TLx ) cu incarcare
automata din registrul THx.
In modul 3, T0 este configurat in doua numaratoare / temporizatoare separate
pe 8 biti TH0 si TL0. Timerul TH0 poate fi utilizat numai ca temporizator.
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 RS232 ).
Modul de operare 3 este prevazut pentru aplicatii care necesita un numarator
suplimentar de 8 biti.
Timer 2
Timer 2 este un numarator/temporizator pe 16 biti cu facilităti de "capturare"
si "comparare".
Intrarea de numarare a lui T2 este legata la un divizor de frecvenţa pe 3 biti,
cu factor de divizare programabil la 1,2,4 sau 8 actionat la rindul sau din trei surse
posibile.
Sistemul de capturare
Registrul T2 este conectat la patru registre de capturare pe 16 biti. La recepţia
semnalelor de intrare, registrele de capturare corespunzatoare sunt incarcate cu
continutul curent al registrului T2 si se genereaza o cerere de intrerupere
63
CAP.3. MICROCONTROLERUL 80C552
corespunzatoare prin setarea fanioanelor de intrerupere. Semnalele de intrare pot
determina capturarea şi genera cererea de intrerupere pe front pozitiv, negativ sau pe
ambele fronturi prin setarea bitilor corespunzatori din registrul de control CTCON.
Sistemul de capturare poate fi folosit, de exemplu, la masurarea duratei unor
impulsuri sau a frecventei acestora.
Sistemul de comparare
Continutul registrelor CM0, CM1 sau CM2 este permanent comparat cu
continutul lui T2 şi la coincidenta se genereaza cereri de întrerupere corespunzatoare
prin setarea fanioanelor de intrerupere.
Intreruperi
Se poate genera o cerere de întrerupere la depasire capacitate registru pe 8 biti
( octetul mai puţin semnificativ din T2 ) si/sau la depasire capacitate registru pe 16
biti ( T2 ). Ambele intreruperi au acelasi vector de adresa. Toate fanioanele de
intrerupere asociate lui T2 trebuie resetate prin program.
Timer 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 ).
La depasirea capacitatii registrului T3, microcontrolerul este resetat si este
generat si un impuls la pinul RESET. Pentru a preveni 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.
INTREBARI
1. Care este structura sistemului de numarare/temporizare al microcontrolerului ?
2. Care este deosebirea intre notiunile de numarator si temporizator ?
3. Care sunt modurile de lucru pentru T0 si T1. Ce reprezinta modurile 0 si 1 ?
4. Cum functioneaza microcontrolerul in modurile 2 si 3 ?
5. Cum functioneaza subsistemele de numarare/temporizare, capturare si
comparare ale T2 ?
6. Care este rolul unui timer de tip “watchdog” intr-un sistem cu microcontroler ?
64
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 80C552 contine doua canale ( iesiri ) pe care se pot genera
impulsuri cu frecventa si factor de umplere programat ( “pulse width modulation
outputs” ). Schema bloc este prezentata in figura 3.4.1_1
P W M0
C ompa ra to r Bufe r
P W M0/
Magistrala interna
Numa ra to r
1/12 Divizo r
( 8 biti )
P W MP
Fos c
. Compa ra to r Bufe r
P W M1/
P W M1
Fig. 3.4.1_1. Schema bloc pentru iesiri PWM
Resursele hard sunt urmatoarele:
Registrul PWMP pe 8 biti, comun ambelor canale, cu rol de divizor de
frecventa
un registru de numarare pe 8 biti
pentru fiecare canal, un registru asociat PWM0, respectiv PWM1, un
comparator pe 8 biti si un bufer pentru formarea semnalelor de iesire
Frecventa de tact (Fosc) divizata succesiv cu 12 si cu registru PWMP
actioneaza numaratorul comun celor doua canale care numara modulo 255 ( deci
intre 0 si 254 inclusiv ).
Valoarea acestuia este comparata permanent cu continutul celor doua registre
PWM0 si PWM1; daca continutul registrului este mai mare decit continutul
numaratorului iesirea corespunzatoare a canalului 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
65
CAP.3. MICROCONTROLERUL 80C552
programabil in incrementi de 1/255. Frecventa semnalelor obtinute la cele doua iesiri
este data de relatia:
fOSC
fPWM =
2 * ( 1+PWMP ) * 255
iar valoarea PWMP pentru o frecventa dorita fPWM este:
fOSC
PWMP = -1
fPWM * 2 * 255
De exemplu, pentru frecventa de oscilatie de 12MHz rezulta fPWM intre 92 Hz si 23,5
KHz.
Asa cum am mentionat, 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
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.
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 trebuie setat, prin program, bitul ADCS ( ADCON.3 ), iar logica interna
asigura ca acest bit sa ramina pe “1” atit timp cit se executa conversia. La sfirsitul
acesteia, ADCS este resetat iar fanionul de intrerupere ADCI, setat. ADCS nu poate
fi sters iar ADCI setat prin program ( ci numai prin hard ).
66
CAP.3. MICROCONTROLERUL 80C552
ADC0
VREF+
STADC
VREF-
AVDD
AVSS
ADC1
MULTIPLEXOR
ADC2
ANALOGIC
ADC3
C ONVERTOR ANALOG/NUMERIC
ADC4
( 10 biti )
ADC5
ADC6
ADC7
ADCON 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 ADCH
MAGISTRALA INTERNA
Fig. 3.4.2_1. Schema bloc convertor analog - numeric
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 conversiei 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 ).
67
CAP.3. MICROCONTROLERUL 80C552
Startul pentru o noua conversie 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.
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
68
CAP.3. MICROCONTROLERUL 80C552
generat de T3 ( 3 cicluri masina ) va activa trazistorul de “pull – up” care “trage” la
“1” logic linia RST.
Dupa reset, registrele SFR iau valori bine determinate, iar continutul RAM-ului
intern nu este afectat.
VDD
T
De pa sire
time r T3
Trigge r
Schmitt
C ircuit
P in RST
RESET
Fig. 3.4.3_1. Circuitul pentru RESET
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. 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.
69
CAP.3. MICROCONTROLERUL 80C552
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.
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
70
CAP.3. MICROCONTROLERUL 80C552
REZUMAT
Iesiri PWM
Microcontrolerul 80C552 contine doua canale ( iesiri ) pe care se pot genera
impulsuri cu frecventa si factor de umplere programat (“pulse width modulation
outputs”).
Frecventa de tact (Fosc) divizata succesiv cu 12 si cu registru PWMP
actioneaza numaratorul comun celor doua canale care numara modulo 255 (deci intre
0 si 254 inclusiv ).
Valoarea acestuia este comparata permanent cu continutul celor doua registre
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.
Daca registrele PWMi se incarca cu 00H sau FFH iesirile PWMi pot fi
mentinute la un nivel constant de “1” respectiv “0”.
Bloc conversie analog - numerica
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.
Startul pentru o conversie analog - numerica se poate face extern, de la pinul
STADC, sau intern, prin program. In ambele cazuri trebuie setat, prin program, bitul
ADCS ( ADCON.3 ), iar logica interna asigura ca acest bit sa ramina pe “1” atit timp
cit se executa conversia. La sfirsitul acesteia, ADCS este resetat iar fanionul de
intrerupere ADCI, setat. ADCS nu poate fi sters iar ADCI setat prin program ( ci
numai prin hard ).
Rezultatul conversiei este memorat in registrul ADCH (8 biti mai semnificativi
) iar ceilalti doi in registrul ADCON ( biti 6 si 7 ). Startul pentru o noua conversie se
poate face numai dupa ce rezultatul celei curente a fost citit si bitul ADCI a fost
resetat prin program.
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:
71
CAP.3. MICROCONTROLERUL 80C552
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
. 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.
Modurile Idle si Power down
80C552 dispune de doua moduri speciale de reducere a puterii consumate, Idle
si Power down .
Modul Idle 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
prin reset hard extern sau prin reset intern cauzat de depasirea capacitatii lui T3.
Modul Power down 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.
INTREBARI
1. Cum functioneaza in principiu un canal PWM ?
2. Cum se poate controla frecventa si factorul de umplere al semnalelor generate ?
3. Care sunt etapele unei conversii analog-numerice ?
4. Cum se poate aplica semnalul de tact ?
5. Ce rol are circuitul de RESET ?
6. Prin ce se caracterizeaza fiecare din modurile de reducere a puterii consumate ?
72
CAP.3. MICROCONTROLERUL 80C552
3.5. Interfata seriala UART a microcontrolerului 80C552
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.
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.
START
D0 D1 D2 D3 D4 D5 D6 D7 D8
STOP
Linie Bit de
inactiva paritate
Fig. 3.5.1_1. Structura unui caracter in mod asincron
73
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 SM1 SM2 REN TB8 RB8 TI RI
unde: SM0 SM1 - Specifica modul de lucru al interfetei seriale
0 0 - modul 0 ; rata fosc/12
0 1 - modul 1 ; rata variabila
74
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 biţi 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 biţi 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.
75
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
76
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 Slave 2 Slave 3
01H 02H 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.
77
CAP.3. MICROCONTROLERUL 80C552
Î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.
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
Timer T1
Rata de Frecventa de SMOD bit C / T Mod de Valoare de
transfer tact ( PCON.7 ) lucru incarcare
19,2K 11,0592MHz 1 0 2 FDH
9,6K 11,0592MHz 0 0 2 FDH
4,8K 11,0592MHz 0 0 2 FAH
2,4K 11,0592MHz 0 0 2 F4H
Problema:
Se cere sa se receptioneze, pe linia seriala, cite un octet (caracter ASCII), sa se
afiseze pe LCD si sa se transmita inapoi. Frecventa de tact este de 12MHz.
Alegem modul 3 de programare al interfetei seriale cu o rata de transfer de 9600
bauds. Se lucreaza fara intreruperi seriale.
Functia pentru receptie octet asteapta ca interfata sa receptioneze un octet (RI=1)
si returneaza valoarea acestuia din registrul de receptie.
78
CAP.3. MICROCONTROLERUL 80C552
Functia pentru transmisie octet asteapta ca octetul anterior sa fie transmis (TI=1),
dupa care scrie noul octet in registrul de transmisie.
// Receptie si transmisie pe portul serial fara intreruperi( polling )
#include <reg552.h>
#include <stdio.h>
#include <..\..\lib\ap_lib.h>
// Buffer pentru afisare caracter pe LCD
unsigned char buffer[ 2 ] = "0";
// Initializeaza interfata seriala UART
void InitSerial(void)
{
S0CON = 0xF0; // modul 3, multiprocesor, receptie validata
TMOD = 0x20; // Timer 1 in mod 2, temporizator
TH1 = 0xFD; // rata de transfer 9600 bauds
TL1 = 0xFD;
TR1 = 1; // porneste Timer 1
ET1 = 0; // NU genereaza intrerupere Timer 1
ES0 = 0; // NU genereaza intrerupere UART
TI = 1; // se poate transmite
}
// Functia de transmisie octet
void Transmit(unsigned char Data)
{
// Transmite un caracter pe linia seriala daca TI = 1
while(! TI ); // asteapta TI=1
TI = 0;
TB8 = 0; // bitul 9 pe zero
S0BUF = Data;
}
// Functia de receptie octet
unsigned char Receive(void)
{
// Receptioneaza un caracter de pe linia seriala daca RI = 1
while(! RI ); // asteapta RI=1
RI = 0;
return S0BUF;
}
79
CAP.3. MICROCONTROLERUL 80C552
// ....................................
void main(void)
{
lcd_InitDisplay();
InitSerial();
while( 1 ){
buffer[0] = Receive(); // receptie octet
lcd_Write( 1, buffer ); // afisare pe LCD
Transmit( buffer[0] ); // transmisie octet
}
}
// ....................................
// end
80
CAP.3. MICROCONTROLERUL 80C552
REZUMAT
Interfata seriala UART a microcontrolerului 80C552 respecta protocolul
RS232 si oferă posibilitatea transmisiei şi receptiei simultane ("full duplex"). De
asemenea poate incepe receptionarea unui al doilea octet ( caracter ) înainte ca cel
anterior receptionat sa fie citit din interfata
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.
Moduri de lucru
Interfata seriala poate opera in patru moduri selectate prin bitii SM0 si SM1 .
In modul 0 sunt transmisi sau receptionati 8 biti. Rata de transfer este fixa la
1/12 din frecventa de oscilatie.
In modul 1 sunt transmisi ( prin TxD ) sau receptionati ( prin RxD ) 10 biti : 1
bit de start ("0"), 8 biţi de date si 1 bit de stop ("1"). La receptie bitul de stop ajunge
în bitul RB8 ( S0CON.2 ). Rata de transfer este variabila.
In modul 2 sunt transmisi ( prin TxD ) sau receptionati ( prin RxD ) 11 biti : 1
bit de start ("0"), 8 biţi 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.
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.
81
CAP.3. MICROCONTROLERUL 80C552
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 fercventa de oscilatie.
In modurile 1 şi 3 rata de transfer ( RT ) este determinata de Timer 1 care
poate fi programat ca temporizator in oricare din cele trei moduri de functionare,
iar generarea intreruperilor trebuie invalidata. Cel mai frecvent Timer 1 este
configurat ca temporizator în mod 2 ( 8 biti cu autoincarcare ).
INTREBARI
1. Care sunt parametrii unei comunicatii seriale in standardul RS232 ?
2. Prin ce se caracterizeaza cele 4 moduri de lucru ?
3. Care sunt facilitatile de comunicatie multiprocesor ?
82
CAP.3. MICROCONTROLERUL 80C552
3.6. Sistemul de intreruperi al microcontrolerului 80C552
3.6.1. Sursele de intreruperi
Sistemul de intreruperi al microcontrolerului 80C552 recunoaste cereri de
intrerupere de la 15 surse distincte, care sunt:
a) două intreruperi externe /INT0 si /[Link] 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 externa 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 RS232 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 resetaţi 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 puţin 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.
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ă.
83
CAP.3. MICROCONTROLERUL 80C552
f) o intrerupere generata de interfata seriala I2C prin bitul SI ( S1CON.3 ) ca
urmare a apariţiei 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 corespunzător 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 întîi cererea corespunzatoare nivelului superior
de prioritate. Daca exista cereri simultane de pe acelaşi 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 prezentaţi 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. De exemplu pentru
intreruperea asociata convertorului analog-numeric se scrie:
ReadADC() interrupt 10 {...}
84
CAP.3. MICROCONTROLERUL 80C552
Tabelul 3.6.1_1. Sursele de intreruperi si adresele rutinelor de tratare
Nr. Sursa de intrerupere Simbol Cod Vectorul
crt. intrerupere intrerupere
1. intrerupere externa 0 X0 0 0003H
2. depasire Timer0 T0 1 000BH
3. intrerupere externa 1 X1 2 0013H
4. depasire Timer 1 T1 3 001BH
5. intrerupere UART S0 4 0023H
6. intrerupere I2C S1 5 002BH
7. intrerupere capturare 0 CT0 6 0033H
8. intrerupere capturare 1 CT1 7 003BH
9. intrerupere capturare 2 CT2 8 0043H
10. intrerupere capturare 3 CT3 9 004BH
11. intrerupere CAN ADC 10 0053H
12. intrerupere comparare 0 CM0 11 005BH
13. intrerupere comparare 1 CM1 12 0063H
14. intrerupere comparare 2 CM2 13 006BH
15. depasire Timer 2 T2 14 0073H
IEN0
EA EAD ES1 ES0 ET1 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
IEN1
ET2 ECM2 ECM1 ECM0 ECT3 EXT2 ECT1 ECT0
unde:
ET2 - valideaza intreruperea data de depasirea capacitatii lui T2
85
CAP.3. MICROCONTROLERUL 80C552
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 PCT0
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
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
86
CAP.3. MICROCONTROLERUL 80C552
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 fiecărui ciclu masina şi sunt testate în ciclu masina urmator. Daca cel puţin
un fanion este setat şi sistemul de întreruperi este validat se genereaza o instructiune
LCALL la subrutina de servire corespunzătoare, 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, într-
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.
87
CAP.3. MICROCONTROLERUL 80C552
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
fiecărui ciclu maşina. 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 creşte dacă apare una din
cele trei conditii prezentate la punctul 2. In cazul cel mai defavorabil cînd
instrucţiunea 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 răspuns este de 9 ciclii
maşină.
C1 C2 C3 C4 C5
S5P 2 S6
Intreruperea Intreruperea Intreruperile Exe cutie instructiune Subrutina de
devine a ctiva e ste me mo ra ta sunt testate LCALL 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.
88
CAP.3. MICROCONTROLERUL 80C552
REZUMAT
Sursele de intreruperi
Sistemul de intreruperi al microcontrolerului 80C552 recunoaste cereri de
intrerupere de la 15 surse distincte, care sunt:
a) două intreruperi externe /INT0 si /[Link] pot fi recunoscute pe
frontul cazator al semnalului sau pe nivel "0" in functie de programarea bitilor IT0
(TCON.0 ) si IT1 (TCON.2 ).
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 RS232 printr-o logica SAU la
activarea unuia din fanioanele RI (întrerupere la receptie) sau TI ( întrerupere la
emisie) din registrul S0CON.
d) opt intreruperi generate de timerul T2: patru intreruperi de capturare, trei
intreruperi de comparare şi o intrerupere pentru depasirea de capacitate:
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 apariţiei unor evenimente
Fiecare sursa de întrerupere poate fi validata sau invalidata prin setarea sau
resetarea bitului corespunzător 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.
Tratarea unei intreruperi
Fanioanele corespunzatoare cererilor de întrerupere sunt pozitionate în starea
S5P2 a fiecărui ciclu masina şi sunt testate în ciclu masina urmator. Daca cel puţin
un fanion este setat şi sistemul de întreruperi este validat se genereaza o instructiune
LCALL la subrutina de servire corespunzătoare, 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
89
CAP.3. MICROCONTROLERUL 80C552
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 ( vezi tabelul 1). 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.
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.
Timpul minim de raspuns la o intrerupere externa este de trei ciclii masina . Timpul
de raspuns creşte dacă apare una din cele trei conditii prezentate anterior. In cazul
cel mai defavorabil cînd instrucţiunea 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
răspuns este de 9 ciclii maşină.
INTREBARI
1. Care sunt sursele de intreruperi recunoscute de microcontroler ?
2. Cum se organizeaza nivelele de prioritate a intreruperilor ?
3. Cum se valideaza/invalideaza o intrerupere ?
4. Care este mecanismul prin care se trateaza o intrerupere ?
5. Cum se trateaza intreruperile externe ?
6. Cum se calculeaza timpul de raspuns la o intrerupere externa ?
90
CAP.3. MICROCONTROLERUL 80C552
3.7. Interfata seriala I2C a microcontrolerului 80C552
3.7.1. Preliminarii
Interfata seriala I2C ( notata SIO1 ) permite conectarea microcontrolerului
80C552 la o magistrala I2C care utilizeaza doar doua linii, SDA ( linia de date ) si
SCL ( linia de ceas ), pentru transferul informatiei intre dispozitivele conectate la
magistrala. Principalele caracteristici ale acesteia sunt :
transfer bidirectional intre dispozitive master si slave
magistrala multimaster, fara un master central
arbitrare pentru tentativa de acces simultan la magistrala a mai multor
dispozitive master
sincronizarea ceasului, care permite comunicarea dispozitivelor cu diferite rate
de transfer
Conectarea interfetei interne la magistrala externa I2C se face prin doi pini de
port P1.6/SCL si P1.7/SDA; pentru validarea SIO1 latch-urile P1.6 si P1.7 trebuie
setate. Unitatea centrala se interfateaza cu SIO1 prin intermediul a patru registre
SFR: S1CON-registru de control, S1STA-registru de stare, S1DAT-registru de
date si S1ADR-registru pentru adresa slave.
In figura 3.7.1_1 este prezentata configuratia unei magistrale I2C, iar in
figura 3.7.1_2 este prezentat un transfer de date pe magistrala.
VDD
R R
SDA
SC L
P 1.7 P1.6
Alte Alte
8xC552 dispozitive dispozitive
Fig. 3.7.1_1. Configuratia unei magistrale I2C
In functie de bitul de sens R/W\, sunt posibile doua tipuri de transferuri de
date :
1. Transfer de date de la un master transmitator ( MST_TRX ) la un slave receptor
( SLV_REC ). Primul octet transmis de master este adresa slave; urmeaza un
91
CAP.3. MICROCONTROLERUL 80C552
numar de octeti de date, slave-ul returnind un bit de confirmare ( “acknowledge
bit“- ACK ) dupa fiecare octet receptionat.
2. Transfer de date de la un slave transmitator ( SLV_TRX ) la un master receptor
( MST_REC ). Primul octet ( adresa slave ) este transmis de master, dupa care
slave-ul returneaza un bit de confirmare; urmeaza un numar de octeti de date
trimisi de slave catre master care trimite un bit de confirmare dupa fiecare octet
cu exceptia ultimului, cind trimite un bit “not acknowledge” (NOT_ACK)
pentru incheierea transferului.
Master-ul genereaza impulsurile de ceas ( SCL ), conditiile de START ( S ),
STOP ( P ) sau START repetat ( o conditie START repetat incheie un transfer si
pina la startul celui urmator master-ul nu cedeaza magistrala ).
Se mnal ACK Conditia de STOP
de la Re ce ptor
SDA P
S
MSB R/W
Adre sa SLAVE Bit
dire ctie
SCL
1 2 7 8 9 1 2 3-8 9
S P/S
ACK ACK
Conditia de
START Se re pe ta daca sunt transfe rati
mai multi octe ti
Fig. 3.7.1_2. Transferul de date pe magistrala I2C
3.7.2. Moduri de lucru
Interfata SIO1 poate opera in patru moduri:
1. Modul master transmitator.
Primul octet transmis de master contine adresa slave ( pe 7 biti ) si bitul de
sens al transferului R/W\=0 ( se transmite W ) - notam acest octet SLA+W ;
urmeaza un numar de octeti de date, slave-ul returnind bitul ACK dupa fiecare
octet receptionat. START si STOP indica inceputul si sfirsitul unui transfer.
2. Modul master receptor.
Primul octet transmis de master contine adresa slave ( pe 7 biti ) si bitul de
sens al transferului R/W\=1 ( se transmite R ) - notam acest octet SLA+R ;
urmeaza un numar de octeti de date transmisi de salve, master-ul returnind bitul
92
CAP.3. MICROCONTROLERUL 80C552
ACK dupa fiecare octet receptionat. START si STOP indica inceputul si sfirsitul
unui transfer.
3. Modul slave receptor.
Primul octet receptionat este SLA+W; daca adresa receptionata coincide cu
cea proprie, slave-ul intra in legatura cu master-ul, receptioneaza octetii de date
transmisi de acesta si returneaza un ACK dupa fiecare octet. START si STOP sunt
recunoscuti ca inceput si sfirsit de transfer.
4. Modul slave transmitator.
Primul octet receptionat este SLA+R; daca adresa receptionata coincide cu
cea proprie, slave-ul intra in legatura cu master-ul, transmite octetii de date iar
master-ul returneaza un ACK dupa fiecare octet. START si STOP sunt recunoscuti
ca inceput si sfirsit de transfer.
3.7.3. Registrele de lucru
Structura registrului S1CON este prezentata in figura 3.7.3_1.
S1CON
CR2 ENS1 STA STO SI AA CR1 CR0
unde :
CR2, CR1, CR0 - stabilesc rata de transfer seriala in modul master
ENS1 - bitul de validare SIO1
STA - bitul de START
STO - bitul de STOP
SI - fanionul de intrerupere
AA - fanionul de confirmare
Fig 3.7.3_1. Registrul S1CON pentru controlul interfetei seriale SIO1
ENS1 este bitul de validare SIO1.
Daca ENS1=0, iesirile SDA si SCL sunt in starea de inalta impedanta, iar
intrarile corespunzatoare sunt ignorate. Pentru modul slave, SIO1 este in starea
“neadresabil” si bitul STO ( S1CON.4 ) este fortat la “0”. Liniile P1.6 si P1.7 pot fi
folosite ca linii I/O cu colector in gol.
Daca ENS1=1, SIO1 este validat; latch-urile P1.6 si P1.7 trebuie setate.
ENS1 nu trebuie folosit pentru a decupla temporar SIO1 de la magistrala, deoarece
cind ENS1 este resetat, starea interfetei este pierduta ( in acest scop se poate utiliza
bitul AA-S1CON.2 )
93
CAP.3. MICROCONTROLERUL 80C552
STA este bitul de START
Daca STA este setat pentru a intra in modul master, SIO1 testeaza starea
magistralei I2C si genereaza o conditie de START cind magistrala este libera. Daca
STA este setat cind SIO1 este deja in modul master, se transmite o conditie de
START repetat.
Daca STA este resetat nu se va genera o conditie de START sau START
repetat.
STO este bitul de STOP
Daca STO este setat cind SIO1 este in modul master, va fi transmisa pe
magistrala I2C o conditie de STOP dupa care bitul STO va fi resetat prin hard.
Daca STO este resetat nu va fi generata o conditie de STOP.
SI este fanionul de intrerupere
Daca SI este setat si intreruperea SIO1 este validata, se genereaza o
intrerupere. Bitul SI este setat la intrarea in una din cele 25 de stari ( din 26
posibile ) ale interfetei. Singura stare in care nu se seteaza SI este F8H, stare care
indica de fapt ca nu exista inca nici o informatie utila.
Fanionul SI trebuie resetat prin program.
Daca SI este resetat nu se genereaza intrerupere.
AA este fanionul de confirmare
Daca fanionul AA este setat un bit ACK ( nivel “low” pe linia SDA ) este
returnat atunci cind :
- slave-ul receptioneaza propria adresa
- slave-ul receptioneaza adresa generala ( “general call” ) cind bitul GC=1
( S1ADR.0 )
- un octet de date a fost receptionat in timp ce SIO1 este in modul master
receptor sau slave receptor.
Daca fanionul AA este resetat un bit NOT_ACK ( nivel “high” pe linia SDA )
este returnat atunci cind un octet de date a fost receptionat in timp ce SIO1 este in
modul master receptor sau slave receptor.
CR0, CR1 si CR2 stabilesc frecventa semnalului SCL ( rata de transfer seriala )
Cei trei biti au semnificatie doar in modul master, deoarece in modul slave
SIO1 se sincronizeaza cu ceasul generat de master.
Tabelul 3.7.3_1 prezinta ratele de transfer pentru frecventele de oscilatie de 6MHz,
12MHz si 16MHz.
Registrul de stare S1STA este un registru SFR pe 8 biti care poate fi doar citit.
Cei mai semnificativi 5 biti contin codul binar al starii in care se afla SIO1, iar cei
94
CAP.3. MICROCONTROLERUL 80C552
mai putin semnificativi 3 biti sunt zero. Exista 26 de stari posibile ale circuitului (
din care una, codificata F8H nu contine informatii relevante ) ; la intrarea in oricare
din celelalte 25 de stari, bitul SI este setat.
Tabel 3.7.3_1.
Frecventa biti ( kHz ) la Fosc
CR2 CR1 CR0 6 MHz 12 MHz 16 MHz
0 0 0 23 47 63
0 0 1 27 54 71
0 1 0 31 63 83
0 1 1 37 75 100
1 0 0 6.25 12.5 17
1 0 1 50 100 -
1 1 0 100 - -
Registrul de adresa S1ADR este un registru SFR pe 8 biti care poate fi citit
sau inscris. Continutul sau este fara importanta cind SIO1 este in modul master; in
modul slave cei 7 biti mai semnificativi trebuie incarcati cu adresa proprie a
microcontrolerului.
Daca bitul cel mai putin semnificativ, notat GC este setat, microcontrolerul va
recunoaste pe linga adresa proprie si o adresa generala ( 00H ); daca GC = 0 bitul
este ignorat.
Registrul de date S1DAT este un registru SFR pe 8 biti si contine octetul
de date care va fi transmis sau care tocmai a fost receptionat pe linia seriala. Data
ramine stabila in acest registru atit timp cit SIO1 este intr-o stare definita si bitul SI
este setat.
3.7.4. Descrierea modurilor de lucru
Descrierea transferurilor de date in fiecare din modurile de lucru utilizeaza
urmatoarele notatii :
S conditia de START
SLA adresa slave pe 7 biti
R bitul de sens pentru citire de la slave ( nivel “high” pe linia
SDA )
W bitul de sens pentru scriere la slave ( nivel “low” pe linia SDA )
A bitul ACK ( nivel “low” pe linia SDA )
95
CAP.3. MICROCONTROLERUL 80C552
A\ bitul NOT_ACK ( nivel “high” pe linia SDA )
DATA octetul de date ( transmis sau receptionat )
P conditia de STOP
ADR_GEN adresa generala
SLV_N_ADR modul SLAVE neadresabil
[Link]. Modul Master Transmitator
Diagrama de functionare in modul master transmitator este prezentata in
figura 3.7.4.1_1, iar descrierea starilor posibile ale SIO1 este prezentata in tabelul
3.7.4.1_2.
In acest mod, un numar de octeti de date sunt transmisi de la un master
transmitator catre un slave receptor. Inainte de intrarea in acest mod, S1CON
trebuie initializat astfel :
- bitul ENS1 =1 pentru validarea SIO1
- bitii STA, STO, SI sunt resetati
- bitul AA poate fi setat sau resetat; daca AA = 0 SIO1 nu va recunoaste propria
adresa sau adresa generala in cazul in care un alt dispozitiv devine master pe
magistrala ( de fapt SIO1 nu poate intra in acest caz in modul slave )
- bitii CR0, CR1, CR2 sunt pozitionati pentru rata de transfer dorita
Intrarea in modul master se poate face acum prin setarea STA. SIO1 va testa
magistrala I2C si va genera un START ( S ) imediat ce aceasta devine libera. Cind
START este generat, bitul SI este setat si se intra in starea 08H ( vezi tabelul
3.7.4.1_2 ) in care trebuie incarcat registru S1DAT cu adresa slave-ului si bitul de
sens ( SLA+W ); bitul SI trebuie resetat pentru ca transferul sa continue.
Cind SLA+W a fost transmis si bitul ACK a fost receptionat, bitul SI este setat din
nou si un numar de stari in S1STA sunt posibile. Acestea sunt 18H, 20H sau 38H
pentru modul master si 68H, 78H sau B0H daca modul slave a fost validat ( bitul
AA = 1 ).
Dupa un START repetat ( starea 10H ), SIO1 poate comuta in modul master
receptor incarcind registru S1DAT cu SLA+R.
96
CAP.3. MICROCONTROLERUL 80C552
S SLA W A DATA A P
08H 18H 28H
Urmatorul transfer incepe
S SLA W
cu un START REP ETAT
10H
NOT_ACK re ce ptionat dupa
A/ P R
a dresa slave
20H
NOT_ACK re ce ptionat dupa La mo dul
A/ P
o cte t de da te MST/REC
30H
Arbitra re pierduta in timpul A sa u Alti MST A sa u Alti MST
A/ continua A/ co ntinua
a drese i sla ve sa u o ctet de da te
38H 38H
Arbitra re pierduta si a dresare Alti MST
A
continua
in continua re ca SLAVE
La sta rile corespunza to are
68H 78H 80H in mo dul SLAVE
De la MASTER la SLAVE
De la SLAVE la MASTER
Fig. 3.7.4.1_1. Diagrama de functionare in modul Master Transmitator
97
CAP.3. MICROCONTROLERUL 80C552
Tabelul 3.7.4.1_2. Descrierea starilor in modul Master Transmitator
STAREA RASPUNS APLICATIE SOFT
COD MAGISTRALEI I2C S1CON URMATOAREA ACTIUNE A
STARE SI A INTERFETEI S1DAT STA STO SI AA INTERFETEI SIO1
SIO1
08H START a fost Incarca X 0 0 X SLA+W va fi transmis
transmis SLA+W ACK va fi receptionat
10H START REP. a fost Incarca X 0 0 X Identic anterior
transmis SLA+W
Incarca X 0 0 X SLA+W va fi transmis
SLA+R SIO1 va comuta in modul
MST/REC
18H SLA+W a fost Incarca 0 0 0 X DATA va fi transmisa
transmis; ACK a DATA ACK va fi receptionat
fost receptionat Nu 1 0 0 X START [Link] fi transmis
Nu 0 1 0 X STOP va fi transmis
Fanionul STO va fi sters
Nu 1 1 0 X STOP urmat de un START
vor fi transmise
Fanionul STO va fi sters
20H SLA+W a fost Incarca 0 0 0 X DATA va fi transmisa
transmis; DATA ACK va fi receptionat
NOT_ACK a fost Nu 1 0 0 X START [Link] fi transmis
receptionat Nu 0 1 0 X STOP va fi transmis
Fanionul STO va fi sters
Nu 1 1 0 X STOP urmat de un START
vor fi transmise
Fanionul STO va fi sters
28H DATA din S1DAT a Incarca 0 0 0 X DATA va fi transmisa
fost transmisa; DATA ACK va fi receptionat
ACK a fost Nu 1 0 0 X START [Link] fi transmis
receptionat Nu 0 1 0 X STOP va fi transmis
Fanionul STO va fi sters
Nu 1 1 0 X STOP urmat de un START
vor fi transmise
Fanionul STO va fi sters
30H DATA din S1DAT a Incarca 0 0 0 X DATA va fi transmisa
fost transmisa; DATA ACK va fi receptionat
NOT_ACK a fost Nu 1 0 0 X START [Link] fi transmis
receptionat Nu 0 1 0 X STOP va fi transmis
Fanionul STO va fi sters
Nu 1 1 0 X STOP urmat de un START
vor fi transmise
Fanionul STO va fi sters
38H Arbitrare pierduta Nu 0 0 0 X Magistrala va fi cedata
in SLA+R/W sau SIO1 va intra in modul
octetii de date “slave” neadresabil
Nu 1 0 0 X START va fi transmis cind
magistrala devine libera
98
CAP.3. MICROCONTROLERUL 80C552
[Link]. Modul Master Receptor
Diagrama de functionare este prezentata in figura 3.7.4.2_1, iar descrierea
starilor posibile ale SIO1 este prezentata in tabelul 3.7.4.2_2.
In acest mod, un numar de octeti de date sunt receptionati de un master
receptor de la un slave transmitator.
Initializarea transferului se face la fel ca in modul master transmitator.
Cind START este generat, bitul SI este setat si se intra in starea 08H ( vezi
tabelul 3.7.4.2_2 ) in care trebuie incarcat registru S1DAT cu adresa slave-ului si
bitul de sens ( SLA+R ); bitul SI trebuie resetat pentru ca transferul sa continue.
Cind SLA+R a fost transmis si bitul ACK a fost receptionat, bitul SI este setat din
nou si un numar de stari in S1STA sunt posibile. Acestea sunt 40H, 48H sau 38H
pentru modul master si 68H, 78H sau B0H daca modul slave a fost validat ( bitul
AA = 1 ).
Dupa un START repetat ( starea 10H ), SIO1 poate comuta in modul master
transmitator incarcind registru S1DAT cu SLA+W.
S SLA R A DATA
DATA A DATA A/ P
08H 40H 50H 58H
Urmato rul trans fer incep e
S SLA R
cu un START REPETAT
10H
NOT_ACK receptionat dupa
A/ P W
adre sa slave
La modul
48H
MST/TRX
Arbitrare pierd uta in timpul A s au Alti MST Alti MST
A
A/ continua continua
adre sei slave sau bit ACK
38H 38H
Arbitrare pierd uta si adres are Alti MST
A
continua
in co ntinuare ca SLAVE
La sta rile coresp unza toare
68H 78H 80H in mod ul SLAVE
De la MASTER la SLAVE
De la SLAVE la MASTER
Fig. 3.7.4.2_1. Diagrama de functionare in modul Master Receptor
99
CAP.3. MICROCONTROLERUL 80C552
Tabelul 3.7.4.2_2. Descrierea starilor in modul Master Receptor
STAREA RASPUNS APLICATIE SOFT
COD MAGISTRALEI I2C S1CON URMATOAREA ACTIUNE A
STARE SI A INTERFETEI S1DAT STA STO SI AA INTERFETEI SIO1
SIO1
08H START a fost Incarca X 0 0 X SLA+R va fi transmis
transmis SLA+R ACK va fi receptionat
10H START REP. a fost Incarca X 0 0 X Identic anterior
transmis SLA+R
Incarca X 0 0 X SLA+W va fi transmis
SLA+W SIO1 va comuta in modul
MST/TRX
38H Arbitrare pierduta Nu 0 0 0 X Magistrala va fi cedata
in NOT_ACK SIO1 va intra in modul
“slave”
Nu 1 0 0 X START va fi transmis cind
magistrala devine libera
40H SLA+R a fost Nu 0 0 0 0 DATA a fost receptionata
transmis; ACK a NOT_ACK va fi returnat
fost receptionat Nu 0 0 0 1 DATA a fost receptionata
ACK va fi returnat
48H SLA+R a fost Nu 1 0 0 X START [Link] fi transmis
transmis; Nu 0 1 0 X STOP va fi transmis
NOT_ACK a fost Fanionul STO va fi sters
receptionat Nu 1 1 0 X STOP urmat de un START
vor fi transmise
Fanionul STO va fi sters
50H DATA a fost Citeste 0 0 0 0 DATA a fost receptionata
receptionata; ACK DATA NOT_ACK va fi returnat
a fost returnat Citeste 0 0 0 1 DATA a fost receptionata
DATA ACK va fi returnat
58H DATA a fost Citeste 1 0 0 X START [Link] fi transmis
receptionata; DATA
NOT_ACK a fost Citeste 0 1 0 X STOP va fi transmis
returnat DATA Fanionul STO va fi sters
Citeste 1 1 0 X STOP urmat de un START
DATA vor fi transmise
Fanionul STO va fi sters
100
CAP.3. MICROCONTROLERUL 80C552
[Link]. Modul Slave Receptor
Diagrama de functionare in modul slave receptor este prezentata in figura
3.7.4.3_1, iar descrierea starilor posibile ale SIO1 este prezentata in tabelul
3.7.4.3_2.
In acest mod, un numar de octeti de date sunt receptionati de la un
master transmitator.
Initializarea transferului se face prin incarcarea S1ADR si S1CON astfel :
S1ADR se incarca pe cei 7 biti mai semnificativi cu adresa la care va raspunde
cind va fi adresat de un master, iar daca bitul mai putin semnificativ GC este setat,
slave-ul va raspunde si la adresa generala ( 00H – adresa de selectie pentru toate
modulele slave); daca GC = 0 adresa generala este ignorata.
S1CON trebuie initializat astfel :
- bitul ENS1 =1 pentru validarea SIO1
- bitii STA, STO, SI sunt resetati
- bitul AA trebuie setat pentru ca SIO1 sa recunoasca propria adresa sau adresa
generala
- bitii CR0, CR1, CR2 nu au importanta in modul slave
Dupa ce S1ADR si S1CON au fost initializati, SIO1 ramine in asteptare pina
cind este adresat prin octetul SLA+W de un master transmitator. In continuare
bitul SI este setat si un numar de stari sunt posibile ( codul lor este in registru
S1STA ). In modul slave receptor se poate ajunge si din modul master daca SIO1
pierde arbitrarea pentru acces la magistrala ( vezi starile 68H si 78H ).
Daca bitul AA este resetat in timpul unui transfer, SIO1 va returna un bit
NOT_ACK dupa urmatorul octet de date; in continuare SIO1 nu isi va mai
recunoaste propria adresa sau adresa generala. Totusi, magistrala este monitorizata
si revenirea la recunoasterea adreselor poate fi facuta prin setarea bitului AA ( bitul
AA poate fi deci folosit pentru izolarea temporara de magistrala ).
101
CAP.3. MICROCONTROLERUL 80C552
P s au
S SLA W A DATA A DATA A
S
60H 80H 80H A 0H
Ultimul octet re ce ptionat P s au
A/
es te NOT_ACK S
88H
Arbitrare pie rduta ca
MASTER si a dre sa re A/
ca SLAVE
68H
Re ce ptie adresa Adre sa P s au
ge ne rala A DATA A DATA A
ge ne ra la (ADR_GEN) S
70H 90H 90H A 0H
Ultimul octet re ce ptionat P s au
A/
es te NOT_ACK S
98H
Arbitra re pie rduta ca MASTER
si adresare ca SLAVE prin A
ADR_GEN
78H
De la MASTER la SLAVE
De la SLAVE la MASTER
Fig. 3.7.4.3_1. Diagrama de functionare in modul Slave Receptor
102
CAP.3. MICROCONTROLERUL 80C552
Tabelul 3.7.4.3_2. Descrierea starilor in modul Slave Receptor
STAREA RASPUNS APLICATIE SOFT
COD MAGISTRALEI I2C S1CON URMATOAREA ACTIUNE A
STARE SI A INTERFETEI S1DAT STA STO SI AA INTERFETEI SIO1
SIO1
60H SLA+W proprie a Nu X 0 0 0 DATA va fi receptionata si
fost receptionata; NOT_ACK va fi returnat
ACK a fost Nu X 0 0 1 DATA va fi receptionata si
returnat ACK va fi returnat
68H Arbitrare pierduta Nu X 0 0 0 DATA va fi receptionata si
in SLA+R/W ca NOT_ACK va fi returnat
master; SLA+W Nu X 0 0 1 DATA va fi receptionata si
proprie a fost ACK va fi returnat
receptionta; ACK
returnat
70H ADR_GEN a fost Nu X 0 0 0 DATA va fi receptionata si
receptionata; ACK NOT_ACK va fi returnat
a fost returnat Nu X 0 0 1 DATA va fi receptionata si
ACK va fi returnat
78H Arbitrare pierduta Nu X 0 0 0 DATA va fi receptionata si
in SLA+R/W ca NOT_ACK va fi returnat
master; ADR_GEN Nu X 0 0 1 DATA va fi receptionata si
a fost receptionta; ACK va fi returnat
ACK returnat
80H Anterior adresat Citeste X 0 0 0 DATA va fi receptionata si
cu SLA proprie; DATA NOT_ACK va fi returnat
DATA a fost Citeste X 0 0 1 DATA va fi receptionata si
receptionata; ACK DATA ACK va fi returnat
a fost returnat
88H Anterior adresat Citeste 0 0 0 0 Comuta in modul
cu SLA proprie; DATA SLV_N_ADR; nu
DATA a fost recunoaste SLA proprie
receptionata; sau ADR_GEN
NOT_ACK a fost Citeste 0 0 0 1 Comuta in modul
returnat DATA SLV_N_ADR; recunoaste
SLA proprie; ADR_GEN
este recunoscuta daca
S1ADR.0=1
Citeste 1 0 0 0 Comuta in modul
DATA SLV_N_ADR; nu
recunoaste SLA proprie
sau ADR_GEN
START va fi generat cind
magistrala devine libera
Citeste 1 0 0 1 Comuta in modul
DATA SLV_N_ADR; recunoaste
SLA proprie; ADR_GEN
este recunoscuta daca
S1ADR.0=1
START va fi generat cind
magistrala devine libera
90H Anterior adresat Citeste X 0 0 0 DATA va fi receptionata si
cu ADR_GEN; DATA NOT_ACK va fi returnat
DATA a fost Citeste X 0 0 1 DATA va fi receptionata si
receptionata; ACK DATA ACK va fi returnat
103
CAP.3. MICROCONTROLERUL 80C552
a fost returnat
98H Anterior adresat Identic cu 0 0 0 0 Identic cu starea 88H
cu ADR_GEN; starea 0 0 0 1
DATA a fost 88H 1 0 0 0
receptionata; 1 0 0 1
NOT_ACK a fost
returnat
A0H STOP sau START Nu 0 0 0 0 Identic cu starea 88H
REP. au fost Nu 0 0 0 1
receptionati Nu 1 0 0 0
Nu 1 0 0 1
[Link]. Modul Slave Transmitator
Diagrama de functionare in modul slave transmitator este prezentata in
figura 3.7.4.4_1, iar descrierea starilor posibile ale SIO1 este prezentata in tabelul
3.7.4.4_2.
In acest mod, un numar de octeti de date sunt transmisi catre un master
receptor.
Initializarea transferului se face prin incarcarea S1ADR si S1CON la fel ca
in cazul slave receptor.
Dupa ce S1ADR si S1CON au fost initializati, SIO1 ramine in asteptare pina
cind este adresat prin octetul SLA+R de un master receptor. In continuare bitul SI
este setat si un numar de stari sunt posibile ( codul lor este in registru S1STA ). In
modul slave transmitator se poate ajunge si din modul master daca SIO1 pierde
arbitrarea pentru acces la magistrala ( vezi starea B0H ).
Daca bitul AA este resetat in timpul unui transfer, SIO1 va transmite un
ultim octet de date dupa care va intra in una din starile C0H sau C8H; in continuare
SIO1 nu isi va mai recunoaste propria adresa sau adresa generala ignorind masterul
daca acesta continua transferul ( masterul va receptiona in acest caz valoarea “1”
pe linia seriala ). Totusi, magistrala este monitorizata si revenirea la recunoasterea
adreselor poate fi facuta prin setarea bitului AA ( AA poate fi deci folosit pentru
izolarea temporara de magistrala ).
104
CAP.3. MICROCONTROLERUL 80C552
P sau
S SLA R A DATA
DATA A DATA A/
S
08H A 8h B8H C 0H
Arbitrare pierduta ca MASTER si
A
adre sare in continuare ca SLAVE
B0H
To ti bitii P s au
A
sunt "1" S
Ultimul octe t de date trans mis
C omuta in modul SLAVE ne adresa bil
( bitul AA in S1CON es te "0" ) C 8H
De la MASTER la SLAVE
De la SLAVE la MASTER
Fig. 3.7.4.4_1. Diagrama de functionare in modul Slave Transmitator
Tabelul 3.7.4.4_2. Descrierea starilor in modul Slave Transmitator
STAREA RASPUNS APLICATIE SOFT
COD MAGISTRALEI I2C S1CON URMATOAREA ACTIUNE
STARE SI A INTERFETEI S1DAT STA STO SI AA A INTERFETEI SIO1
SIO1
A8H SLA+R proprie a Citeste X 0 0 0 Ultima DATA va fi
fost receptionata; DATA transmisa si ACK va fi
ACK a fost receptionat
returnat Citeste X 0 0 1 DATA va fi transmisa si
DATA ACK va fi receptionat
B0H Arbitrare pierduta Citeste X 0 0 0 Ultima DATA va fi
in SLA+R/W ca DATA transmisa si ACK va fi
master; SLA+R receptionat
proprie a fost Citeste X 0 0 1 DATA va fi transmisa si
receptionta; ACK DATA ACK va fi receptionat
returnat
B8H DATA in S1DAT a Citeste X 0 0 0 Ultima DATA va fi
fost transmisa; DATA transmisa si ACK va fi
ACK a fost receptionat
receptionat Citeste X 0 0 1 DATA va fi transmisa si
DATA ACK va fi receptionat
C0H DATA in S1DAT a Nu 0 0 0 0 Comuta in modul
fost transmisa; SLV_N_ADR; nu
NOT_ACK a fost recunoaste SLA proprie
receptionat sau ADR_GEN
Nu 0 0 0 1 Comuta in modul
105
CAP.3. MICROCONTROLERUL 80C552
SLV_N_ADR; recunoaste
SLA proprie; ADR_GEN
este recunoscuta daca
S1ADR.0=1
Nu 1 0 0 0 Comuta in modul
SLV_N_ADR; nu
recunoaste SLA proprie
sau ADR_GEN
START va fi generat cind
magistrala devine libera
Nu 1 0 0 1 Comuta in modul
SLV_N_ADR; recunoaste
SLA proprie; ADR_GEN
este recunoscuta daca
S1ADR.0=1
START va fi generat cind
magistrala devine libera
C8H Ultima DATA in Nu 0 0 0 0 Identic cu starea C0H
S1DAT a fost Nu 0 0 0 1
transmisa; ACK a Nu 1 0 0 0
fost receptionat Nu 1 0 0 1
[Link]. Stari nedefinite
Exista doua coduri in registru S1STA care nu corespund la stari fizice ale
SIO1 :
S1STA = F8H - codul indica faptul ca nu exista informatii relevante
deoarece bitul SI nu a fost inca setat; acest caz apare la trecerea intre
celelalte stari sau cind SIO1 nu este implicat intr-un transfer.
S1STA = 00H - codul indica prezenta unei erori de magistrala intr-un
transfer serial ( de exemplu o conditie de START sau STOP intr-o pozitie
ilegala, perturbatii externe ). Cind apare o astfel de eroare bitul SI este setat;
pentru revenire in functionare normala bitul STO trebuie setat si SI resetat,
SIO1 intrind astfel in modul slave “neadresabil” ( stare fizica definita ).
Intr-o aplicatie, lucrul cu interfata seriala I2C ( SIO1 ) se poate realiza, in
principiu, in doua moduri :
prin interogare ( “polling” ) cu intreruperea seriala SIO1 invalidata. In acest caz,
se testeaza prin program bitul SI pentru a detecta momentul in care interfata
ajunge intr-o stare definita ( codul starii se citeste din registrul S1STA ).
prin intreruperi. In acest caz, programatorul trebuie sa scrie o subrutina de tratare
a intreruperii unde se ajunge automat ( prin mecanisme hard ) atunci cind bitul de
intrerupere SI este setat.
In principiu, un program pentru interfata seriala I2C ar trebui sa cuprinda o
functie de initializare a interfetei, cite o functie pentru implementarea modurilor de
lucru, o functie de intrerupere ( daca se lucreaza cu intreruperi ).
106
CAP.3. MICROCONTROLERUL 80C552
Functia de initializare ( de exemplu : void InitSIO1(void) {...}) trebuie sa
realizeze urmatoarele actiuni :
stabilire nivel logic “1” pe liniile SDA si SCL
programare S1CON ( validare, rata de transfer, etc. )
Functia care implementeaza un mod de lucru trebuie sa realizeze un automat
secvential cu un numar finit de stari. Astfel, de fiecare data cind SI = 1, actiunea
intreprinsa depinde de codul starii curente din S1STA.
De exemplu, pentru modul master receptor :
void I2C_MasterReceptor( ..........)
{
bit flag_Ok = 0;
// Transmite conditia de START
STA = 1;
// Implementeaza un automat cu un numar finit de stari
while( 1 ){
// Trecerea intr-o noua stare este indicata prin SI=1
if( SI == 1 ){
// Analizeaza starea curenta
switch( S1STA ){
// Eroare de comunicatie pe bus
case 0x00 :
........................
break;
// S-a transmis conditia de START / START repetat
case 0x08 :
case 0x10 :
.......................
break;
// S-a transmis SLA + R, s-a primit ACK
case 0x40 :
.......................
break;
.........................................................................
// S-a primit DATA, s-a transmis NOT ACK
case 0x58 :
// Transmite conditia de STOP
STA = 0; STO = 1;
flag_Ok = 1;
break;
}
107
CAP.3. MICROCONTROLERUL 80C552
// Sterge SI
SI = 0;
}
// Operatie completa
if(flag_Ok) break;
}
}
Functia de intrerupere ( de exemplu : Serial1() interrupt 5 {...} ) trebuie sa
realizeze in principiu aceleasi actiuni prezentate anterior cu diferenta ca nu se mai
realizeaza testarea bitului SI ( intrarea in functie se face automat doar cind SI = 1 ).
108
CAP.3. MICROCONTROLERUL 80C552
REZUMAT
Interfata seriala I2C permite conectarea microcontrolerului 80C552 la o
magistrala I2C care utilizeaza doar doua linii, SDA ( linia de date ) si SCL ( linia
de ceas ), pentru transferul informatiei intre dispozitivele conectate la magistrala.
Principalele caracteristici ale acesteia sunt :
transfer bidirectional intre dispozitive master si slave
magistrala multimaster, fara un master central
arbitrare pentru tentativa de acces simultan la magistrala a mai multor
dispozitive master
sincronizarea ceasului, care permite comunicarea dispozitivelor cu diferite rate
de transfer
In functie de bitul de sens R/W\, sunt posibile doua tipuri de transferuri de date :
Transfer de date de la un master transmitator ( MST_TRX ) la un slave
receptor ( SLV_REC ). Primul octet transmis de master este adresa slave;
urmeaza un numar de octeti de date, slave-ul returnind un bit de confirmare (
“acknowledge bit“- ACK ) dupa fiecare octet receptionat.
Transfer de date de la un slave transmitator ( SLV_TRX ) la un master
receptor ( MST_REC ). Primul octet ( adresa slave ) este transmis de master,
dupa care slave-ul returneaza un bit de confirmare; urmeaza un numar de
octeti de date trimisi de slave catre master care trimite un bit de confirmare
dupa fiecare octet cu exceptia ultimului, cind trimite un bit “not
acknowledge” (NOT_ACK) pentru incheierea transferului.
Master-ul genereaza impulsurile de ceas ( SCL ), conditiile de START ( S ), STOP
( P ) sau START repetat ( o conditie START repetat incheie un transfer si pina la
startul celui urmator master-ul nu cedeaza magistrala ).
Interfata seriala I2C poate opera in patru moduri:
1. Modul master transmitator.
Primul octet transmis de master contine adresa slave ( pe 7 biti ) si bitul de
sens al transferului R/W\=0 ( se transmite W ) - notam acest octet SLA+W ;
urmeaza un numar de octeti de date, slave-ul returnind bitul ACK dupa fiecare
octet receptionat. START si STOP indica inceputul si sfirsitul unui transfer.
2. Modul master receptor.
Primul octet transmis de master contine adresa slave ( pe 7 biti ) si bitul de
sens al transferului R/W\=1 ( se transmite R ) - notam acest octet SLA+R ;
urmeaza un numar de octeti de date transmisi de salve, master-ul returnind bitul
109
CAP.3. MICROCONTROLERUL 80C552
ACK dupa fiecare octet receptionat. START si STOP indica inceputul si sfirsitul
unui transfer.
3. Modul slave receptor.
Primul octet receptionat este SLA+W; daca adresa receptionata coincide cu
cea proprie, slave-ul intra in legatura cu master-ul, receptioneaza octetii de date
transmisi de acesta si returneaza un ACK dupa fiecare octet. START si STOP sunt
recunoscuti ca inceput si sfirsit de transfer.
4. Modul slave transmitator.
Primul octet receptionat este SLA+R; daca adresa receptionata coincide cu
cea proprie, slave-ul intra in legatura cu master-ul, transmite octetii de date iar
master-ul returneaza un ACK dupa fiecare octet. START si STOP sunt recunoscuti
ca inceput si sfirsit de transfer.
INTREBARI
1. Care sunt principalele caracteristici ale interfetei I2C ?
2. Ce tipuri de transferuri sunt posibile pe magistrala ?
3. Care sunt modurile de lucru ale interfetei I2C ?
4. Care sunt registrele principale si care este rolul acestora ?
5. Descrieti functionarea interfetei in modul Master Transmitator.
6. Descrieti functionarea interfetei in modul Slave Receptor.
110