Documente Academic
Documente Profesional
Documente Cultură
Amug PDF
Amug PDF
tefan Suceveanu
CUPRINS
INTRODUCERE..................................................................................1
1.
2.
2.1.
a) Modul 0.......................................................................99
b) Modul 1.......................................................................99
c) Modul 2..................................................................... 100
d) Modul 3..................................................................... 100
2.6.2
Registrele speciale ale PWM.................................... 101
a) Numrtorul PTx ........................................................ 101
b) Registrul de perioad PPx ............................................ 101
c) Registrul de durat PWx .............................................. 102
d) Registrele de control PWMCON0 i PWMCON1 ................ 102
2.6.3
ntreruperile modulului PWM................................... 103
2.7.
C ONVERTORUL ANALOG NUMERIC ......................................... 103
2.7.1
Moduri de lucru..................................................... 103
Conversii singulare ..................................................... 104
Conversii multiple ....................................................... 104
Ateptare semnal citire rezultat .................................... 105
Inserare canal............................................................ 105
2.7.2
Timpii de conversie ............................................... 106
2.7.3
Controlul ntreruperilor ADC .................................... 107
2.8.
T IMERE /N UMRTOARE .................................................... 108
2.8.1
Blocul de timere GPT1............................................ 108
a) Timerul T3................................................................. 108
Modul timer ............................................................... 108
Modul timer comandat ................................................ 109
Modul numrtor ........................................................ 110
b) Timerele T2 i T4 ....................................................... 110
Concatenarea timerelor T2 i T4 ................................... 111
Rencrcarea timerului T3 ............................................ 111
Capturarea valorii timerului T3 ..................................... 112
2.8.2
Blocul de timere GPT2............................................ 112
a) Timerul T6................................................................. 113
Modul timer ............................................................... 113
Modul timer comandat ................................................ 114
Modul numrtor ........................................................ 114
b) Timerul T5................................................................. 114
Concatenarea timerelor T5 i T6 ................................... 115
Rencrcarea timerului T6 ............................................ 115
Capturarea valorii timerului T5 ..................................... 115
Multiplicarea frecvenei ............................................... 116
2.8.3
ntreruperile blocurilor de timere GPT1 i GPT2 ......... 116
2.9.
C OMPARATOARELE I REGISTRELE DE CAPTUR ........................ 117
2.9.1
Timerele CAPCOM.................................................. 118
Modul timer ............................................................... 118
Modul numrtor ........................................................ 118
3.2.
3.3.
3.4.
3.5.
3.6.
3.7.
4.
Introducere
Lucrarea de fa se adreseaz unui cerc larg de cititori interesai de
problemele ridicate de implementarea, n viaa de zi cu zi, a unor dispozitive,
aparate, sisteme care au n compunere elemente automate de coordonare,
control, comand etc. Se presupune c cititorii sunt familiarizai cu termenii
specifici utilizatorilor de microprocesoare, pentru a ctiga n concizie unele
expresii nefiind explicate.
Complexitatea sistemului poate fi extrem de variat, de exemplu, de la
un filtru de cafea sau o main de splat, pn la un telefon mobil sau un
automobil. Marele avantaj al microcontrolerelor fa de microcalculatoarele
clasice, cu microprocesor, const n faptul c sistemul este astfel proiectat
pentru a fi prietenos, aparatul inteligent fiind uor de manevrat i de ctre
nespecialiti.
Spre deosebire de calculatoare (sau computer n limba englez
desemnnd calcule, lucrul cu numere), controlerul mai degrab lucreaz cu
informaii despre sistemul controlat: care este starea unui motor electric,
temperatura unui lichid etc., funcie de acestea i de algoritmul de lucru
programat lund deciziile necesare. Deci, controlerele pot fi considerate
calculatoare obinuite n care predomin interfeele ctre exterior.
Istoria timpurie a calculatoarelor poate fi considerat ncepnd cu
Charles Babbage, un inventator britanic, autorul mainii analitice n anul
1830. Ideea teoretic descria principii asemntoare cu ceea ce fac i
calculatoarele din ziua de astzi dar, dezvoltarea tehnologic din secolul
trecut nu a permis realizarea practic a mainii.
O idee mai practic a avut-o americanul Hermann Hollerith care a
patentat o main de calculat n anul 1889. Maina lui Hollerith lucra cu
cartele perforate i a fost utilizat ani de zile n scopuri statistice. Compania
lui Hollerith, denumit Tabulating Machine Company a fost absorbit n anul
1924 de alt firm, formnd mpreun vestita International Business Machines
Corporation.
Un pas esenial n progresul calculatoarelor l-a constituit introducerea
algebrei booleene, o algebr care lucreaz numai cu dou cifre 0 i 1. Algebra
dezvoltat de Boole a permis implementarea ulterioar a calculatoarelor
electronice, sisteme uriae care conineau milioane de mici comutatoare care
nu puteau avea dect dou stri: deschis (asociat de regul cifrei 0) i nchis
(1). Comutatoarele sunt cunoscute astzi sub denumirea de bii. n
calculatoarele moderne, grupul de 8 bii este un bloc fundamental i are
numele de octet (n limba englez byte i prescurtat B).
n Marea Britanie Alan Turing a pus bazele logicii simbolice n anul 1937
(articolul On Computable Number), printr-o analiz comparat cu activitatea
mental uman. De asemenea, el a fost primul care a introdus conceptul de
Introducere _________________________________________________________________ 2
Introducere _________________________________________________________________ 4
Funcii alternative
ADC0
ADC1
ADC2
ADC3
ADC4
ADC5
ADC6
ADC7
CMSR0
CMSR1
CMSR2
CMSR3
CMSR4
CMSR5
CMT0
CMT1
XTAL1
XTAL2
35
34
EA
PSEN
ALE
49
47
48
PWM0
PWM1
4
5
AV SS
AV DD
AV REF+
AV REF-
60
61
59
58
STADC
Port 5
Port 6
0
1
2
3
4
5
6
7
1
68
67
66
65
64
63
62
0
1
2
3
4
5
6
7
7
8
9
10
11
12
13
14
RST
EW
15
6
57
56
55
54
53
52
51
50
0
1
2
3
4
5
6
7
16
17
18
19
20
21
22
23
0
1
2
3
4
5
6
7
39
40
41
42
43
44
45
46
0
1
2
3
4
5
6
7
24
25
26
27
28
29
30
31
0
1
2
3
4
5
6
7
Port 0
AD0
AD1
AD2
Magistral
AD3
date i
AD4
adrese
AD5
AD6
AD7
Port 1
CT0I
CT1I
CT2I
CT3I
T2
RT2
SCL
SCA
Port 2
A8
A9
A10 Magistral
A11
date i
A12
adrese
A13
A14
A15
Port 3
RXD/DATA
TXD/CLOCK
INT0
INT1
T0
T1
WR
RD
Timere
T0 i T1
Procesor
Memorie
program
8k8
Nucleu
8051
Memorie Modulator
date
n
2568
impulsuri
Convertor Interfa
analog
serial
numeric
sincron
Magistral
intern
16
Porturi
I/ O
P0-P3
Interfa
serial
asincron
P0 P3
TX
RX
Porturi
I/ O
P4-P5
5 registre
captur
P5 P4
CT0I-CT3I
16
Timer
T2
3 registre
comparare
Timer T3
Watchdog
EW
d) Registrul de stare
Acest registru de 8 bii conine informaii referitoare
programului. Structura sa este prezentat n tabelul 1.1.
PSW (D0h)
CY
AC
F0
RS1
RS0
OV
F1
P
CY
AC
F0
RS1
RS0
Indicator transport (carry).
Indicator transport auxiliar (pentru operaiile BCD).
Indicator utilizator 0 (de uz general).
Bii selectare banc registre de lucru:
RS1
RS0
Banc registre selectat
0
0
Banc 0 (00h 07h)
0
1
Banc 1 (08h 0Fh)
1
0
Banc 2 (10h 17h)
1
1
Banc 3 (18h 1Fh)
Indicator depire.
Indicator utilizator (de uz general).
Indicator paritate acumulator.
OV
la
starea
Tabelul 1.1
F1
P
EN51
STA
ST0
SI
AA
CR1
CR0
S1CON Registru control I 2 C
D8h
CY
AC
F0
RS1 RS0
OV
F1
P
PSW
Registru stare program
D0h
CTH3
Registru captur 3
CFh
CTH2
Registru captur 2
CEh
CTH1
Registru captur 1
CDh
CTH0
Registru captur 0
CCh
CMH2
Registru comparare 2
CBh
CMH1
Registru comparare 1
CAh
CMH0
Registru comparare 0
C9h
TM2IR Registru ntreruperi T2
C8h T2OV CMI2 CMI1 CMI0 CTI3 CTI2 CTI1 CTI0
ADCH
Registru convertor A/D
C6h
ADCON Registru control ADC
C5h ADC.1 ADC.0 ADEX ADCI ADCS AADR2 AADR1 AADR0
P5
Port 5
C4h ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0
P4
Port 4
C0h CMT1 CMT0 CMSR5 CMSR4 CMSR3 CMSR2 CMSR1 CMSR0
PAD
PS1
PS0
PT1
PX1
PT0
PX0
IP0
Registru prioriti 0
B8h
RD
WR
T1
T0
TXD
RXD
P3
INT1
INT0
Port 3
B0h
CTL3
Registru captur 3
AFh
CTL2
Registru captur 2
AEh
CTL1
Registru captur 1
ADh
CTL0
Registru captur 0
ACh
CML2
Registru comparare 2
ABh
CML1
Registru comparare 1
AAh
CML0
Registru comparare 0
A9h
EA
EAD ES1 ES0 ET1 EX1 ET0 EX0
IEN0
Validare ntreruperi 0
A8h
P2
Port 2
A0h P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0
S0BUF Registru buffer UART
99h
SM0 SM1 SM2 REN TB8 RB8
T1
R1
S0CON Registru control UART
98h
SDA SCL RT2
T2 CT3I CT2I CT1I CT01
P1
Port 1
90h
TH1
Registru T1
8Dh
TH0
Registru T0
8Ch
TL1
Registru T1
8Bh
TL0
Registru T0
8Ah
M1
M0 GATE C/T
M1
M0
TMOD
Registru mod T0 i T1
89h GATE C/T
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
TCON
Registru control T0 i T1
88h
Registre aritmetice
Timere/Numrtoare
Indicatori
Control
captur
T2
(CTCON),
registru
ntreruperi
T2
(TM2IR),
captur
0
(CTL0
i
Modulatorul de impulsuri n durat
CTH0), captur 1 (CTL1 i CTH1), captur 2
Prescaler PWM, registru PWM0, registru PWM1
(CTL2 i CTH2), captur 3 (CTL3 i CTH3),
Sistemul de ntreruperi
comparare 0 (CML0 i CMH0), comparare 1
Registru prioriti 0 (IP0), registru prioriti 1 (CML1 i CMH1), comparare 2 (CML2 i CMH2),
(IP1), validare ntreruperi 0 (IEN0), validare comutare/validare registre comparare T2 (RTE),
ntreruperi 1 (IEN1)
setare registre comparare T2 (STE)
Convertorul analog/numeric
Interfee seriale
Registru convertor A/D (ADCH), control ADC Registru control UART (S0CON), buffer UART
(ADCON)
(S0BUF), registru control I 2 C (S1CON), date
I 2 C (S1DAT), registru stare I 2 C (S1STA), adres
Control consum energie
slave I 2 C (S1ADR)
Registru control consum (PCON)
registrelor R0 sau R1. Memoria extern este adresat fie prin registrele R0 i
R1 (caz n care blocul maxim de memorie este de 256 octei), fie prin
registrul DPTR (caz n care capacitatea de adresare este de 64 kB).
Adresarea imediat este folosit pentru ncrcarea de constante
numerice ca parte a instruciunii din memoria program.
Adresarea cu registru de baz i index este folosit pentru lucrul cu
tabele de conversie, tabele de salturi etc. Pentru aceasta este folosit ca
registru de baz DPTR sau PC, registrul index fiind acumulatorul.
Instruciunile familiei 8xC552 sunt optimizate att din punct de vedere al
lungimii codului (49 de instruciuni pe un octet, 45 pe doi octei i 17 pe trei
octei), ct i al timpului de execuie (64 de instruciuni sunt executate
ntr-un ciclu main, 45 n dou cicluri main i dou n 4 cicluri main).
Cele 111 instruciuni se pot clasifica n patru grupe funcionale:
a) transfer de date;
b) instruciuni aritmetice;
c) instruciuni logice;
d) controlul programului.
a)
Transferul de date
PUSH
POP
MOVX
MOVC
realizeaz
transferul
unui
octet
ntre
memoria
program
b)
Instruciuni aritmetice
n acumulator.
ADDC - adun acumulatorul cu operandul surs i bitul C. Rezultatul este
returnat n acumulator.
DA realizeaz o corecie a adunrii n situaia lucrului cu numere
codificate BCD.
Scdere:
DEC scade 1 din operandul surs. Rezultatul este returnat n operand.
returnat n acumulator.
nmulire:
MUL realizeaz o nmulire fr semn ntre registrele A i B. Rezultatul
este returnat n registrele A (octetul mai puin semnificativ) i B (octetul
mai semnificativ).
mprire:
DIV realizeaz o mprire fr semn ntre registrele A i B. Ctul
rezultatului este pstrat n registrul A iar restul mpririi n B.
c)
Instruciuni logice
CPL
RL
RR
nmulire cu 2.
rotete la dreapta coninutul acumulatorului. Este echivalent cu o
RLC
mprire cu 2.
rotete la stnga coninutul acumulatorului prin intermediul bitului C
RRC
SWAP
ANL
ORL
primul operand.
execut o operaie SAU ntre doi operanzi. Rezultatul este returnat
XRL
n primul operand.
execut o operaie SAU exclusiv ntre doi operanzi. Rezultatul este
returnat n primul operand.
d)
Controlul programului.
Instruciunile
pentru
controlul
programului
determin,
uneori
concomitent cu ndeplinirea unei condiii, executarea nesecvenial a
instruciunilor din program.
Exist trei clase de astfel de instruciuni: apel necondiionat la subrutin,
ntoarcere din subrutin i salt; salturi condiionale; revenire din ntrerupere.
Apeluri i salturi necondiionate:
ACALL memoreaz urmtoarea adres n stiv, incrementeaz SP cu 2
i apoi transfer controlul adresei de salt; ACALL poate fi utilizat pentru
JMP
fa de adresa curent.
JNZ execut salt dac acumulatorul este diferit de zero. Saltul este
adresa curent.
JNC execut salt dac bitul C este 0. Saltul este relativ fa de
adresa curent.
JB
execut salt dac bitul operandului este 1. Saltul este relativ
fa de adresa curent.
JNB execut salt dac bitul operandului este 0. Saltul este relativ
fa de adresa curent.
CJNE compar primul operand cu al doilea i execut salt dac nu
sunt egali.
DJNZ decrementeaz operandul surs i execut salt dac rezultatul
procedur nu trebuie aplicat dect dac portul a fost folosit ca port de ieire,
ntruct iniial, dup RESET , toate registrele porturilor P0-P4 sunt ncrcate cu
FFh.
Citire
Bus
Scriere
Adres/Date
Control
D
Q
Registru
P0.X
CK Q
V DD
Citire
Pin
P0.X
V DD
Bus
D
Q
Registru
P1.X
CK Q
Scriere
MUX
Pin citire
Pin citire
Funcie alternativ
Citire
Citire
Funcie alternativ
Bus
Scriere
D
Q
Registru
P1.X
CK Q
X=6;7
Pin
P1.X
Bus
Scriere
Pin citire
Funcie alternativ
Citire
V DD
Funcie alternativ
Pin
P1.X
Control V DD
Adres
D
Q
Registru
P2.X
CK Q
MUX
Pin
P2.X
Pin citire
Citire
Bus
Scriere
Bus
D
Q
Registru
P3.X
CK Q
Pin
P3.X
Scriere
Pin citire
Funcie alternativ
D
Q
Registru
P4.X
CK Q
Pin citire
Bus
Pin citire
Spre ADC
Pin
P4.X
Citirea porturilor, aa cum se observ i din figura 1.3. poate fi fcut fie
citind direct pinul, fie citind bistabilul portului respectiv. Selectarea modului
de citire este fcut automat de unitatea central, funcie de instruciune.
Funciile alternative ale porturilor sunt descrise n figura 1.1 i tabelul
1.4, detalii suplimentare despre acestea gsindu-se la descrierea modulelor
interne.
Tabelul 1.4
CT0I
CT1I
CT2I
CT3I
T2
RT2
SCL
SDA
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7
P1.0
P1.1
Magistral multiplexat date i P1.2
(octetul
mai
puin P1.3
adrese
pe
durata P1.4
semnificativ)
P1.5
accesului la memoria extern
P1.6
P1.7
P2.0
P2.1
P2.2
P2.3
P2.4
P2.5
P2.6
P2.7
A9
A9
A10
A11
A12
A13
A14
A15
P3.0 RXD
P3.1 TXD
P3.2 INT0
Magistral de adrese (octetul
P3.3 INT1
mai semnificativ) pe durata P3.4
T0
accesului la memoria extern
T1
P3.5
P3.6
WR
P3.7
RD
P4.0
P4.1
P4.2
P4.3
P4.4
P4.5
P4.6
P4.7
CMSR0
CMSR1
CMSR2
CMSR3
CMSR4
CMSR5
CMT0
CMT1
Comparare cu timer
setri/resetri ieiri
T2
Comparare cu
comutri ieiri
T2
timer
P5.0
P5.1
i P5.2
P5.3
P5.4
P5.5
i P5.6
P5.7
ADC0
ADC1
ADC2
ADC3 Opt intrri analogice pentru
ADC4 convertorul analog numeric
ADC5
ADC5
ADC5
PWM0
Comparator
1/2
f OSC
Prescaler
>>
PWM0
Numrtor
Comparator
>>
PWM1
PWM1
Multiplexor
analogic
Registru
DAC aproximaii
succesive
0 1 2 3 4 5 6 7
ADCON
STADC
V REF+
V REF
AVDD
AVSS
0 1 2 3 4 5 6 7
ADCH
Magistral intern
Rezultatul
conversiei
este
regsit
registrul
ADCH
(biii
mai
semnificativi), ultimii doi bii fiind citii din registrul ADCON (ADC . 1 i ADC.0).
Ct timp o conversie este n curs (ADCI i ADCS diferite de zero), un
semnal extern STADC sau o comand software nu este luat n consideraie i
nu este iniializat o nou conversie.
VADC = 1024
VIN VREF
VREF+ VREF
1.7. Timere/Numrtoare
Familia 8xC552 dispune de patru timere: timerele T0 i T1 sunt identice
cu cele din 8051, T2 este un timer de 16 bii cu faciliti suplimentare iar T3
este un timer de 8 bii pentru resetarea programului controlerului.
Timerele 0 i 1 constau n dou numrtoare de 16 bii i pot ndeplini
urmtoarele funcii:
msurarea unor intervale de timp;
numrarea unor evenimente;
generarea unor cereri de ntrerupere.
Configurat ca timer, contorul este incrementat la fiecare ciclu main (la
fiecare microsecund pentru oscilator de 12 MHz). Astfel, timpul poate fi
msurat n uniti de cicluri main.
Configurat ca numrtor, contorul este incrementat la fiecare tranziie
10 a semnalului de pe pinul de intrare corespunztor. Deoarece o
recunoatere a unei tranziii dureaz dou cicluri main, frecvena maxim
de numrare este de 500 kHz (pentru oscilator de 12 MHz).
Fa de aceste moduri, timerele T0 i T1 mai au patru moduri de
funcionare, de la MOD0 la MOD3.
1.7.4
Modul 3
n acest mod, timerul T0 funcioneaz ca dou registre separate, TL0 i
TH0, fiecare a cte 8 bii. Registrul TL0 este controlat de biii standard ai
timerulului T0 iar registrul TH0 de biii timerului T1, inclusiv ntreruperea
timerului T1.
Modul 3 este adoptat dac este necesar un timer suplimentar. n aceast
situaia T0 lucreaz ca dou timere independente iar T1 poate funciona, de
exemplu, ca generator de rat de transmisie sau n orice alt aplicaie care nu
necesit o ntrerupere.
Configuraia intern a timerelor T0 i T1 n cele patru moduri de
funcionare se prezint n figura 1.6.
OSC M12
C/T=0
C/T=1
TLn
(5/8 bii)
THn
(8 bii)
Pin INTn
GATEn
TFn ntrerupere
Pin Tn
TRn
GATEn
TRn
Pin Tn
ntrerupere
Pin INTn
TFn
TLn
(8 bii)
C/T=1
C/T=0
M12 OSC
a),b) Modul 0 i 1
THn
(8 bii)
OSC M12
Pin T0
TR0
GATE0
Rencrcare
c) Modul 2
TL0
(8 bii)
TF0 ntrerupere
TH0
(8 bii)
TF1
Pin INT0
TR1
ntrerupere
d) Modul 3
(TM2CON.7).
Indicatorii
setai
de
depire
trebuie
teri
prin
CTI1
CT0
=
CM0(s)
Stop
f OSC M12
T2
RT2
T2ER
CT1
Int
=
CM1(r)
CT3I Int
CTI3
CT2
Int
CT3
Int
CM2(k)
Int
Prescaler
Int
TML2 TMH2
f OSC /12
Divizor
11 bii
tergere
Timer T3
ncrcare
Bufer
RST
Reset
Scriere
tergere
WLE
Oprit
PCON
ncrcare
EW
SM0
SM1
SM2
SM2
REN
TB8
RB8
TI
RI
REN
TB8
Descriere
RB8
T1
Tabelul 1.8
R1
Vitez de transmisie
0
0
0 Registru de deplasare fOSC/12
0
1
1 UART de 8 bii
Variabil
1
0
2 UART de 9 bii
fOSC/32 sau fOSC/64
1
1
3 UART de 9 bii
Variabil
Folosit pentru comunicarea multiprocesor n modurile 2 i 3. Dac este setat, RI nu va fi
activat dac bitul 8 de date nu este 0 logic. n modul 1 condiioneaz RI de primirea unui
bit valid de stop. n modul 0 trebuie ters.
Validarea recepiei seriale. Se poate seta prin program pentru a activa sau dezactiva recepia
serial.
Bitul 9 de date transmis n modul 2 sau 3. Este setat sau ters prin program de regul,
funcie de bitul de paritate.
Bitul 9 de date recepionat n modul 2 sau 3. n modul 1, dac SM2=0, constituie bitul de
stop. n modul 0 nu este folosit.
Indicator ntrerupere transmisie. Este setat automat la terminarea mesajului. Trebuie ters
prin program.
Indicator ntrerupere recepie. Este setat automat la recepionarea unui mesaj. Trebuie ters
prin program
Selectare mod lucru:
1.9.1
Interfaa serial SIO0 n modul 0
n acest mod interfaa este capabil s transmit sau s recepioneze
mesaje de 8 bii (mai nti bitul mai puin semnificativ), la o vitez de
transmisie egal cu f OSC /12.
Datele seriale sunt recepionate sau transmise numai de pinul RXD, TXD
fiind folosit pentru semnalul de ceas.
S0BUF
Detector zero
STOP
START
SMOD=1
M16
SMOD=0
M2
Detector
10
TXD
SHIFT
DATA
Control emisie
CL
CL
START
TI
RI
SEND
ntrerupere S0
LOAD
S0BUF
Control recepie
1FFH SHIFT
Detector
majoritar
RXD
Registru deplasare
9 bii
S0BUF
recepiei c a fost primit ultimul bit, ncarc S0BUF i RB8 i seteaz RI.
Octetul recepionat este disponibil dac sunt ndeplinite fiecare din
urmtoarele dou condiii: indicatorul RI ters i SM2=0 sau bitul de stop=1.
1.9.3
Interfaa serial SIO0 n modul 2
n modul 2 sunt emii 11 bii prin intermediul TXD sau recepionai de
RXD: un bit de start, 8 bii de date, un bit programabil (bitul 9 de regul bit
de paritate) i un bit de stop. La emisie, bitul 9 poate fi programat prin
S0CON.3 (TB8). La recepie, bitul 9 este regsit n S0CON.2 (RB8). Viteza de
transmisie este selectabil acceptnd una din valorile f OSC /32 sau f OSC /64.
Structura intern este asemntoare cu cea din figura 1.9; diferena este
dat de existena unei surse suplimentare pentru generarea ratei de
transmisie.
Transmisia este activat de scrierea registrului S0BUF. Scrierea n S0BUF
ncarc TB8 n bitul 9 al registrului de deplasare i semnaleaz blocului de
control al transmisiei c este solicitat o emisie. Transmisia ncepe activarea
semnalului SEND care emite bitul de start. Dup emiterea primului bit i
translatarea spre dreapta a coninutului registrului de deplasare, pe poziia
bitului cel mai semnificativ este introdus 1. Ulterior, deplasarea celorlali bii
produce introducerea unor bii 0, astfel c, n momentul n care TB8 a ajuns
n poziia de emisie din registrul de deplasare, este urmat de bitul de stop
(setat pe 1), restul biilor din registru fiind teri. Aceast condiie este
detectat de blocul de control al emisiei i i semnaleaz c mai are de emis
un bit, dup care dezactiveaz SEND i seteaz indicatorul ntreruperii la
transmisie TI.
Recepia este iniiat de o tranziie 10 a semnalului RXD. Pentru a
asigura sincronizarea cu fluxul de date, iniierea recepiei produce o resetare
imediat a timerului T1. De asemenea, registrul de serializare pentru recepie
este ncrcat cu 1FFh.
Cnd bitul de start, deplasat succesiv, ajunge n registrul de deplasare
pe poziia limit stnga (al noulea bit), se semnaleaz blocului de control al
recepiei c a fost primit ultimul bit, ncarc S0BUF i RB8 i seteaz RI.
Octetul recepionat este disponibil dac sunt ndeplinite fiecare din
urmtoarele dou condiii: indicatorul RI ters i SM2=0 sau bitul de stop=1.
1.9.4
Interfaa serial SIO0 n modul 3
n modul 3 sunt emii 11 bii prin intermediul TXD sau recepionai de
RXD: un bit de start, 8 bii de date, un bit programabil (bitul 9 de regul bit
de paritate) i un bit de stop. La emisie, bitul 9 poate fi programat prin
S0CON.3 (TB8). La recepie, bitul 9 este regsit n S0CON.2 (RB8). Viteza de
transmisie este determinat de timerul T1.
1, 3
Vitez
transmisie
1 MHz
375 kHz
187,5 kHz
62.5 kHz
19.2 kHz
9600 Hz
4800 Hz
2400 Hz
1200 Hz
137.5 Hz
110 Hz
110 Hz
Timer 1
f OSC
12
12
12
12
11.059
11.059
11.059
11.059
11.059
11.059
6
12
MHz
MHz
MHz
MHz
MHz
MHz
MHz
MHz
MHz
MHz
MHz
MHz
SMOD
C/T
(PCON.7) (TMOD.6)
X
X
1
X
0
X
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Mod
X
X
X
2
2
2
2
2
2
2
2
1
Valoare
rencrcare
X
X
X
FFh
FDh
FDh
FAh
F4h
E8h
1Dh
72h
FEEBh
Bus I 2 C
SCL
SDA SCL
8XC552
Periferic
I2C
1.10.1
Modul emisie circuit principal
n acest mod, un numr de octei este transmis ctre un circuit
secundar. Registrul S1CON trebuie setat n modul urmtor:
S1CON
Stare I 2 C
18
S-a
emis
SLA+W.
ACK s-a recepionat.
S-a
emis
SLA+W.
20 ACK
nu
s-a
recepionat.
28
S-au emis
nu
30 ACK
recepionat.
datele.
s-a
Rspuns program
Urmtoarea aciune I 2 C
S1DAT
STA STO SI AA
Va fi emis SLA+W. Se va recepiona
ncarc
X
0
0 X
SLA+W
ACK.
Ca
mai sus.
X
0
0 X
ncarc
SLA+W
ncarc
X
0
0 X Se emite SLA+R. SIO1 trece n
SLA+R
modul b).
0
0
0 X Octetul va fi transmis.
ncarc octet
1
0
0 X Va fi transmis START R.
1
0 X Va fi transmis STOP.
Nici o aciune 0
S1DAT
1
1
0 X Va fi transmis STOP urmat de START.
0
0
0 X Octetul va fi transmis.
ncarc octet
1
0
0 X Va fi transmis START R.
1
0 X Va fi transmis STOP.
Nici o aciune 0
S1DAT
1
1
0 X Va fi transmis STOP urmat de START.
0
0
0 X Octetul va fi transmis.
ncarc octet
1
0
0 X Va fi transmis START R.
1
0 X Va fi transmis STOP.
Nici o aciune 0
S1DAT
1
1
0 X Va fi transmis STOP urmat de START.
0
0
0 X Octetul va fi transmis.
ncarc octet
1
0
0 X Va fi transmis START R.
1
0 X Va fi transmis STOP.
Nici o aciune 0
S1DAT
1
1
0 X Va fi transmis STOP urmat de START.
SLA
08
18
28
Urmtoarea transmisie
iniiat cu STAR T R
SLA
10
Ack Stop
20
Ack Stop
Mod
recepie
30
Arbitrarea pierdut i
trece n slave
Ack
Ack
Ack
Ack
Ack
38
68 78 80
Continu
alte
mastere
1.10.2
Modul recepie circuit principal
n acest mod, un numr de octei este recepionat de la un dispozitiv
secundar. Transferul este iniiat ca n modul transmisie circuit principal. Dup
ce a fost emis START, rutina de tratare a ntreruperii trebuie s ncarce n
S1DAT adresa dispozitivului secundar i bitul de direcie ( SLA+R). Bitul SI
trebuie ters de program. Dup emiterea SLA+R i primirea de la circuitul
secundar a confirmrii, indicatorul SI este setat din nou i registrul S1STA
conine o serie de coduri descrise n tabelul 1.10.b.
Cod
Stare I C
S1DAT
STA STO SI AA
ncarc SLA+R
0 X
ncarc SLA+R
ncarc SLA+W
X
X
0
0
0 X
0 X
0 X
0 X
1
0
1
0
1
1
0 X
0 X
0 X
S-a
38 arbitrarea
sau ACK.
40
pierdut
SLA+R Nici o
S1DAT
S-a
emis
SLA+W. Nici o
ACK s-a recepionat. S1DAT
S-a
emis
SLA+W.
Nici o
48 ACK
nu
s-a S1DAT
recepionat.
aciune
aciune
aciune
Tabelul 1.10.b
Urmtoarea aciune I 2 C
Va fi emis SLA+R. Se va recepiona
ACK.
Ca mai sus.
Va fi emis SLA+W. SIO1 comut n
modul a).
Magistrala va fi eliberat. SIO1 va
intra n modul slave neadresat.
Va fi emis start dac magistrala este
liber.
Octetul va fi recepionat. Nu va fi
emis ACK.
Octetul va fi recepionat. Va fi emis
ACK.
Va fi emis START R.
Va fi emis STOP.
Va fi emis STOP urmat de START.
S SLA
08
Ack
40
50
58
Urmtorul transfer
iniiat cu START R
10
Ack Stop
Ack
Ack
Arbitrarea pierdut i
trece n slave
SLA
48
38
Ack
38
Ack
68 78 80
Mod
emisie
Continu
alte
mastere
1.10.3
S-a
recepionat
STOP sau START R
A0
Citete datele
cnd era adresat n
modurile c) sau d)
0 1
0 0
0 1
0 0
0 1
SLA
Ack
60
88
Ack
68
Apel gen.
Ack
70
Datele pierdute nu
sunt confirmate
Arbitrarea pierdut i
trece n slave
A0
80
90
A0
1.10.4
Tabelul 1.10.d
aciune I 2 C
emis. ACK va fi
va fi recepionat.
emis.
ACK
va
fi
va fi recepionat.
emis.
ACK
va
va fi recepionat
fi
SLA
n timpul ultimului
octet emis trece n mod
slave neadresat
Ack
A8
C0
Ack
B0
Ack 11 Stp/S
C8
1.10.5
Alte stri
Cu excepia strilor a)d), registrul S1STA mai poate defini dou
ipostaze ale interfeei I 2 C, prezentate n tabelul 1.10.e.
Tabelul 1.10.e
S1DAT
STA STO SI AA
Stare I 2 C
Urmtoarea aciune I 2 C
Nici
o
informaie
SIO1
este
n
ateptare
sau
Nici o aciune S1DAT i S1CON
F8
pertinent. SI=0.
realizeaz un transfer.
n toate cazurile magistrala este
Nici o aciune
00 Eroare magistral
eliberat i SIO1 trece n modul
0
1
0
X
S1DAT
slave neadresat.
Cod
SAU LOGIC
ntre
PAD
Prioritate ntrerupere convertor analog/numeric.
PS1
Prioritate ntrerupere interfa serial SIO1.
PS0
Prioritate ntrerupere interfa serial SIO0.
PT1
Prioritate ntrerupere depire timer T1.
PX1
Prioritate ntrerupere extern 1.
PT0
Prioritate ntrerupere depire timer T0.
PX0
Prioritate ntrerupere extern 0.
PT2
PCM2
PCM1
PCM0
PCT3
PCT2
PCT1
PCT0
IEN1 (E8h)
PT2
Prioritate ntrerupere depire timer T2.
PCM2
Prioritate ntrerupere comparator 2.
PCM1
Prioritate ntrerupere comparator 1.
PCM0
Prioritate ntrerupere comparator 0.
PCT3
Prioritate ntrerupere captur 3.
PCT2
Prioritate ntrerupere captur 2.
PCT1
Prioritate ntrerupere captur 1.
PCT0
Prioritate ntrerupere captur 0.
WLE
GF1
GF0
PD
IDL
PCON (87h)
SMOD
Folosit de SIO0. Dac este setat dubleaz viteza de transmisie n modurile 1, 2 i 3.
WLE
Validare timer T3.
GF1, GF0 Indicator de uz general
PD
IDL
Dac este setat, controlerul intr n modul de lucru POWER-DOWN. Este condiionat de
semnalul extern EW.
Dac este setat, controlerul intr n modul de lucru IDLE.
1.12.1
Modul inactiv
n acest mod rmn active: timerele T0, T1 i T3, interfeele externe
SIO0 i SIO1, precum i ntreruperile externe 0 i 1.
Registrele stiv, acumulator, contor program, celelalte registre interne i
memoria RAM i pstreaz coninutul.
Ieirea din acest mod este posibil prin dou metode:
orice ntrerupere provoac tergerea bitului IDL (PCON.0) ieind astfel din
acest mod. ntreruperea va fi servit iar urmtoarea instruciune dup
RETI va readuce contorul program la valoarea iniial naintea intrrii n
modul economic.
modul inactiv poate fi dezactivat printr-un reset.
1.12.2
Modul oprit
n acest mod, oscilatorul circuitului este oprit i toate modulele interne
sunt blocate. Memoria RAM intern, inclusiv registrele speciale, i pstreaz
valoarea dinainte. Pentru o reducere de consum mai important, este posibil
i reducerea tensiunii de alimentare pn la o valoare la care memoria RAM
i mai menine coninutul.
Ieirea din acest mod se poate face numai printr-o iniializare extern.
100
101
102
103
104
105
106
107
108
111
112
113
114
115
116
117
A0/P1.0
A1/P1.1
A2/P1.2
A3/P1.3
A4/P1.4
A5/P1.5
A6/P1.6
A7/P1.7
A8/P1.8
A9/P1.9
A10/P1.10
A11/P1.11
CC24IO/A12/P1.12
CC25IO/A13/P1.13
CC26IO/A14/P1.14
CC27IO/A15/P1.15
118
119
120
121
122
123
124
125
128
129
130
131
132
133
134
135
47
48
49
50
51
52
53
54
57
58
59
60
61
62
63
64
P4.0/A16
P4.1/A17
P4.2/A18
P4.3/A19
P4.4/A20
P4.5/A21
P4.6/A22
P4.7/A23
85
86
87
88
89
90
91
92
65
66
67
68
69
70
73
74
75
76
77
78
79
80
81
P3.0/T0IN
P3.1/T6OUT
P3.2/CAPIN
P3.3/T3OUT
P3.4/T4EUD
P3.5/T4IN
P3.6/T3IN
P3.7/T2IN
P3.8/MRST
P3.9/MTSR
P3.10/TXD0
P3.11/RXD0
P3.12/BHE/WRH
P3.13/SCLK
P3.15/CLKOUT
27
28
29
30
31
32
33
34
35
36
39
40
41
42
43
44
P5.0/AN0
P5.1/AN1
P5.2/AN2
P5.3/AN3
P5.4/AN4
P5.5/AN5
P5.6/AN6
P5.7/AN7
P5.8/AN8
P5.9/AN9
P5.10/AN10/T6EUD
P5.11/AN11/T5EUD
P5.12/AN12/T6IN
P5.13/AN13/T5IN
P5.14/AN14/T4EUD
P5.15/AN15/T2EUD
1
2
3
4
5
6
7
8
P6.0/CS0
P6.1/CS1
P6.2/CS2
P6.3/CS3
P6.4/CS4
P6.5/HOLD
P6.6/HLDA
P6.7/BREQ
19
20
21
22
23
24
25
26
P7.0/POUT0
P7.1/POUT1
P7.2/POUT2
P7.3/POUT3
P7.4/CC28IO
P7.5/CC29IO
P7.6/CC30IO
P7.7/CC31IO
9
10
11
12
13
14
15
16
P8.0/CC16IO
P8.1/CC17IO
P8.2/CC18IO
P8.3/CC19IO
P8.4/CC20IO
P8.5/CC21IO
P8.6/CC22IO
P8.7/CC23IO
RD
WR/WRL
READY
ALE
EA
XTAL2
XTAL1
RSTIN
RSTOUT
NMI
CC0IO/P2.0
CC1IO/P2.1
CC2IO/P2.2
CC3IO/P2.3
CC4IO/P2.4
CC5IO/P2.5
CC6IO/P2.6
CC7IO/P2.7
EX0IN/CC8IO/P2.8
EX1IN/CC9IO/P2.9
EX2IN/CC10IO/P2.10
EX3IN/CC11IO/P2.11
EX4IN/CC12IO/P2.12
EX5IN/CC13IO/P2.13
EX6IN/CC14IO/P2.14
T7IN/EX7IN/CC15IO/P2.15
95
96
97
98
99
137
138
140
141
142
AD0/P0.0
AD1/P0.1
AD2/P0.2
AD3/P0.3
AD4/P0.4
AD5/P0.5
AD6/P0.6
AD7/P0.7
AD8/P0.8
AD9/P0.9
AD10/P0.10
AD11/P0.11
AD12/P0.12
AD13/P0.13
AD14/P0.14
AD15/P0.15
80C167
ROM
intern
Unitate central
16
16
16
PEC
Port 6
T3
T4
GPT2
T5
T6
16
BRG
T7
T8
T0
T1
Port 8
PWM
CAPCOM1
SSC
T2
Port 5
8
ASC0
CAPCOM2
GPT1
Convertor A/N
10 bii
Port 0
Port 1
Controler magistral
extern
Port 4
16
Watchdog
Controler ntreruperi
Osc
16
RAM
intern
16
16
BRG
Port 3
15
Port 7
Port 8
8
FFFFFF
Pagina date
1023
Z ona
RA M/ SFR
00FFFF
00F000
FF0000
Pagina date 3
Segment
254
FE0000
Memorie
extern
030000
Segment
2
Segment
1
Segment
0
Pagina date 0
000000
Spaiu adresare
Pagina date 2
008000
Pagina date 1
020000
010000
Pagina date 3
00C000
Memorie
R OM
intern
004000
Pagina date 0
000000
Segment sistem
00FFFF
00FFFF
Z ona SFR
00F000
00FE00
Pagina date 3
00C000
Memorie
extern
RA M intern
Pagina date 2
008000
00F600
Pagina date 1
Memorie
R OM
intern
R ezervat
004000
00F200
Pagina date 0
Z ona E SFR
000000
Segment sistem
00F000
a)
Stiva sistem
Tabelul 1.14
Adres stiv
00FBFE-00FA00 (implicit)
00FBFE-00FB00
00FBFE-00FB80
00FBFE-00FBC0
00FBFE-00F800
00FDFE-00F600
Stiva sistem mai are dou registre speciale STKUN i STKOV utilizate
pentru controlul limitei inferioare, respectiv superioare. Aceste dou registre
pot fi folosite nu numai pentru evitarea distrugerii datelor din stiv, dar
permit i implementarea unei stive circulare.
b)
bloc,
zona
SFR,
este
dispus
memoria
RAM
la
adresele
#4
ODP2,#data16
DP6,#mask,#data8
DP1H.7
T8REL,R2
Adres
FF98h
FFA0h
FEA0h
F0A0h E
FE18h
FE1Ah
FE1Ch
FE1Eh
FF9Ah
FF0Ch
FF14h
FF16h
FF18h
FF1Ah
FE4Ah
FE80h
FF78h
FE82h
FF7Ah
FE84h
FF7Ch
FE86h
FF7Eh
FE88h
FF80h
FE8Ah
FF82h
FE8Ch
FF84h
FE8Eh
FF86h
FE90h
FF88h
FE92h
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Registru
Tabelul 1.15
Descriere
control sfrit conversie ADC
control convertor ADC
rezultat convertor ADC
2 rezultat convertor ADC
1 selectare adres
2 selectare adres
3 selectare adres
4 selectare adres
control ntrerupere convertor ADC
0 configurare bus
1 configurare bus
2 configurare bus
3 configurare bus
4 configurare bus
timer 2 captur/rencrcare
CAPCOM 0
control ntrerupere CAPCOM 0
CAPCOM 1
control ntrerupere CAPCOM 1
CAPCOM 2
control ntrerupere CAPCOM 2
CAPCOM 3
control ntrerupere CAPCOM 3
CAPCOM 4
control ntrerupere CAPCOM 4
CAPCOM 5
control ntrerupere CAPCOM 5
CAPCOM 6
control ntrerupere CAPCOM 6
CAPCOM 7
control ntrerupere CAPCOM 7
CAPCOM 8
control ntrerupere CAPCOM 8
CAPCOM 9
e)
Memoria extern
1 MB cu A19A16 pe P4 i A15A0 pe P1
sau P0;
16 MB cu A23A16 pe P4 i A15A0 pe
P1 sau P0.
ROM
BUSCON0
BUSCON1
BUSCON2
BUSCON3
BUSCON4
DPP0
DPP1
DPP2
DPP3
MDH
MDL
Mul/div
Mascare
Unitate
aritmetic
Reg.depls.
Indic. context
CP
R15
Registre
uz
general
RAM
2 kB
R0
ADDRSEL1
ADDRSEL2
ADDRSEL3
ADDRSEL4
CSP
PSW
IP,CSP
acces coduri;
DPP0DPP3
CP
SP,STKUN,STKOV
MDL,MDH,MDC
ZEROS,ONES
1.14.1
Stiva de instruciuni
Deoarece circuitul 80C167 are o stiv cu patru nivele, pn la patru
instruciuni pot fi executate simultan. Aceast facilitate a unitii centrale
asigur un timp de execuie a majoritii instruciunilor ntr-un singur ciclu
main (50 ns pentru frecvena de ceas de 40 MHz).
Cele patru nivele ale stivei de instruciuni au urmtoarele funciuni:
1. FETCH (aducere) n acest nivel este asigurat aducerea instruciunilor,
adresate prin registrele IP i CSP, din memoria intern sau extern, RAM
ori ROM, n unitatea central;
2. DECODE (decodificare) acest nivel asigur decodificarea instruciunilor i,
dac este necesar, este calculat adresa operandului i acesta este
ncrcat. Pentru instruciunile de salt, registrele IP i CSP sunt actualizate
cu valoarea destinaiei saltului. n operaiunile care implic utilizarea stivei
sistem, registrul SP este incrementat sau decrementat.
3.
EXECUTE
b)
SCXT CP,#0FC00h
MOV R0,#data
c)
MOV DPP0,#4
MOV DPP0:0000h,R0
MOV SP,#0FA40h
POP,R0
d)
Controlul ntreruperilor
Modificrile prin program (implicite sau explicite ale registrului PSW) sunt
realizate n ciclul main 3 (execuie). Pstrarea unei viteze ridicate de tratare
a ntreruperilor a condus la necesitatea adoptrii unei timp scurt de reacie a
acestui sistem, astfel nct o cerere de ntrerupere poate fi acceptat n
timpul sau dup instruciunea imediat urmtoare blocrii sistemului de
ntreruperi, ca n exemplul urmtor scris n assembler:
In
I n+1
I n+2
BCLR IEN
BSET IEN
I n+k
I n+k+1
I n+k+2
e)
;revalidare ntreruperi
;instruciune neinteruptibil
;instruciune intreruptibil
Modificarea direciei pinului unui port (intrare sau ieire) devine efectiv
abia dup urmtoarea instruciune. Este obligatoriu ca dup iniializarea unui
port, urmtoarea comand s nu se refere la acelai port, ca n exemplul
urmtor scris n assembler:
Eronat:
In
I n+1
BSET DP7.5
BSET P7.0
BSET DP7.5
NOP
BSET P7.0
Corect:
In
In+1
In+2
f)
ncrcare instruciune
Instruciune 16 bii
Instruciune 32 bii
100
100
300
400
100
200
150
300
Tabelul 1.16
Operand 16 bii
Citire
Scriere
100
0/50
0
100
100
150
150
1.14.3
Registrele speciale ale unitii centrale
Unitatea central necesit un set de registre speciale utilizate pentru
pstrarea informaiilor referitoare la starea sistemului, controlul sistemului i
configurarea magistralelor, segmentarea memoriei program, utilizarea
paginilor de memorie de date, asigurarea unitii aritmetice (ALU) cu
constante de uz general sau operanzi pentru nmulire ori mprire, precum i
accesul la registrele de uz general i la stiva sistem.
Accesul la registrele SFR ale unitii centrale se face simplu, prin orice
instruciune capabil s adreseze spaiul de memorie al SFR. Totui, pentru a
asigura corecta funcionare a circuitului, exist unele restricii, cum ar fi:
indicatorul de instruciuni IP i indicatorul segmentului de program CSP
XPER-SHARE
VISIBLE
WRCFG
CLKEN
BYTDIS
ROMEN
STKSZ
SGTDIS
SYSCON
(FF12h)
ROMS1
b)
ILVL
IEN
HLDEN
USR0
MULIP
E
MULIP
USR0
ILVL
HLDEN
PSW
(FF10h)
IEN
Tabelul 1.18
E
c)
IP
Specific adresa curent din interiorul segmentului SEGNR.
IP
CSP
(FE08h)
SEGNR
SEGNR
255
254
F E0 0 00 h
A d re s fizic p e 2 4 /2 0 /1 8 b ii
0 1 0 0 0 0 h
0
0 0 0 0 0 0 h
d)
Aceste patru registre selecteaz patru pagini de date diferite care sunt
active simultan n timpul execuiei programului. Primii 10 bii mai puin
semnificativi selecteaz una din cele 1024 de pagini de 16 kB posibile. Astfel,
DPP permit adresarea ntregii memorii prin pagini de 16 kB fiecare.
Registrele DPP sunt folosite implicit n momentul oricrui acces la
memorie prin intermediul instruciunilor indirecte sau pe 16 bii (fac excepie
instruciunile EXTinse sau transferul de date prin intermediul PEC).
Dup iniializare, cele patru registre sunt setate astfel nct permit
adresarea direct a primelor pagini (3 0) din segmentul 0.
Structura registrelor DPPx este prezentat n tabelul 2.7.
Tabelul 1.20
DPP0
(FE00h)
DPP1
(FE02h)
DPP2
(FE04h)
DPP3
(FE06h)
DPPxPN
DPP0PN
DPP1PN
DPP2PN
DPP3PN
1023
1022
D PP3 11
D PP2 10
D PP1 01
D PP0 00
Acest registru este folosit pentru a selecta zona din memoria RAM
intern alocat pentru cele 16 registre de uz general (GPR).
Structura registrului CP este prezentat n tabelul 2.8.
Tabelul 1.21
CP
(FE10h)
CP
CP
CP
x2
RAM
intern
+
Acces
octet
Acces
cuvnt
GPR
Adresare pe 2 bii pentru unele instruciuni numai primii doi bii ai GPR
sunt folosii pentru o adresare indirect. Modul de calcul al adresei este
identic cu cel pentru adresarea pe 4 bii.
Adresare pe 8 bii (mnemonic reg sau bitoff) dac sunt n domeniul
F0h-FFh, interpreteaz cei 4 bii mai puin semnificativi ca o adres GPR
pe 4 bii, n timp ce ceilali bii mai semnificativi sunt ignorai. Modul de
calcul al adresei este identic cu cel pentru adresarea pe 4 bii. Pentru
acces la nivel de bit, adresa GPR este calculat ca mai sus iar poziia
bitului este specificat de ceilali 4 bii mai semnificativi.
f)
stivei
i,
cazul
care
stivei
i,
cazul
care
Tabelul 1.22
g)
h)
(FF1Ch) are valoarea 00h n timp ce registrul ONES (FF1Eh) are valoarea FFh.
Magistral multiplexat
Magistral demultiplexat
c)
anterior
pe
magistrala
demultiplexat
A drese
A LE
Bus (P0)
A drese
D ate/instr
RD
Bus (P0)
A drese
D ate
WR
a. Magistral multiplexat
Ciclu magistral
A dres (P1)
Segment (P4)
A LE
Bus (P0)
D ate/instr
RD
Bus (P0)
D ate
WR
b. Magistral demultiplexat
D emultiplexat
Inactiv
Multiplexat
A dres (P1)
Segment (P4)
A LE
Bus (P0)
Date/In
Adr.
D ate
A dr
Date/In]
RD
Bus (P0)
D ate
WR
c. Comutarea magistralei demultiplexate n magistral multiplexat
d)
P0L.
Aceast
procedur
elimin
registrele,
bufferele
e)
Rat transfer
(8/16/32 bii)
1.5/3/6
1/2/4
1.5/1.5/3
1/1/2
Necesiti sistem
Linii IO libere
P1
P0H
P1
SALSEL
00
01
10
A23A16
Tabelul 1.24
Spaiu memorie direct adresabil
1 MB
64 kB (minim)
16 MB (maxim)
f)
Linii CS
CS2CS0
CS1CS0
CS4CS0
Observaii
CSREN
0
1
1
0
Tabelul 1.26
Mod de lucru CS
CS selectare adres (mod implicit pentru CS0 )
Semnalele rmn active pe toat durata ciclului EBC. Un semnal CS pentru
adres devine activ sincron cu frontul cztor al semnalului ALE i devine
inactiv la frontul cresctor al ALE.
CS numai la citire
CS numai la scriere
CS la citire/scriere
Aceste semnale rmn active ct timp semnalele de control asociate
(RD/WR, WRL, WRH) sunt active. Acest mod include i o ntrziere
programabil a semnalelor RD/WR.
1.15.2
Caracteristici programabile ale magistralei
Importante caracteristici de sincronizare ale EBC pot fi setate de
programator pentru a simplifica adaptarea la o mare varietate de dispozitive
i configuraii de memorii externe.
Se pot programa urmtorii parametri ai magistralei externe:
lungimea semnalului ALE;
1 15 stri de ateptare;
intervalul n care perifericele sunt n nalt impedan;
timpul de ntrziere a semnalelor de citire/scriere;
controlul semnalului READY.
a)
dup frontul cztor al acestuia este controlat de bitul ALECTL din registrele
BUSCON. Dac bitul ALECTL este setat, ciclurile de acces ale ferestrei
adresate de BUSCON vor avea semnalul ALE prelungit cu jumtate dintr-o
perioad a ceasului sistem (25 ns pentru frecven de ceas de 20 MHz). De
asemenea timpul de meninere a adresei pe magistral dup frontul cztor al
ALE (pe o magistral multiplexat) va fi prelungit cu jumtate dintr-o
perioad a ceasului sistem. Aceast procedur este utilizat pentru a asigura
un timp suplimentar pentru separarea de pe magistral a adresei.
Diagrama de timp a acestui semnal este prezentat n figura 2.10.
Ciclu normal
Ciclu prelungit
Segment
(P4)
A LE
Bus (P0)
A dr.
Date/In
Adr.
Date/In
RD
Bus (P0)
A dr.
D ate
A dr.
D ate
WR
b)
Stri de ateptare
A dr.
Date/Instr
A dr.
D ate
RD
Bus (P0)
WR
Cicluri ateptare
c)
A dr.
Date/Instr
RD
Ciclu ateptare
ntrzierea semnalelor RD i WR
Date/Instr
RD
Bus (P0)
WR
e)
MCTC.3
Semnalul READY sincron asigur cea mai mare vitez, dar necesit
cunoaterea cu exactitate a caracteristicilor circuitului extern, precum i
validarea semnalului CLKOUT pentru a fi folosit n exterior.
Semnalul READY asincron este mai puin restrictiv, dar necesit stri
suplimentare de ateptare datorit sincronizrii interne.
1.15.3
Registrele speciale ale interfeei cu magistrala extern
Funcionarea EBC este controlat de un set de registre speciale. Unii
factori sunt stabilii de registrul SYSCON (prezentat la 1.14.3.a).
de
patru
perechi
de
registre
BUSCON41/ADDRSEL41
permit
CSWEN3
CSREN3
RDYEN3
BUSCON4
(FF1Ah)
CSREN4
RDYEN4
CSWEN
CSREN
RDYEN
BUSACT
ALECTL
BTYP
MTTC
RWDC
MCTC
ADDRSEL1
(FE18h)
ADDRSEL2
(FE1Ah)
ADDRSEL3
(FE1Ch)
ADDRSEL4
(FE1Eh)
RGSAD
RGSZ
RWDC0
RDYEN2
BUSCON3
(FF18h)
RWDC1
CSREN2
BTYP
MCTC1
BTYP
RWDC2
CSWEN2
MCTC2
BTYP
RWDC3
RDYEN1
BUSCON2
(FF16h)
MCTC0
MCTC3
BTYP
RWDC4
CSREN1
MTTC0
CSWEN1
BTYP
MTTC1
BUSCON1
(FF14h)
MTTC2
RDYEN0
MTTC3
MTTC4
BUSCON0
(FF0Ch)
CSWEN4
Tabelul 1.27
MCTC4
0h:
semnalul CS este independent de semnalele de scriere (WR,WRL,WRH);
1h:
semnalul CS este generat pe durata semnalului de scriere.
0h:
semnalul CS este independent de semnalul de citire (RD);
1h:
semnalul CS este generat pe durata semnalului de citire.
Validare intrare READY. Descris la 1.15.2.e)
0h:
magistrala extern dezactivat;
1h:
magistrala extern n domeniul ADDRSEL corespunztor este activat.
Control lungime semnal ALE. Descris la 1.15.2.a)
Configurare magistral extern. Descris la 1.15.1.
Configurare timp ntrziere. Descris la 1.15.2.c)
Control ntrziere semnale RD/WR. Descris la 1.15.2.d)
Numr cicluri ateptare. Descris la 1.15.2.b)
RGSAD
RGSZ
b)
CSSEL
Atenie! EBC este validat ct timp cel puin unul din biii BUSACT ai
BUSCONx este setat.
Portul P1 va genera adresa n interiorul segmentului ct timp unul
din registrele BUSCONx selecteaz un mod demultiplexat, chiar i n
cazul unor cicluri de magistral multiplexate.
Ferestrele de adrese definite de ADDRSEL nu se pot suprapune.
Ferestrele de adrese definite de ADDRSEL se pot suprapune cu
memoria intern dar n acest caz accesul la memorie nu se va face
prin intermediul EBC.
La orice acces n zona intern de memorie, EBC este inactiv.
1.15.4
Starea inactiv a interfeei cu magistrala extern
n timpul modului inactiv al EBC, magistrala extern este definit dup
cum urmeaz:
portul P0 este n nalt impedan;
folosit;
portul P4 (numai pinii utilizai) pstreaz ultima adres a segmentului
folosit;
portul P6 indic semnalele CS corespunztoare adresei;
ALE este n 0
RD/WR sunt n 1
LOGIC ;
LOGIC .
1.15.5
Arbitrarea magistralei externe
n sistemele de mare performan poate fi obligatorie partajarea
resurselor externe, cum ar fi bancurile de memorie, ntre mai multe
controlere. Circuitul 80C167 ofer aceast facilitate prin posibilitatea arbitrrii
accesului la magistrala sa extern i, deci, la dispozitivele sale externe.
Aceast arbitrare a magistralei, permite unui circuit extern principal s
capete controlul EBC prin intermediul semnalului HOLD. 80C167 accept
aceast cerere de magistral, rspunznd cu semnalul HLDA i trecnd liniile
magistralei n nalt impedan. Noul circuit principal va putea adresa acum
Cedarea magistralei
Accesul
la
EBC
este
cerut
prin
sosirea
semnalului
HOLD.
Dup
LOGIC
LOGIC ;
Preluarea magistralei
central
oprete
execuia
1.16.1
Structura sistemului de ntreruperi
Circuitul 80C167 asigur 56 de ntreruperi care pot fi asignate la 16
nivele de ntrerupere.
Pentru a asigura un program modular i compact, fiecare surs de
ntrerupere sau PEC este controlat de un registru de control a ntreruperii i
un vector de ntrerupere. Registrul de control conine indicatorii de cerere de
ntrerupere i validare a ntreruperii, precum i prioritatea ntreruperii. Fiecare
cerere este activat de un eveniment specific, funcie de modul de operare
ales. Singurele excepii constau n ntreruperile generate de erorile celor dou
interfee seriale; pentru detectarea tipului de eroare produs, este necesar
verificarea registrului de control a interfeei seriale.
Familia 80C167 asigur un sistem de ntreruperi vectorizate, adic pentru
fiecare vector de ntrerupere, sunt rezervate locaii n memorie pentru reset,
excepii sau ntreruperi. n momentul n care survine o cerere de ntrerupere,
unitatea central execut un salt la adresa specificat de vectorul de
ntrerupere, permind o identificare rapid a sursei care a generat-o;
excepiile hardware de tip B mpart ns, acelai vector, pentru identificare
fiind necesar analiza registrului TFR (trap flag register). Pentru ntreruperile
software, vectorul de ntrerupere este specificat n operandul instruciunii (un
numr n domeniul 03Fh).
Locaiile vectorilor constituie o tabel de salturi dispus la sfritul
segmentului sistem. Tabela de salturi permite executarea unor salturi oriunde
n memorie, la adresa rutinelor de tratare a ntreruperilor sau excepiilor.
Intrrile n tabela de salturi sunt dispuse la adresele de nceput ale
segmentului 0. Fiecare intrare ocup dou cuvinte, cu excepia vectorilor
excepiilor hardware i resetului care ocup 4 sau 8 cuvinte. Adresa vectorilor
de ntrerupere rezult din nmulirea cu 4 a numrului excepiei.
Tabelul 2.16 enumer toate cele 56 de ntreruperi sau cereri PEC ale
circuitului 80C167, vectorii asociai i adresele lor, precum i numrul
excepiei. De asemenea, sunt prezentate mnemonicele corespunztoare ale
indicatorilor cerere ntrerupere i validare ntrerupere; mnemonicele sunt
Indicator
cerere
CC0IR
CC1IR
CC2IR
CC3IR
CC4IR
CC5IR
CC6IR
CC7IR
CC8IR
CC9IR
CC10IR
CC11IR
CC12IR
CC13IR
CC14IR
CC15IR
CC16IR
CC17IR
CC18IR
CC19IR
CC20IR
CC21IR
CC22IR
CC23IR
CC24IR
CC25IR
CC26IR
CC27IR
CC28IR
CC29IR
CC30IR
CC31IR
T0IR
T1IR
T2IR
T3IR
T4IR
T5IR
T6IR
T7IR
T8IR
CRIR
ADCIR
ADEIR
S0TIR
S0TBIR
S0RIR
S0EIR
SCTIR
Validare
indicator
CC0IE
CC1IE
CC2IE
CC3IE
CC4IE
CC5IE
CC6IE
CC7IE
CC8IE
CC9IE
CC10IE
CC11IE
CC12IE
CC13IE
CC14IE
CC15IE
CC16IE
CC17IE
CC18IE
CC19IE
CC20IE
CC21IE
CC22IE
CC23IE
CC24IE
CC25IE
CC26IE
CC27IE
CC28IE
CC29IE
CC30IE
CC31IE
T0IE
T1IE
T2IE
T3IE
T4IE
T5IE
T6IE
T7IE
T8IE
CRIE
ADCIE
ADEIE
S0TIE
S0TBIE
S0RIE
S0EIE
SCTIE
Vector
ntrerupere
CC0INT
CC1INT
CC2INT
CC3INT
CC4INT
CC5INT
CC6INT
CC7INT
CC8INT
CC9INT
CC10INT
CC11INT
CC12INT
CC13INT
CC14INT
CC15INT
CC16INT
CC17INT
CC18INT
CC19INT
CC20INT
CC21INT
CC22INT
CC23INT
CC24INT
CC25INT
CC26INT
CC27INT
CC28INT
CC29INT
CC30INT
CC31INT
T0INT
T1INT
T2INT
T3INT
T4INT
T5INT
T6INT
T7INT
T8INT
CRINT
ADCINT
ADEINT
S0TINT
S0TBINT
S0RINT
S0EINT
SCTINT
Tabelul 1.29
Adres
Numr
vector
excepie
000040h 10h
000044h 11h
000048h 12h
00004Ch 13h
000050h 14h
000054h 15h
000058h 16h
00005Ch 17h
000060h 18h
000064h 19h
000068h 1Ah
00006Ch 1Bh
000070h 1Ch
000074h 1Dh
000078h 1Eh
00007Ch 1Fh
0000C0h 30h
0000C4h 31h
0000C8h 32h
0000CCh 33h
0000D0h 34h
0000D4h 35h
0000D8h 36h
0000DCh 37h
0000E0h 38h
0000E4h 39h
0000E8h 3Ah
0000ECh 3Bh
0000E0h 3Ch
000110h 44h
000114h 45h
000118h 46h
000080h 20h
000084h 21h
000088h 22h
00008Ch 23h
000090h 24h
000094h 25h
000098h 26h
0000F4h 3Dh
0000F8h 3Eh
00009Ch 27h
0000A0h 28h
0000A4h 29h
0000A8h 2Ah
00011Ch 47h
0000ACh 2Bh
0000B0h 2Ch
0000B4h 2Dh
ILVL
GLVL
GLVL
IR IE
ILVL
0h:
nici o cere de ntrerupere de la modul asociat;
1h:
sursa a emis o cerere de ntrerupere.
0h:
cererea de ntrerupere invalidat;
1h:
cererea de ntrerupere validat.
Nivel prioritate definete nivelul prioritilor pentru arbitrarea cererilor. Are
valori de la Fh (cea mai mare prioritate) pn la 0h (cea mai sczut
prioritate).
Grup prioritate folosit pentru a departaja mai multe ntreruperi simultane
care au aceeai prioritate. Cel mai prioritar este grupul 3 iar cel mai puin
grupul 0.
Tip B
Tip A
RESET
000000h
0h
III
Reset timer watchdog
NMITRAP 000008h
NMI
2h
ntrerupere nemascabil
STOTRAP 000010h
STKOF
II
4h
Depire superioar stiv
STOTRAP 000018h
STKUF
6h
Depire inferioar stiv
Cod nedefinit
UNDOPC
Instruciune protejat cu
PRTFLT
format incorect
BTRAP
000028h
0Ah
I
Acces cuvnt la adres impar ILLOPA
ILLINA
Salt la adres impar
Acces ilegal magistral extern ILLBUS
Rezervat
2Ch3Ch 0Bh0Fh
ILVL
Excepii software (TRAP)
0h1FCh 00h7Fh
(PSW)
1.16.2
INC
BWT
FEC0h
FEC2h
FEC4h
FEC6h
FEC8h
FECAh
FECCh
FECEh
00:
01:
10:
11:
0:
1:
INC
BWT
Tabelul 1.32
PECC0
PECC1
PECC2
PECC3
PECC4
PECC5
PECC6
PECC7
COUNT
1.16.4
Salvarea strii programului pe durata ntreruperii
nainte ca o ntrerupere s fie servit, starea programului curent este
salvat n stiva sistem. Automat, sunt salvate, n ordine, registrele PSW, CSP
(dac este validat segmentarea) i IP.
Nivelul curent al prioritii procesorului este adus la valoarea prioritii
ntreruperii care este servit. Dac este n curs de execuie o nmulire sau
mprire este setat bitul MULIP din registrul PSW. Indicatorul IR al
ntreruperii servite este ters. Registrul IP este ncrcat cu vectorul asociat
ntreruperii iar CSP este ters (dac segmentarea este validat). Registrele
DPP i CP nu sunt afectate.
n momentul executrii instruciunii de ntoarcere din rutina de tratare a
ntreruperii (RETI), informaiile din stiv sunt descrcate n ordine invers:
IP, CSP i PSW.
Programatorul, de regul, trebuie s salveze n rutina de tratare toate
registrele folosite. Normal, aceste registre sunt salvate n stiv la nceperea
rutinei i readuse din stiv nainte de comanda de revenire n programul
principal.
citite din memoria ROM intern, nu se execut accesri ale memoriei externe
i setarea indicatorului de ntrerupere s-a produs n ultima faz a unui ciclu
de instruciune. Dac indicatorul de ntrerupere este setat pe prima faz a
unei instruciuni, timpul de rspuns este de 4 tacte (100 ns pentru procesor la
40 MHz).
n mod similar cu ntreruperile standard, funcie de condiiile specifice
ntlnite n momentul setrii indicatorului de ntrerupere, timpul de rspuns
pentru servirea PEC poate crete, dar nu mai mult de 9 tacte (225 ns pentru
procesor la 40 MHz).
1.16.6
ntreruperile externe
Cu toate c circuitul 80C167 nu are disponibili pini special dedicai
achiziionrii ntreruperilor externe, exist mai multe posibiliti de a
reaciona la evenimente externe asincrone folosind un numr de linii de
intrare-ieire ca intrri de ntreruperi.
Semnalele externe pot fi conectate la:
Pinii CC0IOCC31IO (intrri comparare/ieiri captur) de la modulele
CAPCOM;
Pinii T4IN, T2IN intrri timer;
Funcie de baz
Registru 015 CAPCOM
Registru 1623 CAPCOM
Registru 2427 CAPCOM
Registru 2831 CAPCOM
Intrare timer auxiliar T2
Intrare timer auxiliar T4
Intrare captur banc timere GPT2
Tabelul 1.33
Registru de control
CC0CC15
CC16CC23
CC24CC27
CC28CC31
T2CON
T4CON
T5CON
EXI7E
00:
01:
10:
11:
EXI6E
EXI5E
EXI4E
EXI3E
EXI2E
EXI1E
EXI0E
Excepiile software
Sunt iniiate de instruciunea TRAP care produce un apel prin program la
Excepiile hardware
NMI
STKOF
STKUF
UNDOPC
ILLBUS
ILLINA
ILLOPA
PRTFLT
UNDOPC
STKUF
STKOF
TFR
(FFACh)
NMI
Tabelul 1.35
opt porturi de 8 bii (porturile P0 format din P0L i P0H, P1 format din
P1L i P1H, P4, P6, P7 i P8);
Fiecare linie de port are cel puin o funcie alternativ de intrare sau
ieire asociat.
Dac pentru o anumit linie este folosit o funcie alternativ de ieire,
direcia acestui pin trebuie stabilit ca ieire (DPx.y=1) cu excepia unor
semnale care sunt folosite direct dup iniializare i sunt setate automat.
Altminteri pinul rmne n nalt impedan i nu afecteaz funcia
alternativ. Bistabilul respectivei linii trebuie setat, ntruct ieirea este
trecut printr-o poart I - LOGIC cu linia de ieire a funciei alternative.
Dac pentru o anumit linie este folosit o funcie alternativ de intrare,
direcia acestui pin trebuie stabilit ca intrare (DPx.y=0 implicit dup
iniializare). Totui, dac la pinul respectiv nu este conectat nici un dispozitiv
extern, acesta se poate defini ca ieire. n acest caz, funcia alternativ a
pinului citete valoarea nscris n bistabilul de ieire al portului. Procedura
este util pentru testare.
Programatorul este responsabil pentru definirea direciei majoritii
liniilor de intrare-ieire dac sunt utilizate i funciile alternative. Exist totui
anumite linii care comut automat direcia semnalelor. Ca exemplu poate fi
dat portul P0, utilizat ca magistral multiplexat de interfaa EBC, care
schimb direcia de cteva ori pentru ncrcarea unei instruciuni.
Toate porturile neutilizate pentru funciile alternative sunt disponibile
utilizatorului ca linii de intrare-ieire.
Atenie! Dac porturile sunt utilizate ca ieiri, pentru a preveni tranziii
nedorite, este recomandabil scrierea mai nti a valorii urmat de
setarea direciei portului.
Datorit efectelor stivei de instruciuni, instruciunile care seteaz
pinii unui anumit port nu trebuie s fie succesive.
1.17.1
Portul P0
Cele dou porturi de 8 bii P0L i P0H reprezint jumtatea inferioar,
respectiv superioar a portului P0. Fiecare port de 8 bii poate fi scris
(inclusiv printr-un transfer PEC) fr a afecta cealalt jumtate.
Dac portul este utilizat ca intrare-ieire, direcia fiecrei linii poate fi
configurat prin registrele corespunztoare DP0L i DP0H.
Structura registrelor de control ale portului P0 sunt indicate n tabelul
2.23.
P0H
(FF02h)
DP0L
(F100h)
P0L
(FF00h)
Tabelul 1.36
P0X.y
DP0X.y
DP0H.0
DP0H.1
DP0H.2
DP0H.3
DP0H.4
DP0H.5
DP0H.6
DP0H
(F102h)
DP0H.7
P1H
(FF06h)
DP1L
(F104h)
DP1H
(F106h)
P1X.y
DP1X.y
P1L
(FF04h)
Tabelul 1.37
A15
A14
A13
A12
A11
A10
A9
A8
A7
A6
A5
A4
A3
A2
A1
A0
Magistral
8/16 bii demux.
CC27IO
CC26IO
CC25IO
CC24IO
Intrri captur
CAPCOM2
1.17.3
Portul P2
Acest port este utilizat pentru intrri/ieiri de uz general, pe 16 bii,
direcia fiecrei linii putnd fi selectat din registrul DP2. Fiecare ieire poate
fi comutat n mod push-pull sau dren n gol prin intermediul registrului
ODP2.
Structura registrelor de control ale portului P2 sunt prezentate n tabelul
2.25.
P2.y
DP2.y
ODP2.y
Registrul de date
0h:
linia P2.y
1h:
linia P2.y
0h:
linia P2.y
1h:
linia P2.y
P2.0
DP2.0
ODP2.0
P2.1
DP2.1
ODP2.1
P2.2
DP2.2
ODP2.2
P2.3
DP2.3
ODP2.3
P2.4
DP2.4
ODP2.4
P2.5
DP2.5
ODP2.5
P2.6
DP2.6
ODP2.6
P2.7
DP2.7
ODP2.7
P2.8
DP2.8
ODP2.8
P2.9
DP2.9
ODP2.9
ODP2
(F1C2h)
DP2
(FFC2h)
P2
(FFC0h)
Tabelul 1.38
al portului P2 bitul y.
este intrare;
este ieire.
este ieire push-pull;
este ieire dren n gol.
T7IN
Intrare timer
T7
1.17.4
Portul P3
Acest port este utilizat pentru intrri/ieiri de uz general, pe 15 bii,
direcia fiecrei linii putnd fi selectat din registrul DP3. Majoritatea ieirilor
pot fi comutate n mod push-pull sau dren n gol prin intermediul registrului
ODP3.
Structura registrelor de control ale portului P3 sunt prezentate n tabelul
2.26.
P3.y
DP3.y
ODP3.y
Registrul de date
0h:
linia P3.y
1h:
linia P3.y
0h:
linia P3.y
1h:
linia P3.y
ODP3
(F1C6h)
DP3.12 P3.12
DP3
(FFC6h)
P3
(FFC4h)
DP3.15 P3.15
al portului P3 bitul y.
este intrare;
este ieire.
este ieire push-pull;
este ieire dren n gol.
semnalele
de
CLKOUT
P3.13
P3.12
P3.11
P3.10
P3.9
P3.8
P3.7
P3.6
P3.5
P3.4
P3.3
P3.2
P3.1
P3.0
Port de uz general
SCLK
BHE
RxD0
TxD0
MTSR
MRST
T2IN
T3IN
T4IN
T3EUD
T3OUT
CAPIN
T6OUT
T0IN
WRH
1.17.5
Portul P4
Portul P4 dispune de 8 linii de intrare-ieire comandate prin registrul P4.
Direcia semnalelor este programat prin registrul DP4. Structura celor dou
registre este prezentat n tabelul 2.27.
DP4
(FFCAh)
P4.y
DP4.y
DP3.0 P4.0
DP3.1 P4.1
DP3.2 P4.2
DP3.3 P4.3
DP3.4 P4.4
DP3.5 P4.5
DP3.6 P4.6
P4
(FFC8h)
DP3.7 P4.7
Tabelul 1.40
A17
A16
Memorie
256 k
A19
A18
A17
A16
Memorie
1 M
A23
A22
A21
A20
A19
A18
A17
A16
Memorie
4 M
1.17.6
Portul P5
Acest port dispune de 16 linii numai de intrare. Datele scrise n acest
port sunt pierdute. Modulul nu are bistabile de ieire i nici registru de
direcie. Structura celor registrului de date este prezentat n tabelul 2.28.
P4.0
P4.1
P4.2
P4.3
P4.4
P4.5
P4.6
P5
(FFA2h)
P4.7
Tabelul 1.41
P5.y
AN15
AN14
AN13
AN12
AN11
AN10
AN9
AN8
AN7
AN6
AN5
AN4
AN3
AN2
AN1
AN0
Intrri
convertor ADC
T2EUD
T4EUD
T5IN
T6IN
T5EUD
T6EUD
Intrri
timere
1.17.7
Portul P6
Acest port este utilizat pentru intrri/ieiri de uz general, pe 8 bii,
direcia fiecrei linii putnd fi selectat din registrul DP6. Fiecare ieire poate
fi comutat n mod push-pull sau dren n gol prin intermediul registrului
ODP6. Structura registrelor de control ale portului P6 sunt prezentate n
tabelul 2.29.
DP6
(FFCEh)
ODP6
(F1CEh)
P6.y
DP6.y
P6
(FFCCh)
Tabelul 1.42
0h:
1h:
BREQ
HLDA
HOLD
CS4
CS3
CS2
CS1
CS0
Funcii
alternative
DP7
(FFD2h)
ODP7
(F1D2h)
P7.y
DP7.y
ODP7.y
Registrul de date
0h:
linia P7.y
1h:
linia P7.y
0h:
linia P7.y
1h:
linia P7.y
al portului P7 bitul y.
este intrare;
este ieire.
este ieire push-pull;
este ieire dren n gol.
P7
(FFD0h)
Tabelul 1.43
CC31IO
CC30IO
CC29IO
CC28IO
POUT3
POUT2
POUT1
POUT0
Funcii
alternative
1.17.9
Portul P8
Acest port este utilizat pentru intrri/ieiri de uz general, pe 8 bii,
direcia fiecrei linii putnd fi selectat din registrul DP8. Fiecare ieire poate
fi comutat n mod push-pull sau dren n gol prin intermediul registrului
ODP8. Structura registrelor de control ale portului P8 sunt prezentate n
tabelul 2.31.
DP8
(FFD6h)
ODP8
(F1D6h)
P7.y
DP8.y
ODP8.y
Registrul de date
0h:
linia P8.y
1h:
linia P8.y
0h:
linia P8.y
1h:
linia P8.y
P8
(FFD4h)
Tabelul 1.44
al portului P8 bitul y.
este intrare;
este ieire.
este ieire push-pull;
este ieire dren n gol.
CC23IO
CC22IO
CC21IO
CC20IO
CC19IO
CC18IO
CC17IO
CC16IO
Funcii
alternative
Control
tergere
numrtor
Numrtor
sus/jos PTx
Clock2
Comparator
Control ieire
Bistabil
POUTx
Control
scriere
Registru
durat PWx
1.18.1
Moduri de operare
Modulul PWM dispune de patru moduri de funcionare:
PWM standard:
genereaz impulsuri aliniate pe front;
PWM simetric:
genereaz impulsuri aliniate central;
Salv (burst):
genereaz grupuri de impulsuri;
Impuls singular (single shot): genereaz un singur impuls.
Atenie! Ieirile POUTx sunt trecute printr-o poart SAU - EXCLUSIV cu ieirile
corespunztoare ale portului P7. Setarea liniei respective poate
produce inversarea semnalului.
a)
Modul 0
Modul 0 este selectat prin tergerea bitului PMx din registrul PWMCON1.
LOGIC
ct timp coninutul
numrtorului este mai mare sau egal cu coninutul registrului PWx. Semnalul
este comutat n nivel 0 LOGIC o dat cu iniializarea numrtorului.
n concluzie, perioada de repetiie este dat de relaia:
T PWM Mod0 =[PPx]+1
Factorul de umplere al impulsului generat este programabil ntre 100%
(registrul PWx=0) i 0% (registrul PWx=PPx).
Acest mod este denumit i aliniat pe front ntruct valoarea registrului
PWx afecteaz numai frontul cresctor al impulsului, n timp ce frontul
descresctor este determinat de tergerea numrtorului la atingerea valorii
din PPx.
Modul de funcionare este ilustrat n figura 2.25.a.
b)
Modul 1
Modul 1 este ales prin setarea bitului PMx din registrul PWMCON1. n
LOGIC
c)
Modul 2
Modul 2 este selectat setnd indicatorul PB01 din registrul PWMCON1.
Acest mod combin semnalele canalelor PWM0 i PWM1 (printr-o poart
I - LOGIC )
Modul 3
Modul 3 este selectat setnd indicatorii PSx din registrul PWMCON1. Acest
LOGIC
LOGIC
cu
valoarea
din
PPx,
urmtorul
impuls
numrtorului.
Modul de funcionare este ilustrat n figura 2.25.d.
va
declana
oprirea
PWx=0
PWx=1
PWx=2
PWx=4
PWx=6
PWx=7
PWx=8
a) Modul 0
b) Modul 1
PP0
PPx=7
PT0
PTx
PWM0
PP1
PT1
POUT1
POUT0
100%
87.5%
75%
50%
25%
12.5%
0%
PWxPTx
PTRx=1
PWxPTx
PWx=4
c) Modul 2
d) Modul 3
1.18.2
Registrele speciale ale PWM
Modulul PWM este controlat prin intermediul a dou seturi de registre:
formele de und sunt programate de PTx, PPx i PWx;
a)
Numrtorul PTx
Prin intermediul bitului PTIx din registrul PWMCON0 se poate selecta
Mod
Mod 0
Mod 1
b)
Frecven
f CPU
f CPU /64
f CPU
f CPU /64
PWx 8 bii
78.13 kHz
1.22 kHz
39.1 kHz
610 Hz
PWx 10 bii
19.53 kHz
305 Hz
9.77 kHz
152.6 Hz
PWx 12 bii
4.88 kHz
76.3 Hz
2.44 kHz
38.15 Hz
PWx 14 bii
1.22 kHz
19.1 Hz
610 Hz
9.54 Hz
Tabelul 1.45
PWx 16 bii
305 Hz
4.77 Hz
152.6 Hz
2.4 Hz
semnalului PWM.
Unitatea central verific egalitatea ntre un registru tampon (care
pstreaz valoarea PWx) i coninutul PTx. Registrul tampon este iniializat la
nceputul fiecrui ciclu PWM cu coninutul registrului PWx sau n timpul scrierii
acestuia, n ultima situaie fiind obligatoriu ca numrtorul s fie oprit.
Dac PTxPWx, ieirea PWM este trecut n starea 1 LOGIC .
Locaiile registrelor PTx, PPx i PWx sunt indicate n tabelul 2.33.
PT0
PP0
PW0
d)
PWM0
F030h
F038h
FE30h
PWM1
F032h
F03Ah
FE32h
PT1
PP1
PW1
PT2
PP2
PW2
PWM2
F034h
F03Ch
FE34h
PT3
PP3
PW3
Tabelul 1.46
PWM3
F036h
F03Eh
FE36h
PIR3 PIR2 PIR1 PIR0 PIE3 PIE2 PIE1 PIE0 PTI3 PTI2 PTI1 PTI0 PTR3 PTR2 PTR1 PTR0
0h:
1h:
0h:
1h:
0h:
1h:
0h:
1h:
PS3 PS2
0h:
1h:
0h:
1h:
0h:
1h:
0h:
1h:
PB01
Atenie! tergerea n timpul funcionrii canalului PWMx a bitului PTRx oprete numrtorul, meninnd neschimbat ieirea corespunztoare.
MUX
AN0
AN15
Eantionare
Control
conversie
ntreruperi:
ADCIR, ADEIR
Convertor
10 bii
Rezultate:
ADAT, ADAT2
V A REF
V A GND
1.19.1
Moduri de lucru
Modulul ADC permite urmtoarele moduri de conversie:
conversie singular;
conversie continu;
conversie multipl singular;
conversie multipl continu;
rezultatul conversiei este pstrat n registrul ADAT iar, n cazul unei conversii
inserate, n registrul ADAT2. Structura celor trei registre este prezentat n
tabelul 2.35.
ADCTC
ADSTC
ADCRQ
ADCIN
ADWR
ADBSY
ADST
ADM
ADCH
ADAT
(FEA0h)
CHNR
ADRES
ADAT2
(F0A0h)
CHNR
ADRES
ADST
ADBSY
ADSTC
ADWR
ADCTC
ADCIN
ADCON
(FFA0h)
ADCRQ
Tabelul 1.48
ADM
ADCH
ADRES
ADRES
Conversii singulare
Aceste moduri sunt selectate prin intermediul cmpului ADM avnd
valoarea 0h (conversie singular) sau 1h (conversie multipl).
Dup pornirea convertorului prin intermediul ADST, indicatorul ADBSY va
fi setat i intrarea specificat n ADCH va fi convertit. Dup terminarea
conversiei, indicatorul cerere ntrerupere ADCIR va fi setat.
n modul conversie singular, la sfritul operaiunii curente, convertorul
se va opri automat i va terge indicatorii ADBSY i ADST.
n modul conversie multipl, la sfritul operaiunii curente, convertorul
va iniia automat o nou conversie a canalului specificat. ADCIR va fi setat la
sfritul fiecrei conversii.
Dac bitul ADST este ters prin program n timpul unei conversii,
convertorul nu se oprete dect dup ce va finaliza activitatea curent.
Conversii multiple
Citire ADDAT
Rezultat pierdut
a) Modul continuu
Conversie canal
AN3
Scrie ADDAT
ADDAT plin
AN2
3
AN1
ateapt
AN0
0
AN3
3
Registru temp.
Generare IRQ
Citire ADDAT
b) Modul ateptare citire rezultat
Conversie canal
AN3
Scrie ADDAT
ADDAT plin
AN2
3
AN1
AN0
AN3
3
Citire ADDAT
Inserare canal
ADDAT2 plin
ntrerupere ADEINT
Citete ADDAT2
TCL32
TCL128
TCL64
t CC
t CC 2
t CC 4
t CC 8
Indicatorul ADEIR din registrul ADEIC este setat numai dac se produce
o suprapunere de date n registrul ADDAT sau dac rezultatul conversiei unui
canal injectat a fost ncrcat n registrul ADDAT2. Aceast cerere de
ntrerupere poate genera o ntrerupere cu vectorul ADEINT sau un transfer
PEC. Structura celor dou registre de ntrerupere este prezentat n
paragraful 1.16.1 (tabelul 2.17).
1.20. Timere/Numrtoare
Timerele cu utilizare general GPT1 i GPT2 reprezint o structur foarte
flexibil de numrtoare/timere care pot fi utilizate pentru sincronizri,
numrare de evenimente, msurare durate, multiplicri de frecven etc.
Cele dou blocuri, GPT1 i GPT2, conin cinci timere de 16 bii. GPT1
conine trei timere cu o rezoluie maxim de 200 ns (la frecvena unitii
centrale de 40 MHz) n timp ce, GPT2 conine dou timere cu o rezoluie
maxim de 100 ns (la frecvena unitii centrale de 40 MHz) i un registru de
16 bii pentru captur i rencrcare (CAPREL).
Fiecare timer din fiecare bloc poate lucra independent ntr-un numr
diferit de moduri sau poate fi concatenat cu alt timer din acelai bloc.
1.20.1
Blocul de timere GPT1
Toate cele trei timere ale blocului (T2, T3 i T4) pot lucra n trei moduri
de baz: timer, timer comandat extern i numrtor i fiecare timer poate
numra cresctor sau descresctor.
Fiecare timer are o intrare extern pentru achiziia de semnale iar
direcia de numrare poate fi modificat att prin program, ct i prin
intermediul unor semnale externe. De asemenea, fiecare depire superioar
sau inferioar a timerului T3 poate fi semnalat n exterior. Timerele auxiliare
T2 i T4 pot fi concatenate cu timerul T3 sau pot fi folosite ca registre de
captur sau rencrcare pentru timerul T3. Coninutul fiecrui timer poate fi
citit sau modificat de unitatea central prin intermediul registrelor T2, T3 i
T4. Scrierea registrului prin program are prioritate fa de orice alt
modificare produs de hardware.
Schema bloc a blocului de timere GPT1 este prezentat n figura 2.28.
a)
Timerul T3
Timerul T3 este configurat i controlat de registrul T3CON, descris n
tabelul 2.37.
Modul timer
Acest mod este selectat pentru timerul T3 dac cmpul T3M din registrul
T3CON este egal cu 0h. Semnalul de ceas este asigurat de prescaler care
divizeaz frecvena unitii centrale cu un coeficient funcie de cmpul T3I:
K=2 3+T3I .
T2EUD
f C PU /2
sus/jos
310
T2IN
Timer T2
Control
Timer T2 ncrcare
captur
T3EUD
f C PU /2 310
T3IN
T4IN
f C PU /2 310
Control
Timer T3
ntrerupere
sus/jos
Timer T3
T3OTL
T3OUT
ntrerupere
ncrcare
captur
Control
Timer T4
Timer T4
ntrerupere
sus/jos
T4EUD
T3OTL
T3OE
T3UDE
T3UD
T3R
T3M
T3I
T3R
T3UD
T3UDE
T3OE
T3CON
(FF42h)
T3OTL
Tabelul 1.50
T3M
T3I
Acest mod este selectat de cmpul T3M din registrul T3CON care trebuie
s aib valoarea 2h sau 3h. Funcionarea timerului n acest mod este similar
cu cea anterioar, numai c frecvena de intrare este condiionat de nivelul
semnalului pe pinul T3IN (P3.6). n acest sens, pinul P3.6 trebuie setat ca
intrare.
Tabelul 1.51
f CPU =20 MHz
Coeficient divizare
Frecven intrare [kHz]
Rezoluie [s]
Perioad [ms]
1h
16
1250
0.8
52.5
2h
3h
4h
5h
6h
7h
32
64
128
256
512 1024
625 312.5 156.25 78.125 39.06 19.53
1.6
3.2
6.4
12.8
25.6
51.2
105
210
420
840 1680 3360
Bitul T3M.0 selecteaz nivelul activ al intrrii: dac este 0h, timerul este
validat dac T3IN are nivelul 0
T3IN are nivelul 1
LOGIC ;
LOGIC .
Modul numrtor
Acest mod este selectat prin setarea cmpului T3M la valoarea 1h. n
acest mod sunt contorizate tranziiile semnalelor pinului T3IN (P3.6) care
trebuie setat ca intrare. Evenimentele care produc incrementri sau
decrementri ale timerului pot fi fronturi cresctoare, descresctoare sau
ambele, funcie de cmpul T3I descris n tabelul 2.39.
T3I
000
001
010
011
1XX
Tabelul 1.52
Front activ pe T3IN
Numrtor dezactivat.
Front cresctor.
Front descresctor.
Ambele fronturi.
Rezervat.
b)
sau 1
LOGIC
Timerele T2 i T4
T4CON
(FF44h)
TxUDE
TxUD
TxR
TxM
TxI
T2R
T2M
T2I
T4R
T4UD T2UD
T2CON
(FF40h)
T4UDE T2UDE
T4M
T4I
timerul auxiliar;
33 de bii, dac numai front cresctor sau descresctor al T3OTL este
cu valoarea 5h.
Acest mod presupune ncrcarea valorii curente a timerului T3 ntr-un
timer auxiliar ca rspuns la tranziia semnalului pe pinul extern TxIN.
Semnalul de declanare poate fi un front cresctor, descresctor sau ambele.
Selectarea tranziiei este fcut de biii mai puin semnificativi din registrul
TxI (valoarea exact este indicat n tabelele 2.39 i 2.40).
Atenie! Dac este utilizat ca registru de captur, timerul auxiliar se oprete
automat, indiferent de valoarea bitului TxR.
Biii de control ai direciei pentru T2IN i T4IN (DP3.7, respectiv
DP3.5) trebuie teri.
Nivelul semnalului de pe pinii T2IN sau T4IN trebuie s-i pstreze
starea cel puin 8t CPU .
1.20.2
Blocul de timere GPT2
Ambele timere ale blocului (T5 i T6) pot lucra n trei moduri de baz:
timer, timer comandat extern i numrtor i fiecare timer poate numra
cresctor sau descresctor. Rezoluia maxim a acestor timere este de 100 ns
(pentru o frecven a procesorului de 40 MHz).
Fiecare timer are o intrare extern pentru achiziia de semnale iar
direcia de numrare poate fi modificat att prin program, ct i prin
intermediul unor semnale externe. De asemenea, fiecare depire superioar
sau inferioar a timerului T6 poate fi semnalat n exterior.
Timerul auxiliar T6 poate fi concatenat cu timerul T5 dar T5 poate fi
concatenat i cu timerele modulului CAPCOM prin intermediul unei conexiuni.
Valoarea registrului timerului T5 poate fi capturat n registrul de 16 bii
CAPREL i, opional, poate fi tears; timerul T6 poate fi rencrcat prin
intermediul aceluiai registru CAPREL.
sus/jos
29
T2IN
Timer T5
Control
Timer T5 tergere
ntrerupere
captur
CAPIN
ntrerupere
CAPREL
CAPCOM
ncrcare
T6IN
f C PU /2 29
ntrerupere
Control
Timer T6
Timer T6
T6OTL
T6OUT
sus/jos
T6EUD
a)
Timerul T6
Timerul T6 este configurat i controlat de registrul T6CON, descris n
tabelul 2.41.
T6SR
T6OTL
T6OE
T6UDE
T6UD
T6R
T6M
T6I
T6R
T6UD
T6UDE
T6OE
T6OTL
T6CON
(FF42h)
T6SR
Tabelul 1.54
T6M
T6I
Modul timer
Acest mod este selectat pentru timerul T6 dac cmpul T6M din registrul
T6CON este egal cu 0h. Semnalul de ceas este asigurat de prescaler care
divizeaz frecvena unitii centrale cu un coeficient funcie de cmpul T6I:
K=2 2+T6I .
Frecvenele de intrare n timer, rezoluia i perioada rezultat din
coeficientul de prescalare ales sunt prezentate n tabelul 2.42. Tabelul este
valabil i pentru modurile timer comandat, precum i pentru T5.
Tabelul 1.55
f CPU =20 MHz
Prescalare
Frecven intrare [kHz]
Rezoluie [s]
Perioad [ms]
1h
16
2500
0.4
26
2h
32
1250
0.8
52.5
3h
4h
5h
6h
7h
64
128
256
512
1024
625 312.5 156.25 78.125 39.06
1.6
3.2
6.4
12.8
25.6
105
210
420
840 1680
LOGIC ;
LOGIC .
Modul numrtor
Acest mod este selectat prin setarea cmpului T6M la valoarea 1h. n
acest mod sunt contorizate tranziiile semnalelor pinului T6IN (P5.12) care
trebuie setat ca intrare. Evenimentele care produc incrementri sau
decrementri ale numrtorului pot fi fronturi cresctoare, descresctoare sau
ambele, funcie de cmpul T6I descris n tabelul 2.43.
T6I
000
001
010
011
1XX
Tabelul 1.56
Front activ pe T6IN
Numrtor dezactivat.
Front cresctor.
Front descresctor.
Ambele fronturi.
Rezervat.
b)
sau 1
LOGIC
Timerul T5
Timerul T5 poate funciona ca timer, timer comandat sau numrtor i
T5SC
T5CLR
CI
T5UDE
T5UD
T5R
T5M
T5I
T5R
T5UD
CI
T5UDE
T5CLR
T5CON
(FF46h)
T5SC
Tabelul 1.57
T5M
T5I
de
1.21.1
Timerele CAPCOM
Utilizarea primordial a timerelor T0/T1 i T7/T8 este de a asigura dou
baze de timp independente pentru registrele de captur/comparare asociate
dar este posibil i folosirea timerelor independent de registrele respective.
Funcionarea timerelor CAPCOM este controlat de registrele T01CON i
T78CON, ambele registre avnd opiuni identice pentru toate cele 4 timere.
Structura celor dou registre este prezentat n tabelul 2.45.
TxIN
f CPU/2310
Control
Timer Tx
D epire
timer T6
CcxIO
Control
(16 semnale) CA PCOM
CCzIO
D epire
timer T6
Control
Timer Ty
310
f CPU/2
ntrerupere
Timer Tx
Registru
TxREL
ntrerupere
16 registre
CA PCOM
ntrerupere
Registru
TyREL
ntrerupere
Timer Ty
TxI
T1R
T1M
T1I
T0R
T0M
T0I
T8R
T8M
T8I
T7R
T7M
T7I
pinului T0IN (P3.0), respectiv T7IN (P2.15) care trebuie setate ca intrri.
Dac timerele T1 i T8 sunt folosite ca numrtoare, este obligatorie setarea
cmpului TxI cu valoarea X00h; n caz contrar timerele T1 sau T8 sunt
dezactivate.
Frecvena maxim de intrare este f CPU /16. Pentru a garanta o numrare
corect, nivelul semnalului trebuie s fie 0 LOGIC sau 1 LOGIC cel puin o
perioad 8t CPU .
Modul rencrcare
ncrcarea registrelor Tx se execut de fiecare dat cnd se produce o
depire, att n modul timer, ct i n modul numrtor. Valoarea de
ncrcare este pstrat n registrul TxREL.
1.21.2
Registrele captur i comparare
Cele 32 de registre de captur/comparare CC0 31 sunt folosite ca
registre de date pentru operaiile de captur sau comparare pentru timerele
T0/T1, respectiv T7/T8.
Fiecare registru poate fi programat individual n modul captur sau n
patru moduri diferite de comparare (cu excepia CC24 27), putnd fi alocate
unuia sau ambelor timere dintr-un modul.
Orice registru de captur/comparare poate fi folosit ca registru cu
utilizare general n situaia n care el nu este utilizat pentru funciile sale
specifice modulului CAPCOM.
Controlul celor 32 de registre de captur/comparare este asigurat de 8
registre CCM0 CCM7, organizate identic. Structura lor este prezentat n
tabelul 2.46.
Tabelul 1.59
CCM0
(FF52h)
CCM1
(FF54h)
CCM2
(FF56h)
CCM3
(FF58h)
CCM4
(FF22h)
CCM5
(FF24h)
CCM6
(FF26h)
CCM7
(FF28h)
ACC3
CCMOD3
ACC2
CCMOD2
ACC1
CCMOD1
ACC0
CCMOD0
ACC7
CCMOD7
ACC6
CCMOD6
ACC5
CCMOD5
ACC4
CCMOD4
ACC11
CCMOD11
ACC10
CCMOD10
ACC9
CCMOD9
ACC8
CCMOD8
ACC15
CCMOD15
ACC14
CCMOD14
ACC13
CCMOD13
ACC12
CCMOD12
ACC19
CCMOD19
ACC18
CCMOD18
ACC17
CCMOD17
ACC16
CCMOD16
ACC23
CCMOD23
ACC22
CCMOD22
ACC21
CCMOD21
ACC20
CCMOD20
ACC27
CCMOD27
ACC26
CCMOD26
ACC25
CCMOD25
ACC24
CCMOD24
ACC31
CCMOD31
ACC30
CCMOD30
ACC29
CCMOD29
ACC28
CCMOD28
CCMODx
0h:
1h:
000:
001:
010:
011:
100:
101:
110:
111:
Comparare
Comparare
Comparare
Comparare
mod
mod
mod
mod
0;
1;
2;
3.
Modul captur
Ca rspuns la un eveniment extern, coninutul timerelor T0/T1 sau
Modurile de comparare
1.21.3
ntreruperile modulului CAPCOM
Modulul CAPCOM genereaz dou categorii de ntreruperi:
4 ntreruperi generate de depirile timerelor T0, T1, T7 i T8;
32 de ntreruperi generate de evenimentele de captur/comparare ale
registrelor CC0CC31.
n mod corespunztor, sunt generate ntreruperi cu vectorii T0INT,
MUX
f CPU
WDTL
WDTH
WDTR
RSTOUT
WDTIN
Control
WDTREL
Reset
Modulul WDT const ntr-un timer de 16 bii care este comandat fie cu
f CPU /2, fie cu f CPU /128. Timerul este realizat prin concatenarea a dou timere
de 8 bii, WDTL i WDTH. Timerul WDTH poate fi setat de utilizator pentru a
selecta durata de aciune a timerului.
Funcionarea WDT este controlat de registrul WDTCON, prezentat n
tabelul 2.47.
WDTREL
WDTR
WDTIN
WDTREL
WDTIN
WDTCON
(FFAEh)
WDTR
Tabelul 1.60
25.6
6.55
1.6
419
S0R
S0LB
S0BRS
S0ODD
0h:
1h:
0h:
1h:
0h:
1h:
0h:
1h:
S0STP
S0REN
S0PEN
S0FEN
S0OEN
S0PE
S0FE
S0OE
S0ODD
S0BRS
S0LB
S0CON
(FFB0h)
S0R
Tabelul 1.61
S0M
S0OE S0FE
Indicatori ntrerupere eroare depire, ncadrare, respectiv paritate.
S0PE
S0OEN
0h:
ignorare erori depire, ncadrare, respectiv paritate;
S0FEN
1h:
verificare erori depire, ncadrare, respectiv paritate.
S0PEN
0h:
recepie dezactivat;
S0REN
1h:
recepie validat.
0h:
un bit de stop;
S0STP
1h:
doi bii de stop.
000: date 8 bii (mod sincron);
001: date 8 bii (mod asincron);
010: rezervat;
011: date 7 bii + paritate (mod asincron);
S0M
100: date 9 bii (mod asincron);
101: date 8 bii + bit atenionare (mod asincron);
110: rezervat;
111: date 8 bii + paritate (mod asincron).
f C PU
S0M
Timer baud
S0STP S0FE
S0PE
:16
S0OE
Ceas
S0REN
S0FEN
S0PEN
S0OEN
S0LB
S0RIR
Control ASC0
S0TIR
Tact deplasare
S0EIR
MUX
RXD0
Eantionare
Registru
deplasare RX
Registru
deplasare TX
S0RBUF
S0TBUF
TXD0
D1
D2
D3
D4
D5
start D0
D1
D2
D3
D4
D5
D6 D7 stop stop
(paritate)
D6 D7 D8 stop stop
(paritate)
(atenionare)
sincron
este
iniiat
la
setarea
bitului
S0REN.
Datele
f C PU
Timer baud
S0M
:4
S0OE
Ceas
S0REN
S0OEN
RXD0
MUX
S0LB
Eantionare
S0RIR
Control ASC0
S0TIR
Tact deplasare
S0EIR
Registru
deplasare RX
Registru
deplasare TX
S0RBUF
S0TBUF
TXD0
din
nou,
funcie
de
modul
de
BAUDSINC =
fCPU
(8 + 4 S0BRS ) (1 + S0BG)
Atenie! Pentru obinerea unor frecvene exacte, este posibil utilizarea unui
oscilator cu cuar special destinat (de exemplu f=18.432 MHz).
S0BRS=0h
Vitez
S0BG
transmisie
Eroare
0%
625 kBaud
0000h
19.2 kBaud -1.4% +1.7% 001F0020h
9600 Baud -1.4% +0.2% 00400041h
4800 Baud -0.6% +0.2% 00810082h
2400 Baud -0.2% +0.2% 01030104h
1200 Baud -0.4% +0.2% 02070208h
600 Baud -0.0% +0.1% 04100411h
75 Baud
+1.7%
1FFFh
Tabelul 1.62
S0BRS=1h
S0BG
Eroare
1.23.4
Controlul ntreruperilor
Pentru operarea n condiii normale, modulul ASC0 seteaz urmtorii
indicatori de ntrerupere:
S0TBIR activat cnd datele sunt mutate din S0TBUF n registrul de
serializare pentru transmisie. Aparine registrului S0TBIC i genereaz
ntreruperea S0TBINT;
SCLK
Control tact
f CPU
SSCTIR
SSCRIC
SSCEIC
Control SSC
Stare
MTSR
Control
pin
Control
Registru
deplasare 16 bii
SSCTB
MRST
SSCRB
SSCEN
SSCMS
SSCAREN
SSCBEN
SSCPEN
SSCREN
SSCTEN
SSCPO
SSCPH
SSCHB
SSCPH
SSCPO
SSCTEN
SSCREN
SSCPEN
SSCBEN
SSCAREN
SSCMS
SSCCON
(FFB0h)
SSCEN=0
SSCEN
Tabelul 1.63
SSCBM
SSCEN
SSCMS
SSCBSY
SSCBE
SSCPE
SSCRE
SSCTE
SSCBM
SSCTE
SSCRE
SSCPE
SSCBE
SSCBSY
SSCCON
SSCEN=1
SSCMS
SSCBM
0h:
transmite/recepioneaz primul bitul mai puin semnificativ;
1h:
transmite/recepioneaz primul bitul cel mai semnificativ.
Lungime mesaj: 1+SSCBM.
0h:
rezervat.
SSCEN
SSCHB
SSCBM
Funcie
Intrare
Intrare
Ieire
Tabelul 1.64
Circuit secundar
Bistabil Direcie
Tip
P3.13=x P3.13=0
P3.9= x DP3.9=0
1.24.1
Operarea full-duplex
n acest mod, dispozitivele sunt legate pe trei linii. Definirea acestor linii
este atributul circuitului principal: linia conectat la pinul MTSR (master
transmit slave receive) este pentru transmisie iar linia conectat la pinul MRST
(master receive slave transmit) este pentru recepie.
Numai circuitul principal, care poate fi unul singur la un moment dat,
transmite tactul de serializare pe pinul SCLK; toate circuitele secundare
primesc acest tact, aa c pinul corespunztor trebuie setat ca intrare
(DP3.13=0h).
Este obligatoriu ca, la iniializare, s se stabileasc circuitul principal,
descrierea modului de operare pentru fiecare bloc SSC (registrul SSCCON) iar
pentru toate circuitele din sistem s se fac selectrile necesare pentru
caracteristicile pinilor (intrri sau ieiri, tipuri de ieiri etc.).
Pinii de ieire MRST ai circuitelor secundare sunt legai mpreun pe un
singur fir. Exist dou posibiliti de a evita coliziunea datelor:
stabilirea prin program, a unui singur circuit secundar cu pinul MRST activ
la un moment dat. De exemplu, toate circuitele secundare au dezactivat
transmisia, circuitul principal emite o cerere de date de la un anume circuit
secundar care i activeaz linia MRST, transmite datele, dup care
DP3.13=1h;
SSCEN=1h;
Circuit secundar 1
Reg.depls.
MTSR
MRST
MRST
SCLK
SCLK
Circuit secundar 2
Reg.depls.
MTSR
MRST
SCLK
1.24.4
Detectarea erorilor
Interfaa SSC este capabil s detecteze patru tipuri de erori:
Erori de recepie, pentru circuitul principal sau secundar, cnd un nou
mesaj a fost complet recepionat iar datele anterior recepionate nu au
fost descrcate din registrul SSCRB. Este setat indicatorul SSCRE validat
de bitul SSCREN, ambele din registrul SSCCON.
Erori de faz, cnd datele de pe pinul MRST (al circuitului principal) sau
pinul MTSR (al circuitului secundar) i schimb starea n zona frontului
activ al semnalului SCLK (n intervalul unui eantion nainte, respectiv
dou eantioane dup frontul activ). Este setat indicatorul SSCPE validat
de bitul SSCPEN, ambele din registrul SSCCON.
Atenie! Chiar dac memoria ROM intern este validat prin configuraia de
iniializare, nu se va executa nici o instruciune din ea.
Spre deosebire de iniializarea normal, timerul WDT este dezactivat
astfel nct secvena de ncrcare BSL nu este limitat ca timp.
Sistemele care utilizeaz procedura BSL o pot iniia prin conectarea unei
rezistene de 5 k ntre pinul P0L.4 i mas. Dac sistemul folosete
temporar modul BSL se poate adapta o soluie cu un jumper sau un semnal
extern.
1.25.2
Procedura de lucru BSL
Dup trimiterea octetului de identificare, blocul BSL ntr ntr-o bucl
ateptnd 32 de octei pe interfaa ASC0. Aceti octei sunt memorai
consecutiv n memoria RAM intern, de la adresa 00FA40h pn la adresa
00FA5Fh, adic 16 instruciuni. Unitatea central execut un salt la prima
instruciune i, astfel, secvena BSL se consider ncheiat.
Totui, o aplicaie nu poate avea numai 16 octei, aa c se intr n a
doua bucl de ncrcare. Aceasta, folosind deja parametrii setai pentru
interfaa ASC0, poate continua ncrcarea, n orice zon de memorie RAM a
programului de aplicaie, rutine diverse, blocuri de date etc.
Procesul poate continua n mai muli pai sau poate trece direct la
execuia programului ncrcat dar, n toate situaiile, unitatea central rmne
n modul BSL.
Pentru a executa aplicaia n modul normal de lucru, este necesar
ieirea din modul BSL. Aceasta se poate face prin program, executnd o
instruciune de iniializare software SRST, care nu mai verific starea
pinului P0L.4 sau printr-o iniializare extern, caz n care pinul P0L.4 trebuie
s fie n starea 1 LOGIC .
Calcularea vitezei de transfer este fcut prin intermediul timerului T6
care msoar durata octetului nul iniial. Orice
durate poate conduce la deviaii mari de vitez
rata de transfer calculat de circuit. Pentru un
obligatoriu ca aceast deviaie s fie mai mic
executrii instruciunii.
Ultima facilitate este util n conjuncie cu un semnal extern pentru
semnalarea unei cderi a tensiunii de alimentare, cuplat pe pinul NMI. Rutina
de tratare a ntreruperii NMI salveaz starea unitii centrale n stiv iar la
final execut instruciunea PWRDN. Dac pinul NMI este nc n 0
LOGIC
LOGIC )
BHE).
Dac magistrala extern este n mod multiplexat cu date pe 8 bii, portul
P0H red ultima adres folosit de EBC iar, n caz contrar, este n nalt
impedan. Portul P0L este ntotdeauna n stare de nalt impedan n modul
inactiv.
Pe portul P1, pentru magistral extern demultiplexat, se regsete
ultima adres utilizat.
Portul P4 conine adresa segment a ultimului acces EBC. Pinii nefolosii
pentru adres sunt pini de intrare-ieire i, n consecin, redau ultima
valoare scris.
n modul oprit, att pentru unitatea central ct i pentru modulele
interne oscilatorul este blocat. Ca n modul inactiv, toate porturile de ieire
reflect starea nainte de intrarea n acest mod. Dac pinul este folosit de un
periferic intern, starea sa red ultima aciune executat de periferic.
ADD
ADDB
ADDC
ADDCB
SUB
SUBB
SUBC
SUBCB
MUL
MULU
DIV
DIVU
DIVL
DIVLU
CPL
CPLB
NEG
NEGB
AND
ANDB
OR
ORB
XOR
XORB
Instruciuni logice
I - LOGIC
SAU - LOGIC
SAU - EXCLUSIV
CMP
CMPB
CMPI1
CMPI2
CMPD1
CMPD2
BFLDL
Setare bit
BSET
tergere bit
BCLR
Mutare bit
BMOV
BMOVN
I - LOGIC
BAND
SAU - LOGIC
SAU - EXCLUSIV
BOR
BXOR
BCMP
SHR
SHL
ROR
ROL
ASHR
Instruciuni normalizare
PRIOR
MOV
MOVB
MOVBS
MOVBZ
PUSH
POP
SCXT
Instruciuni salt
JMPA
JMPS
JB
JNB
JBC
JNBS
JMPI JMPR
CALLS
PCALL
TRAP
RET
RETS
RETP
RETI
Iniializare software
SRST
IDLE
PWRDN
SRVWDT
DISWDT
EINIT
Instruciuni diverse
Nici o aciune
NOP
ATOMIC
EXTR
EXTP
EXTPR
EXTSR
2.1. Software
Programele aplicative sunt scrise, de regul, n asamblor sau n C. Exist
multe alte programe ajuttoare, compilatoare, emulatoare create de diverse
firme. Dintre acestea se pot evidenia:
ApBUILDER de la firma Intel care, prin intermediul unor ferestre, poate
seta parametrii blocurilor funcionale ale microntrolerelor genernd
rutinele aferente n asamblare sau n C. Versiunea 2.21 a programul
suport urmtoarele tipuri de microcontrolere i microprocesoare:
o Intel386 TM EX;
o 80C186EA / 80C188EA, 80C186EB / 80C188EB, 80C186EC / 80C188EC,
80C186XL / 80C188XL;
o 8XC196KD, 8XC196KC, 8XC196KB, 8XC198, 8XC196KR, 8XC196KQ,
8XC196KT, 8XC196JR, 8XC196JQ 8XC196JT, 8XC196NP, 8XC196NT,
8XC196NU;
o 80C296SA;
o 8XC52, 8XC54, 8XC58, 8XC51FA, 8XC51FB, 8XC51FC;
o 8XC251SA, 8XC251SB, 8XC251SP, 8XC251SQ;
o 8XC151SA, 8XC151SB;
o 8X930Ax USB;
o 8X930Hx.
Detalii suplimentare se pot gsi la pagina http://www.intel.com sau
http://developer.intel.com/design/mcs51/.
Franklin Software (http://www.fsinc.com) a realizat unul din cele mai
bune compilatoare C pentru familia de microcontrolere 80x51 i 80xC552. De
asemenea, Franklin Software a dezvoltat ntreaga gam de aplicaii software
(asamblor, compilator C, emulator, monitor etc.) pentru microcontrolerele de
16 bii din familia Siemens 80C16X.
La Philips (http://www.semiconductors.philips.com) se poate gsi un
asamblor i un depanator pentru familiile 80xC51 i XA ct i referine la alte
programe realizate de alte firme.
2.1.1
Compilatorul C
Limbajul C folosit este bazat pe ANSI C cu cteva modificri datorate:
mpririi spaiului de adresare al unitii centrale;
utilizarea specific a registrelor speciale (SFR);
variabilelor de tip bit i obiectele adresabile la nivel de bit;
opiunile bancurilor de registre i mascarea registrelor de uz general;
ntreruperi specifice pentru familiile de microcontrolere.
Vor fi prezentate n continuare principalele caracteristici ale compilatoarelor C51 pentru 8xC552, respectiv C166 pentru 80C16x. Compilatoarele nu
sunt universale, ele fiind specifice fiecrei familii de microcontrolere,
genernd un cod compact i extrem de rapid. Pentru informaii suplimentare
se recomand lucrrile C51 COMPILER Users Guide, Keil Elektronik GmbH i
C166 COMPILER Users Guide, Keil Elektronik GmbH.
Folosirea limbajului de nivel nalt ofer cteva avantaje:
nu este necesar cunoaterea setului de instruciuni ale procesoarelor,
ns este de dorit (dar nu absolut necesar) cunoaterea structurii memoriei
unitilor centrale;
detaliile referitoare la alocarea registrelor i a diferitelor zone de memorie
cad n sarcina compilatorului;
programul are o form structurat;
programarea i timpul de testare a programelor este redus drastic, mrind
eficiena;
librriile C suportate conin multe rutine standard, cum ar fi: intrri/ieiri
formatate, conversii numerice, aritmetic n virgul flotant;
utilizatorul i poate crea propriile librrii;
compilatoarele C realizate sunt portabile, permind trecerea rapid de la
un tip de procesor la altul.
Sintaxa pentru invocarea compilatoarelor este urmtoarea:
C51 fiier.c [list_control]
C166 fiier.c [list_control]
compilator;
DEBUG adaug la fiierul de ieire .obj informaii pentru depanare;
Exemplu: C166 prog.c HOLD (near 6) toate variabilele care ocup mai
puin de 6 octei sunt alocate n zona near.
vectorii de ntrerupere;
INTVECTOR (numai C51) declar deplasamentul pentru tabela vectorilor
OPTIMIZE
inspecteaz
codul
final
eliminnd
unele
slbiciuni
ale
secvene comparare-salt;
(5) permite calculul unic a unor expresii identice care apar n rutine;
destinaie ai PEC;
SRC creeaz n locul fiierului obiect un fiier surs care poate fi asamblat
cu macroasamblorul corespunztor.
Tipuri de date
Dimensiune
Domeniu de valori
1 bit
1 octet
1 octet
0 sau 1
-128 +127
0 +255
Spaiul de memorie
Compilatoarele dezvoltate suport arhitectura complet a familiilor de
microcontrolere pentru care sunt destinate. Fiecare variabil poate fi asignat
explicit unui anumit spaiu de memorie.
Definirea spaiului de memorie utilizat de variabile este prezentat n
tabelul 1.2.a) pentru C51, respectiv 1.2.b) pentru C166.
Tabelul 2.2
Tipuri de memorie
a)
C51
code
data
idata
bdata
xdata
pdata
b)
near
idata
bdata
sdata
far
Descriere
memorie program (64 kB); acces cu MOVC @A+DPTR
memorie intern adresabil direct; acces foarte rapid la variabile
(128 octei)
memorie intern adresabil indirect; posibilitate de adresare a
ntregului spaiu intern de adrese (256 octei)
memorie intern adresabil direct la nivel de bit; permite
accesul la nivel de bit sau octet (16 octei)
memorie de date extern (64 kB); accesat folosind
MOVX @DPTR
memorie de date extern adresat paginat (256 octei) folosind
MOVX @Rn
C166
pointer 16 bii; calculul adresei pe 16 bii permite accesul la:
o 16 kB variabile n grupul NDATA;
o 16 kB constante n grupul NCONST;
o 16 kB date sistem n grupul SDATA.
memorie intern adresabil indirect; posibilitate de adresare a
ntregului spaiu intern de adrese (2 kB)
memorie intern adresabil direct la nivel de bit; permite
accesul la nivel de bit sau octet (256 octei)
spaiul sistem (0C000h0FFFFh); permite definirea obiectelor
PEC
pointer 32 bii, permind accesul complet la ntregul spaiu de
Modelul de memorie
Modelele de memorie determin modul n care sunt folosite variabilele
dinamice, transmiterea parametrilor funciilor i alte declaraii fr un mod
explicit de model de memorie. Parametrii i variabilele automate sunt plasai
n registrele procesorului disponibili apoi n memorie la adrese fixe n funcie
de modelul de memorie folosit.
C51 suport trei modele de memorie iar C166 suport cinci modele de
memorie. Cu excepia modelului TINY , toate celelalte lucreaz n mod
segmentat.
Caracteristicile modelului de memorie pentru C51 i C166 sunt
prezentate n tabelul 3.3.a), respectiv 3.3.b).
Tabelul 2.3
Model memorie
Declaraii variabile
Declaraii funcii
a)
C51
SMALL
Parametrii i variabilele automate sunt plasate n memoria
intern dac nu mai sunt registre disponibile (maxim 120 octei
n memoria DATA)
COMPACT
Parametrii i variabilele automate sunt plasate n memoria
extern dac nu mai sunt registre disponibili. (maxim 256
octei n memoria PDATA)
LARGE
Parametrii i variabilele automate sunt plasate n memoria
extern dac nu mai sunt registre disponibili. (maxim 64 kB n
memoria XDATA)
b)
C166
TINY
16 bii
16 bii
SMALL
near (16 bii)
near (16 bii)
COMPACT
far (32 bii)
near (16 bii)
MEDIUM
near (16 bii)
far (32 bii)
LARGE
far (32 bii)
far (32 bii)
Pointeri
C51 suport pointerii generici i specifici tipului de memorie enumerai n
tabelul 3.4.
Tabelul 2.4
Declarare
float *p
char data *p
int idata *ip
long pdata *pp
char xdata *xp
int code *cp
Memorie
ocupat
3 octei
1 octet
1 octet
1 octet
2 octei
2 octei
Pointer la
float n tot spaiul de memorie (pointer generic)
char n meoria data
int n memoria idata
long n memoria pdata
char n memoria xdata
. int n memoria code
DPP1
DPP2
DPP3
Registru
VAL este setat pentru a indica o masc valid.
ACC CY PSW
DPL DPH R0
R1
R2
R3
R4
R5
R6
LSB
R7
LSB
-
R9
R8
R7
R6
R5
R4
R3
R2
R1
R0
identificator ntrerupere;
numr excepie.
char, pointer 1
octet
R7
R5
R3
int, pointer 2
octei
R6 i R7
R4 i R5
R2 i R3
long, float
pointer generic
R1, R2, R3
R1, R2, R3
R1, R2, R3
Registrul
carry
R7
R6 (MSB), R7 (LSB)
R4 (MSB), R5, R6, R7 (LSB)
R4, R5, R6, R7 (format IEEE pe 32 de bii)
R1, R2, R3 (R3 selector tip memorie, MSB n R2, LSB n R1)
Registru
R4.0
RL4
R4
R4,R5
R4,R5
R4R7
R4
R4,R5
Observaii
Fiiere de configurare
Un proiect scris n C51 trebuie legat (linkeditat) cu fiierul STARTUP.a51
care conine o rutin de iniializare a zonelor de memorie folosite de rutinele
C51 i un salt la funcia main().
Principala modificare adus fiierului de configurare STARTUP.a51 pentru
C51 este nlocuirea declaraiei: CSEG AT 0 cu CSEG AT 8000h atunci cnd
programele sunt executate din memoria RAM (de la adres 8000h) i
programul monitor este de la adres 0h.
Compilatorul C166 poate fi adaptat la diferite sisteme de dezvoltare prin
intermediul a cteva fiiere. Fiierele de configurare i semnificaia lor este:
STARTUP.A66 conine cteva definiii utilizate la iniializarea sistemului:
_MCTC
_RWDC
_MTTC
_RDYEN
impedan;
seteaz registrul BUSCON.12; valideaz utilizarea semnalului
READY pentru terminarea ciclului de memorie;
_CLKEN
_BYTDIS
_SGTDIS
_STKSZ
EXT_RAM
WATCHDOG
GETKEY.C
re. Fiierul respectiv folosete interfaa ASC a microcontrolerului pentru comunicare cu un terminal cu protocol
XON/XOFF.
conine cteva rutine utilizate pentru recepionarea de carac-
tere. Fiierul respectiv folosete interfaa ASC a microcontrolerului pentru comunicare cu un terminal. Nu realizeaz funcii
de conversie.
Toate funciile de intrare ieire, ca de exemplu printf, puts, scanf,
folosesc funciile putchar sau getkey. Prin modificarea acestor fiiere i
introducerea lor n proiectul dezvoltat se poate face adaptarea funciilor de
intrare/ieire la echipamentele periferice folosite. De asemenea, se pot
implementa diverse protocoale de comunicaie.
2.1.2
Asamblorul
Asamblorul conine programele i instrumentele necesare pentru programarea familiilor de procesoare pentru care sunt destinate: A51 pentru 8xC552
i A166 pentru 80C16x.
Rolul asamblorului este de a transforma fiierul surs (de regul .asm) n
fiier relocatabil (.obj).
Invocarea asamblorului poate fi destul de complex, ntruct pot fi
specificate multe opiuni. Informaii suplimentare se pot gsi n lucrrile A51
ASSEMBLER Users Guide, Keil Elektronik GmbH i A166 ASSEMBLER Users
Guide, Keil Elektronik GmbH.
Sintaxa invocrii este:
A51 fiier.asm [opiuni]
A166 fiier.asm [opiuni]
Detalii suplimentare despre opiunile specifice asambloarelor A51 i A166
sunt prezentate n paragraful Controlul asamblorului.
Operanzi i expresii
Programul surs pentru asamblor const n linii de mnemonice avnd o
form asemntoare cu linia urmtoare:
[etichet]:
mnemonic
[;comentariu]
expr13
Tabelul 2.8
Operand Semnificaie
a)
A51
A
acumulator
R0R7
registre de uz general din bancul curent de registre
DPTR
pointer la memoria de date intern sau extern
PC
contor program (conine adresa urmtoarei instruciuni)
C
indicator deplasare (carry)
AB
registru dublu A+B folosit de instruciunile MUL i DIV
AR0AR7
registre folosite pentru adresare absolut
#DATAn
constant imediat pe 8 sau 16 bii
b)
A166
Rn,Rm
acces direct la GPR din bancul curent de registre R0R15
REG
acces direct la orice registru GPR sau SFR
BITWORD
acces la cuvnt n spaiul de memorie adresabil la nivel de bit
BITADDR
acces la bit n spaiul de memorie adresabil la nivel de bit
MEM
acces la orice locaie de memorie
[Rn],[Rm] acces indirect la ntreaga memorie funcie de coninutul GPR
CADDR
adres pe 16 bii a codului instruciunii ntr-un segment de 64 kB
REL
deplasament pentru salturi relative. Valoarea este de +127/-128
cuvinte relativ la deplasamentul curent
SEG
numrul segmentului de cod
#TRAP
constant pe 7 bii folosit ca numr al vectorului de ntrerupere
CC_cond
cod condiie pentru salturi, apeluri rutine etc.
numeric
sau
deplasamentul
simbolului)
CHANGEABLE
Semnificaie
schimbarea ordinii de evaluare
separator poziie bit
tip pointer
Directive
Directivele asamblorului sunt folosite pentru controlul procesului de
asamblare nainte de transformarea fiierului surs n cod main.
Directivele asamblorului A51 se pot clasifica dup cum urmeaz:
definiii de simboluri:
nume SEGMENT tip [relocatabil]
tip indic spaiul de memorie utilizat; poate fi CODE (memorie program), XDATA
(memorie
extern),
DATA
(memorie
date
intern),
IDATA
(memorie
intern
xxxx poate fi CODE, XDATA, DATA, IDATA i BIT i semnific tipul spaiului de
referine ulterioare;
Dac xxxx este EQU sau SET, atunci simbolul sau registrul intern primete valoarea expresiei
(care este fix n cazul EQU sau poate fi modificat ulterior n cazul SET).
memorie;
xx poate fi DS (rezerv un spaiu egal cu expresie_numeric n memoria intern sau
extern), DBIT (rezerv un numr de bii egal cu expresie_numeric n memoria intern
adresabil la nivel de bit), DS (iniializeaz un octet din memoria program cu expresie_numeric), DW (iniializeaz doi octei din memoria program cu expresie_numeric).
obiect reprezint domeniile care vor fi adresate cu unul din registrele DPPn, i
anume:
nume_seciune
(inclusiv
SYSTEM),
nume_grup,
nume_variabil sau
_simbol.
PROC/ENDP,
DEFR/DEFA/DEFB):
nume_banc_registre REGBANK [domeniu] [,]
nr_canal reprezint numrul canalului PEC pentru care este rezervat memoria.
TASK definete un nume de task nume_task (un modul funcional de program care
este activat de software sau excepie hardware care produce o ntrerupere
nume_intr cu vectorul nr.intr).
DEFR/DEFA/DEFB
adrese absolute interne din RAM, respectiv locaii adresabile la nivel de bit.
creeaz un nou simbol nume care poate fi redefinit cu valoarea rezultat din
expresie.
nume BIT expresie
[DPPn]
nume:tip
modulul curent dar sunt definite n alt modul (n care simbolurile sunt definite ca
PUBLIC sau GLOBAL)
Controlul asamblorului
Elementele de control ale asamblorului sunt destinate s altereze
comportarea normal a acestuia. Pot fi specificate fie n linia de comand, fie
n programul surs prin intermediul directivelor $.
Cele mai importante comenzi utilizate de A51 sunt prezentate n
continuare:
(NO)MOD51 specific faptul c toate numele descrise n specificaia hardware pentru 8xC51 sunt cunoscute asamblorului. Dac se lucreaz cu alt
controler trebuie folosit comanda NOMOD51 urmat de o comand
INCLUDE pentru redefinirea registrelor speciale.
(NO)MOD166
simboluri.
(NO)XREF indic asamblorului s creeze un tabel de referine ncruciate
care indic utilizarea simbolurilor, tabel care este adugat listei de
simboluri. Tabelul de referine ncruciate const ntr-o list cu numerele
de linie n care sunt ntlnite simbolurile utilizate n program.
2.1.3
Editorul de legturi
Editorul de legturi combin mai multe module obiect (.obj) diferite
ntr-un singur modul absolut (.m66) care poate fi ncrcat de un depanator
sau emulator. El rezolv referinele publice i externe i prile de program
relocatabile sunt asignate la adrese absolute. De asemenea, editorul alege
librriile necesare i leag codurile rutinelor din librrii la programul final. n
final, editorul de legturi produce un fiier obiect absolut care conine ntregul
program, eventual i informaiile necesare pentru depanare. Informaii
suplimentare despre editoarele de legturi pot fi gsite n lucrrile 8051
Utilities Users Guide, Keil Elektronik GmbH i 80C166 Utilities Users Guide,
Keil Elektronik GmbH.
Pentru familiile 8xC552 i 80C16x se folosesc editoarele L51, respectiv
L166.
Sintaxa comenzilor este urmtoarea:
L51 list_intrare [TO fiier_ieire] [list_control]
L166 list_intrare [TO fiier_ieire] [list_control]
unde: list_intrare reprezint o list de fiiere separate prin virgule.
Fiierele conin modulele de programe relocatabile care vor fi
combinate pentru a rezulta modulul de program absolut.
fiier_ieire este numele sub care va fi scris modulul de program
absolut. Dac nu este introdus nici un nume, primul nume din
list_intrare va fi folosit pentru programul final.
list_control conine comenzile i parametrii din linia de apel.
Cele mai importante comenzi din list_control utilizate de L51 sunt
prezentate n continuare:
ixref produce un fiier cu lista referinelor ncruciate;
precede,bit,data,idata,stack,xdata,code permit definirea adreselor diferitelor spaiilor de memorie, conform cu tabelul 1.10:
Tabelul 2.10
prezentate n continuare:
CLASSES specific un domeniu de adrese fizice sau ordinea de alocare
pentru toate seciunile cu un nume de clas dat. CLASSES permite
definirea simpl a structurii memoriei microcontrolerului. Valoarea implicit
este:
CLASSES
NOMAP elimin harta memoriei i lista grupurilor din fiierul list de ieire.
secvenial. Prima seciune este alocat la cea mai mic adres (de regul
0) sau la valorile implicite declarate prin directivele CLASSES sau GROUPS.
Sintax: SECTIONS(nume_seciune[%nume_clas](adres))
Exemplu: L166 prog.obj SECTIONS(?PR?PROG%NCODE(0x1200),&?CO?PROG%NCONST)
Seciunea ?PR?PROG i clasa NCODE sunt alocate la adresa 0x1200, dup
care sunt alocate seciunea ?CO?PROG i clasa NCONST la adrese superioare
valorii 0x1200.
2.1.4
Programe utilitare
Cu excepia compilatoarelor, asambloarelor i editoarelor de legturi,
exist numeroase alte unelte software care uureaz munca programatorilor.
Vor fi prezentate n continuare numai administratorul de biblioteci (LIB51 i
LIB166) i convertorul de fiiere obiect n fiiere Intel hex (OHS51 i OH166).
Administratorul de biblioteci
Administratorul de biblioteci permite crearea i modificarea bibliotecilor
utilizate de editorul de legturi. Modul de utilizare a celor dou programe
LIB51 i LIB166 este identic, utilizatorul trebuind s modifice n linia de
comand numai numele programului apelat.
Sintaxa liniei de comand este:
LIBxxx [comand]
unde:
LIBxxx
comand
poate lipsi, caz n care este afiat promptul '*' pentru a indica ateptarea unei
DELETE
bibliotec
(nume_modul,)
terge
din
bibliotec
modulul
(modulele) nume_modul,.
utilizat), INT14 (comunicaia serial se face folosind ntreruperea BIOS 14h), NOINT
(comunicaia este fcut fr ntreruperi hardware) sau baudrate
(valaore)
(valorile admise sunt 300, 600, 1200, 2400, 4800, 9600 i 19200 bii/s).
3 RxD
2 TxD
7 GND
RTS 4
CTS 5
4 RTS
5 CTS
DSR 6
8
CD
DTR 20
PC-AT
6 DSR
8
CD
20 DTR
Sistem dezvoltare
15 14 13 12 11 10
0
0
0
0
0
0
0
0
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
Adresa
8
1
1
1
1
1
1
1
1
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
Exemplu
010xh
012xh
014xh
016xh
018xh
01axh
01cxh
01exh
Y1
10MHz
U3
35
34
EA
C3
33p
X TA L1
X TA L 2
47
PS EN
A LE
48
A LE
PW M0
PW M1
RST
4
5
PW M0
PW M1
A vss
60
AVS
A vd d
61
AV D
V re f+
59
AV+
V re f -
58
AV -
Vcc
EA
PS EN
EW
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7
57
56
55
54
53
52
51
50
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7
16
17
18
19
20
21
22
23
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
S TA DC
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
P 5.0
P 5.1
P 5.2
P 5.3
P 5.4
P 5.5
P 5.6
P 5.7
1
68
67
66
65
64
63
62
P 5.0
P 5.1
P 5.2
P 5.3
P 5.4
P 5.5
P 5.6
P 5.7
P2.0
P2.1
P2.2
P2.3
P2.4
P2.5
P2.6
P2.7
39
40
41
42
43
44
45
46
P2.0
P2.1
P2.2
P2.3
P2.4
P2.5
P2.6
P2.7
P 4.0
P 4.1
P 4.2
P 4.3
P 4.4
P 4.5
P 4.6
P 4.7
7
8
9
10
11
12
13
14
P 4.0
P 4.1
P 4.2
P 4.3
P 4.4
P 4.5
P 4.6
P 4.7
P3.0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7
24
25
26
27
28
29
30
31
P3.0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7
S TA DC
U1
15
EW
49
C2
10u
R1
8k2
S1
RESET
A D0
A D1
A D2
A D3
A D4
A D5
A D6
A D7
3
4
7
8
13
14
17
18
S1
1
11
D0
D1
D2
D3
D4
D5
D6
D7
Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
2
5
6
9
12
15
16
19
O U T0
O U T1
O U T2
O U T3
O U T4
O U T5
O U T6
O U T7
2
5
6
9
12
15
16
19
O U T8
O U T9
OU T1 0
OU T1 1
OU T1 2
OU T1 3
OU T1 4
OU T1 5
2
5
6
9
12
15
16
19
A0
A1
A2
A3
A4
A5
A6
A7
F un c ii
a lte rn a t ive
OC
CLK
Vcc
7 4 H C T3 7 4
R2
220
U6
A D0
A D1
A D2
A D3
A D4
A D5
A D6
A D7
3
4
7
8
13
14
17
18
S2
1
11
D0
D1
D2
D3
D4
D5
D6
D7
Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
OC
CLK
7 4 H C T3 7 4
U7
A D0
A D1
A D2
A D3
A D4
A D5
A D6
A D7
3
4
7
8
13
14
17
18
A LE
1
11
D0
D1
D2
D3
D4
D5
D6
D7
Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
OC
CLK
80C552
U11
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
A 10
A 11
A 12
A 13
A 14
10
9
8
7
6
5
4
3
25
24
21
23
2
26
1
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
A11
A12
A13
A14
S RAM
O R AM
WR
20
22
27
CE
OE
WR
7 4 H C T3 7 4
U10
11
12
13
15
16
17
18
19
O0
O1
O2
O3
O4
O5
O6
O7
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
A 10
A 11
A 12
A 13
A 14
10
9
8
7
6
5
4
3
25
24
21
23
2
26
27
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
A11
A12
A13
A14
S R OM
A 15
V CC
20
22
1
CE
OE
VPP
62256
O0
O1
O2
O3
O4
O5
O6
O7
11
12
13
15
16
17
18
19
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7
A D0
A D1
A D2
A D3
A D4
A D5
A D6
A D7
I N T2
I N T3
I N T4
I N T5
T2
RT 2
S DA
SCL
A8
A9
A10
A11
A12
A13
A14
A15
RX D
TX D
I N T0
I N T1
T0
T1
WR
RD
C M SR0
C M SR1
C M SR2
C M SR3
C M SR4
C M SR5
C MT 0
C MT 1
A DC 0
A DC 1
A DC 2
A DC 3
A DC 4
A DC 5
A DC 6
A DC 7
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
P2.0
P2.1
P2.2
P2.3
P2.4
P2.5
P2.6
P2.7
P3.0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7
P4.0
P4.1
P4.2
P4.3
P4.4
P4.5
P4.6
P4.7
P5.0
P5.1
P5.2
P5.3
P5.4
P5.5
P5.6
P5.7
2
4
6
8
11
13
15
17
IO0
IO1
IO2
IO3
IO4
IO5
IO6
IO7
1
19
S3
U9
A D0
A D1
A D2
A D3
A D4
A D5
A D6
A D7
18
16
14
12
9
7
5
3
1Y0
1Y1
1Y2
1Y3
2Y0
2Y1
2Y2
2Y3
1A0
1A1
1A2
1A3
2A0
2A1
2A2
2A3
1G
2G
27C256
7 4 H C T2 4 4
C4
3u3
U2A
74LS14
A 15
C5
3u3
SRAM
C7
3u3
RD
1
6
2
7
3
8
4
9
5
PS EN
U4A
3
2 7 4 H C T0 8
OR A M
U5
4
U4B
6
5 7 4 H C T0 8
WR
A 15
A8
A7
A6
A5
5
4
6
3
2
1
G2 B
G2 A
G1
C
B
A
7
9
10
11
12
13
14
15
Y7
Y6
Y5
Y4
Y3
Y2
Y1
Y0
S7
S6
S5
S4
S3
S2
S1
S0
U8
2
V+
1
C1+ 3
C1-
V-
4
C2+ 5
C2-
C6
3u3
14
7 TX D 1
TX D 2
11
IN 1 1 0
IN 2
TX D
13
8 R XD 1
R XD 2
12
OU T1 9
OU T2
RXD
MAX232
J11
VCC
1
2
P1
R S 2 32
D1
5V6
POW ER
7 4 H C T1 3 8
J1
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7
1
2
3
4
5
6
7
8
P0
J2
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
1
2
3
4
5
6
7
8
P1
J3
P2.0
P2.1
P2.2
P2.3
P2.4
P2.5
P2.6
P2.7
1
2
3
4
5
6
7
8
P2
J4
P3.0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7
1
2
3
4
5
6
7
8
P3
J5
P4.0
P4.1
P4.2
P4.3
P4.4
P4.5
P4.6
P4.7
1
2
3
4
5
6
7
8
P4
J6
P5.0
P5.1
P5.2
P5.3
P5.4
P5.5
P5.6
P5.7
1
2
3
4
5
6
7
8
P5
J7
S0
S1
S2
S3
S4
S5
S6
S7
1
2
3
4
5
6
7
8
S el
J8
IO0
IO1
IO2
IO3
IO4
IO5
IO6
IO7
1
2
3
4
5
6
7
8
J9
OU T0
OU T1
OU T2
OU T3
OU T4
OU T5
OU T6
OU T7
IO
1
2
3
4
5
6
7
8
OU TA
J10
OU T8
OU T9
OU T1 0
OU T1 1
OU T1 2
OU T1 3
OU T1 4
OU T1 5
1
2
3
4
5
6
7
8
OU TB
2.2.2
Microcontrolerul 80C167
Sistemul de dezvoltare cu microcontrolerul 80C167 permite dezvoltarea,
depanarea i execuia programelor de aplicaie realizate pe un PC. Schema
electric de principiu a sistemului este prezentat n figura 3.2.
Principalele faciliti ale sistemului de dezvoltare sunt:
selectarea memoriei externe, ROM+RAM sau numai RAM, precum i a
mrimii memoriei externe 1MB sau 2/4MB prin intermediul jumperelor
JP1JP4, respectiv JP6 i JP7, dup cum urmeaz:
JP1 i JP2 pe poziie WRx selecteaz U4 i U5 ca RAM, iar pe poziie
A15 selecteaz ca memorie ROM;
selecteaz ROM;
JP6 pe poziie V CC selecteaz memorie de 1 MB, iar pe poziie A18
memorie ROM.
JP5 n poziia V CC selecteaz magistral demultiplexat, iar n poziia
GND selecteaz magistral multiplexat. Dac este selectat magistrala
multiplexat, utilizatorul trebuie s ntrerup semnalele AD1AD15 ntre
microcontroler i circuitele de memorie U2 i U3.
setarea registrelor SYSCON, BUSCON0 i RP0H prin intermediul jumperelor
JP8JP15, dup cum urmeaz:
JP8 seteaz bitul WRCFG (SYSCON.7 modul semnalelor WR i BHE);
JP11 (P0.7)
OFF
ON
OFF
ON
JP12 i JP13 seteaz cmpul CSSEL din registrul RP0H care are
urmtoarea semnificaie:
JP12 (P0.9 ) JP13 (P0.10)
OFF
OFF
ON
ON
OFF
ON
OFF
ON
5 linii
Nici o
2 linii
3 linii
JP14 i JP15 seteaz cmpul SALSEL din registrul RP0H care are
urmtoarea semnificaie:
Numr linii adres segment
JP14 (P0.11) JP15 (P0.12)
OFF
OFF
Adres segment 2 bii (A16A17)
OFF
ON
Adres segment 8 bii (A16A23)
ON
OFF
Memorie nesegmentat
ON
ON
Adres segment 4 bii (A16A19)
R1
10k
S1
NMI
A D0
A D1
A D2
A D3
A D4
A D5
A D6
A D7
A D8
A D9
A D1 0
A D1 1
A D1 2
A D1 3
A D1 4
A D1 5
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
A 10
A 11
A 12
A 13
A 14
A 15
S2
RESET
ALE
EA
R S TIN
140
R S TO U T
141
99
142
98
ALE
P3.0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7
P3.8
P3.9
P3.10
P3.11
P3.12
P3.13
P3.15
P4.0
P4.1
P4.2
P4.3
P4.4
P4.5
P4.6
P4.7
U1
P5.0
P5.1
P5.2
P5.3
P5.4
P5.5
P5.6
P5.7
P5.8
P5.9
P5.10
P5.11
P5.12
P5.13
P5.14
P5.15
80C167
P6.0
P6.1
P6.2
P6.3
P6.4
P6.5
P6.6
P6.7
65
66
67
68
69
70
73
74
75
76
77
78
79
80
81
P3.0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7
P3.8
P3.9
P3.10
P3.11
P3.12
P3.13
P3.15
85
86
87
88
89
90
91
92
P4.0
P4.1
P4.2
P4.3
P4.4
P4.5
P4.6
P4.7
27
28
29
30
31
32
33
34
35
36
39
40
41
42
43
44
P5.0
P5.1
P5.2
P5.3
P5.4
P5.5
P5.6
P5.7
P5.8
P5.9
P5.10
P5.11
P5.12
P5.13
P5.14
P5.15
1
2
3
4
5
6
7
8
P6.0
P6.1
P6.2
P6.3
P6.4
P6.5
P6.6
P6.7
19
20
21
22
23
24
25
26
9
10
11
12
13
14
15
16
37
38
34
P 7.0
P 7.1
P 7.2
P 7.3
P 7.4
P 7.5
P 7.6
P 7.7
P 8.0
P 8.1
P 8.2
P 8.3
P 8.4
P 8.5
P 8.6
P 8.7
V A RE F
V A G ND
VPP
A1
A2
A3
A4
A5
A6
A7
A8
A9
A 10
A 11
A 12
A 13
A 14
A 15
A 16
A 17
L5
A 19
12
11
10
9
8
7
6
5
27
26
24
25
4
28
3
31
2
30
1
A1
A2
A3
A4
A5
A6
A7
A8
A9
A 10
A 11
A 12
A 13
A 14
A 15
A 16
A 17
L5
A 19
12
11
10
9
8
7
6
5
27
26
24
25
4
28
3
31
2
30
1
A16
L4
A19
L3
A16
L1
W RL
L2
W RH
A15
JP1
L6
A19
L5
A18
MAX232
14 TX D 1
7 TX D 2
V6
13 R XD 1 O U T1 12
8 R XD 2 O U T2 9
4
5
C2+
C2-
IN 1 11
IN 2 10
1
3
C1+
C1U8
V+
2
VCC
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
A 10
A 11
A12
A13
A14
A15
A16
A17
A 18
1M 2/4M
P5.0
P5.1
P5.2
P5.3
P5.4
P5.5
P5.6
P5.7
P5.8
P5.9
P5.10
P5.11
P5.12
P5.13
P5.14
P5.15
P4.0
P4.1
P4.2
P4.3
P4.4
P4.5
P4.6
P4.7
P6.0
P6.1
P6.2
P6.3
P6.4
P6.5
P6.6
P6.7
P O U T0
P O U T1
P O U T2
P O U T3
C C 28 IO
C C 29 IO
C C 30 IO
C C 31 IO
C C 16 IO
C C 17 IO
C C 18 IO
C C 19 IO
C C 20 IO
C C 21 IO
C C 22 IO
C C 23 IO
A D9
A D1 0
A D1 1
A D1 2
A D1 3
A D1 4
A D1 5
A D1 6
3
4
7
8
13
14
17
18
WR
OE
CE
13
14
15
17
18
19
20
21
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7
29 W RL
24
RD
22 CS1
U2 R A M L
A LE
1
11
D0
D1
D2
D3
D4
D5
D6
D7
A1
A2
A3
A4
A5
A6
A7
A8
A9
A 10
A 11
A 12
A 13
A 14
A 15
A 16
A 17
L5
A 19
12
11
10
9
8
7
6
5
27
26
24
25
4
28
3
31
2
30
1
A1
A2
A3
A4
A5
A6
A7
A8
A9
A 10
A 11
A 12
A 13
A 14
A 15
A 16
A 17
L5
A 19
12
11
10
9
8
7
6
5
27
26
24
25
4
28
3
31
2
30
1
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
A 10
A 11
A12
A13
A14
A15
A16
A17
A 18
D0
D1
D2
D3
D4
D5
D6
D7
WR
OE
CE
13
14
15
17
18
19
20
21
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7
29 W RH
24
RD
22 CS1
U3 R A M H
RAM HIGH
13
14
15
17
18
19
20
21
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7
29
24
22
L1
RD
CS0
2
5
6
9
12
15
16
19
A9
A10
A11
A12
A13
A14
A15
A16
A0
D0
A1
D1
A2
D2
A3
D3
A4
D4
A5
D5
A6
D6
A7
D7
A8
A9
WR
A 10
OE
A 11
CE
A12
A13
A14
A15
A16
A 17
U5
A 18R A M / R O M H
13
14
15
17
18
19
20
21
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7
29
24
22
L2
RD
CS0
U7
Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
JP5
A D1
A D2
A D3
A D4
A D5
A D6
A D7
A D8
3
4
7
8
13
14
17
18
A LE
1
11
VCC
OC
G H C T3 7 3
P0.1
P7.0
P7.1
P7.2
P7.3
P7.4
P7.5
P7.6
P7.7
P8.0
P8.1
P8.2
P8.3
P8.4
P8.5
P8.6
P8.7
RAM HIGH
D0
D1
D2
D3
D4
D5
D6
D7
A0
D0
A1
D1
A2
D2
A3
D3
A4
D4
A5
D5
A6
D6
A7
D7
A8
A9
WR
A 10
OE
A 11
CE
A12
A13
A14
A15
A16
A 17
U4
A 18 R A M / R O M L
JP7
1M 2/4M
A DC 0
A DC 1
A DC 2
A DC 3
A DC 4
A DC 5
A DC 6
A DC 7
A DC 8
A DC 9
A DC 10
A DC 11
A DC 12
A DC 13
A DC 14
A DC 15
A 16
A 17
A 18
A 19
A 20
A 21
A 22
A 23
CS0
CS1
CS2
CS3
CS4
H O LD
H L DA
B RE Q
U6
JP6
P2.0
P2.1
P2.2
P2.3
P2.4
P2.5
P2.6
P2.7
P2.8
P2.9
P2.10
P2.11
P2.12
P2.13
P2.14
P2.15
P3.0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7
P3.8
P3.9
P3.10
P3.11
P3.12
P3.13
P3.15
R A M LO W
C4
3u3
C5
3u3
C C 0 IO
C C 1 IO
C C 2 IO
C C 3 IO
C C 4 IO
C C 5 IO
C C 6 IO
C C 7 IO
C C 8 IO
C C 9 IO
C C 10 IO
C C 11 IO
C C 12 IO
C C 13 IO
C C 14 IO
C C 15 IO
T0 IN
T6 O U T
C A P IN
T3 O U T
T3 E UD
T4 IN
T3 IN
T2 IN
M RS T
M TS R
TX D
RXD
W RH
S CLK
C LK O U T
R A M LO W
VPP
P 2.0
P 2.1
P 2.2
P 2.3
P 2.4
P 2.5
P 2.6
P2.7
P 2.8
P 2.9
P 2.1 0
P 2.1 1
P 2.1 2
P 2.1 3
P 2.1 4
P 2.1 5
VAREF
VA GND
47
48
49
50
51
52
53
54
57
58
59
60
61
62
63
64
READY
P 2.0
P 2.1
P 2.2
P 2.3
P 2.4
P 2.5
P 2.6
P 2.7
P 2.8
P 2.9
P 2.1 0
P 2.1 1
P 2.1 2
P 2.1 3
P 2.1 4
P 2.1 5
P 1L. 0
P 1L. 1
P 1L. 2
P 1L. 3
P 1L. 4
P 1L. 5
P 1L. 6
P1L.7
P 1H .0
P 1H .1
P 1H .2
P 1H .3
P 1H .4
P 1H .5
P 1H .6
P 1H .7
RD
95
W R/W RL
96
118
119
120
121
122
123
124
125
128
129
130
131
132
133
134
135
R S TO U T
P8.0
P8.1
P8.2
P8.3
P8.4
P8.5
P8.6
P8.7
P 1.0
P 1.1
P 1.2
P 1.3
P 1.4
P 1.5
P 1.6
P 1.7
P 1.8
P 1.9
P 1.1 0
P 1.1 1
P 1.1 2
P 1.1 3
P 1.1 4
P 1.1 5
P 0L. 0
P 0L. 1
P 0L. 2
P 0L. 3
P 0L. 4
P 0L. 5
P 0L. 6
P 0L. 7
P 0H .0
P 0H .1
P 0H .2
P 0H .3
P 0H .4
P 0H .5
P 0H .6
P0H.7
NMI
100
101
102
103
104
105
106
107
108
111
112
113
114
115
116
117
P7.0
P7.1
P7.2
P7.3
P7.4
P7.5
P7.6
P7.7
P 0.0
P 0.1
P 0.2
P 0.3
P 0.4
P 0.5
P 0.6
P 0.7
P 0.8
P 0.9
P 0.1 0
P 0.1 1
P 0.1 2
P 0.1 3
P 0.1 4
P 0.1 5
X TA L 2
137
X TA L 1
138
40MHz
C3
27p
EA
RD
WR
Y1
97 READY
C1
10u
C2
27p
Funcii alternative
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7
P0.8
P0.9
P0.10
P0.11
P0.12
P0.13
P0.14
P0.15
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
P1.8
P1.9
P1.10
P1.11
P1.12
P1.13
P1.14
P1.15
D0
D1
D2
D3
D4
D5
D6
D7
Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
2
5
6
9
12
15
16
19
A1
A2
A3
A4
A5
A6
A7
A8
OC
G H C T3 7 3
P0.4
P0.6
P0.7
C6
3u3
C7
3u3
JP8
1
6
2
7
3
4
9
5
1
2
3
4
5
6
7
8
P0.10
JP10
R 2 1 5k
P1
RS232
P0.9
JP9
16
15
14
13
12
11
10
9
P0.11
JP11
P0.12
7805
JP12
JP13
JP14
JP15
8V...12V
VCC
DAC 8 bii
Y
Port IO
DAC 8 bii
OK
Z
/**************************************************************************\
nextchr:
mov
mov
mov
p2,#1
r0,#20h
r1,#40h
mov
movc
jz
DPTR,#txt
A,@DPTR
gata
inc
push
push
DPTR
DPL
DPH
mov
DPTR,#gen_c
clr
subb
C
A,#20h
mov
mul
add
mov
mov
adc
mov
B,#8
AB
A,DPL
DPL,A
B,A
A,DPH
DPH,A
;
;
;
;
;
;
mov
mov
r2,#7
r3,#7
; contor randuri
; contor coloane
mov
ch_v,vert
A,@DPTR
ch_o,oriz
A
B,A
endpixel
afis
ch_o
A,B
r3,nextpixel
;
;
;
;
;
;
;
;
;
inc
inc
djnz
ch_v
DPTR
r2,nextlin
mov
oriz,ch_o
pop
POP
jmp
ret
DPH
DPL
nextchr
mov
movx
mov
movx
nop
nop
nop
a,ch_o
@r0,a
a,ch_v
@r1,a
;afisare pixeli
nextlin:
movc
mov
nextpixel: RRC
mov
jnc
call
endpixel: inc
mov
djnz
gata:
afis:
citim un rand
DAC la inceput caracter
testare pixel de afisat
salvare rand
pixelul nu exista
desenam pixelul
urmatoarea coloana
refacere valoare rand
urmatorul rand
;ateptare 1 us
p4.2
;set z
;ateptare 1 us
p4.2
;reset z
txt:
db
Un text, 0
gen_c:
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
db
0,0,0,0,0,0,0,0
20h,20h,20h,20h,0,0,20h,0
50h,50h,50h,0,0,0,0,0
50h,50h,0f8h,50h,0f8h,50h,50h,0
20h,78h,0a0h,70h,28h,0f0h,20h,0
0c0h,0c8h,10h,20h,40h,98h,18h,0
60h,90h,0a0h,40h,0a8h,90h,68h,0
60h,20h,40h,0,0,0,0,0
10h,20h,40h,40h,40h,20h,10h,0
40h,20h,10h,10h,10h,20h,40h,0
0,20h,0a8h,70h,0a8h,20h,0,0
0,20h,20h,0f8h,20h,20h,0,0
0,0,0,0,60h,20h,40h,0
0,0,0,0f8h,0,0,0,0
0,0,0,0,0,60h,60h,0
0,8,10h,20h,40h,80h,0,0
70h,88h,98h,0a8h,0c8h,88h,70h,0
20h,60h,20h,20h,20h,20h,70h,0
70h,88h,8,10h,20h,40h,0f8h,0
0f8h,10h,20h,10h,8,88h,0f0h,0
10h,30h,50h,90h,0f8h,10h,10h,0
0f8h,80h,0f0h,8,8,88h,70h,0
30h,40h,80h,0f0h,88h,88h,70h,0
0f8h,8,10h,20h,40h,40h,40h,0
70h,88h,88h,70h,88h,88h,70h,0
70h,88h,88h,78h,8,10h,60h,0
0,60h,60h,0,60h,60h,0,0
0,60h,60h,0,60h,20h,40h,0
10h,20h,40h,80h,40h,20h,10h,0
0,0,0f8h,0,0f8h,0,0,0
80h,40h,20h,10h,20h,40h,80h,0
70h,88h,8,10h,20h,0,20h,0
70h,88h,8,68h,0a8h,0a8h,70h,0
70h,88h,88h,88h,0f8h,88h,88h,0
0f0h,88h,88h,0f0h,88h,88h,0f0h,0
70h,88h,80h,80h,80h,88h,70h,0
0e0h,90h,88h,88h,88h,90h,0e0h,0
0f8h,80h,80h,0f0h,80h,80h,0f8h,0
0f8h,80h,80h,0f0h,80h,80h,80h,0
70h,88h,80h,0b8h,88h,88h,78h,0
88h,88h,88h,0f8h,88h,88h,88h,0
70h,20h,20h,20h,20h,20h,70h,0
38h,10h,10h,10h,10h,90h,60h,0
88h,90h,0a0h,0c0h,0a0h,90h,88h,0
80h,80h,80h,80h,80h,80h,0f8h,0
88h,0d8h,0a8h,0a8h,88h,88h,88h,0
88h,88h,0c8h,0a8h,98h,88h,88h,0
70h,88h,88h,88h,88h,88h,70h,0
0f0h,88h,88h,0f0h,80h,80h,80h,0
70h,88h,88h,88h,0a8h,90h,68h,0
0f0h,88h,88h,0f0h,0a0h,90h,88h,0
78h,80h,80h,70h,8,8,0f0h,0
0f8h,20h,20h,20h,20h,20h,20h,0
88h,88h,88h,88h,88h,88h,70h,0
88h,88h,88h,88h,88h,50h,20h,0
88h,88h,88h,0a8h,0a8h,0a8h,50h,0
88h,88h,50h,20h,50h,88h,88h,0
88h,88h,88h,50h,20h,20h,20h,0
0f8h,8,10h,20h,40h,80h,0f8h,0
70h,40h,40h,40h,40h,40h,70h,0
0,80h,40h,20h,10h,8,0,0
70h,10h,10h,10h,10h,10h,70h,0
20h,50h,88h,0,0,0,0,0
0,0,0,0,0,0,0f8h,0
0,20h,20h,0f8h,20h,20h,0,0
;blanc
;!
;"
;#
;$
;%
;&
;'
;(
;)
;*
;+
;,
;;.
;/
;0
;1
;2
;3
;4
;5
;6
;7
;8
;9
;:
;;
;<
;=
;>
;?
;@
;A
;B
;C
;D
;E
;F
;G
;H
;I
;J
;K
;L
;M
;N
;O
;P
;Q
;R
;S
;T
;U
;V
;W
;X
;Y
;Z
;[
;\
;]
;^
;_
;+
sub_r:
wait1:
ret0:
wait2:
ret1:
mov
mov
mov
p2,#1
r0,#20h
r1,#40h
mov
mov
add
mov
movx
mov
movx
mov
nop
djnz
acall
a,oriz
ch_v,vert
a,#7
ch_o,a
@r0,a
a,ch_v
@r1,a
r7,#50h
;afisare reticul
;valoare DAC veritical
r7,wait1
afis
;ateptare
;afisam un pixel
mov
inc
acall
djnz
r7,#0eh
ch_v
afis
r7,ret0
mov
mov
add
mov
movx
mov
movx
mov
nop
djnz
acall
ch_o,oriz
a,vert
a,#7
ch_v,a
@r1,a
a,ch_o
@r0,a
r7,#20h
mov
inc
acall
djnz
r7,#0eh
ch_o
afis
r7,ret1
a,ch_o
@r0,a
a,ch_v
@r1,a
;afisare pixeli
;ateptare 1 us
p4.2
;set z
r7,wait2
afis
ret
afis:
mov
movx
mov
movx
nop
nop
nop
nop
nop
clr
;ateptare 1 us
p4.2
;reset z
2.3.2
Afiarea pe display LCD
Afioarele LCD au cptat o foarte mare dezvoltare, fiind folosite n
special ca dispozitive pentru afiarea informaiilor pentru sistemele cu
microcontrolere.
Dac iniial erau dispozitive cu 7 segmente, utilizabile n special pentru
afiarea numerelor, astzi s-au generalizat circuitele cu matrice de puncte
organizate n 24 linii de caractere, fiecare linie coninnd 1640 de
caractere alfanumerice. Exist i afioare LCD grafice proiectate pentru
utilizare cu microcontrolere. Acestea nu sunt organizate ca matrice de
caractere ci, mai degrab, ca un display, existnd rezoluii de la 190x190
pn la 640x480 puncte.
Avantajele dispozitivelor LCD constau n consumul extrem de redus,
gabaritul mic, contrastul foarte bun i vizibilitatea bun n condiii de
iluminare puternic.
Dezavantajele afioarelor, circuitele de comand complexe, tensiuni de
alimentare diferite de restul circuitelor i necesitatea unei iluminri externe n
condiii de ntuneric, au fost n bun parte eliminate de modulele actuale.
Acestea conin un microcontroler specializat care are ca sarcin interfaarea
cu sistemul master, decodificarea datelor, controlul memoriei de caractere,
controlul tensiunilor de alimentare etc.
Astzi exist pe pia o multitudine de dispozitive, n mare parte fiind
echivalente ntre ele, n continuare fiind prezentate structura pinilor,
comenzile i un exemplu de program surs pentru un display cu 2 rnduri i
16 caractere.
Programele surs folosesc fiierele de definiii SYSTEM.H i TYPEDEF.H
care sunt prezentate n anexe.
n tabelul 3.12 sunt prezentate funciile pinilor modulului afior LCD iar
n tabelul 3.13 este prezentat registrul de comenzi i setul de instruciuni al
controlerului afiorului.
Pin nr.
1
2
3
Simbol
V SS
V DD
V0
RS
5
6
7
8
9
10
R/W
E
DB0
DB1
DB2
DB3
Tabelul 2.12
Funcie
0V
5V5%
0V(max)5V
H: Data input
H/L
Selectare registru
L: Instruction code input
H/L
Citire/Scriere
H: Citire, L: Scriere
H, HL Selecie afiaj (Enable) --mod 8 bii
H/L
Bitul 0 de date
H/L
Bitul 1 de date
H/L
Bitul 2 de date
H/L
Bitul 3 de date
Nivel
-----
Descriere
Mas
Alimentare
Ajustare contrast
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
Codul
Instruciunea
Display Clear 0 0 0 0 0 0 0 0 0 1
Entry
set
mode
0 0 0 0 0 0 0 1
I/D
Display/
0 0 0 0 0 0 0 0 1 *
Cursor Home
0 0 0 0 0 0 1 D C B
Display/
Cursor Shift
0 0 0 0 0 1
CG RAM
Address Set
0 0 0 1
DD RAM
Address Set
0 0 1
DL
Function Set 0 0 0 0 1
S/C
R/L
Display
ON/OFF
* *
N 0 * *
ACG
ADD
BF
Busy Flag /
AC
Address
0 1
Counter read
CG RAM / DD
Datele ce vor fi
RAM Data
1 0
nscrise
Write
CG RAM / DD
Datele care sunt
RAM Data
1 1
citite
Write
Funcia
terge toat zona de date,
reface stara afiajului, ncarc
contorul de adrese cu adresa
DD RAM 00h
Reface starea afiajului din
deplasare i incarc contorul
de adrese cu adresa DD RAM
00h
Indic direcia de deplasare a
cursorului i a deplasarea
afiajului. Aceast operaie
are loc dup fiecare dat
transferat.
Indic i activeaz afiajul
(D), cursorul (C), plpirea
caracterului aflat la poziia
cursorului (B).
Deplasare afiaj (S/C=1), sau
cursor (S/C=0) la dreapta
(R/L=1) sau stnga (R/L=0).
Seteaz numrul de bii ai
interfeei (DL=1: 8 bii, DL=0:
4 bii) i numrul de linii ai
afiajului (N=1: dou linii,
N=0: o linie).
ncarc contorul de adrese cu
o adres CG RAM. Toate
datele ulterioare vor fi din/n
CG RAM.
ncarc contorul de adrese cu
o adres DD RAM. Toate
datele ulterioare vor fi din/n
DD RAM.
Citire indicatorului BUSY (BF)
i a contorului de adrese
(AC).
Tabelul 2.13
Timpul de
execuie
f OSC =250kHz
1.64ms
1.64ms
40s
40s
40s
40s
40s
40s
40s
40s
40s
/**************************************************************************\
** Titlu:
LCD.H
**
** Descriere:
Declaratiile functiilor pentru lucru cu LCD-ul
**
**
**
** Versiune:
2.0
**
** Inceut la:
August 97
**
** Autor:
Stefan Suceveanu, Pratco s.r.l. Bucuresti, Romania
**
** Compilator C: C51 V2.27, Franklin Software, Inc.
**
**
**
** Acest modul contine urmatoarele functii:
**
**
declaratii de coduri si macrouri
**
void
void
void
void
void
void
void
LCDcmd(char c);
//
LCDdta(char d);
//
LCD_init(void);
//
LCDclear(bit row);
//
LCDclr(bit row);
//
LCDstr(bit rand, char col, char* txt);
LCDchr(bit rand, char col, char chr);
CursorON()
CursorOFF()
BlinkON()
BlinkOFF()
BonCoff()
BoffCon()
LCDcmd(0x0E)
LCDcmd(0x0C)
LCDcmd(0x0D)
LCDcmd(0x0C)
LCDcmd(0x0D)
LCDcmd(0x0E)
bit CursorRight(void);
bit CursorLeft(void);
byte LCDgetpoz(void);
void LCDsetpoz(byte poz);
1=EOL
1=BOL
0x00-0x17 rind 1, 0x40-0x57 rind 2
0x00-0x17 rind 1, 0x40-0x57 rind 2
#ifdef _LCD_BUFFER_
#include "../MAIN/system.h"
extern xdata char LCDTXT[2][LCD_SIZE+1]; /* imaginea in memorie
a LCD-ului */
extern bit fLCD;
/* Flag date noi pt LCD
*/
/* Indica ca sunt daate noi de afisat in
bufferul LCDTXT
*/
extern bit fLCDon;
/* Flag afisare permisa LCD
*/
/* fLCDon = 0 blocheaza afisarea pe LCD
este folosit pentru a bloca afisarea
cand se folosesc functii lungi (printf)
si care pot lasa bufferul LCDTXT
intr-o stare nedefinita (nu ASCIIZ) */
extern void LCDput(bit rand, char col, char *txt);
#endif
#endif
/**************************************************************************\
** Titlu:
LCD.C
**
** Descriere:
Functiile folosite pentru acesul la LCD
**
\**************************************************************************/
#include <reg552.h>
#include <stdio.h>
#include <string.h>
#include <absacc.h>
#include <typedef.h>
#include "..\main\system.h"
#include "lcd.h"
#ifdef _LCD_BUFFER_
xdata char
LCDTXT[2][LCD_SIZE+1];
bit
fLCD;
// Flag date noi pentru LCD
bit
fLCDon;
// Flag afisare permisa pe LCD
#endif
\*************************************************************************
LCDcmd = transmite o comanda la LCD
*************************************************************************/
void LCDcmd(char c)
{
waitLCD();
LCDwcmd(c);
}
\*************************************************************************
iLCDcmd = transmite o comanda la LCD. Folosita in intreruperi cand se
foloseste bufferarea afisajului
*************************************************************************/
#ifdef _LCD_BUFFER_
//
//
//
//
\*************************************************************************
LCDgetpoz = intoarce pozitia unde se afla cursorul
*************************************************************************/
byte LCDgetpoz(void)
{
data byte poz;
do
poz = XBYTE[0x0102];
while (poz & 0x80);
return (poz & 0x7f);
}
\*************************************************************************
LCDsetpoz = muta cursorul la pozitia specificata
*************************************************************************/
void LCDsetpoz(byte poz)
{
waitLCD();
LCDwcmd(poz | 0x80);
}
\*************************************************************************
CursorRight = muta cursorul la dreapta
*************************************************************************/
bit CursorRight(void) // 1=EOL
{
data byte poz;
\*************************************************************************
LCDclr = sterge afisajul la randul specificat. Scrie direct la LCD
*************************************************************************/
void LCDclr(bit row)
{
LCDstr(row, 0, "
");
}
/*
void LCDchr(bit rand, char col, char chr)
{
unsigned char i;
// randul 0 incepe de la adresa 0x00 pana la 0x17 = 24 de pozitii
// randul 1 incepe de la adresa 0x40 pana la 0x57
}
*/
#ifdef _LCD_BUFFER_
\*************************************************************************
LCDclear = sterge randul din imaginea textului LCD in memorie
*************************************************************************/
void LCDclear(bit row)
{
byte r;
r = row ? 1 : 0;
fLCDon = 0;
memset(LCDTXT[r], 0, LCD_SIZE+1);
fLCD = fLCDon = 1;
}
\*************************************************************************
LCDstr = scrie un sir de caractere la randul si coloana specificate,
direct la LCD
*************************************************************************/
void LCDstr(bit rand, char col, char *txt)
{
xdata byte r,c,i;
r = rand ? 1 : 0;
c = 0;
while(LCDTXT[r][c] && (c < LCD_SIZE)) // cautam ASCIZ
c++;
fLCDon = 0;
P4.3
P4.2
P4.1
P4.0
1
4
7
*
2
5
8
0
3
6
9
#
A
B
C
D
P4.3
P4.2
P4.1
P4.0
P4.4 P4.6
P4.4 P4.6
P4.5
P4.5 P4.7
Figura 2.5. Conectarea tastaturii la sistemele cu 80C552
2.4.1
Rutine pentru utilizarea tastaturii pe sistemele cu 80C552
Citirea tastaturii se face folosind urmtorul algoritm:
Pasul 1.
Se emit pe rnduri (P4.0P4.3) 0000 i se seteaz coloanele ca
intrri (P4.4P4.7) 1111;
Pasul 2.
Pasul 3.
Pasul 4.
Pasul 5.
* si o alta tasta */
Kbo1
0x19
Kbo2
0x39
Kbo3
0x59
Kbo4
0x45
Kbo5
0x35
Kbo6
0x55
Kbo7
0x13
Kbo8
0x33
Kbo9
0x53
Kbo0
0x31
Kbod
0x51
/* combinatii
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
# si o alta tasta */
Kbd1
0x59
Kbd2
0x69
Kbd3
0x49
Kbd4
0x55
Kbd5
0x65
Kbd6
0x45
Kbd7
0x53
Kbd8
0x63
Kbd9
0x43
Kbd0
0x61
Kbdo
0x51
// coduri de eroare
#define NKb
0
#define
GI_OK
#define
GI_ESC
#define
GI_WAIT
#define
GI_NOINPUT
#define
GI_KBRDERR
#define
GI_NODATA
-6
-1
-2
-3
-4
-5
/*
/*
/*
/*
/*
/*
#endif // _KBRDCODE_H_
/**************************************************************************\
** Titlu:
KBRD.H
**
** Descriere:
Prototipurile funciilor pentru citirea tastaturii 3x4 **
**
sau 4x4
**
**
**
** Acest modul conine urmtoarele funcii:
**
**
Citire bufferat a tastaturii:
**
**
fKBRD_ERR: flag care indic o eroare apruta la citirea tast.
**
**
iKBRD_read(void) citete de la port i depune n stiv.
**
**
Funcii de citire a tastaturii:
**
**
KBHIT: flag care indic apsarea unei taste.
**
**
byte KBH_init(void) funcie care iniializeaz tastatura i date **
**
char getnomber(byte row, byte col, char *txt, char retlen,
**
**
char** retsir) funcie de editare ir de caractere
**
**
**
** Observaii: Pentru validarea lucrului bufferat cu tastatura trebuie
**
#endif
extern bit KBHIT;
extern void KBRD_init(void);
// iniializeaz tastatura
extern byte KBRD_read(void);
// extrage un caracter din bufferul de tastatur
//extern int getint(byte row, byte col, char *txt, char len);
extern char getnomber(byte row, byte col, char *txt, char retlen, char** retsir);
#endif
/**************************************************************************\
** Titlu:
KBRD.C
**
** Descriere:
Implementarea funciilor pt. folosirea tastaurii 3x4 sau**
**
4x4
**
**
**
** Acest modul conine urmtoarele funcii:
**
**
Citire bufferat a tastaturii:
**
**
fKBRD_ERR: flag care indica o eroare aprut la citirea tast.
**
**
iKBRD_read(void) citete de la port i depune n stiv.
**
**
Funcii de citire a tastaturii:
**
**
KBHIT: flag care indic apsarea unei taste.
**
**
byte KBH_init(void) funcie care iniializeaz tastatura i date.**
**
char getnomber(byte row, byte col, char *txt, char retlen,
**
**
char** retsir) funcie de editare ir de caractere
**
**
**
** Observaii: Pentru validarea lucrului bufferat cu tastatura trebuie
**
**
introdusa linia #define KBRD_BUFFER in KBRD.H
**
**
Folosete rutine pentru afiare pe LCD (LCD.H)
**
**
**
\**************************************************************************/
#pragma DEBUG OBJECTEXTEND CODE SYMBOLS
#include <reg552.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <typedef.h>
#include "..\main\system.h"
#include "kbrdcode.h"
#include "kbrd.h"
bit KBHIT;
#ifdef _KBRD_BUFFER_
static idata
byte
static idata
byte
bit fKBRD_ERR;
byte iKBRD_read(void);
#endif
void KBRD_init(void);
byte KBRD_read(void);
// iniializeaz tastatura
// extrage un caracter din bufferul de tastatur
\*************************************************************************
Iniializeaz tastatura.
Dac este validat modul bufferat iniializeaz pointerii de citire i scriere n
stiva tastaturii.
Seteaz portul P4 ca fiind portul la care este legat tastatura.
*************************************************************************/
void KBRD_init(void)
{
#ifdef _KBRD_BUFFER_
KBRD_R = 0x00;
KBRD_W = 0x00;
#endif
P4 = 0xff;
//
//
//
//
se
se
se
se
if(!t)
to = 0;
if((t == to) || (!(t & 0xf0)))
return 0;
to = t;
KBHIT = 1;
#ifdef _KBRD_BUFFER_
// scriem n bufferul de tastatur
KBRD_BUFF[KBRD_W] = t;
// incrementm poziia de scriere n buffer numai dac nu suprascriem
// informaia mai veche
poz = (KBRD_W + 1) % KBRD_BUFF_SIZE;
if(poz != KBRD_R)
KBRD_W = poz;
else
fKBRD_ERR = 1;
#endif
return(t);
}
\*************************************************************************
Funciile de citire a tastaturii:
byte KBRD_read(void): citire bufferat a tastaturii. Se apeleaz
atunci cnd se lucreaz cu iKBRD_read n ntreruperi.
*************************************************************************/
#ifdef _KBRD_BUFFER_
byte KBRD_read(void)
{
data byte r;
if(KBRD_R == KBRD_W)
return 0;
// bufferul de tastatur este gol
else
{
r = KBRD_BUFF[KBRD_R]; // returnm ce gsim n bufferul de tastatur
KBRD_R = (KBRD_R + 1) % KBRD_BUFF_SIZE;
return r;
// am extras un caracter din buffer
}
}
#endif
2.4.2
P2.3
P2.2
P2.1
P2.0
LM 16X21A
D7 D6 D5 D4 D3 D2 D1 D0
EN R/W RS
<reg167.h>
<stdio.h>
<ctype.h>
<intrins.h>
*/
*/
*/
char waitLCD(void);
/* ateapt LCD ready, ntoarce AC
*/
void cmdLCD(char c);
/* comanda ctre LCD
*/
void initLCD(void);
/* reset i iniializare LCD
*/
char readLCD(void);
/* citete caracter din CG/DD RAM
*/
void dataLCD(char c);
/* scrie caracter in CG/DD RAM
*/
void putLCD(char rind, char coloana, char *s);/*pune ASCIIZ la rnd, coloan*/
void chrLCD(char rind, char coloana, char c); /*pune char la rnd, coloan*/
void clrLCD(char rind);
/* sterge rindul specificat (4 sterge tot)
*/
unsigned int kbd(void);
/* citeste un caracter de la Tastatura 4*4
*/
char waitLCD(void)
{
unsigned char p;
DP2 |= 0x0e00;
DP8 = 0x00;
*/
*/
P2 &= 0xf7ff;
P2 |= 0x0400;
P2 &= 0xfdff;
*/
*/
*/
/* Validare LCD
*/
/* Validare LCD
*/
DP8 = 0xff;
_nop_();
*/
P8 = c;
P2 &= 0xf1ff;
P2 |= 0x0800;
P2 &= 0xf7ff;
/* validare LCD
/* dezactivare LCD
*/
*/
*/
/* dezactivare LCD
*/
DP8 = 0xff;
_nop_();
*/
P8 = c;
*/
P2 |= 0x0200;
P2 &= 0xfbff;
/* RS = 1
/* R/W = 0
*/
*/
P2 |= 0x0800;
P2 &= 0xf7ff;
/* validare LCD
/* dezactivare LCD
*/
*/
p = P8;
while((p & 0x80) == 0x80)
p = P8;
P2 &= 0xf7ff;
return(p & 0x7f);
}
void cmdLCD(char c)
{
waitLCD();
}
char readLCD(void)
{
char p;
waitLCD();
P2 |= 0x0e00;
p = P8;
P2 &= 0xf7ff;
return(p);
}
void dataLCD(char c)
{
waitLCD();
}
void initLCD(void)
{
cmdLCD(0x38);
cmdLCD(0x06);
cmdLCD(0x0c);
cmdLCD(0x01);
}
/*
/*
/*
/*
*/
*/
*/
*/
/* Tastatura 4*4
*/
DP2 = 0x000f;
ODP2 = 0x00ff;
_nop_();
P2 = 0;
*/
*/
/* OUT
*/
DP2 = 0x0e0f;
_nop_();
t = P2 & 0x00f0;
/* P2.4-7 set IN
/* P2.9-B pentru LCD
/* IN
*/
*/
*/
DP2 = 0x0ef0;
*/
*/
_nop_();
P2 = t;
/* OUT value
*/
/* IN or value
*/
/* conversie ASCII
t=0x30;break;
t=0x31;break;
t=0x32;break;
t=0x33;break;
t=0x34;break;
t=0x35;break;
t=0x36;break;
t=0x37;break;
t=0x38;break;
t=0x39;break;
t=0x41;break;
t=0x42;break;
t=0x43;break;
t=0x44;break;
t=0x45;break;
t=0x46;break;
t=0;
break;
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
2.4.3
Funcii de citire i editare iruri de caractere
Tot legat de citirea tastaturii mai este prezentat i o funcie mai
complex care folosete i modulul de afiare pe LCD (getnumber). Aceast
funcie este folosit pentru afiarea unui mesaj i citirea unei variabile
numerice care este returnat sub forma unui ir de caractere de lungime
predefinit la apelul funciei. n aceast funcie au fost atribuite urmtoarele
definiii tastelor:
A: introduce un punct zecimal (dac nu a fost introdus deja unul)
B: introduce semnul pe prima poziie.
C: terge ultimul caracter
*: ESC
#: ENTER
Funcia nu ateapt ca s fie apsata o tast i deci trebuie apelat n
polling.
Funcia EDITTEXT pentru editare de texte implementat este un mic
editor de texte. Aceasta primete ca parametrii un mesaj, MSG, care va fi
afiat pe primul rnd pe afiajul LCD, un text, TXT, care va fi afiat pe rndul
al doilea pe LCD i care reprezint valoarea implicit care va fi modificat de
utilizator. Urmtoarele interpretri s-au dat tastelor:
TASTA 4:
mut cursorul la stnga; scroll text dac este necesar;
TASTA 6:
mut cursorul la dreapta; scroll text dac este necesar;
TASTA 2:
incrementeaz caracterul de sub cursor;
TASTA 2:
decrementeaz caracterul de sub cursor;
TASTA 5:
caracterul de sub cursor = spaiu;
TASTA 1:
caracterul de sub cursor = A;
TASTA 3:
caracterul de sub cursor = Z;
TASTA 7:
caracterul de sub cursor = a;
TASTA 9:
caracterul de sub cursor = z;
TASTA 0:
caracterul de sub cursor = 0;
TASTA *:
ESC funcia va ntoarce GI_ESC
TASTA #:
ENTER funcia va ntoarce 1
Funcia nu ateapt ca s fie apsata o tast i deci trebuie apelat n
polling.
/**************************************************************************\
** Titlu:
EDITTEXT.C
**
** Descriere:
Citirea unui text si a unui numr
**
**
**
** Versiune:
2.0
**
** nceput la:
August 97
**
** Autor:
tefan Suceveanu, Pratco s.r.l. Bucureti, Romnia
**
** Compilator C: C51 V2.27, Franklin Software, Inc.
**
**
**
** Acest modul conine urmtoarele funcii:
**
**
int edittext(char* msg, char* txt, char maxlen)
**
**
Afieaz msg pe LCD pe primul rnd i txt pe rndul 2
**
**
Modifica txt, care poate s conin maxim maxlen caractere
**
**
char getnomber(byte row, byte col, char *txt, char len,
**
#define Nsir 5
xdata char l[Nsir+1];
/* Editeaz un text
afieaz MSG pe primul rand
afieaz txt pe rndul 2 si l modific
se pot introduce maxim 'maxlen' caractere
txt trebuie alocat txt[maxlen+1]
TASTA 4:
mut cursorul la stnga; scroll text dac este necesar
TASTA 6:
mut cursorul la dreapta; scroll text dac este necesar
TASTA 2:
incrementeaz caracterul de sub cursor
TASTA 2:
decrementeaz caracterul de sub cursor
TASTA 5:
caracterul de sub cursor = spaiu
TASTA 1:
caracterul de sub cursor = A
TASTA 3:
caracterul de sub cursor = Z
TASTA 7:
caracterul de sub cursor = a
TASTA 9:
caracterul de sub cursor = z
TASTA 0:
caracterul de sub cursor = 0
INTOARCE:
!ATENTIE!
!ATENTIE!
*/
int edittext(char* msg, char* txt, char maxlen)
{
static data char t,poz,s;
data byte c;
if(!kbsstate)
{
poz = s = 0;
LCDstr(0, 0, msg);
LCDstr(1, 0, txt);
LCDstr(1, 0, "\0");
kbsstate++;
CursorON();
}
else
{
t = KBRD_read();
if(!t)
return GI_WAIT;
switch(t)
{
case Kb4: if(poz)
//deplaseaz cursor la stnga, scroll
poz--;
if(poz < s)
{
s = poz;
LCDclr(1);
LCDstr(1, 0, &txt[s]);
LCDstr(1, 0, "\0");
}
else
CursorLeft();
break;
case Kb6: poz++;
//deplaseaz cursor la dreapta, scroll
if(poz > strlen(txt))
//
case Kb2:
case Kb8:
case Kb5:
case Kb0:
case Kb1:
case Kb3:
case Kb7:
case Kb9:
case KbC:
case Kbo:
case Kbd:
poz = strlen(txt);
if(poz > maxlen)
poz = maxlen;
if(poz > s+15)
{
s = poz - 15;
LCDclr(1);
LCDstr(1, 0, &txt[s]);
LCDstr(1, 15, "\0");
}
else
LCDstr(1, poz-s, "\0");
CursorRight();
break;
if(poz == strlen(txt))
//incrementeaz caracterul
{
txt[poz+1] = 0;
//ultimul caracter -> 0
txt[poz] = '0';
}
else
{
c = txt[poz];
c++;
if(c > 0x7f)
c = 0x20;
txt[poz] = c;
}
LCDstr(1, 0, &txt[s]);
LCDstr(1, poz, "\0");
break;
if(poz == strlen(txt))
//decrementeaz caracterul
{
txt[poz+1] = 0;
//ultimul caracter -> z
txt[poz] = 'z';
}
else
{
c = txt[poz];
c--;
if(c < 0x20)
c = 0x7f;
txt[poz] = c;
}
LCDstr(1, 0, &txt[s]);
LCDstr(1, poz, "\0");
break;
txt[poz] = 0x20;
//caracterul de sub cursor
LCDstr(1, 0, &txt[s]);
LCDstr(1, poz, "\0");
break;
txt[poz] = '0';
//caracterul de sub cursor
LCDstr(1, 0, &txt[s]);
LCDstr(1, poz, "\0");
break;
txt[poz] = 'A';
//caracterul de sub cursor
LCDstr(1, 0, &txt[s]);
LCDstr(1, poz, "\0");
break;
txt[poz] = 'Z';
//caracterul de sub cursor
LCDstr(1, 0, &txt[s]);
LCDstr(1, poz, "\0");
break;
txt[poz] = 'a';
//caracterul de sub cursor
LCDstr(1, 0, &txt[s]);
LCDstr(1, poz, "\0");
break;
txt[poz] = 'z';
//caracterul de sub cursor
LCDstr(1, 0, &txt[s]);
LCDstr(1, poz, "\0");
break;
strcpy(&txt[poz], &txt[poz+1]); //terge caracterul
LCDstr(1, 0, &txt[s]);
break;
kbstate = 0;
//* = ESC
LCDclr(0);
LCDclr(1);
CursorOFF();
return GI_ESC;
break;
kbstate = 0;
//# = ENTER
LCDclr(0);
LCDclr(1);
CursorOFF();
de sub cursor
de sub cursor
= 0
= A
= Z
= a
= z
if(first)
{
l[k++] = '-';
first = 0;
refresh = 1;
}
break;
case KbC:
if(!first)
// tergem ultimul caracter
{
k--;
if(l[k] == '.')
// dac tergem virgula
virgula = 0;
// marcm c nu avem virgul
l[k] = ' ';
if(txt)
LCDstr(row, col + strlen(txt), l);
else
LCDstr(row, col, l);
l[k] = 0;
if(!k)
first = 1;
refresh = 1;
}
break;
// ESC
case NKb:
if(first)
return GI_NOINPUT;
break;
//
//
default:
return GI_KBRDERR;
break;
// ENTER
// tast necunoscut
}
if(refresh)
{
refresh = 0;
l[k] = 0;
if(txt)
{
LCDstr(row, col, txt);
LCDstr(row, col + strlen(txt), l);
}
else
LCDstr(row, col, l);
}
if(first)
// nu este apsat nici o tast
return GI_NOINPUT;
return GI_WAIT;
}
data
data
data
55h
56h
57h
; regsitrii de lucru
h_b:
clr
mov
mov
mov
a
r_0,a
r_1,a
r_2,a
mov
anl
jz
mov
movc
mov
a,hex0
a,#0fh
etc3
dptr,#tab_00-1
a,@a+dptr
r_0,a
;formare semioctet 1
mov
anl
jz
swap
mov
mov
movc
add
da
mov
mov
mov
movc
addc
da
mov
a,hex0
a,#0f0h
etc4
a
r7,a
dptr,#tab_10-1
a,@a+dptr
a,r_0
a
r_0,a
a,r7
dptr,#tab_11-1
a,@a+dptr
a,r_1
a
r_1,a
mov
anl
jz
mov
mov
movc
add
da
mov
mov
mov
a,hex1
a,#0fh
etc5
r7,a
dptr,#tab_20-1
a,@a+dptr
a,r_0
a
r_0,a
a,r7
dptr,#tab_21-1
etc3:
etc4:
;conversie uniti
;formare semioctet 2
;conversie zeci
;formare z+u
;valoarea unui octet este
;zecimal intre 0 si 256
;acum determinam sutele
;adunam cu carry
;formare semioctet 3
;formare z+u
54h
34h
etc5:
movc
addc
da
mov
a,@a+dptr
a,r_1
a
r_1,a
mov
anl
jz
swap
mov
mov
add
da
mov
mov
mov
movc
addc
da
mov
mov
mov
movc
addc
da
mov
a,hex1
a,#0f0h
etc6
a
r7,a
dptr,#tab_30-1
a,r_0
a
r_0,a
a,r7
dptr,#tab_31-1
a,@a+dptr
a,r_1
a
r_1,a
a,r7
dptr,#tab_32-1
a,@a+dptr
a,r_2
a
r_2,a
mov
mov
mov
r2,#3
r1,r_2
r0,#char0
mov
and
swap
add
@r0,a
inc
mov
and
add
mov
inc
dec
dec
jpnz
mov
ret
a,@r1
a,#0f0h
a
a,#40h
db
db
db
db
db
db
db
db
db
db
db
db
db
db
1,2,3,4,5,6,7,8,9
10h,11h,12h,13h,14h,15h
16h,32h,48h,64h,80h,96h,12h,28h
44h,60h,76h,92h,08h,24h,40h
0,0,0,0,0,0,1,1,1,1,1,1,2,2,2
56h,12h,68h,24h,80h,36h,92h,48h
04h,60h,16h,72h,28h,84h,40h
2,5,7,10h,12h,15h,17h,20h
23h,25h,28h,30h,33h,35h,38h
96h,92h,88h,84h,80h,76h,72h,68h
64h,60h,56h,52h,48h,44h,40h
40h,81h,22h,63h,4,45h,86h,27h
68h,9,50h,91h,32h,73h,14h
0,0,1,1,2,2,2,3,3,4,4,4,5,5,6
etc6:
etc7:
mov
tab_00:
tab_10:
tab_11:
tab_20:
tab_21:
tab_30:
tab_31:
tab_32:
;formare m+s
;formare semioctet 4
movc
a,@a+dptr
;formare z+u
;formare m+s
;conversie zm
;formatare zm
;conversie ASCII
2.5.2
r0
a,@r1
a,#0fh
a,#40h
@r0,a
r0
r1
r2
etc7
@r0,#00h
SEGMENT
SEGMENT
SEGMENT
SEGMENT
DATA
CODE
DATA
CODE
RSEG
math_32_data
?load_16?byte: DS 2
?load_32?byte: DS 4
?mul_16?byte:
DS 2
?div_16?byte:
DS 2
?add_16?byte:
DS 2
?sub_16?byte:
DS 2
?add_32?byte:
DS 4
?sub_32?byte:
DS 4
op_0:
DS 1
op_1:
DS 1
op_2:
DS 1
op_3:
DS 1
tmp_0:
DS 1
tmp_1:
DS 1
tmp_2:
DS 1
tmp_3:
DS 1
RSEG
math_32_code
load_16:
;ncarc octeii 0+1 ai operandului cu valoarea dorit
mov
op_3,#0
mov
op_2,#0
mov
op_1,?load_16?byte
mov
op_0,?load_16?byte + 1
ret
load_32:
; ncarc octeii 0-4 ai operandului cu valoarea dorit
op_3,?load_32?byte
op_2,?load_32?byte + 1
op_1,?load_32?byte + 2
op_0,?load_32?byte + 3
low_16:
;ntoarce octeii 0+1 (LSB) ai operandului
mov
r6,op_1
mov
r7,op_0
ret
mid_16:
; ntoarce octeii 1+2 ai operandului
mov
r6,op_2
mov
r7,op_1
ret
high_16:
; ntoarce octeii 2+3 (MSB) ai operandului
mov
r6,op_3
mov
r7,op_2
ret
add_16:
;adaug
clr
mov
addc
mov
mov
addc
mov
mov
addc
mov
mov
addc
mov
ret
add_32:
; adaug patru octei furnizai
clr
c
mov
a,op_0
addc
a,?add_32?byte + 3
mov
op_0,a
mov
a,op_1
addc
a,?add_32?byte + 2
mov
op_1,a
mov
a,op_2
addc
a,?add_32?byte + 1
mov
op_2,a
mov
a,op_3
addc
a,?add_32?byte
mov
op_3,a
ret
de program la operand
;octet 0 (lsb)
;octet 1 + carry
;octet 2 + carry
sub_16:
;scdere 16 bii furnizai de program apelant din operand
clr
c
mov
a,op_0
subb
a,?sub_16?byte + 1
;octet LSB
mov
op_0,a
mov
a,op_1
subb
a,?sub_16?byte
;octet MSB + C
mov
op_1,a
mov
a,op_2
subb
a,#0
;propagare C
mov
op_2,a
mov
a,op_3
subb
a,#0
;propagare C
mov
op_3,a
ret
sub_32:
; scdere 32 bii furnizai de program apelant din operand
clr
c
mov
a,op_0
subb
a,?sub_32?byte + 3
;octet 0
mov
op_0,a
mov
a,op_1
subb
a,?sub_32?byte + 2
;octet 1 + carry
op_1,a
a,op_2
a,?sub_32?byte + 1
op_2,a
a,op_3
a,?sub_32?byte
op_3,a
;octet 2 + carry
;octet 3 + carry
mul_16:
;nmulire operand 32 bii cu valoare 16 bii
mov
tmp_3,#0
;tergere 16 bii (MSB)
mov
tmp_2,#0
;generare octet 0 resultat
mov
b,op_0
mov
a,?mul_16?byte+1
mul
ab
mov
tmp_0,a
mov
tmp_1,b
;generare octet 1 resultat
mov
b,op_1
mov
a,?mul_16?byte+1
mul
ab
add
a,tmp_1
mov
tmp_1,a
mov
a,b
addc
a,tmp_2
mov
tmp_2,a
jnc
mul_loop1
inc
tmp_3
mul_loop1:
mov
b,op_0
mov
a,?mul_16?byte
mul
ab
add
a,tmp_1
mov
tmp_1,a
mov
a,b
addc
a,tmp_2
mov
tmp_2,a
jnc
mul_loop2
inc
tmp_3
mul_loop2:
;Generare octet 2 rezultat
mov
b,op_2
mov
a,?mul_16?byte+1
mul
ab
add
a,tmp_2
mov
tmp_2,a
mov
a,b
addc
a,tmp_3
mov
tmp_3,a
;Generare octet 3 rezultat
mov
b,op_1
mov
a,?mul_16?byte
mul
ab
add
a,tmp_2
mov
tmp_2,a
mov
a,b
addc
a,tmp_3
mov
tmp_3,a
;Finalizare rezultat
mov
b,op_3
mov
a,?mul_16?byte+1
mul
ab
add
a,tmp_3
mov
tmp_3,a
;Eliminare rezultat superior. Valoare numai pe 32 bii
mov
b,op_2
mov
a,?mul_16?byte
mul
ab
add
a,tmp_3
mov
tmp_3,a
;Mutare din registre temporare n operand
mov
op_0,tmp_0
mov
op_1,tmp_1
mov
op_2,tmp_2
mov
op_3,tmp_3
ret
div_16:
;mprire operand 32 bii cu valoare
mov
r7,#0
mov
r6,#0
;tergere rest
B,#2
AB
A,DPL
DPL,A
A,DPH
A,B
DPH,A
; citim sin(HIGH(i))
movc
mov
inc
movc
mov
A,@DPTR
R6,A
DPTR
A,@DPTR
R7,A
inc
mov
inc
movc
mov
DPTR
R4,A
DPTR
A,@DPTR
R5,A
clr
mov
subb
mov
subb
c
A,R5
A,R7
A,R4
A,R6
; sin(HIGH(i+1) sin(HIGH(i))
mov
mul
B,?sinus?byte + 1
AB
;
; panta * LOW(i)
add
mov
mov
adc
mov
A,R7
?sinus?byte,A
A,B
A,R6
?sinus?byte+1,A
; HIGH sin(HIGH(i))
; LOW sin(HIGH(i))
; HIGH sin(HIGH(i+1))
; LOW sin(HIGH(i+1))
; panta
ret
sin_tab:
DW
0000h,00c9h,0192h,025bh,0324h,03edh,04b6h,057fh,
0647h,0710h,07d9h,08a2h,096ah,0a33h,0afbh,0bc3h,
0c8bh,0d53h,0e1bh,0ee3h,0fabh,1072h,1139h,1201h,
12c8h,138eh,1455h,151bh,15e2h,16a8h,176dh,1833h,
18f8h,19bdh,1a82h,1b47h,1c0bh,1ccfh,1d93h,1e56h,
1f19h,1fdch,209fh,2161h,2223h,22e5h,23a6h,2467h,
2528h,25e8h,26a8h,2767h,2826h,28e5h,29a3h,2a61h,
2b1fh,2bdch,2c98h,2d55h,2e11h,2ecch,2f87h,3041h,
30fbh,31b5h,326eh,3326h,33deh,3496h,354dh,3604h,
36bah,376fh,3824h,38d8h,398ch,3a40h,3af2h,3ba5h,
3c56h,3d07h,3db8h,3e68h,3f17h,3fc5h,4073h,4121h,
41ceh,427ah,4325h,43d0h,447ah,4524h,45cdh,4675h,
471ch,47c3h,4869h,490fh,49b4h,4a58h,4afbh,4b9eh,
4c3fh,4ce1h,4d81h,4e21h,4ebfh,4f5eh,4ffbh,5097h,
5133h,51ceh,5269h,5302h,539bh,5433h,54cah,5560h,
55f5h,568ah,571dh,57b0h,5842h,58d4h,5964h,59f3h,
5a82h,5b10h,5b9dh,5c29h,5cb4h,5d3eh,5dc7h,5e50h,
5ed7h,5f5eh,5fe3h,6068h,60ech,616fh,61f1h,6271h,
62f2h,6371h,63efh,646ch,64e8h,6563h,65ddh,6657h,
66cfh,6746h,67bdh,6832h,68a6h,6919h,698ch,69fdh,
6a6dh,6adch,6b4ah,6bb8h,6c24h,6c8fh,6cf9h,6d62h,
6dcah,6e30h,6e96h,6efbh,6f5fh,6fc1h,7023h,7083h,
70e2h,7141h,719eh,71fah,7255h,72afh,7307h,735fh,
73b5h,740bh,745fh,74b2h,7504h,7555h,75a5h,75f4h,
7641h,768eh,76d9h,7723h,776ch,77b4h,77fah,7840h,
7884h,78c7h,7909h,794ah,798ah,79c8h,7a05h,7a42h,
7a7dh,7ab6h,7aefh,7b26h,7b5dh,7b92h,7bc5h,7bf8h,
7c29h,7c5ah,7c89h,7cb7h,7ce3h,7d0fh,7d39h,7d62h,
7d8ah,7db0h,7dd6h,7dfah,7e1dh,7e3fh,7e5fh,7e7fh,
7e9dh,7ebah,7ed5h,7ef0h,7f09h,7f21h,7f38h,7f4dh,
7f62h,7f75h,7f87h,7f97h,7fa7h,7fb5h,7fc2h,7fceh,
7fd8h,7fe1h,7fe9h,7ff0h,7ff6h,7ffah,7ffdh,7fff h,
S:
E:
M:
3
SEEE EEEE
Nr.(1.176E-383.40E+38)
bit de semn;
exponent, pe 8 bii, n complement fa de doi, cu deplasament 0x7Fh;
mantis normalizat pe 23 de bii; bitul cel mai semnificativ este
ntotdeauna 1 i nu este memorat.
0
1
2
3
MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM
4
5
6
7
MMMM MMMM MMMM MMMM EEEE EMMM
SEEE EEEE
Nr.(1.7E-3081.7E+308)
S:
E:
M:
bit de semn;
exponent, pe 12 bii, n complement fa de doi, cu deplasament 0x7FFh;
mantis normalizat pe 51 de bii; bitul cel mai semnificativ este
ntotdeauna 1 i nu este memorat.
Adoptarea unui format nestandard, exponent 8 bii i mantis 16 de bii,
permite utilizarea rutinelor de 16 bii prezentate anterior (adunare, scdere,
nmulire, mprire i funciile trigonometrice care rezult din sinus),
implementarea algoritmului matematic trebuind s in cont de urmtoarele:
adunarea i scderea se fac direct asupra mantisei, dup ce una din
acestea a fost denormalizat astfel nct cei doi exponeni s fie egali;
pentru nmulire, dup ce ambele mantise sunt normalizate, exponenii se
adun iar mantisele se nmulesc;
pentru mprire, dac ambele mantise sunt normalizate, exponenii se
scad iar mantisele se mpart;
funciile trigonometrice sunt deduse din sinus.
Rutinele de normalizare sau denormalizare nu sunt prezentate, ele fiind
relativ simple: o deplasare la stnga a virgulei mantisei presupune o
incrementare a exponentului, n timp ce o deplasare la dreapta a virgulei
mantisei presupune o decrementare a exponentului.
Conversia analog numeric se face folosind canalul 6 al microcontrolerului, pornirea conversiei fcndu-se folosind un tact extern cu frecvena
de 150.588Hz generat cu PWM1. La PWM0 este legat un LED verde prin care
se semnalizeaz funcionarea aparatului iar pe portul P4.0, P4.1 i P4.2 sunt
legate 3 LED-uri care semnalizeaz diverse nivele ale semnalului achiziionat.
Filtrul numeric FIR proiectat este de tip FOB eliptic de ordin 4 cu banda
de tiere ntre
47Hz i 53Hz cu pierderea maxim de 0.01dB n banda de
trecere i cu atenuarea minim de 40dB n banda de tiere. Coeficienii
acestuia au fost determinai n Matlab, rezultnd un filtru de ordin 4 cu
caracteristica prezentat cu linie punctat n figura 3.7.
A = [1.0000000000000000e+000, 1.9339272398278690e+000,
2.8285942321601420e+000, 1.8331973819885190e+000,
8.9861884056193790e-001]
B = [9.4679436232257540e-001, 1.8813950274867980e+000,
2.8281850745989090e+000, 1.8813950274867970e+000,
9.4679436232257500e-001]
|H|
[dB]-25
-30
-35
-40
-45
-50
46
47
48
49
50
f [Hz]
51
52
53
54
0x7FFFFFFF
= 0 x 2AB55 . Tot din
4 3 0x3FF
considerente de vitez aceast constant trebuie sa fie o putere a lui doi
pentru c operaiile de nmulire i mprire pot fi implementate prin rotire la
stnga i respective la dreapta i de asemenea nu trebuie s fie prea mare
pentru limitarea numrului de rotiri. Noi am ales constanta la valoarea
0x4000. Filtrul obinuit folosind coeficienii multiplicai cu 0x4000 i rotunjii
la cel mai apropiat numr ntreg are caracteristica prezentat n figura 3.7 cu
linie continu.
valoarea
maxim
constantei:
c=
// validam intruperile
// trimitem mesajul de identificare
ADCON |= 0x20;
// ADCON |= 0x08
// B U C L A
while(1)
if(fadc)
{
fadc = 0;
P R I N C I P A L A
//
// daca avem date de la convertorul ADC
// filtram esantioanele
// GREEN LED
// RED LED
// YELLOW LED
// transmitem esantioanele filtrate
// transmitem esantioanele
// cate bucle facem in asteptare
// anulam nr. De bucle
// setam watchdog-ul
// incrementam nr de bucle
// ===============================================================
//
Tratarea intreruperii de la ADC
// folosim bancul de registrii 2
// ===============================================================
void INTADC(void) interrupt 10 using 2
{
#ifdef IMPLEMENT_DAC10BITS
DAC = getadc();
// max = 0x3ff; citim toti cei 10 biti
#else
DAC = ADCH;
// max = 0xff; citim numai cei 8 biti superiori
#endif
ADCON &= 0xef;
// 1110 1111 => ADCI = 0
ADCON |= CHANEL;
// set the aqusition chanel
fadc = 1;
}
/**************************************************************************\
** Titlu:
ASMFUNC.ASM
**
** Descriere:
Citirea convertorului analog numeric
**
**
**
** Versiune:
4.0
**
** Inceut la:
August 98
**
** Autor:
Stefan Suceveanu, Pratco s.r.l. Bucuresti, Romania
**
** Compilator C: C51 V2.27, Franklin Software, Inc.
**
**
**
** Acest modul contine urmatoarele:
**
**
int getadc(void)
**
**
**
** Ultima modificare la data: 23 sep 1999
**
** Istoric:
**
**
**
** Observatii:
**
**
**
\**************************************************************************/
$XREF
$DEBUG
$NOMOD51
$INCLUDE (\INCLUDE\REG552.INC)
;_PROG
_GETADC
;BYTEVAR
;VAR
;BITVAR
;STACK
;CONST
SEGMENT
SEGMENT
SEGMENT
SEGMENT
SEGMENT
SEGMENT
SEGMENT
CODE
CODE
DATA BITADDRESSABLE
DATA
BIT
IDATA
CODE
;=================================================================
; int getadc(void)
; un intreg este returnat folosin registrii R6(MSB) si R7(LSB)
;=================================================================
PUBLIC
GETADC
RSEG
_GETADC
GETADC:
mov
swap
rr
rr
a,ADCH
A
A
A
(tic)
return(T0_ReadTime() - otic); */
\*************************************************************************
bit T0_init(long tic) = intilaizeaza Timerul T0 cu valoarea din argument
in ns
*************************************************************************/
bit T0_init(long tic)
{
data int x;
/*
/*
/*
/*
/*
tic in ns = [750ns,...,192000ns=192us]
Fosc = 16Mhz/12 = 1.333.333,333
tic = (256-TH0)/Fosc
*/
tic min = (256-255)/Fosc = 750ns
(MIN_TIC)
tic max = (256-000)/Fosc = 192000ns=192us (MAX_TIC) */
*/
*/
Observaii:
1. Biii marcai cu - nu exist i nu conteaz la scriere;
2. Bitul PM/AM trebuie mascat n timpul citirii zecilor de ore;
3. Bitul BUSY poate fi numai citit;
4. Bitul IRQ flag poate fi setat numai la valoarea 0;
5. Calendarul este setat pentru era cretin;
6. Zilele sptmnii sunt memorate astfel: 0=duminic 6=smbt;
7. La scrierea unei valori ntr-un registru care este n afara limitelor
acestuia va rezulta o eroare la citire.
Pinii D0D3 (Data Bus) sunt folosii pentru citirea i scrierea datelor n
circuit i sunt conectai la magistrala de date. Cnd CS0 = 0, CS1 = 1 i
sunt activai pinii RD sau WR putem citi respectiv scrie data n circuit, n rest
ei sunt n starea de impedan ridicat (3-state).
Pinii A0A3 sunt pinii de adres i sunt folosii mpreun cu pinul ALE.
Pinul ALE valideaz decodorul intern de adrese. Cnd ALE=1 i
CS0=0, data care se gsete pe pinii A0A3 sunt scrii n decodorul de
adrese. Microprocesoarele cu ieirea ALE poate fi conectat direct la acest
pin, pentru celelalte procesoare ALE trebuie legat la V cc .
Pinul WR este folosit pentru a valida porile care permit scrierea datelor
n registrul desemnat de A0A3.
Pinul RD este folosit pentru a valida porile care permit citirea datelor
n registrul desemnat de A0A3.
Pinii CS0 i CS1 sunt folosii pentru selecia circuitului i valideaz
interpretarea semnalele ALE, RD i WR (CS0 = 0, CS1 = 1). CS1
funcioneaz separat de ALE i trebuie folosit pentru detecia alimentrii
circuitului.
Pinul
STD.P
(Standard
Pulse)
este
folosit
pentru
generarea
de
LOGIC
LOGIC
se valideaz trecerea n
a bitului BUSY. Cnd bitul BUSY este ters, registrele RTC pot fi citite
sau scrise. Dup terminarea operaiei de scriere sau citire dintr-un registru,
bitul HOLD trebuie resetat. Dac acest lucru nu este fcut va apare o eroare.
Dac n timpul n care HOLD este 1
LOGIC
LOGIC
LOGIC ,
atunci HOLD = 0
LOGIC .
BUSY
0
HOLD 0
HOLD 0
wait 190 s
IRQ flag (D2). Acest bit (Interrupt Request Flag) este controlat direct
de pinul de ieire STD.P. Cnd STD.P este ters, IRQ=1
STD.P este setat, IRQ=0
ntrerupere
LOGIC .
microcontrolerului.
LOGIC
i atunci cnd
Bitul
MASK
mpreun
cu
t0
t1
Atunci cnd IRQ este ters i vine o nou ntrerupere, noua ntrerupere
va fi ignorat. La setarea bitului HOLD sau 30 SEC ADJUST este necesar
mascarea cu 1 a bitului IRQ. Setarea bitului IRQ la valoarea 1 nu are nici
un efect pentru pinul de ieire STD.P.
Cnd se modific starea biilor t0 i t1, bitul IRQ trebuie resetat.
30
SEC
Registrul de control E
MASK (D0). Acest bit lucreaz ca ntreruptor ON/OFF pentru ieirea
STD.P. Cnd bitul MASK =1 atunci ieirea STD.P este activ iar atunci cnd
bitul MASK = 0 atunci ieirea STD.P este n starea 1.
INTR/STND (D1) este folosit pentru controlul formei de und obinute la
ieirea STD.P (open-drain). n modul INTERRUPT (D1 = 1) ieirea STD.P va
rmne n starea 0 pn cnd se va reseta manual bitul IRQ flag. n modul
STANDARD ieirea va rmne de asemenea n starea 0 pn la resetarea
manual a bitului IRQ flag dar nu mai mult de 7.8125ms cnd indicatorul IRQ
se va reseta automat. Bitul MASK trebuie s fie 0 n timpul acestor moduri de
lucru. Perioada semnalului de ieire la pinul STD.P este determinat de biii
t0 i t1.
t0 (D2) i t1 (D3) determin perioada semnalului de la ieirea STD.P n
cele dou moduri de funcionare INTERRUPT sau STANDARD, conform
tabelului 3.14.
t1
t0
0
0
1
1
0
1
0
1
Perioada
1/64 sec
1 sec
1 minut
1 or
Limea
INTR
*
*
*
*
Tabelul 2.16
impulsului
STND
7.8125ms
7.8125ms
7.8125ms
7.8125ms
Setare alarm
POWER ON
Citire registru D
TEST 0
REST 1
24/12 x
STOP 1
IRQ
1
Ateapt 125 s
SETAREA
CEASULUI
IRQ 0
SETAREA
REGISTRULUI E
Citete H10 i H1
30 SEC 0
IRQ 0
HOLD 0
AM09:00
Da
TEST 0
REST 0
24/12 x
STOP 0
Nu
Execut altceva
Tratare alarm
Alte operaii
normale
Figura 2.9. Programarea RTC72421
/**************************************************************************\
** Titlu:
RTC.H
**
** Descriere:
Descrierea functiilor pt. manipularea RTC-72421
**
**
**
** Versiune:
2.0
**
** Inceut la:
August 95
**
** Autor:
Stefan Suceveanu, Pratco s.r.l. Bucuresti, Romania
**
** Compilator C: C51 V2.27, Franklin Software, Inc.
**
**
**
** Acest modul contine urmatoarele:
**
**
Functii pentru citirea si setarea RTC-ului
**
**
Definirea unui sir de caractere ASCII cu data ora ...
**
**
**
** Ultima modificare la data: 23 nov 1998
**
** Istoric:
**
**
**
** Observatii:
**
**
**
\**************************************************************************/
#ifndef
_RTC_H_
#define
_RTC_H_
1
extern xdata char
#define
#define
#define
#define
RTC_DATA[22];
RTC_DATE
RTC_TIME
RTC_WEEK
RTC_WEEK_STR
RTC_DATA + 2
RTC_DATA + 11
RTC_DATA[20]
RTC_DATA
bit
fRTC;
bit
fTIC;
bit
fF1;
bit
fF2;
idata word tic;
idata word secF1;
idata word secF2;
#define GetTic()
tic
#define TicDiff(otic)
//
//
//
//
Flag
Flag
Flag
Flag
bit RTC_busy(void);
void RTC_init(void);
void RTC_clr(void);
void RTC_read(void);
//
//
//
//
extern
extern
extern
extern
extern
extern
extern
void
void
void
void
void
void
void
//
//
//
//
//
//
//
setare
setare
setare
setare
setare
setare
setare
setRTCday(byte val);
setRTCmon(byte val);
setRTCyear(byte val);
setRTCweek(byte val);
setRTChour(byte val);
setRTCmin(byte val);
setRTCsec(byte val);
zi
luna
an
zi din saptamana
ora
minute
secunde
#endif
/**************************************************************************\
** Titlu:
RTC.C
**
** Descriere:
Implementarea functiilor pt. manipularea RTC-72421
**
**
**
** Acest modul contine urmatoarele:
**
**
Functii pentru citirea si setarea RTC-ului
**
**
Definirea unui sir de caractere ASCII cu data ora ...
**
\**************************************************************************/
#pragma DEBUG OBJECTEXTEND CODE SYMBOLS
#include <reg552.h>
#include <string.h>
#include <typedef.h>
#include <absacc.h>
#include "i2c.h"
#include "qcount.h"
#include "..\main\system.h"
xdata char
RTC_DATA[22];
// dd/mm/yy hh:mm:ss ww
code char days[8][3] = {"Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sa", "??"};
bit
fRTC;
bit
fTIC;
bit
fF1;
bit
fF2;
//bit onTicRTC;
idata word tic;
idata word secF1=0;
idata word secF2=0;
//
//
//
//
//
//
//
//
bit RTC_busy(void);
void RTC_init(void);
void RTC_clr(void);
void RTC_read(void);
//
//
//
//
\*************************************************************************
Tratarea intreruperilor de la RTC
*************************************************************************/
void int_rtc(void) interrupt 2 using 1
{
tic++;
// contor ticuri
fTIC = 1;
// TIC la fiecare 1/64sec
// contor de intarziere 1
if(secF1)
if(!(--secF1))
// decrementam timer 1 pana la 0
fF1 = 1;
// a ajuns la zero -> setam flagul fF1
// contor de intarziere 2
if(secF2)
if(!(--secF2))
// decrementam timer 2 pana la 0
fF2 = 1;
// a ajuns la zero -> setam flagul fF2
if(!(tic && 0x3f))
// echivalent cu if(!(tic % 64))
fRTC = 1;
// flag 1 sec
RTC_ck = 2;
}
\*************************************************************************
Citim datele din RTC si le formatam sub forma unui sir ASCIIZ cu urmatoarea
structra: dd/mm/yy hh:mm:ss ww.
^
^
|
+-- se inscrie \0
+-------- din secunda in secunda se va inlocui cu
*************************************************************************/
// d10
// d1
// m10
// m1
// y10
// y1
// h10
// h1
// m10
// m1
// s10
// s1
XBYTE[regD_RTC] = 0x00;
}
\*************************************************************************
Citirea bitului BUSY. Functa intoarce 1 cand RTC este ocupat si 0 in rest.
*************************************************************************/
bit RTC_busy(void)
{
// HOLD = 1
XBYTE[regD_RTC] = 0x01;
// 30adj=0,irq=1,busy=0,hold=1 (0101)
if(XBYTE[regD_RTC] & 0x02)
{
// HOLD = 0
XBYTE[regD_RTC] = 0x00; // 30adj=0,irq=1,busy=0,hold=0 (0100)
return 1;
// trebuie sa asteptam
}
else
return 0;
// RTC ramane in HOLD
}
\*************************************************************************
Initializarea RTC-ului
*************************************************************************/
void RTC_init(void)
{
IT1 = 1;
// INT1 on falling edge
EX1 = 1;
// Enable extarnal interrupt 1 (RTC)
XBYTE[regF_RTC] = 0x06;
//
//
//
//
//
//
}
XBYTE[regE_RTC] =
XBYTE[regE_RTC]
XBYTE[regE_RTC]
XBYTE[regE_RTC]
XBYTE[regD_RTC] =
XBYTE[regF_RTC] =
// test=0,24h=1,stop=1,reset=0 (0110)
0x00;
//
= 0x04; //
= 0x08; //
= 0x0c; //
0x00;
//
0x04;
//
\*************************************************************************
Stergerea datelor din RTC
*************************************************************************/
void RTC_clr(void)
{
char adr;
IT1 = 1;
EX1 = 1;
XBYTE[regF_RTC] = 0x07;
// test=0,24h=1,stop=1,reset=1 (0111)
XBYTE[regE_RTC]
XBYTE[regE_RTC] =
// XBYTE[regE_RTC]
// XBYTE[regE_RTC]
XBYTE[regD_RTC] =
XBYTE[regF_RTC] =
}
= 0x00; //
0x04;
//
= 0x08; //
= 0x0c; //
0x00;
//
0x04;
//
\*************************************************************************
Setarea orei
*************************************************************************/
void setRTChour(byte hh)
{
data byte x = hh/10;
while(RTC_busy());
XBYTE[regHOUR10] = x;
XBYTE[regHOUR1] = hh - x*10;
XBYTE[regD_RTC] = 0x00;
}
\*************************************************************************
Setarea minutelor
*************************************************************************/
void setRTCmin(byte mm)
{
data byte x = mm/10;
while(RTC_busy());
XBYTE[regMIN10] = x;
XBYTE[regMIN1] = mm - x*10;
XBYTE[regD_RTC] = 0x00;
}
\*************************************************************************
Setarea secundelor
*************************************************************************/
void setRTCsec(byte ss)
{
data byte x = ss/10;
while(RTC_busy());
XBYTE[regSEC10] = x;
XBYTE[regSEC1] = ss - x*10;
XBYTE[regD_RTC] = 0x00;
}
\*************************************************************************
Setarea zilelor
*************************************************************************/
void setRTCday(byte dd)
{
data byte x = dd/10;
while(RTC_busy());
XBYTE[regDAY10] = x;
XBYTE[regDAY1] = dd - x*10;
XBYTE[regD_RTC] = 0x00;
}
\*************************************************************************
Setarea lunii
*************************************************************************/
void setRTCmon(byte val)
{
data byte x = val/10;
while(RTC_busy());
XBYTE[regMON10] = x;
XBYTE[regMON1] = val - x*10;
XBYTE[regD_RTC] = 0x00;
}
\*************************************************************************
Setarea anului (nuami ultimele 2 cifre)
*************************************************************************/
void setRTCyear(byte val)
{
data byte x = val/10;
2.8. Periferice I 2 C
Exist multe circuite periferice dedicate I 2 C care sunt fabricate de multe
firme. Totui. majoritatea acestora sunt produse de Philips, posesoarea mrcii
I 2 C. O list a acestora se poate gsi la www.semicoductors.philips.com.
Cteva dintre cele mai utilizate sunt:
PCF8566:
Driver universal pentru afiaj LCD;
PCF8576:
Driver universal pentru afiaj LCD;
PCF8570:
Memorie SRAM 256x8bii;
PCF8571:
Memorie SRAM 128x8bii;
PCF8573:
Ceas de timp real (RTC);
PCF8583:
Ceas de timp real (RTC) i calendar cu RAM static 256x8bii;
PCF8574:
Opt intrri/ieiri paralele;
PCF8584:
Controler de magistral I 2 C;
PCF8591:
Convertor 4 canale analog-digital, 1 canal digital-analog pe 8 bii.
O alt firm productoare de periferice I 2 C este SGS-Thomson (adres la
www.st.com), specializat n special n memorii:
ST24C08: memorie EEPROM 8Ko (4x256x8bii);
X24645:
memorie EEPROM cu protecie a blocurilor de memorie.
2.8.1
Ceas de timp real
Circuitul integrat Philips PCF8583 este un ceas de timp real i o memo2
rie I C. n figura 3.10 este prezentat modul de legare a circuitului PCF8583
la magistrala I 2 C.
1 OSCI
32.768kHz 2 OSCO
3 A0
INT 7
IRQ
SCL 6
330
SCL
SDA 5
330
SDA
Selectare
adres
Descrierea circuitului
Tabelul 2.17
MOD CONTOR Adres
CONTROL/STARE 00h
D1
D0
01h
D3
D2
02h
D5
D4
03h
liber
04h
liber
05h
liber
06h
Timer
T1
T0
07h
1 = setare
1 = setare
1 = setare
1 = setare
1 = setare
1 = setare
1 = setare
rezervat.
Tabelul 2.19
Descriere
alarm pentru ziua 0;
alarm pentru ziua 1;
alarm pentru ziua 2;
alarm pentru ziua 3;
alarm pentru ziua 4;
alarm pentru ziua 5;
alarm pentru ziua 6;
Ieirea INT (de tip FET-n, cu dren n gol) este programat prin registrul
de control a alarmei. Ieirea este activ (nivel 0 LOGIC ) atunci cnd indicatorul
de alarm sau indicatorul de contor sunt setai. n modul ceas fr alarm,
ieirea este controlat de indicatorul de contor.
Oscilatorul
Un cristal de 32.768kHz trebuie conectat ntre OSCI (pinul 1) i OSCO
(pinul 2). Pentru controlul frecvenei se poate lega un condensator variabil
(<100p) ntre OSCI i V CC . n modul ceas cu tact extern i n modul contor de
evenimente, oscilatorul intern este inhibat i OSCI este trecut n starea de
nalt impedan, ceea ce permite folosirea unui semnal de 50Hz extern
pentru funcia de ceas sau a unui semnal cu frecven ridicat pentru
numrarea evenimentelor.
Iniializarea
La punerea sub tensiune, interfaa I 2 C, registrele de stare/comand i
toi contorii sunt teri. Circuitul ncepe s numere considernd frecvena de
32.768kHz, ora n format 24h, 1 ianuarie, anul 00, ora 00:00:00 00. Ieirea
INT va genera un semnal cu frecvena de 1Hz, plecnd din starea sus. Acest
semnal poate fi anulat prin setarea corespunztoare a registrului de alarm.
Interfaa I 2 C este inhibat i resetat dac tensiunea de alimentare scade sub
valoarea de funcionarea a interfeei.
Este recomandat trecerea n mod inactiv a RTC-ului n timpul setrii
acestuia cu noile date. nscrierea de valori eronate n registrele de date
conduc la o proast contorizare dar nu vor bloca funcionarea circuitului.
Protocolul de legtur I 2 C
Circuitul RTC PCF8583 se interfaeaz prin intermediul unui protocol I 2 C,
protocol descris pe larg n paragraful 1.10, Interfaa serial sincron I 2 C.
Pentru acest circuit, frecvena maxim de lucru pe interfaa serial este de
100kHz. Sunt prezentate, n figura 3.11, procedurile de lucru cu dispozitivul
I 2 C.
Confirmare de la slave
S Slave Address 0
Word Address
D ate
n octei
R/ W
a) Scriere n RTC
autoincrementare
adres
Confirmare de la slave
S Slave Address 0
S Slave Address 1
Word Address A
D ate
n octei
R/ W
R/ W
Neconfirmare de la slave
D ate
NA
autoincrementare
adres
autoincrementare
adres
D ate
D ate
n octei
autoincrementare
adres
R/ W
autoincrementare
adres
2.8.2
Convertoare A/D i D/A
Circuitul integrat PCF8591, fabricat n tehnologie CMOS, conine 4 intrri
analogice, 1 ieire analogic i o interfa I 2 C. Adresa I 2 C se poate stabili
folosind trei pini ai circuitului (A0, A1 i A2), putnd fi legate la aceeai
magistral I 2 C opt circuite integrate PCF8591. Adresa circuitului este dat de
structura:
1
A2
A1
A0 R/W
Semnal Descriere
AIN0
AIN1
intrri analogice
AIN2
AIN3
A0
A1
selectarea adresei I 2 C
A2
V SS
SDA
SCL
OSC
EXT
AGND
V REF
AOUT
V DD
Bit
0,1
2
3
Descriere
Numrul canalului A/D:
00 canalul 0
01 canalul 1
10 canalul 2
11 canalul 3
Indicator autoincrementare canal (1 = validat)
0
Programarea intrrilor analogice:
AIN0
channel 0
AIN1
channel 1
AIN2
channel 2
AIN3
channel 3
AIN0
channel 0
AIN1
channel 1
AIN2
AIN3
channel 2
00: 4 intrri
4,5
channel 0
AIN0
AIN1
channel 1
AIN1
channel 2
AIN2
AIN2
AIN3
6
7
AIN3
channel 0
channel 1
D6
D5
D4
D3
D2
D1
LSB
D0
registru date
DAC
Conversia D/A
Al treilea octet trimis ctre circuit este memorat n registrul convertorului
digital/analog i este convertit ntr-o tensiune analogic folosind un divizor
rezistiv conectat la V REF .
Valoarea tensiunii de ieire la pinul AOUT se poate calcula folosind
formula:
V
VAGND 7
VAOUT = VAGND + REF
Di 2i
256
i=0
Conversia A/D
Ciclul de conversie analog/digital ncepe atunci cnd este adresat pentru
citire (imediat dup decodarea unei adrese de citire valide) i este pornit de
frontul descresctor al semnalului SCL atunci cnd pe SDA se transmite
validarea recepiei (A) valorii conversiei anterioare.
Primul octet trimis ntru-un ciclu de citire reprezint rezultatul conversie
din ciclul anterior de citire sau valoarea 80h imediat dup punerea sub
tensiune.
Oscilatorul
Dac pinul EXT este conectat la V SS atunci circuitul integrat va folosi
oscilatorul intern pentru generarea tactului necesar conversiei A/D. La pinul
OSC este disponibil un semnal de frecvena oscilatorului (ntre 0,75MHz i
1,25MHz).
Dac pinul EXT este conecta la V DD , pinul OSC este transformat n pin de
intrare la care se poate aplica un tact extern care va fi folosit pentru
conversia A/D.
2.8.3
Memorii E 2 ROM
Memoriile E 2 ROM (electrically erasable ROM) au cptat o larg
dezvoltare datorit avantajelor oferite de conservarea datelor n lipsa
alimentrii, coroborat cu simplitatea modificrii locaiilor de memorie.
Memoriile E 2 ROM dezvoltate n tehnologie I 2 C au capaciti de pn la
8kB (la data culegerii materialului). n continuare este prezentat circuitul
ST24C08, o memorie de 1kB mprit n 4 blocuri de 256 octei.
Principalele caracteristici ale memoriei sunt:
minim 1.000.000 de cicluri de scriere
minim 10 ani timp de meninere a datelor nscrise
tensiune de alimentare ntre 3V i 5,5V
protecia la scriere a blocurilor
proces de scriere octet cu octet sau octei multipli (pn la 8 octei)
proces de scriere a unei ntregi pagini (pn la 16 octei)
Semnal
PRE
NC
E
V SS
SDA
SCL
MODE
V CC
Descriere
Protecie la scriere
Selecie circuit
Mas
Intrare/ieire date I 2 C
Tact I 2 C
Mode scriere (0 = mod multioctet, 1 = mod paginat)
Tensiune de alimentare (-0,3V6,5V)
Adresa slave
b6
b5
0
1
b7
1
b4
0
Tabelul 2.23
Selecie circuit Selecie bloc
R/W
b3
b2
b1
b0
E
A9
A8
R/W
Tabelul 2.24
Operaia
R/W Mode Octei Condiie
Citire de la adresa
1
X
1
Start, selecie circuit, R/W = 1
curent
Start, selecie circuit, adresa,
Citire de la o
0
X
0
R/W = 0
adres aleatoare
1
X
1
Restart, adresa, R/W = 1
La fel ca la citirea de la adresa
Citire secvenial 1
X
11024
curent sau aleatoare
Scriere octet
1
X
1
Start, selecie circuit, R/W = 0
Scriere secvenial 0
1
8
Start, selecie circuit, R/W = 0
Scriere paginat
0
0
16
Start, selecie circuit, R/W = 0
Protecia la scriere
Blocul superior de 256 de octei poate fi protejat la scriere. Protecia
poate ncepe de la oricare nceput de pagin de 16 octei. Adresa paginii de
nceput a zonei protejate este stabilit de semioctetul superior (b4b7) din
ultimului octet din memorie (blocul 3 adresa 3FFh), conform tabelului 3.25 .
Tabelul 2.25
Adresa 1FFh, bloc 1
b7
b6
b5
b4
b3
Adresa de nceput a zonei protejate
Atenie!
b2
0 = Protecie validat
b1
x
b0
x
Adresarea memoriei
pornit dup primirea semnalului STOP, i are durata de 10 ms, timp n care
memoria nu va rspunde la nici o cerere extern. Procedura de lucru este
descris n figura 3.12.b).
Citirea din memorie
Operaia de citire este independent de valoarea semnalului MODE.
Citirea
octei
de
la
adresa
curent
unuia
sau
mai
muli
Circuitul ST24C08 are un contor de adrese intern care este autoincrementat dup fiecare operaie de scriere sau citire. Contorul se
incrementeaz pn la valoarea 1023 (3FFh) dup care sare la valoarea 000h.
Citirea de la adresa curent se face prin transmiterea condiiei de START,
adresei dispozitivului slave i a blocului i a bitului de direcie (R/W = 1).
Dispozitivul slave va valida recepia i va transmite valoarea octetului
care se afla la adresa curent dup care o incrementeaz. Dac dispozitivul
master valideaz recepia, dispozitivul slave va transmite urmtorul octet,
proces ca se va repeta pn cnd dispozitivul master nu va mai valida
recepia. n acest moment dispozitivul slave va transmite condiia de STOP.
Procedura de lucru este descris n figura 3.12.c).
Pentru nceput se stabilete adresa ca la procesul de scriere (primii 2
octei dup START) dup care se transmite un RESTART urmat de adresa
circuitului slave, a blocului i a bitului de direcie (R/W = 1). Astfel, n prima
etap se seteaz registrul de adrese la valoarea dorit, iar n a doua etap se
citesc datele folosind algoritmul prezentat la citirea de la adresa curent a
unuia sau mai muli octei. Procedura de lucru este descris n figura 3.12.d)
i 3.12.e).
DATA IN
BYTE ADDR
STOP
START
R/W
a) Scriere octet
ACKL
DEV SEL
ACKL
BYTE ADDR
START
ACKL
DATA IN 1
DATA IN 2
ACKL
R/W
DATA IN N-1
ACKL
DATA IN N
STOP
DEV SEL
DATA OUT
START
STOP
R/W
DEV SEL
BYTE ADDR
START
ACKL
ACKL
DEV SEL
START
R/W
NACKL
DATA OUT
R/W
STOP
DEV SEL
START
BYTE ADDR
R/W
DEV SEL
START
ACKL
DATA OUT 1
STOP
R/W
NACKL
ACKL
DATA OUT N
e) Citirea secvenial de la o adres oarecare
STOP
2.8.4
Extensii ieiri paralele
Extensiile paralele reprezint o alternativ economic de mrire a
numrului de intrri/ieiri digitale a unui sistem cu microcontroler I 2 C.
Unul din circuitele care realizeaz aceast funciune este PCF8574, un
dispozitiv cu 16 pini care pot fi programai individual ca intrare sau ieire
(ieire quasi bidirecionale n sens Intel pinii de intrare trebuiesc setai prin
trecere n starea sus). Ieirile pot comanda direct LED-uri (pinii accept 20mA
intrare, 25mA ieire)
Acest circuit genereaz un semnal de ntrerupere (INT) cnd semnalul
de intrare la oricare pin s-a modificat fa de ultima citire, ceea ce permite
informarea microprocesorului de apariia unui eveniment fr a fi necesar o
comunicaie pe magistrala I 2 C.
Semnificaia pinilor circuitului este prezentat n tabelul 3.24.
Tabelul 2.26
Pin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Semnal
A0
A1
A2
P0
P1
P2
P3
VSS
P4
P5
P6
P7
INT
SCL
SDA
VDD
Descriere
Adresa I 2 C
A2
A1
A0
LSB
R/W
A2
A1
A0
R/W
PCF8574A
0
LOGIC
putnd fi folosite ca
2.8.5
Emularea unei interfee I 2 C
Anumite aplicaii necesit interfaarea la o magistral I 2 C i a unor
circuite care nu au aceast facilitate. Exist posibilitatea simulrii interfeei
I 2 C pe un port paralel de PC, pe o interfa serial asincron etc.
n cele ce urmeaz este prezentat, n asamblor, programul surs pentru
simularea interfeei I 2 C pe un microcontroler din familia 8xC51.
/**************************************************************************\
** Descriere:
Rutina simulare interfaa IIC
**
**
**
** Versiune:
1.0
**
** Inceut la:
Iunie 94
**
** Autor:
Stefan Suceveanu, Pratco s.r.l. Bucuresti, Romania
**
** Compilator C: C51 V2.27, Franklin Software, Inc.
**
**
**
** Acest modul contine urmatoarele functii:
**
**
**
** Ultima modificare la data: 23 nov 1998
**
** Istoric:
**
**
**
** Observatii:
**
**
**
\**************************************************************************/
$REGISTERBANK (0,1)
NAME
IIC
$NOLIST
; Etichete PUBLIC:
; *************************************
public ?IIC_Test_Device
public ?IIC_Test_Device?BYTE
public ?IIC_Write
public ?IIC_Write?BYTE
public ?IIC_Write_Sub
public ?IIC_Write_Sub?BYTE
public ?IIC_Write_Sub_SWInc
public ?IIC_Write_Sub_SWInc?BYTE
public ?IIC_Write_Memory
public ?IIC_Write_Memory?BYTE
public ?IIC_Write_Sub_Write
public ?IIC_Write_Sub_Write?BYTE
public ?IIC_Write_Sub_Read
public ?IIC_Write_Sub_Read?BYTE
public ?IIC_Read
public ?IIC_Read?BYTE
public ?IIC_Read_Sub
public ?IIC_Read_Sub?BYTE
public ?IIC_Read_Status
public ?IIC_Read_Status?BYTE
public ?Init_IIC
public ?Init_IIC?BYTE
;
;
*****************
;
* Constante IIC *
;
*****************
IICRetries
equ 5
;Numar incercari
IICTimeOut
equ 100
;100 ms Time Out IIC
NVM_Write_Delay equ 40
;40 ms acces EEPROM
;
;
*********************************************************************
;
* Constante control IICInOut
*
;
* Semioctetul LOW: stare; semioctetul HIGH: control
*
;
*********************************************************************
;
SLREAD
equ 7
;Citeste Slave = 1
mSlread
equ 1 SHL SLREAD
;
SLNOMEM
equ 6
;Memorie Slave inexistenta = 1
mSlnomem
equ 1 SHL SLNOMEM
;
SLNOSUB
equ 5
;Slave subadresa inexistenta = 1
mSlnosub
equ 1 SHL SLNOSUB
;
SLNOINCR
equ 4
;Autoincrementare subadresa = 1
mSlnoincr
equ 1 SHL SLNOINCR
;
_Test_Device
equ mSlnomem+mSlnosub
;Test dispozitiv
_Write
equ mSlnomem+mSlnosub
;Scrie fara subadresa
_Write_Sub
equ mSlnomem
;Scrie cu subadrresa si autoinc.
_Write_Memory
equ mSlnoincr
;Scrie memorie (octet cu octet+intarziere)
_Write_Sub_SWInc equ mSlnomem+mSlnoincr
;Scrie cu subadrresa fara autoinc.
_Read_Sub
equ mSlnomem+mSlread
;Citeste cu subadresa
IICNextByte:
;
;
;
;
IICNVM_Delay1:
IICNVM_Delay2:
;
IICSkipDelay:
DataIndex2,IICNextByte
IICExitOk
;intarziere 2*NVM_Write_Delay*0.5s
;intariere 0.5 ms
;
;Octet urmator
;Eroare
;
;
************************************************************************
;
* IICInOutKernel
*
;
************************************************************************
;
IICInOutKernel: mov
r2,#IICRetries
;Revenire eroare ( Norm. 5 )
IICInOutRetry:
clr
ea
;dezactivare intreruperi
setb
sta
;Mod transfer master
anl
IICCntrl,#NOT (mError+mInBlock2)
;Sterge eroare, Start cu Block 1
setb
IICCntrl.MSTNOTREADY
;Master \Ready
setb
ea
;Validare intreruperi
;
;
***********************************************
;
* Asteptare terminare mesaj IIC, cu TimeOut
*
;
***********************************************
mov
r1,#IICTimeOut
;IICTimeOut*1 ms
IICWaitReady1: mov
r0,#250
;Bucla=1 ms
IICWaitReady2: jnb
IICCntrl.MSTNOTREADY,IICReady
;Bit este 0 daca este gata
djnz
r0,IICWaitReady2
djnz
r1,IICWaitReady1
;
;
**********************************************
;
* A survenit timeout; eliberare magistrala
*
;
**********************************************
clr
ea
;dezactivare intreruperi
mov
a,#mError
;modificare stare
mov
r0,#IICCntrl
;
xchd
a,@r0
;
mov
s1con,#NSTA_STO_AA
;forteaza eliberare magistrala
setb
ea
;validare intreruperi
;
;
****************************************
;
* Master a transferat; test eroare
*
;
****************************************
IICReady:
jnb
IICCntrl.ERROR,IICExitOk
;Daca \Error intoarce OK
djnz
r2,IICInOutRetry
;Repeta pana la nr. maxim incercari
IICErrorExit:
mov
a,#1
;intoarce eroare
sjmp
IICExit
;
IICExitOk:
clr
a
;Intoarce OK
IICExit:
mov
c,acc.0
;Eroare in Carry
mov
IIC_Error,c
;Eroare in IIC_Error
ret
IICInitCode
Segment Code Unit
Rseg
IICInitCode
;
;
*****************************************************************
;
* Init_IIC:
*
;
*
PROCEDURE ( OwnSlaveAddress ) ;
*
;
*
DECLARE OwnSlaveAddress BYTE ;
*
;
*
*
;
*
Initializeaza IIC SIO1, seteaza adresa slave propriu
*
;
*
*
;
*
NOTA: Aceasta procedura trebuie apelata inaintea apelului *
;
*
oricearei alte proceduri IIC
*
;
*****************************************************************
?Init_IIC:
mov
s1adr,SlaveAddress
;Seteaza adresa slave propriu
mov
s1con,#NSTA_NSTO_AA
;Declara Ack in adresa slave
mov
IICCntrl,#0
;Initializare registru ctrl/stare
setb
es1
;Validare intrerupere SIO1
;
;
***********************************************************
;
IICIntCode
;
;
*****************************************
;
* IIC_int
*
;
*
Intrerupere SIO1
*
;
*****************************************
IIC_Int:
push
acc
;Salvare acumulator
push
s1sta
;Salvare S1STA
mov
a,#High SIOStates ;Transfera controlul la stari
push
acc
ret
IICIntStates
Segment Code Page
Rseg
IICIntStates
;
*****************************************************************
;
*
Intrerupere IIC
*
;
*
*
;
*
Trebuie sa inceapa la pagina noua
*
;
*
Fiecare rutina de start trebuie sa fie de 8 octeti
*
;
*
Pt mai mult de 8 octeti se poate face salt
*
;
*
*
;
*
Mod transmisie master:
*
;
*
S SlvW
A Sub
A +
*
;
*
+ D1[0] A D1[1] A ..... A D1[L-1] A +
*
;
*
+ D2[0] A D2[1] A ..... A D2[M-1] A P
*
;
*
(Nota: Subadresa este optionala, L si M pot fi 0)
*
;
*
*
;
*
Mod E/R master:
*
;
*
S SlvR
A D2[0] A ..... A D2[M-1] N P
*
;
*
(Nota: M > 0)
*
;
*
*
;
*
S SlvW
A Sub
A +
*
;
*
+ D1[0] A ..... A D1[L-1] A S SlvR A +
*
;
*
+ D2[0] A ..... A D2[M-1] N P
*
;
*
*
;
*****************************************************************
;
SIOStates:
;
*********************************************************
;
* Stare 00:
*
;
*
eroare bus mod master sau slave datorita unui
*
;
*
START sau STOP eronat
*
;
* Actiuni
*
;
*
IICCntrl := Eroare
*
;
*
Eliberare magistrala
*
;
*
Mod slave neadresat
*
;
*********************************************************
acall
SetError
;Actualizare stare
mov
s1con,#NSTA_STO_AA
;Eliberare bus, Mod slave neadresat
ajmp
SIO1Exit
;Exit
ds
1
;2 + 3 + 2 + 1
;
;
*********************************************************
;
* Stare 08:
(mod master transmisie)
*
;
*
A fost transmis START
*
;
* Actiuni
*
;
*
Initializare DataCount (r2) si DataPointer (r1) *
;
*
pt. DataBlock1
*
;
*
Emisie SLA + R/W, ACK va fi receptionat
*
;
*********************************************************
mov
r2,DataCount1
;Initializare DataCount (r2)
mov
r1,DataIndex1
;Initializare DataPointer (r1)
clr
a
;Implicit: scriere
ajmp
SendSlvAdr
;Comun cu starea 10
ds
1
;2 + 2 + 1 + 2 + 1
;
;
*********************************************************
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
State20:
* Stare 10:
(mod master transmisie)
*
*
A fost transmis START repetat
*
* Actiuni
*
*
Emisie SLA + R, ACK va fi receptionat
*
*********************************************************
mov
a,#1
;Set bit citire
orl
a,SlaveAddress
;Combinare cu adresa slave
clr
sta
;Sterge bit start
ajmp
SendAccExit
;Emisie date, sterge SI
*********************************************************
* Stare 18:
(mod master transmisie)
*
*
A fost transmis SLA+W, ACK a fost receptionat
*
* Actiuni
*
*
If SUBADDRESS Then
*
*
Emisie subadresa, ACK va fi receptionat
*
*
Else
*
*
Emisie date sau STOP
*
*********************************************************
jb
IICCntrl.SLNOSUB,JumpSendData ;Emisie date daca \subadresa
mov
a,SubAddress
;Incarca subadresa
ajmp
SendAccExit
;Emisie
ds
1
;3 + 2 + 2 + 1
*********************************************************
* Stare 20:
(mod master transmisie)
*
*
A fost transmis SLA+W, NACK a fost receptionat *
* Actiuni
*
*
IICCntrl := Eroare
*
*
Emisie STOP
*
*********************************************************
acall
SetError
;Intoarce stare eroare
ajmp
SendStop
;Emisie STOP
ds
4
;2 + 2 + 4
;
;
*********************************************************
;
* Stare 28:
(mod master transmisie)
*
;
*
A fost transmis DATA din S1DAT, ACK a fost rec. *
;
* Actiuni
*
;
*
Emisie date
*
;
*********************************************************
JumpSendData:
ajmp
SendData
;Emisie date
;
MstRecHandleAck:cjne
r2,#1,KeepAA
;Daca <> 1 atunci AA=1
clr
aa
;Altfel NACK
KeepAA:
ret
;2 + 3 + 2 + 1
;
;
*********************************************************
;
* Stare 30:
(mod master transmisie)
*
;
*
A fost transmis DATA din S1DAT, a fost rec.NACK *
;
* Actiuni
*
;
*
IICCntrl := Eroare
*
;
*
Emisie STOP
*
;
*********************************************************
ajmp
State20
;La fel cu starea 20
;
SetError:
mov
r0,#IICCntrl
;Modifica numai starea
mov
a,#mError
;Setare indicator eroare
xchd
a,@r0
;
ret
;2 + 2 + 2 + 1 + 1
;
;
*********************************************************
;
* Stare 38:
(mod master transmisie)
*
;
*
Arbitrare pierduta in SLA, R/W sau DATA
*
;
* Stare 38:
(mod master receptie)
*
;
*
Arbitrare pierduta la returnare ACK
*
;
* Actiuni
*
;
*
Set STA pt Start mod master cand busul e liber *
;
*
Set AA (AA era 0)
*
;
*********************************************************
mov
s1con,#STA_NSTO_AA
;Setare START si declarare ACK
clr
IICCntrl.INBLOCK2
;Revenire la bloc 1
ajmp
ClrSiExit
;Stergere SI
ds
1
;3 + 2 + 2 + 1
;
;
*********************************************************
;
* Stare 40:
(mod master receptie)
*
;
*
A fost transmis SLA+R, a fost receptionat ACK
*
;
* Actiuni
*
;
*
Setare DataCount si DataIndex pt bloc 2
*
;
*
If DataCount <> 1 Then
*
;
*
ACK
*
;
*
Else
*
;
;
;
;
;
;
;
;
;
FetchData:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
State60:
*
NACK
*
*********************************************************
acall
SetupBlock2
;Setare bloc 2
acall
MstRecHandleAck
;Manevrare Ack
ajmp
ClrSiExit
;Exit
ds
2
;2 + 2 + 2 + 2
*********************************************************
* Stare 48:
(mod master receptie)
*
*
A fost transmis SLA+R, a fost receptionat NACK *
* Actiuni
*
*
IICCntrl := Eroare
*
*
Emisie STOP
*
*********************************************************
ajmp
State20
;Ca la starea 20
dec
mov
inc
ret
ds
r2
@r1,s1dat
r1
;2 + 1 + 2 + 1 + 1 + 1
*********************************************************
* Stare 50:
(mod master receptie)
*
*
A fost rec DATA, a fost returnat ACK
*
* Actiuni
*
*
Aduce data, decr. contor, incr. pointer
*
*
If Count = 1 Then
*
*
NACK
*
*
Else
*
*
ACK
*
*********************************************************
acall
FetchData
;Data
acall
MstRecHandleAck ;Ack
ajmp
ClrSiExit
;Exit
ds
2
;2 + 2 + 2 + 2
*********************************************************
* Stare 58:
(mod master receptie)
*
*
A fost rec DATA, a fost returnat NACK
*
* Actiuni
*
*
Set AA
*
*
Emisie STOP
*
*********************************************************
acall
FetchData
;Data
setb
aa
;ACK
ajmp
SendStop
;Emisie STOP
ds
2
;2 + 2 + 2 + 2
*********************************************************
* Stare 60:
(mod slave receptie)
*
*
A fost rec SLA+W, a fost returnat ACK
*
* Actiuni
*
*
IICCntrl (Asteapta octet 1 )
*
*********************************************************
setb
IICCntrl.BYTE1EXPECTED ;Actualizare stare
ajmp
ClrSiExit
;Exit
;
ds
;
;
;
;
;
;
;
;
;
State68:
;
;
;
;
;
;
;
;
;2 + 2 + 4
*********************************************************
* Stare 68
(mod slave receptie)
*
*
Arbitrare pierduta in SLA, R/W ca master.
*
*
Receptionata SLA+W propriu, A fost returnat ACK *
* Actiuni
*
*
IICCntrl (Asteapta octet 1 )
*
*
Set STA si AA
*
*********************************************************
setb
IICCntrl.BYTE1EXPECTED ;Actualizare stare
clr
IICCntrl.INBLOCK2
;Reset stare master
setb
aa
;ACK
ajmp
SendStart
;Set bit start
*********************************************************
* Stare 70
(mod slave receptie)
*
*
Receptionat apel CALL+W. A fost returnat ACK
*
*
(daca apelul general este validat)
*
* Actiuni
*
*
Ca la starea 60
*
*********************************************************
ajmp
State60
;Ca la starea 60
ds
6
;
;
;
;
;
;
;
;
State80:
;
;
;
;
;
;
;
;
State88:
;
;
;
;
;
;
;
;
;
SetupBlock2:
;
;
;
;
;
;
;
;
*********************************************************
* Stare 78
(mod slave receptie)
*
*
Arbitrare pierduta ca SLA, R/W ca master.
*
*
Receptionat apel CALL+W. A fost returnat ACK
*
*
(daca apelul general este validat)
*
* Actiuni
*
*
Ca la starea 68
*
*********************************************************
ajmp
State68
;Ca la starea 68
ds
6
*********************************************************
* Stare 80
(mod slave receptie)
*
*
Adresat anterior cu SLA propriu. Octeti rec.
*
*
ACK returnat
*
* Actiuni
*
*
Receptie slave
*
*********************************************************
acall
Receive_Slave
;Receptie slave
ajmp
ClrSiExit
;Exit
ds
4
;2 + 2 + 4
*********************************************************
* Stare 88
(mod slave receptie)
*
*
Adresat anterior cu SLA propriu. Octeti rec.
*
*
NACK returnat (neadresat ca slave in continuare)*
* Actiuni
*
*
Citeste date false, ACK
*
*********************************************************
mov
a,s1dat
;Date dummy
setb
aa
;ACK
ajmp
ClrSiExit
;Exit
ds
2
;2 + 2 + 2 + 2
*********************************************************
* Stare 90
(mod slave receptie)
*
*
Adresat anterior cu apel general. Octeti rec.
*
*
ACK returnat
*
* Actiuni
*
*
Ca la starea 80
*
*********************************************************
ajmp
State80
;Ca la starea 80
setb
mov
ajmp
IICCntrl.INBLOCK2
r1,DataIndex2
SetupB2Proceed
;bloc2
;Pointer la bloc2
;
;2 + 2 + 2 + 2
*********************************************************
* Stare 98
(mod slave receptie)
*
*
Adresat anterior cu apel general. Octeti rec.
*
*
NACK returnat
*
* Actiuni
*
*
Ca la starea 88
*
*********************************************************
ajmp
State88
;Ca la starea 88
;
SetupB2Proceed: mov
r2,DataCount2
;Lungime bloc2
ret
ds
3
;2 + 2 + 1 + 3
;
;
*********************************************************
;
* Stare A0
(mod slave receptie)
*
;
*
S-a receptionat STOP sau apel general cand era *
;
*
adresat ca slave rec sau emisie
*
;
* Actiuni
*
;
*
Clear IICCntrl (asteapta octet 1)
*
;
*********************************************************
StateA0:
clr
IICCntrl.BYTE1EXPECTED ;Actualizare stare
setb
aa
;Ack adresa proprie slave
ajmp
ClrSiExit
;Exit
ds
2
;2 + 2 + 2 + 2
;
;
*********************************************************
;
* Stare A8
(mod slave emisie)
*
;
*
S-a receptionat SLA+R. S-a returnat ACK
*
;
*
adresat ca slave rec sau emisie
*
;
* Actiuni
*
;
*
Emisie slave
*
;
*********************************************************
StateA8:
acall
Send_Slave
;Emisie date slave
ajmp
ClrSiExit
;Exit
ds
4
;2 + 2 + 4
;
;
;
;
;
;
;
SendStart:
;
;
;
;
;
;
;
;
SendStop:
;
;
;
;
;
;
;
;
;
;
;
SendData:
;
ProceedSend:
;
SendAccExit:
ClrSiExit:
SIO1Exit:
;
;
;
Init_Slave:
;
;
;
;
;
;
;
;
;
;
;
;
Receive_Slave:
*********************************************************
* Stare B0
(mod slave emisie)
*
*
Arbitrare pierduta in SLA, R/W ca master.
*
*
S-a receptionat SLA+W propriu. ACK returnat
*
* Actiuni
*
*
Set STA + AA
*
*
Ca la starea A8
*
*********************************************************
setb
sta
;Set bit start
setb
aa
;Set ACK
ajmp
StateA8
;Emisie date
ds
2
;2 + 2 + 4
*********************************************************
* Stare B8
(mod slave emisie)
*
*
S-au transmis datele. ACK returnat
*
* Actiuni
*
*
Ca la starea A8
*
*********************************************************
ajmp
StateA8
;Emisie ca slave
setb
sta
;Emisie START
ajmp
ClrSiExit
;Exit
ds
2
;2 + 2 + 2 + 2
*********************************************************
* Stare C0:
(mod slave emisie)
*
*
S-au transmis datele. S-a receptionat NACK
*
* Actiuni
*
*
Ca la starea A0
*
*********************************************************
ajmp
StateA0
;Ca la starea A0
setb
clr
ajmp
sto
IICCntrl.MSTNOTREADY
ClrSiExit
;Emisie STOPStop
;Stergere bit \Ready
;Exit
;2 + 2 + 2 + 2
*********************************************************
* Stare C8
(mod slave emisie)
*
*
S-au transmis ultimele date (AA=0). Rec. ACK
*
* Actiuni
*
*
Ca la starea A0
*
*********************************************************
ajmp
StateA0
;Ca la starea A0
********************************************
* Proceduri SIO1
*
********************************************
cjne
r2,#0,ProceedSend
;Emisie date daca exista
jb
IICCntrl.INBLOCK2,SendStop ;Emisie STOP daca este bloc2
acall
SetupBlock2
;Altfel, set bloc2
jnb
IICCntrl.SLREAD,SendData
;Daca \mod citire, emisie bloc2
ajmp
SendStart
;Altfel, emisie START repetat
dec
mov
inc
r2
a,@r1
r1
mov
s1dat,a
;emisie date
clr
si
;sterge SI
pop
acc
;reface Acc
pop
psw
;reface PSW
reti
;Exit
*********************************************************
* Init_Slave
*
*********************************************************
ret
*********************************************************
* Receive_Slave
*
*
*
* Actiuni
*
*
If IICCntrl ( Byte 1 Expected ) Then
*
*
IICCntrl ( Byte 1 Expected ) := 0
*
*
SubAddress := s1dat
*
*
Else
*
*
@SubAddress := s1dat
*
*
SubAddress
*
*********************************************************
mov
a,s1dat
;Data receptionata
mov
r0,#r17
;Indicare subadresa
jbc
IICCntrl.BYTE1EXPECTED,SaveData ;Daca octet1, salveaza in subadresa
mov
inc
mov
ret
r0,r17
r7
@r0,a
;Altfel, @subadresa
;Post-incrementare subadresa
;Salvare date
*********************************************************
* Send_Slave
*
*
*
* Actiuni
*
*
s1dat := @SubAddress
*
*
SubAddress ++
*
*********************************************************
mov
r0,r17
mov
s1dat,@r0
inc
r7
ret
;
end
#endif
/**************************************************************************\
** Titlu:
COUNT.C
**
** Descriere:
Implementeaz contoare soft.
**
**
**
** Versiune:
2.0
**
** nceput la:
iunie, 1997
**
** Autor:
tefan Suceveanu, Pratco s.r.l. Bucureti, Romnia
**
** Compilator C: C51 V2.27, Franklin Software, Inc.
**
** Copyright:
PRATCO s.r.l. Bucureti, Romnia,
**
**
C.P. 61-137, RO 75500,
**
**
Tel./Fax: (+40)-1-345.17.25
**
**
e-mail: office@pratco.ro
**
**
www:
www.pratco.ro
**
**
**
** Acest modul conine urmtoarele funcii:
**
**
void reset_count(byte n) = reseteaz contorul n
**
**
void reset_counts(void) = reseteaz toate contoarele
**
**
void quick_count(byte newval) = implementeaz 8 contoare
**
**
**
** Ultima modificare la data: 10 februarie 1998
**
** Istoric:
**
**
**
** Copyright (C) 1998 PRATCO s.r.l. All rights reserved.
**
\**************************************************************************/
#pragma DEBUG OBJECTEXTEND CODE SYMBOLS
#include <typedef.h>
#include <stdio.h>
#include <reg552.h>
#include "count.h"
#define N_COUNTERS 8 /* nu modificai aceast valoare */
xdata TCOUNTER counters[N_COUNTERS];
/************************************************************************
Reseteaz contorul n
*************************************************************************/
void reset_count(byte n)
{
counters[n].count.Lw = counters[n].flags = 0;
}
/************************************************************************
Reseteaz toate contoarele [N_COUNTERS]
*************************************************************************/
void reset_counts(void)
{
byte i;
for(i = 0; i < N_COUNTERS; i++)
reset_count(i);
}
/************************************************************************
Implementeaz 8 contoare soft.
*************************************************************************/
void count(byte val)
{
static data byte oldval;
data byte i,sc,sd;
data byte *pflags;
data blword *pcx;
sc = (oldval ^ newval) & newval;
sd = (oldval ^ newval) & oldval;
// decrementm
// incrementm
// decrementam
// incrementam
T0
PWM
/* iniializare SIO1 */
initLCD();
putLCD(0,0,"FRECVENTA RECEPTIE: ");
putLCD(2,0,"SELECTIE FRECVENTA: ");
afis = 1;
divizor = 3345;
afisare = ((float)divizor - 622) * 62.5;
asir[0] = 0x8e;
asir[1] = 0x50;
putTSA(1,2,&asir[0]);
while(1)
{
if(afis)
{
divizor = (divizor & 0x7fff);
putTSA(1,2,&divizor);
sprintf(asir,"%g",afisare);
putLCD(1,0,"
");
sin(t+) Formator
TTL
stop
Numrtor
12 bii
cos t
RESOLVER
Formator
TTL
start
sin
MDAC
cos
sint
cos(t+)
cos
MDAC
sin(-)
VCO
sin
ROM
d
dt
Numrtor
sus/jos 16 bii
1
0
0
0
LB
X5
Y5
MB
RB
X4
Y4
0
Bit
Y7
X3
Y3
0
Y6
X2
Y2
0
X7
X1
Y1
0
X6
X0
Y0
0
VIN
Filtru
Surs
referin
Regulator
Filtru
VOUT
BD135
5V
1A
6...10V
LM323
IN OUT
8...10V
IN OUT
5V
1A
GND
8...10V
5V
3A
GND
DZ5V6
3.1.2
Surse n comutaie
De regul, sursele de alimentare n comutaie produc tensiunea de ieire
dintr-o tensiune alternativ de cteva sute de kiloheri generate de un
oscilator din tensiunea de alimentare.
Principalele avantaje ale surselor n comutaie sunt randamentul ridicat
(ajunge pn la 97%), dar i obinerea de tensiuni cu orice polaritate i
valoare fa de tensiunea de intrare. De asemenea multe din circuitele
utilizate mai au i alte faciliti, cum ar fi: detectarea scderii tensiunii de
intrare i generarea unui semnal NMI, pornirea/oprirea sursei prin intermediul
unui semnal de comand TTL etc.
n figura 4.3 sunt prezentate dou tipuri de surse de 5V: una din ele
este destinat folosirii n aparatele portabile, tensiunea de 5V de mic putere
(240mA) fiind produs pentru tensiuni de intrare ntre 1V i 6.2V; cea de
doua este o surs de putere mare (5A) utilizabil pe autovehicule (tensiunea
de intrare n gama 10...60V).
V IN =16.2V
V IN =1060V
MAX777
2 IN
1 I LI M
7
10H
PGND
4
OUT
AGND
V SW
LT1074
1V
LX 5
ON/OFF
VIN
V OUT =5V
240mA
TO3
V OUT =5V/5A
50H
2K8
FB 4
2K2
2K7
GND
10n
MBR745
C1
C2
7 AC1
V OU T 6
1 AC2
V SE N SE 5
R2
5V
MAX610
4 V SET
OUV 3
Reset C
V-
V+
+12V
47F/16V
R2 =
0.6
ILIMIT
(overflow) a timerului T0, ultima valoare capturat va indica durata transmisiei unui caracter, de la bitul de start pn la bitul de stop.
n tabelul CmpTable se gsesc valorile maxime ale duratei unui caracter
pentru fiecare vitez de transmitere. Trebuie avut n vedere ca s nu se
transmit un al doilea caracter imediat dup primul.
Dac se folosete i bitul de paritate, pot apare erori de determinare a
vitezei de comunicaie dac se transmite oricare din caracterele de la 'p' la 'z',
acoladele '{' sau '}', bara vertical '|', tilda '~' sau caracterul 'delete', n
funcie de paritatea folosit (par sau impar). Caracterele uzuale folosite
pentru a atrage atenia sistemului (spaiu, enter, escape) nu prezint aceste
neajunsuri.
Trebuie avut n vedere, de asemenea, c primul caracter recepionat este
pierdut, neputnd fi identificat corect.
De asemenea dac dup determinarea vitezei de transmisie se constat
erori de ncadrare (framing errors) atunci trebuie repetat algoritmul de
determinare a vitezei.
Pentru a calcula valorile din tabelul CmpTable se folosete urmtoarea
formul:
Osc[MHz]
5
Viteza de transmitere 12
Valorile din tabel sunt pe 16 bii i deci rezultatele de mai sus trebuie
mprite n dou dup octetul superior i inferior.
Formula de mai sus a fost dedus folosind urmtoarele ecuaii:
timpul minim de recunoaste re
valoarea maxima din tabel =
durata unui ciclu masina
nr. maxim de biti de recunoscut
durata unui octet
timpul minim de recunoaste re =
numarul de biti vizibili
Valoare din tabel =
BIT
DATA
DATA
DATA
EQU
P3.0
30h
31h
32h
P4
;
ORG 8000h
START:
MOV
SJMP
;Pin recepie.
;Octet superior rezultat timer.
;Octet superior rezultat timer.
;Valoare final vitez de transmisie.
;Port afiare pentru depanare.
;
Subrutine
;Subrutin determinare automat vitez de transmitere
;Detecteaz viteza de transmitere dup primul caracter recepionat prin msurarea
;lungimii caracterului. Unele caractere pot s produc erori, n special cele care
;conin la ;sfrit 0X7h sau 0XFh.
AutoBaud:
MOV
TMOD,#01h
;Initializare timer T0
MOV
TH0,#0
MOV
TL0,#0
MOV
TCON,#0
MOV
MOV
CharH,#0
CharL,#0
AB0:
JB
SETB
RX,AB0
TR0
AB1:
JB
JNB
MOV
MOV
TF0,AB3
RX,AB1
CharH,TH0
CharL,TL0
AB2:
JB
JB
SJMP
TF0,AB3
RX,AB2
AB1
AB3:
CLR
CLR
TR0
TF0
MOV
BRate,#19
MOV
MOV
MOVC
DEC
CJNE
SJMP
JC
DJNZ
SJMP
A,BRate
DPTR,#CmpTable
A,@A+DPTR
;Tabel comparare.
BRate
A,CharH,Cmp1;Verificare rezultat.
CmpLow
;Verificare octet inferior.
CmpMatch
;Valoare tabel < valoare timp.
BRate,CmpLoop;Verificare sfrit tabel.
CmpMatch
MOV
MOVC
CJNE
SETB
JC
DJNZ
A,BRate
A,@A+DPTR
;Tabel comparare.
A,CharL,Cmp2;Verificare rezultat
C
;Valoare tabel = valoare timp
CmpMatch
;C setat dac A < octet inferior ;rezultat.
BRate,CmpLoop;Verificare sfrit tabel.
MOV
CLR
RRC
MOV
RET
A,BRate
C
A
BRate,A
CmpLoop:
Cmp1:
CmpLow:
Cmp2:
CmpMatch:
;Comparare complet
;Salvare valoare
3.2.2
Implementarea unei transmisii seriale cu pachete CRC16
n cazul transmiteri datelor n medii poluate electromagnetic pot apare
erori. Aceste erori pot fi detectate folosind un algoritm simplu ca de exemplu
suma fr transport a tuturor octeilor dintr-un pachet, fie algoritmi mai
complicai care asigur o probabilitate foarte mare de detectare a erorilor.
Printre aceti algoritmi se afl i Codul Ciclic Redundant (CRC). Algoritmul de
determinarea a sumei de control propus determin CRC 16 folosind polinomul
CRC-CCITT x 16 + x 12 + x 5 + x 0 folosit n protocolul XMODEM, pentru un buffer
'buff' de lungime 'len'. Valoare pe 16 bii obinut trebuie adugat la sfritul
bufferului ce urmeaz a fi transmis astfel:
Buff High(CRC) Low(CRC)
La recepie se calculeaz CRC16 pentru ntreg bufferul recepionat
(inclusiv cu CRC-ul transmis len+2) i dac valoarea obinut este zero
atunci transmisia s-a fcut fr erori. Dac valoarea CRC-ului calculat este
diferit de zero atunci au aprut erori la transmisie i n funcie de protocolul
de comunicaie folosit se poate transmite un NACK sau nu se transmite nimic.
Funcia unsigned int bufCRC16(char *buff, char len,
unsigned int CRC) are implementat calculul CRC-ului pentru cele dou
moduri de memorare a valorilor ntregi n memorie (litle endian
procesoarele Int e l x86, Pentium sau big endian procesoarele Motorola,
Philips). Aceast funcie primete ca parametrii un pointer la irul cu date
care urmeaz s fie transmis, buff, lungimea acestui ir, len, i valoarea
CRC-ului de la care se pleac. Dac se dorete calculul CRC-ului numai pentru
irul indicat de buff atunci parametrul CRC se va iniializa cu 0. Dac se
dorete concatenarea a dou iruri valoarea CRC-ul obinut dup apelul
acestei funcii pentru primul ir de caractere se va pasa ca parametru la
apelul acestei funcii pentru al doilea ir de caractere.
Pentru creterea vitezei, n memoria program se memoreaz un tabel cu
codurile CRC16 pentru toate valorile unui octet, tabel care are lungimea de
512 octei.
/*****************************************************************************\
** Descriere:
Calculeaza CRC16 pe baza polinomului CRC-CCITT (XMODEM)
**
**
**
** Versiune:
2.0
**
** Inceut la:
Iunie 1998
**
** Autor:
Stefan Suceveanu, Pratco s.r.l. Bucuresti, Romania
**
** Compilator C: C51 V2.27, Franklin Software, Inc.
**
** Copyright:
PRATCO s.r.l. Bucuresti, Romania,
**
**
C.P. 61-137, RO 75500, Bucuresti, Romania
**
**
Tel./Fax: (+40)-1-345.09.75
**
**
e-mail: office@pratco.ro
**
**
www:
www.pratco.ro
**
**
**
** Acest modul contine urmatoarele functii:
**
**
unsigned int bufCRC16(char *buff, char len, unsigned int CRC)
**
**
**
** Ultima modificare la data: 24 iunie 1998
**
** Istoric:
**
**
**
** Observatii: Pentru ca calculul CRC-ului s fie independent de procesorul **
** folosit trebuie modificat in typedef.h funciile LOW si HIGH care extrag **
** din memorie partea inferioara si respectiv superioara a unui intreg pe
**
** 16 biti.
**
** Pentru verificarea CRC-ului la receptie trebuie ca CRC-ul unui mesaj la **
{
0x3063,
0xB16B,
0x2252,
0xA35A,
0x1401,
0x9509,
0x0630,
0x8738,
0x78A7,
0xF9AF,
0x6A96,
0xEB9E,
0x5CC5,
0xDDCD,
0x4EF4,
0xCFFC,
0xA1EB,
0x20E3,
0xB3DA,
0x32D2,
0x8589,
0x0481,
0x97B8,
0x16B0,
0xE92F,
0x6827,
0xFB1E,
0x7A16,
0xCD4D,
0x4C45,
0xDF7C,
0x5E74,
0x4084,
0xC18C,
0x52B5,
0xD3BD,
0x64E6,
0xE5EE,
0x76D7,
0xF7DF,
0x0840,
0x8948,
0x1A71,
0x9B79,
0x2C22,
0xAD2A,
0x3E13,
0xBF1B,
0xD10C,
0x5004,
0xC33D,
0x4235,
0xF56E,
0x7466,
0xE75F,
0x6657,
0x99C8,
0x18C0,
0x8BF9,
0x0AF1,
0xBDAA,
0x3CA2,
0xAF9B,
0x2E93,
0x50A5,
0xD1AD,
0x4294,
0xC39C,
0x74C7,
0xF5CF,
0x66F6,
0xE7FE,
0x1861,
0x9969,
0x0A50,
0x8B58,
0x3C03,
0xBD0B,
0x2E32,
0xAF3A,
0xC12D,
0x4025,
0xD31C,
0x5214,
0xE54F,
0x6447,
0xF77E,
0x7676,
0x89E9,
0x08E1,
0x9BD8,
0x1AD0,
0xAD8B,
0x2C83,
0xBFBA,
0x3EB2,
0x60C6,
0xE1CE,
0x72F7,
0xF3FF,
0x44A4,
0xC5AC,
0x5695,
0xD79D,
0x2802,
0xA90A,
0x3A33,
0xBB3B,
0x0C60,
0x8D68,
0x1E51,
0x9F59,
0xF14E,
0x7046,
0xE37F,
0x6277,
0xD52C,
0x5424,
0xC71D,
0x4615,
0xB98A,
0x3882,
0xABBB,
0x2AB3,
0x9DE8,
0x1CE0,
0x8FD9,
0x0ED1,
0x70E7,
0xF1EF,
0x62D6,
0xE3DE,
0x5485,
0xD58D,
0x46B4,
0xC7BC,
0x3823,
0xB92B,
0x2A12,
0xAB1A,
0x1C41,
0x9D49,
0x0E70,
0x8F78,
0xE16F,
0x6067,
0xF35E,
0x7256,
0xC50D,
0x4405,
0xD73C,
0x5634,
0xA9AB,
0x28A3,
0xBB9A,
0x3A92,
0x8DC9,
0x0CC1,
0x9FF8,
0x1EF0
/*07*/
/*0F*/
/*17*/
/*1F*/
/*27*/
/*2F*/
/*37*/
/*3F*/
/*47*/
/*4F*/
/*57*/
/*5F*/
/*67*/
/*6F*/
/*77*/
/*7F*/
/*87*/
/*8F*/
/*97*/
/*9F*/
/*A7*/
/*AF*/
/*B7*/
/*BF*/
/*C7*/
/*CF*/
/*D7*/
/*DF*/
/*E7*/
/*EF*/
/*F7*/
/*FF*/
\****************************************************************************
calculeaz CRC16 pentru un buffer de lungime len plecnd de la un CRC
existent pentru concatenarea CRC-ului a dou buffere. La primul apel CRC
trebuie sa fie 0.
****************************************************************************/
unsigned int bufCRC16(char *buff, char len, unsigned int CRC)
{
data unsigned char i;
for(i = 0; i < len; i++)
// calcul CRC independent de procesor
CRC = (((unsigned int)LOW(CRC)) << 8) ^ crctab[HIGH(CRC) ^ buff[i]];
// calcul CRC pentru procesoare tip Intel (little endian)
//
CRC = (CRC << 8) ^ crctab[(CRC >> 8) ^ buff[i]];
return CRC;
}
3.2.3
Sistem de transmisie cu cureni purttori
O aplicaie interesant poate fi utilizarea reelei electrice de 220V/50Hz
ca mediu de transmisie a datelor. Informaia, care poate consta chiar ntr-un
pachet de date transmise serial, moduleaz n frecven o purttoare de circa
10 kHz.
Filtrul format din capacitatea C i transformatorul reglabil pe ferit Tr
asigur att separarea de reea ct i adaptarea la linia de transmisie.
ntruct mediul de transmisie este, prin definiie, saturat cu parazii, este
necesar adoptarea unor msuri specifice pentru recepionarea corect a
datelor seriale transmise: n primul rnd reducerea vitezei de transmisie; n al
doilea rnd trebuie utilizate protocoale specifice pentru detectarea sau
IN 9
10
15
PP
P1
CIN
VCOUT
P2
SIN
4046
CX
VCOIN
CX
INH
R1
R2
DEMO
ZEN
3
4
Tr
14
3
4
Linie 220V
Tr
14
6
470p
7
5
11
12
100K
470p
7
5
11
12
fP=10kHz
vitez=300 baud
CIN
VCOUT
PP
P1
SIN
P2
CX
4046
CX
INH
R1
R2
VCOIN
DEMO
ZEN
1
2
13
100K
100n
9
10 OUT
15
100K
3.2.4
Interfaa CAN
Pentru distane mici, de civa metri, semnalele digitale care nu au o
band prea mare se pot transmite direct, fr precauii deosebite.
n cazul transmiterii informaiilor la distane mari, este obligatorie
folosirea unor circuite speciale, interfee, care realizeaz o amplificare a
semnalului astfel nct atenuarea semnalului produs de firul telefonic s nu
reduc semnificativ raportul semnal zgomot. De regul, amplificarea este
realizat n tensiune sau n curent.
Aceste interfee sunt standardizate, principalele tipuri i caracteristicile
lor fiind prezentate n tabelul 4.1.
Tabelul 3.1
Tip
Distan
interfa
legtur
Numr
Numr
emitoare receptoare
pe un canal pe un canal
Semnal
RS 232
7 m
tensiune
RS 422
1200 m
32
tensiune
RS 485
1200 m
32
32
curent
arbitrare;
ncadrare mesaje;
viteza de transfer i sincronizare.
Nivelul de transfer constituie nucleul protocolului CAN. El prezint
mesajele recepionate nivelului obiect i accept de la acesta mesajele de
transmis. Nivelul de transfer este responsabil cu sincronizarea biilor,
ncadrarea mesajelor, confirmri, arbitrri, detectarea, semnalarea i limitarea
erorilor.
Nivel fizic:
nivel semnal i reprezentare bii;
mediu de transmisie.
b)
Caracteristici generale
Tipuri de cadre
CADRU DE DATE
Cmp
arbitrare
Cmp
control
Cmp
date
Cmp
CRC
Start cadru
Spaiu
intermediar
Cmp
confirmare
CADRU CERERE DE DATE
Cmp
arbitrare
Cmp
control
Cmp
CRC
Start cadru
Cadru
date
Sfrit
cadru
Spaiu
intermediar
sau cadru
suprancrcare
Sfrit
cadru
Spaiu
intermediar
sau cadru
suprancrcare
Cmp
confirmare
CADRU EROARE
Indicator
eroare
Spaiu intermediar
sau cadru suprancrcare
Delimitator
Suprapunere indicatori
eroare
Sfrit cadru sau
delimitator eroare
ori suprancrcare
CADRU SUPRANCRCARE
Indicator
suprancrcare
Delimitator
Spaiu intermediar
sau cadru suprancrcare
Suprapunere indicatori
suprancrcare
Cadru
Pauz
Cadru
Magistral
inactiv
Pauz
Cadru
Suspendare
transmisie
Cadru
Magistral
inactiv
d)
Prelucrarea erorilor
Limitarea erorilor
CANDAT:
registru de date;
CANCON:
CANSTA:
Control (CR)
Comand (CRM)
Stare (SR)
ntrerupere (IR)
Cod acceptare (ACR)
Masc acceptare (AMR)
Sincronizare magistral 0 (BTR0)
Sincronizare magistral 1 (BTR1)
Control ieire (OCR)
Test
Segment control
0Ah
0Bh
0Ch
0Dh
0Eh
0Fh
10h
11h
12h
13h
Identificator (DSCR0)
Bit RTR. Cod lungime mesaj (DSCR1)
Octet 1
Octet 2
Octet 3
Octet 4
Octet 5
Octet 6
Octet 7
Octet 8
14h
15h
16h
17h
18h
19h
1Ah
1Bh
1Ch
1Dh
Identificator
Bit RTR. Cod lungime
Octet 1
Octet 2
Octet 3
Octet 4
Octet 5
Octet 6
Octet 7
Octet 8
Descriptor
Bufer emisie
Date
Identificator
Bit RTR. Cod lungime
Octet 1
Octet 2
Octet 3
Octet 4
Octet 5
Octet 6
Octet 7
Octet 8
Descriptor
Bufer
recepie
0 sau 1
Date
TM
RA
Tabelul 3.2
TM
S
RA
OIE
EIE
TIE
RIE
RR
CR (0)
Mod test. Este destinat testrilor la fabricant.
0: modulul CAN funcioneaz normal;
1: modulul CAN funcioneaz n mod test.
Bit sincronizare. Modificarea biilor S i RA este posibil numai dac bitul RR
este setat. Dup o iniializare extern S este nedefinit.
0: tranziiile magistralei recesivdominant sunt folosite pentru resincronizare;
1: sunt folosite pentru resincronizare ambele tipuri de tranziii.
Referin activ. Dup o iniializare extern RA este setat.
0: se folosete ca referin o tensiune extern;
1: se folosete ca referin tensiunea AV DD .
a)
Tip
Control
Comand
Stare
ntreruperi
Bit
CR.7
CR.5
CMR.7
CMR.6
CMR.4
CMR.3
CMR.2
CMR.1
CMR.0
SR.7
SR.6
SR.5
SR.4
SR.3
SR.2
SR.1
SR.0
IR.3
IR.1
IR.0
Simbol
TM
RA
RX0A
RX1A
SLP
COS
RRB
AT
TR
BS
ES
TS
RS
TCS
TBS
DO
RBS
OI
TI
RI
Funcie
Mod test
Referin activ
RX0 activ
RX1 activ
Inactiv
tergere stare depire
Eliberare buffer recepie
Suprimare transmisie
Cerere transmisie
Stare magistral
Stare erori
Stare emisie
Stare recepie
Emisie complet
Acces buffer transmisie
Depire date
Stare buffer recepie
ntrerupere depire
ntrerupere transmisie
ntrerupere recepie
Tabelul 3.3
Efect
Dezactivat
Setat (ieire)
Setat (RX0 = CRX0)
Setat (RX1 = CRX1)
ters (atenionare)
Setat (ters)
Setat
ters
ters
ters (magistral activ)
ters (nu exist erori)
ters (inactiv)
ters (inactiv)
Setat (complet)
Setat (liber)
ters (inexistent)
ters (registru descrcat)
ters
ters
ters
AV D D
M od atenion a re
Semnal
a ten ion a re
CRX0
RX0
C o m p arare
CRX1
RX1
BS
ES
TS
RS
TCS
TBS
DO
RBS
ES
TS
RS
TCS
TBS
DO
Tabelul 3.5
RBS
SR (2)
Stare magistral. Cnd magistrala este inactiv, modulul CAN va seta bitul RB.
Modulul rmne n aceast stare pn cnd RR este ters. Dup aceasta, CAN
ateapt timpul minim definit de protocol (128 de semnale magistral liber)
nainte de a activa magistrala, terge bitul de stare eroare i reiniializa
contorul de erori.
0: modulul este implicat n lucrul pe magistrala CAN;
1: modulul nu este implicat n lucrul pe magistral.
Stare eroare.
0: ambele numrtoare de erori nu au depit numrul maxim;
1: cel puin un numrtor de erori a depit numrul maxim.
Stare transmisie.
0: nu este transmis nici un mesaj;
1: mesaj n curs de transmitere.
Stare recepie. Dac att RS ct i TS sunt 0 LOGIC , magistrala CAN este
inactiv.
0: nu este recepionat nici un mesaj;
1: mesaj n curs de recepionare.
Completare transmisie. TCS este ters ori de cte ori indicatorul TR este setat.
Dac un mesaj care a fost cerut i apoi anulat nu a fost transmis, TCS rmne 0
LOGIC .
0: mesajul solicitat anterior nu a fost transmis;
1: mesajul solicitat anterior a fost transmis.
Acces buffer transmisie. Dac unitatea central scrie n bufferul de transmisie
ct timp indicatorul TBA este ters, octetul scris este pierdut fr a se semnala.
0: unitatea central nu poate scrie n bufferul de transmisie; un mesaj fie
ateapt s fie transmis, fie este n curs de transmitere;
1: unitatea central poate scrie n buffer.
Depire date. Dac este detectat DO=1, mesajul recepionat este eliminat. Un
mesaj admis pentru transmisie este memorat de asemenea ntr-un buffer de
recepie. Dac modulul pierde arbitrarea, poate deveni receptor i neavnd
buffer de recepie disponibil se semnaleaz o eroare DO. DO nu provoac
transmisia unui cadru de depire.
0: nu a survenit nici o depire de la ultima comand tergere depiri;
1: ambele buffere de recepie sunt pline i nu mai poate fi memorat primul
octet al unui nou mesaj.
Stare buffer recepie. Dac indicatorul RRB este setat de unitatea central, RBS
este ters de logica de control a interfeei (IML). Dac un nou mesaj este
memorat ntr-unul din bufferele de recepie, RBS este setat.
0: nu a survenit nici un mesaj de la ultima comand RRB;
1: un nou mesaj este disponibil.
Tabelul 3.6
IR (3)
WUI
ntrerupere atenionare.
0: registrul a fost citit de unitatea central;
1: modul inactiv a fost abandonat.
OI
ntrerupere depire. Este setat sincron cu indicatorul Depire date.
0: registrul a fost citit de unitatea central;
1: ambele registre recepie conin un mesaj, se primete un nou mesaj care nu
poate fi pstrat i indicatorul OIE (validare ntrerupere depire) este setat.
EI
ntrerupere la eroare.
0: registrul a fost citit de unitatea central;
1: schimbarea indicatorilor ES sau BS, dac EIE (validare ntrerupere eroare)
este setat.
TI
ntrerupere transmisie.
0: registrul a fost citit de unitatea central;
1: schimbarea indicatorului TBA, dac TIE (validare ntrerupere emisie) este
setat.
RI
ntrerupere recepie. RI i RBS sunt setai concomitent.
0: registrul a fost citit de unitatea central;
1: un nou mesaj este disponibil n bufferul de recepie i RIE (validare
ntrerupere recepie) este setat.
Tabelul 3.8
AM1
AM0
recesiv.
Dac
modulul
este
stare
de
iniializare
(RR=1),
Bufferul
date)
de
recepie
(DSCR1,
DSCR0
cmpurile
de
speciale
pentru
interfaare
cu
unitatea
CANADR (DBh)
DMA
Control logic DMA. Aceast logic permite transferul unui mesaj complet (10
octei) ntre modulul CAN i memoria RAM intern n maxim 2 instruciuni. Un
transfer DMA este stabilit mai nti prin scrierea adresei de RAM (00h la FFh) n
CANSTA iar apoi setarea simultan a indicatorilor DMA i adreselor bufferelor Tx
sau Rx din CANADR; adresa RAM indic locaia primului octet care va fi
transferat. Setarea DMA produce evaluarea automat a DLC i apoi iniiaz
transferul.
Pentru a iniia un transfer TX-DMA n CANADR trebuie scris 8Ah. Apoi mesajul
complet (2 octei descriptori i 08 octei date) de la adresa RAM sunt
transferate n bufferul de transmisie.
Transferul RX-DMA se face scriind n CANADR o valoare de la 94h la 9Dh, pentru
a selecta din mesaj octeii dorii (toi opt, respectiv nici unul).
Dup un transfer DMA reuit, indicatorul DMA este ters.
AutoInc Dac AutoInc este setat, coninutul CANADR este incrementat automat dup
orice acces la registrul CANDAT. Incrementarea CANADR peste valoarea 3Fh
terge indicatorul AutoInc i registrul CANADR.
CANA40 Definesc adresa registrului intern din modulul CAN care va fi accesat prin
intermediul CANDAT.
CAND7 CAND6 CAND5 CAND4 CAND3 CAND2 CAND1 CAND0
CANDAT (DAh)
CAND70 Registrul CANDAT apare ca un port ctre registrele interne ale modulului CAN
selectate de CANADR. Scrierea sau citirea CANDAT este de fapt un acces la
registrul intern CAN adresat de CANADR.
WUI
OI
EI
TI
RI
R
CANCON (D9h)
RX1A
WUM
SLP
COS
RRB
AT
TR
W RX0A
Structura indicatorilor este identic cu cea descris la registrele IR (pentru citire), respectiv
CMR (pentru scriere)
BS
ES
TS
RS
TCS
TBS
DO
RBS
CANSTA
R
(DFhD8h)
W RAMA7 RAMA6 RAMA5 RAMA4 RAMA3 RAMA2 RAMA1 RAMA0
Structura indicatorilor este identic cu cea descris la registrele RS (pentru citire). Scrierea
n CANSTA seteaz valorile RAMA70 corespunztor adresei din memoria RAM intern care
va fi folosit pentru un transfer DMA.
linia de transmisie;
convertete nivelele de tensiune de pe linie n semnale compatibile cu
intrrile CRX0 i CRX1.
8xC592
C cu modul CAN
CTX0
V DD
CTX1
390
CRX0
6k8
+5V
6N137
3k6
100n
390
V SS
0V
390
CRX1
100n
6N137
+5V
390
+5V
TxD
RxD
V ref
RS
PCA82C250
Transceiver CAN
124
CANH
CANL
124
Anexe
Definiiile constantelor sistemului de dezvoltare, adresele porturilor i a
perifericelor din fiierul SYSTEM.H.
/**************************************************************************\
** Titlu:
SYSTEM.H
**
** Descriere:
Declaratiile constantelor sistemului
**
**
**
** Versiune:
2.0
**
** Inceut la:
August 95
**
** Autor:
Stefan Suceveanu, Pratco s.r.l. Bucuresti, Romania
**
** Compilator C: C51 V2.27, Franklin Software, Inc.
**
**
**
** Acest modul contine urmatoarele functii:
**
**
declaratii de constatnet si macrouri pentru:
**
**
- RTC, LCD, I2C, EEPROM, porturi, tastatura,
**
**
controller intrerupri, wachdog
**
**
**
** Ultima modificare la data: 23 nov 1998
**
** Istoric:
**
**
**
** Observatii:
**
**
**
\**************************************************************************/
#ifndef _SYSTEM_H_
#define _SYSTEM_H_
#include <reg552.h>
#define EX_WATCHDOG()
T2 = T2 ? 0 : 1
/* RTC =============================================================== */
#define RTC_ADR
0x2800
/* Adrsa circuitului RTC */
#define regSEC1
(RTC_ADR | 0x0000)
/* = registru 0 din RTC */
#define regSEC10
(RTC_ADR | 0x0001)
/* = registru 1 din RTC */
#define regMIN1
(RTC_ADR | 0x0002)
/* = registru 2 din RTC */
#define regMIN10
(RTC_ADR | 0x0003)
/* = registru 3 din RTC */
#define regHOUR1
(RTC_ADR | 0x0004)
/* = registru 4 din RTC */
#define regHOUR10
(RTC_ADR | 0x0005)
/* = registru 5 din RTC */
#define regDAY1
(RTC_ADR | 0x0006)
/* = registru 6 din RTC */
#define regDAY10
(RTC_ADR | 0x0007)
/* = registru 7 din RTC */
#define regMON1
(RTC_ADR | 0x0008)
/* = registru 8 din RTC */
#define regMON10
(RTC_ADR | 0x0009)
/* = registru 9 din RTC */
#define regYEAR1
(RTC_ADR | 0x000a)
/* = registru A din RTC */
#define regYEAR10
(RTC_ADR | 0x000b)
/* = registru B din RTC */
#define regWEEK
(RTC_ADR | 0x000c)
/* = registru C din RTC */
#define regD_RTC
(RTC_ADR | 0x000d)
/* = registru D din RTC */
#define regE_RTC
(RTC_ADR | 0x000e)
/* = registru E din RTC */
#define regF_RTC
(RTC_ADR | 0x000f)
/* = registru F din RTC */
extern
#define
#define
#define
#define
xdata char
RTC_DATE
RTC_TIME
RTC_WEEK
RTC_WEEK_STR
RTC_DATA[21];
RTC_DATA + 2
RTC_DATA + 11
RTC_DATA[20]
RTC_DATA
/* LCCD
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
=============================================================== */
LCD_ADR
0x0100
LCDRS
0x0001
LCDCMD
LCDadr
LCDDATA
LCDadr | LCDRS
LCDwcmd(c)
XBYTE[LCD_ADR + 0] = c
LCDwdta(d)
XBYTE[LCD_ADR + 1] = d
LCDrstate()
XBYTE[LCD_ADR + 2]
LCDrdta()
XBYTE[LCD_ADR + 3]
waitLCD()
while(LCDrstate() & 0x80)
LCD_SIZE
16
Bibliografie
***
***
***
***
***
***
***
***
***
***
***
***
***
***
***
***
***
***
***
***
***
with
on-chip
Microelectronica,
CAN,
Product
P.Buehring .a.
Application of the P8xC592 microcontroller with CANinterface, HKI/AN 91014, Hamburg, 1992.
H.C. Reuss