Sunteți pe pagina 1din 291

Vladimir Melnic

tefan Suceveanu

Aplicaii cu microcontrolere de uz general

CUPRINS
INTRODUCERE..................................................................................1
1.

FAMILIA DE MICROCONTROLERE 8XC552 ..................................5


U NITATEA CENTRAL I REGISTRELE SALE ................................. 6
a) Acumulatorul ................................................................ 8
b) Registrul B ................................................................... 8
c) Pointerul stivei .............................................................. 8
d) Registrul de stare .......................................................... 9
e) Registrul pointer la memoria de date ............................... 9
1.2.
R EGISTRELE SPECIALE SFR................................................ 9
1.3.
S ETUL DE INSTRUCIUNI ....................................................11
a) Transferul de date ........................................................12
b) Instruciuni aritmetice ...................................................13
c) Instruciuni logice ........................................................13
d) Controlul programului. ..................................................14
1.4.
P ORTURILE DE INTRARE - IEIRE .............................................15
1.5.
M ODULATORUL DE IMPULSURI N DURAT .................................17
1.6.
C ONVERTORUL ANALOG NUMERIC ...........................................18
1.7.
T IMERE /N UMRTOARE ......................................................19
1.7.1
Modul 0 .................................................................20
1.7.2
Modul 1 .................................................................20
1.7.3
Modul 2 .................................................................20
1.7.4
Modul 3 .................................................................21
1.8.
T IMERUL INIIALIZARE T3 ( WATCHDOG ) .................................24
1.9.
I NTERFAA SERIAL ASINCRON ............................................26
1.9.1
Interfaa serial SIO0 n modul 0 ..............................26
1.9.2
Interfaa serial SIO0 n modul 1 ..............................27
1.9.3
Interfaa serial SIO0 n modul 2 ..............................29
1.9.4
Interfaa serial SIO0 n modul 3 ..............................29
1.10.
I NTERFAA SERIAL SINCRON I 2 C ........................................30
1.10.1 Modul emisie circuit principal ....................................32
1.10.2 Modul recepie circuit principal..................................33
1.10.3 Modul recepie circuit secundar .................................34
1.10.4 Modul transmisie circuit secundar ..............................36
1.10.5 Alte stri ................................................................37
1.11.
S ISTEMUL DE NTRERUPERI ..................................................37
1.12.
C ONSUMUL REDUS DE ENERGIE .............................................39
1.12.1 Modul inactiv ..........................................................40
1.12.2 Modul oprit.............................................................40
1.1.

2.

FAMILIA DE MICROCONTROLERE 80C16X ................................41

2.1.

O RGANIZAREA MEMORIEI ....................................................44


2.1.1
Memoria ROM intern ..............................................45
2.1.2
Memoria RAM intern i zona registrelor speciale
(SFR).....................................................................45
a) Stiva sistem .................................................................46
b) Registrele de uz general (GPR).......................................46
c) Indicatorii pentru Interfaa pentru evenimente de la
periferice ....................................................................47
d) Registrele speciale (SFR) ...............................................47
e) Memoria extern ..........................................................52
2.2.
U NITATEA CENTRAL .........................................................52
2.2.1
Stiva de instruciuni.................................................54
a) Actualizarea indicatorului context ...................................55
b) Actualizarea indicatorului paginii de date .........................55
c) Actualizarea explicit a indicatorului stivei .......................55
d) Controlul ntreruperilor ..................................................55
e) Iniializarea porturilor de intrare-ieire ............................56
f)
Schimbarea configuraiei sistemului ................................56
2.2.2
Timpul de execuie al instruciunilor ..........................56
2.2.3
Registrele speciale ale unitii centrale.......................57
a) Registrul de configurare a sistemului (SYSCON)................57
b) Registrul de stare a procesorului (PSW)...........................58
c) Indicatorul de instruciuni (IP) i indicatorul segmentului
de program (CSP) .........................................................59
d) Indicatorii paginilor de date (DPP0, DPP1, DPP2 i DPP3) ..60
e) Indicatorul context (CP) ................................................61
f)
Indicatorii stiv sistem (SP), depire superioar stiv
(STKOV) i depire inferioar stiv (STKUN) ...................62
g) Registrele pentru nmulire/mprire (MDH, MDL i MDC) ..63
h) Registrele constante (ZEROS i ONES) ............................63
2.3.
I NTERFAA CU MAGISTRALA EXTERN (EBC) .............................63
2.3.1
Modurile de lucru ale magistralei externe ...................64
a) Magistral multiplexat .................................................64
b) Magistral demultiplexat ..............................................64
c) Comutarea ntre tipurile de magistral ............................65
d) Dimensiunea magistralei externe de date ........................66
e) Generarea segmentului de adrese...................................67
f)
Generarea semnalelor de selecie ...................................68
2.3.2
Caracteristici programabile ale magistralei ..................69
a) Controlul semnalului ALE ...............................................69
b) Stri de ateptare.........................................................69
c) Programarea intervalului de nalt impedan...................70
d) ntrzierea semnalelor RD i WR ....................................70

e) Controlul semnalului READY ...........................................71


2.3.3
Registrele speciale ale interfeei cu magistrala
extern ..................................................................71
a) Registrele pentru controlul magistralei (BUSCON04,
ADDRSEL14) .............................................................72
b) Registrul de control la iniializare (RP0H).........................73
2.3.4
Starea inactiv a interfeei cu magistrala extern ........73
2.3.5
Arbitrarea magistralei externe ...................................73
a) Cedarea magistralei ......................................................74
b) Preluarea magistralei ....................................................74
2.3.6
Interfaa cu magistrala X-BUS ...................................74
2.4.
S ISTEMUL DE NTRERUPERI I REGISTRELE PEC .........................75
2.4.1
Structura sistemului de ntreruperi.............................76
2.4.2
Funcionarea canalelor Controlerului pentru evenimente
de la periferice (PEC) ...............................................79
2.4.3
Prioritile sistemului de ntreruperi ...........................80
2.4.4
Salvarea strii programului pe durata ntreruperii ........81
2.4.5
Timpul de rspuns la ntrerupere ...............................82
2.4.6
ntreruperile externe ...............................................83
2.4.7
Excepii..................................................................85
a) Excepiile software .......................................................85
b) Excepiile hardware ......................................................85
2.5.
P ORTURILE DE INTRARE - IEIRE .............................................87
2.5.1
Portul P0 ................................................................88
Funciile alternative ale portului P0 .................................89
2.5.2
Portul P1 ................................................................89
Funciile alternative ale portului P1 .................................90
2.5.3
Portul P2 ................................................................91
Funciile alternative ale portului P2 .................................91
2.5.4
Portul P3 ................................................................92
Funciile alternative ale portului P3 .................................93
2.5.5
Portul P4 ................................................................94
Funciile alternative ale portului P4 .................................94
2.5.6
Portul P5 ................................................................95
Funciile alternative ale portului P5 .................................95
2.5.7
Portul P6 ................................................................95
Funciile alternative ale portului P6 .................................96
2.5.8
Portul P7 ................................................................96
Funciile alternative ale portului P7 .................................96
2.5.9
Portul P8 ................................................................97
Funciile alternative ale portului P8 .................................97
2.6.
M ODULATORUL DE IMPULSURI N DURAT .................................98
2.6.1
Moduri de operare ...................................................98

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

Modul rencrcare ....................................................... 119


2.9.2
Registrele captur i comparare .............................. 119
a) Modul captur ............................................................ 120
b) Modurile de comparare................................................ 120
Modul de comparare 0 ................................................ 120
Modul de comparare 1 ................................................ 121
Modul de comparare 2 ................................................ 121
Modul de comparare 3 ................................................ 121
Modul de comparare cu registru dublu .......................... 121
2.9.3
ntreruperile modulului CAPCOM.............................. 122
2.10.
T IMERUL DE INIIALIZARE WATCHDOG ................................ 122
2.11.
I NTERFAA SERIAL ASINCRON / SINCRON ............................. 123
2.11.1 Modul asincron ..................................................... 125
2.11.2 Modul sincron ....................................................... 126
2.11.3 Generarea ratei de transmisie ................................. 127
2.11.4 Controlul ntreruperilor........................................... 128
2.12.
I NTERFAA SERIAL SINCRON DE VITEZ .............................. 128
2.12.1 Operarea full-duplex .............................................. 131
2.12.2 Operarea half-duplex ............................................. 132
2.12.3 Viteza de transmisie .............................................. 133
2.12.4 Detectarea erorilor ................................................ 133
2.12.5 Controlul ntreruperilor SSC .................................... 134
2.13.
NCRCTORUL BOOTSTRAP ............................................... 134
2.13.1 Intrarea n modul BSL ............................................ 134
2.13.2 Procedura de lucru BSL .......................................... 135
2.14.
C ONSUMUL REDUS DE ENERGIE ........................................... 136
2.14.1 Modul inactiv ........................................................ 136
2.14.2 Modul oprit........................................................... 136
2.14.3 Starea pinilor de ieire pe parcursul modurilor
economice ............................................................ 137
2.15.
S ETUL DE INSTRUCIUNI .................................................. 137
Instruciuni aritmetice ................................................. 138
Instruciuni logice ...................................................... 138
Comparri i control bucle ........................................... 138
Instruciuni booleene bii............................................. 138
Instruciuni deplasare i rotire ..................................... 139
Instruciuni normalizare .............................................. 139
Instruciuni mutare date.............................................. 139
Instruciuni stiva sistem .............................................. 139
Instruciuni salt.......................................................... 139
Instruciuni apel subrutine ........................................... 139
Instruciuni rentoarcere subrutine ................................ 140
Instruciuni control sistem ........................................... 140

Instruciuni diverse..................................................... 140


3.

DEZVOLTAREA SISTEMELOR CU MICROCONTROLERE.............. 143


3.1.

3.2.

3.3.

3.4.

3.5.

3.6.
3.7.

S OFTWARE ................................................................... 143


3.1.1
Compilatorul C ...................................................... 144
Tipuri de date ............................................................ 145
Spaiul de memorie..................................................... 146
Modelul de memorie ................................................... 147
Pointeri ..................................................................... 147
Bancuri de registre i mascarea registrelor .................... 148
ntreruperi ................................................................ 149
Transmiterea parametrilor ........................................... 150
Fiiere de configurare ................................................. 151
3.1.2
Asamblorul ........................................................... 152
Operanzi i expresii .................................................... 152
Directive ................................................................... 154
Controlul asamblorului ................................................ 157
3.1.3
Editorul de legturi ................................................ 158
3.1.4
Programe utilitare ................................................. 160
Administratorul de biblioteci ........................................ 160
Convertorul fiiere obiect-hexazecimal .......................... 160
3.1.5
Depanatoare ......................................................... 161
3.1.6
Monitoare............................................................. 161
S ISTEME DE DEZVOLTARE .................................................. 162
3.2.1
Microcontrolerul 80C552......................................... 163
3.2.2
Microcontrolerul 80C167......................................... 165
A FIAREA INFORMAIILOR ................................................. 168
3.3.1
Afiarea pe tub catodic .......................................... 168
3.3.2
Afiarea pe display LCD.......................................... 172
T ASTATUR MATRICIAL ................................................... 177
3.4.1
Rutine pentru utilizarea tastaturii pe sistemele cu
80C552 ................................................................ 178
3.4.2
Rutine pentru utilizarea tastaturii i display-ului LCD
n sistemele cu 80C167 .......................................... 181
3.4.3
Funcii de citire i editare iruri de caractere ............ 185
E XTINDEREA CAPACITILOR ARITMETICE ............................... 190
3.5.1
Aritmetic BCD...................................................... 190
3.5.2
Creterea preciziei de reprezentare a numerelor n
virgul fix i virgul flotant.................................. 192
F ILTRE NUMERICE .......................................................... 198
C EAS DE TIMP REAL ........................................................ 205
Registrul de control D ................................................. 209
Registrul de control E ................................................. 210
Registrul de control F.................................................. 210

P ERIFERICE I 2 C............................................................. 216


3.8.1
Ceas de timp real .................................................. 216
Descrierea circuitului .................................................. 216
Ieire de ntrerupere INT............................................. 219
Oscilatorul ................................................................. 220
Iniializarea ............................................................... 220
Protocolul de legtur I2C ........................................... 221
3.8.2
Convertoare A/D i D/A .......................................... 221
Conversia D/A ............................................................ 223
Conversia A/D ............................................................ 223
Oscilatorul ................................................................. 223
3.8.3
Memorii E 2 ROM ..................................................... 223
Protecia la scriere...................................................... 224
Adresarea memoriei .................................................... 224
Operaia de scriere ..................................................... 225
Scrierea unui octet ..................................................... 225
Scrierea mai multor octei ........................................... 225
Scrierea paginat ....................................................... 225
Citirea din memorie .................................................... 226
Citirea de la adresa curent a unuia sau mai muli octei . 226
Citirea de la o adres oarecare a unuia sau mai muli
octei ........................................................................ 227
3.8.4
Extensii ieiri paralele ............................................ 228
3.8.5
Emularea unei interfee I2C .................................... 229
3.9.
T IMERE DE VITEZ MARE .................................................. 239
3.10.
S INTEZ DE FRECVEN ................................................... 242
3.11.
S ISTEME PENTRU CONTROLUL POZIIEI .................................. 245
3.8.

4.

ACCESORII PENTRU SISTEMELE CU MICROCONTROLERE ........ 249


S URSE DE ALIMENTARE .................................................... 249
4.1.1
Surse liniare ......................................................... 249
4.1.2
Surse n comutaie ................................................ 250
4.2.
I NTERFEE SERIALE ........................................................ 251
4.2.1
Detectarea automat a vitezei de transmisie seriale ... 251
4.2.2
Implementarea unei transmisii seriale cu pachete
CRC16 ................................................................. 254
4.2.3
Sistem de transmisie cu cureni purttori.................. 255
4.2.4
Interfaa CAN ....................................................... 256
a) Concepte de baz CAN ................................................ 257
b) Caracteristici generale................................................. 258
c) Tipuri de cadre .......................................................... 259
d) Prelucrarea erorilor..................................................... 262
e) Limitarea erorilor........................................................ 262
f)
Module CAN din microcontrolere ................................... 264
4.1.

Circuitul 80C592 ......................................................... 264


Registrul de control (CR) ............................................. 265
Registrul de comand (CMR) ........................................ 266
Registrul de stare (SR) ................................................ 268
Registrul de ntreruperi (IR)......................................... 268
Registrul cod de acceptare (ACR) ................................. 269
Registrul masc de acceptare (AMR) ............................. 269
Registrul 0 de sincronizare a magistralei (BTR0) ............. 269
Registrul 1 de sincronizare a magistralei (BTR1) ............. 270
Registrul de control a ieirii (OCR) ................................ 270
Bufferul de transmisie (DSCR1, DSCR0 i cmpurile
de date) .................................................................... 271
Bufferul de recepie (DSCR1, DSCR0 i cmpurile
de date) .................................................................... 272
Registrele speciale pentru interfaare cu unitatea
central .................................................................... 272
Conectarea microcontrolerului 8xC592 la magistrala CAN . 272
ANEXE .......................................................................................... 276
BIBLIOGRAFIE ............................................................................. 279

1 _________________________________________Aplicaii cu microcontrolere de uz general

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

algoritm, o metod de prelucrare a datelor stabilit de un operator uman,


precum i automatul capabil s execute instruciunile algoritmului.
Al doilea rzboi mondial a constituit un stimul puternic pentru
dezvoltarea tehnicii de calcul. n Statele Unite, Mark Aiken a realizat MARK 1,
un calculator format din 3304 comutatoare. Destinaia sa era, din pcate,
strict militar: tabele de tragere pentru artilerie. Dezvoltarea teoretic adus
de Turing, a permis unei echipe britanice realizarea unei maini automate
bazate pe comutatoare cu tuburi electronice, main folosit pentru
descifrarea mesajelor Enigma ale marinei militare germane. Din pcate,
realizarea practic a unei maini abstracte universale Turing a euat n anul
1946
Din punct de vedere istoric, primul calculator electronic universal din
lume poate fi considerat ENIAC. Acesta a fost realizat de Statele Unite,
coninea 17 468 tuburi electronice ocupnd o suprafa de 450 m 2 . Din punct
de vedere al puterii de calcul al calculatoarelor actuale, ENIAC era mai puin
performant dect un calculator de buzunar.
Un salt tehnologic extraordinar a fost realizat de Bell Laboratories prin
invenia tranzistorului, dispozitivul minune: mai rapid, mai mic i mai ieftin
dect tubul electronic. Progresele microelectronicii au permis realizarea, n
anul 1958, de ctre firma Texas Instrument, a primului circuit integrat, o
reuniune de tranzistoare, diode, rezistene i condensatoare. Avntul
tehnologic al microelectronicii, a fcut posibil realizarea primelor
calculatoare universale iniial cu tranzistoare (generaia a II-a), ulterior cu
circuite integrate (generaia a III-a).
n anul 1969 firma Intel a primit o comand de circuite integrate pentru
o structur necesar unui calculator. Structura nu prea a avut succes dar,
ideea de a crea un calculator cu programul modificabil prin intermediul unei
memorii externe, a permis ca n doi ani firma Intel s scoat pe pia primul
microprocesor, Intel 4004. Acest prim procesor avea o memorie volatil
(RAM) de 32 bii, o memorie nevolatil pentru programe (ROM) de 1024 bii,
un registru de deplasare de 10 bii, avnd un set de 16 instruciuni. i
urmtorul contract al firmei Intel necesar pentru realizarea unor terminale
finalizat cu microprocesorul Intel 8008 nu a avut, iniial, succesul scontat. O
politic de pia inteligent, realizat prin vnzarea de kituri compuse din
microprocesor, memorii externe i circuite de suport a avut ns un succes
deosebit: volumul livrrilor a atins 330 milioane dolari n 1979.
Pn la sfritul anului 1975, pe pia se gseau deja 40 de tipuri
diferite de microprocesoare. Situaia a dus la dezvoltarea unor circuite
periferice i de suport specifice pentru fiecare firm, multe dintre ele fiind
gndite chiar nainte de lansarea microprocesorului.
Integrarea n acelai integrat a circuitelor periferice a condus la
realizarea microcalculatorului pe o singur structur microcontrolerul,
Primul microcontroler, Intel 8048 (1971) avea urmtoarea structur: unitate

3 _________________________________________Aplicaii cu microcontrolere de uz general

central, memorii RAM i ROM, circuite de intrare-ieire. Nici acest circuit nu


a avut un mare succes. Abia n anul 1981, o dat cu noul model IBM PC,
microcontrolerul 8048 i-a dovedit versatilitatea, fiind folosit pentru controlul
tastaturii acestor tipuri de calculatoare.
Succesul deosebit al acestui microcontroler a condus la dezvoltarea
continu a acestor dispozitive: au nceput s fie integrate periferice pentru
comanda unor dispozitive de afiare, convertoare analog/numerice (ADC) i
numeric/analogice (DAC), numrtoare etc.
Astfel, unul din cele mai utilizate microcontrolere de 8 bii a fost Intel
8051, bazat pe o structur de 8048 la care se adugau i o interfa serial
asincron, dou numrtoare de 16 bii, avnd de asemenea, capabiliti
sporite pentru memorii.
Avnd exemplul firmei Intel, majoritatea celorlali productori au nceput
s produc circuite asemntoare, unele dintre ele fiind nevoite s cumpere
licena de producie. Astfel, n anul 1991 Philips a achiziionat licena, deja
anticului 8051, producnd seria de microcontrolere 8xC552. Acestea aveau un
nucleu 8051, la care se mai aduga un convertor analog/numeric cu 16
intrri, un numrtor suplimentar cu registre de captur i comparare, un
numrtor pentru iniializare (watchdog), dou ieiri de impulsuri modulate n
durat, o interfa serial sincron pentru standardul I 2 C. De asemenea,
8xC552 coninea o memorie RAM intern de 256 octei, 83C552 o memorie
PROM de 8 kB iar 87C552 o memorie EPROM de 8 kB.
Succesul procesoarelor de 8 bii i nevoia de cretere a capacitii de
calcul, a vitezei de lucru sau a mrimii memoriei, a impus dezvoltarea, de
ctre marele firme, a unor circuite, din ce n ce mai performante: n anul 1974
apare primul procesor de 16 bii PACE (Processing and Control Circuit), urmat
imediat de mai cunoscutele Intel 8086, Motorola 68000 sau Zilog Z8000.
Utilizarea acestor procesoare n microcalculatoarele dezvoltate de Apple sau
IBM au obligat la trecerea n faza urmtoare: microprocesoarele de 32 de bii
(familia Intel iAPX432 I 80x86 sau Motorola M 680x0).
Limitrile tehnologice au impus o limit n dezvoltarea unor alte
procesoare, preferndu-se o reorganizare a logicii procesului: n loc de a
dezvolta procesoare complexe, cu mii de instruciuni s-a simplificat la maxim
structura intern a circuitului, reducnd drastic setul de instruciuni. Avantajul
este evident: n locul unui procesor cu multe instruciuni (CISC - Complex
Instruction Set Computing) la care se consum mult timp pentru fiecare
instruciune, un procesor cu puine instruciuni (RISC Reduced Instruction
Set Computing) va executa extrem de rapid orice instruciune. Simplificarea
structurii interne prin micorarea decodificatorului de instruciuni, a permis
integrarea unor module noi, cum ar fi procesoarele de virgul mobil,
creterea vitezei de execuie i, nu n ultimul rnd, mrirea magistralelor
interne sau externe pn la 128 de bii. Realizri deosebite n domeniul
procesoarelor RISC constituie familiile SPARC (Sun Microsystems), PowerPC

Introducere _________________________________________________________________ 4

(Motorola), MIPS (Silicon Graphics), Alpha (fost Digital Equipment


Corporation, actualmente proprietatea Compaq) etc. Dominarea procesoarelor
RISC este contrazis de o singur excepie CISC notabil: familia Intel
Pentium.
Procesoarele RISC au permis realizarea unui mainframe impresionant:
calculatorul Cray 3D, realizat de firma Cray Research n anul 1991 are n
compunere 256 procesoare RISC de 64 bii, o frecven a ceasului de 300
MHz i un hard-disk de 430 TB (430 000 000 MB).
Controlerele au urmat ndeaproape evoluia procesoarelor: concomitent
cu circuitele pe 16 bii au aprut controlere similare (de exemplu Intel
80186); filozofia RISC a fost implementat i n universul controlerelor prin
circuitele Siemens 80C16x sau Motorola 68332.
n ncheiere, trebuie amintit de circuitele DSP (Digital Signal Processor) o
sintez a procesoarelor standard i a controlerelor. Aceste circuite, special
proiectate pentru prelucrarea semnalelor n timp real, beneficiaz de o unitate
de calcul n virgul fix i flotant extrem de performant, au integrate
circuitele principale de interfa (memorii, convertoare analog/numerice i
numeric/analogice ultrarapide, comunicaii seriale sincrone i asincrone,
numrtoare etc.), fiind capabile, de exemplu, s efectueze calculul pentru o
transformat Fourier rapid n 1024 de puncte n mai puin de 1 s.
Astfel, ultima creaie a firmei Advanced Micro Device, procesorul Athlon,
are un nucleu DSP care execut instruciuni specifice pentru: modem, Dolby
stereo, fiiere MP3 i software ADSL.

5 _________________________________________Aplicaii cu microcontrolere de uz general

1. Familia de microcontrolere 8xC552


Familia 8xC552 este reprezentat de o serie de circuite de 8 bii de nalt
performan destinate utilizrii n aplicaii n timp real, cum ar fi automatizri
industriale, controlul unor sisteme automate, aparate de msur i control
etc.
Aceast familie constituie o perfecionare a controlerului 8051, n sensul
adugrii de noi periferice, creterii vitezei de lucru sau a integrrii de
faciliti suplimentare. Setul de instruciuni al 8xC552 este compatibil cu cel al
lui 8051, n sensul c programele pentru 8051 pot rula i pe 8xC552.
Funcie de tipul memoriei ROM interne, cei trei membri ai familiei 8xC552
sunt:
87C552, cu memorie EPROM de 8 kB;
83C552, cu memorie PROM de 8 kB;
80C552, fr memorie ROM intern.
n lucrare se va folosi n continuare termenul generic 8xC552 pentru toi
membrii familiei, cu excepia indicat circuitele avnd structura i
instruciunile identice.
O modificare a familiei 8xC552 fa de modelul iniial 8051 const n
adugarea a dou moduri cu consum redus de energie selectabile prin
program:
inactiv (IDLE), care las n funciune numai componentele existente i n

8051 (numrtoarele 0 i 1, memoria RAM, interfaa serial asincron);


oprit (POWER-DOWN), care blocheaz oscilatorul circuitului, lsnd activ

numai memoria RAM.


Descrierea funcional a pinilor circuitului este prezentat n figura 1.1.
Controlerul 8xC552 conine:
unitate central de 8 bii;
256 octei de memorie RAM, suprapui cu 128 octei de memorie alocai
registrelor speciale;
controler de ntreruperi;
ase porturi de intrri/ieiri digitale;
dou timere/numrtoare de 16 bii;
un numrtor de 16 bii cu registre de captur i comparaie;
un timer pentru deblocarea sistemului (watchdog);
un convertor analog/numeric de 10 bii cu 8 intrri;
dou ieiri de impulsuri modulate n durat (utilizabile pentru convertoare
numeric/analogice);
dou interfee seriale (una asincron, compatibil RS-232, cealalt
sincron, compatibil I 2 C).
Structura intern a controlerului 8xC552 este prezentat n figuraFigura
1.2.

Familia de microcontrolere 80C16x ______________________________________________ 6


Funcii alternative

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

Figura 1.1. Microcontrolerul 8xC552

1.1. Unitatea central i registrele sale


Funciile de baz ale unitii centrale sunt: aducerea instruciunii din
memoria program i decodificarea ei, executarea operaiilor aritmetice i
logice, memorarea rezultatelor anterioare, controlul perifericelor etc.
Sincronizarea funcionrii unitii centrale i a ntregului sistem de
periferice este asigurat de un oscilator stabilizat cu un cristal de cuar sau
un rezonator ceramic. Controlerul poate lucra i cu oscilator extern, situaie n
care semnalul este aplicat la pinul XTAL1. Pentru reducerea consumului de
energie, un bit al registrului special PCON poate dezactiva oscilatorul
circuitului, blocnd funcionarea tuturor modulelor (modul POWER-DOWN);
totui, n acest mod este conservat coninutul memoriei RAM.

7 _________________________________________Aplicaii cu microcontrolere de uz general


T0 T1 INT0 INT1
PWM0 PWM1 STADC ADC0-7 SCA SCL
XTA L1
XTA L2
EA
A LE
PSE N
WR
RD
AD 0-7
A 8-15

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

T2 RT2 CMSR0-CMSR5 RST


CMT0,CMT1
Figura 1.2. Structura intern a microcontrolerului 83C552

EW

Un ciclu main al unitii centrale este format din 12 oscilaii complete,


mprite n 6 stri (S1-S6), fiecare stare fiind format din dou faze (P1 i
P2). Cele 12 oscilaii sunt astfel codificate de la S1P1 la S6P2. Cele mai
multe din instruciunile controlerului sunt executate ntr-un ciclu main (cu
un oscilator de 12 MHz, un ciclu main reprezint 1 s), o alt parte sunt
executate n dou cicluri main (2 s) iar nmulirea i mprirea n 4s.
Unitatea central are un contor program (PC) de 16 bii, cu capacitate de
adresare de 64 kB pentru memoria de program. Memoria de date, cu o
capacitate maxim tot de 64 kB, este adresabil n dou moduri, prin
intermediul unor registre interne: R0 sau R1, respectiv DPTR.
Unitatea central controleaz urmtoarele blocuri de memorie:
pn la 64 kB memorie program (ROM);
pn la 64 kB memorie date (RAM);
256 octei memorie RAM intern, suprapui cu 128 octei pentru registrele
speciale.
Selecia modulului de memorie program, intern sau extern, este
asigurat de semnalul EA: dac acesta are valoarea 1 LOGIC este selectat
memoria program intern (numai la 83C552); n cazul 0 LOGIC sunt aduse
instruciuni numai din memoria extern, de la 0000h la 1FFFh. De menionat
faptul c zona de memorie program de la 0000h la 0002h este rezervat
pentru adresa programului de iniializare, n timp ce locaiile de la 0003h la
0073h sunt folosite pentru adresele rutinelor de tratare a ntreruperilor.
Diferenierea tipului de memorie adresat (program sau date) este
asigurat de starea semnalului PSEN. Cu excepia acestuia, n situaia lucrului
cu memorie program extern, cnd magistrala de date i adrese este
multiplexat pe P0 i P2, separarea magistralei inferioare de adrese este
asigurat de semnalul ALE.

Familia de microcontrolere 80C16x ______________________________________________ 8

Memoria de date interne este mprit n trei seciuni: un bloc de 128


octei la adrese mici, un bloc de 128 octei la adrese mari i o zon de 128 de
octei destinat registrelor speciale.
Primul bloc de memorie (de la 00h la 07Fh) este adresabil direct sau
indirect. Zona de memorie de la 00h la 1Fh conine patru bancuri de registre,
fiecare format din 8 registre, de la R0 la R7; la un moment dat, poate fi
selectat un singur banc de registre prin intermediul a doi bii definii n
registrul special de stare (PSW). Urmtoarele 16 locaii, de la 20h la 2Fh,
conin 128 de bii adresabili direct. Aceast zon este folosit, de regul,
pentru operaii booleene sau pentru indicatoare de program. Zona de
memorie de la 30h la 7Fh este utilizabil pentru variabile.
Locaiile de la 80h la FFh sunt mprite ntre memoria de date i
registrele speciale iar adresarea lor poate fi indirect (pentru memoria date)
sau direct (pentru registrele speciale).
Controlerele din familia 8xC552 are posibilitatea s adreseze o memorie
de date externe cu o capacitate de pn la 64 kB. n acest scop sunt utilizate
semnalele PSEN (selectare memorie date sau program), ALE (magistrala de
adrese A0-A7 activ pe portul P0), RD i WR (citire, respectiv scriere date).
Cu excepia celor 256 de octei de memorie intern, unitatea central
mai dispune de cteva registre importante:
a) acumulatorul A;
b) registrul B;
c) pointerul stivei SP;
d) registrul de stare PSW;
e) registrului pointer la memoria de date DPTR.
a) Acumulatorul
Acest registru este direct adresabil i este referit mnemonic ca A. Este
adresabil la nivel de bit. Este registrul principal de lucru al unitii aritmetice
i logice (ALU). De asemenea, prin intermediul su se pot face schimburi de
date cu memoria extern, salturi relative la coninutul su etc.
b) Registrul B
Este un registru adresabil la nivel de bit. Este destinat ca registru
auxiliar pentru operaiile de nmulire i mprire dar poate fi folosit i ca
registru general.
c) Pointerul stivei
Acest registru de 8 bii este folosit pentru poziionarea stivei n memoria
intern. Mrimea stivei este de maxim 256 octei i este limitat de memoria
RAM intern disponibil.

9 _________________________________________Aplicaii cu microcontrolere de uz general

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

e) Registrul pointer la memoria de date


Registrul pointer la memoria de date (DPTR) este un registru de 16 bii
destinat lucrului cu memoria extern. Este format dintr-un octet inferior
(DPL), respectiv unul superior (DPH).
DPTR permite accesul indirect la memoria de date extern sau la
constante din memoria program. De asemenea, el poate fi utilizat ca un
registru de 16 bii sau ca dou registre de 8 bii independente.
Trebuie amintit c memoria de date extern poate transfera indirect un
octet n acumulator nu numai folosind adresa locaiei din DPTR (situaie n
care capacitatea de adresare este maxim 64 kB) dar poate fi adresat i pe
8 bii, prin intermediul registrelor R0 sau R1 (situaie n care capacitatea de
adresare este de 256 octei). Mrirea spaiului de adresare prin intermediul
R0 sau R1 se poate face utiliznd pentru adresarea memoriei externe bii din
porturile de intrare-ieire neutilizai n alte scopuri.

1.2. Registrele speciale SFR


Registrele speciale, poziionate n memoria intern de date n domeniul
80h-FFh, conin toate registrele sistemului, cu excepia contorului program
(PC) i a celor 8 bancuri de registre. SFR sunt destinate controlului modulelor
interne, strii controlerului, setrii modurilor economice de lucru etc. Cele 56
de registre speciale ale familiei 8xC552 sunt prezentate n tabelul 1.2
clasificate dup adres. Pentru o identificare mai rapid a registrelor, tabelul
1.3 le prezint clasificate dup funciuni.
Detaliile referitoare la seturile de registre speciale care controleaz
modulele interne ale familiei 8xC552 sunt prezentate n subcapitolele
destinate fiecrui modul.

Familia de microcontrolere 80C16x _____________________________________________ 10


Tabelul 1.2
Simbol
Descriere
Adres
Adres bit, funcie alternativ port
T3
Timer 3
FFh
PWMP
Prescaler PWM
FEh
PWM1
Registru PWM 1
FDh
PWM0
Registru PWM 0
FCh
PT2 PCM2 PCM1 PCM0 PCT3 PCT2 PCT1 PCT0
IP1
Registru prioriti 1
F8h
B
Registru B
F0h
RTE
Comutare/validare comp. T2 EFh TP47 TP46 RP45 RP44 RP43 RP42 RP41 RP40
STE
Setare registre comp. T2
EEh TG47 TG46 SP45 SP44 SP43 SP42 SP41 SP40
TMH2
Registru T2
EDh
TML2
Registru T2
ECh
CTCON Control captur T2
EBh CTN3 CTP3 CTN2 CTP2 CTN1 CTP1 CTN0 CTP0
TM2CON Registru control T2
EAh T2IS1 T2ISO T2ER T2B0 T2P1 T2P0 T2MS1 T2MS0
ET2 ECM2 ECM1 ECM0 ECT3 ECT2 ECT1 ECT0
IEN1
Validare ntreruperi 1
E8h
ACC
Acumulator
E0h
GC
S1ADR Registru adres slave I 2 C DBh
Adres slave
S1DAT Registru date I 2 C
DAh
SC4 SC3 SC2 SC1 SC0
0
0
0
S1STA Registru stare I 2 C
D9h

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

WLE GF1 GF0


PD
IDL
PCON
Registru control consum
87h SMOD
DPH
Registru pointer date
83h
DPL
Registru pointer dat
82h
SP
Indicator stiv
81h
P0
Port 0
80h P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0

O BSERVAIE : caracterele italice indic registre numai citire.

11 ________________________________________Aplicaii cu microcontrolere de uz general


Tabelul 1.3

Registre aritmetice

Timere/Numrtoare

Acumulator, registru B, registru stare program


Timer T0 (TL0 i TH0), timer T1 (TL1 i TH1),
(PSW)
registru mod T0 i T1 (TMOD), registru control
Porturi
T0 i T1 (TCON), timer T2 (TML2 i TMH2), timer
Port0 (P0), Port1 (P1), Port2 (P2), Port3 (P3),
T3, registru control T2 (TM2CON)
Port4 (P4), Port5 (P5)

Indicatori

Logic captur i comparare

Indicator stiv (SP), pointer date (DPH i DPL)

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)

1.3. Setul de instruciuni


Setul de instruciuni al familiei 8xC552 este o modernizare a
predecesorului su, 8051. Sunt introduse instruciuni suplimentare pentru
controlul modulelor nou adugate, precum i cteva instruciuni noi: scdere
cu mprumut, comparare, nmulire i mprire.
Instruciunile controlerului acioneaz la nivel de bit, 4 bii, 8 bii sau 16
bii. Fa de circuitul originar, 8051, modurile de adresare au fost
diversificate, existnd acum 5 tipuri:
a) adresare la registre;
b) adresare direct;
c) adresare indirect;
d) adresare imediat;
e) adresare cu registru de baz i index.
Adresarea registrelor permite accesul la cele opt registre R0-R7 selectate
de doi bii (RS0 i RS1) din registrul PSW. Accesul la locaiile respective de
memorie (00h-1Fh) se poate face ns i prin adresare direct, bancul de
registre situndu-se n zona 00h-7Fh care este adresabil n mod direct. n
zona registrelor speciale, registrele care controleaz modulele interne sunt de
asemenea adresabile direct.
n cadrul memoriei interne exist dou blocuri de 16 octei care sunt
adresabile direct la nivel de bit: 128 de bii pot fi adresai direct n zona
(20h-2Fh), ceilali 128 de bii gsindu-se la adresele 80h-FFh care sunt
divizibile cu opt.
Adresarea indirect este folosit pentru accesul zonei de memorie de la
80h la FFh care nu este adresat ca SFR, precum i pentru memoria extern
de date. Pentru memoria intern adresarea este fcut prin intermediul

Familia de microcontrolere 80C16x _____________________________________________ 12

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

Operaiunile de transfer de date sunt mprite n trei clase:


de uz general;
specifice acumulatorului;
adresare imediat pe 16 bii.
Transferul de date de uz general const n trei tipuri de operaii:
MOV
realizeaz transferul unui bit sau octet de la operandul surs la

PUSH

operandul destinaie. Combinnd operanzii i modurile de adresare


rezult 57 de instruciuni diferite.
incrementeaz registrul SP i apoi transfer octetul desemnat de
operandul surs n memoria adresat de SP.
transfer octetul desemnat n operandul surs de la locaia adresat

POP

de SP i apoi decrementeaz registrul SP.


Operaiile specifice acumulatorului sunt:
XCH
schimb operandul surs cu acumulatorul.
XCHD

schimb 4 bii ai operandul surs cu 4 bii ai acumulatorului.

MOVX

realizeaz transferul unui octet ntre memoria extern i acumulator.


Adresa extern este specificat de R0 i R1 sau DPTR.

MOVC

realizeaz

transferul

unui

octet

ntre

memoria

program

acumulator. Adresarea este cu registru de baz (PC sau DPTR) i index


(A).
Adresarea imediat pe 16 bii semnific ncrcarea registrului DPTR cu o
valoare pe doi octei.

13 ________________________________________Aplicaii cu microcontrolere de uz general

b)

Instruciuni aritmetice

Familia 8xC552 dispune de patru operaii aritmetice de baz. Indicatorul


depire (OV) poate fi folosit pentru operaii de adunare i scdere pentru
numere n cod BCD cu semn sau fr semn; de asemenea, pentru numerele
BCD exist o instruciune pentru corecia acumulatorului.
Cu excepia indicatorului OV mai exist nc trei indicatori care reflect
rezultatul operaiei:
C (transport) setat dac n urma operaiei rezult o depire a
acumulatorului;
AC (transport auxiliar) setat dac rezult un transport ntre biii 3 i 4 ai
acumulatorului;
P (paritate) setat dac suma modulo 2 a acumulatorului este 1.
Cele patru instruciuni aritmetice sunt:
Adunare:
 INC adun 1 la operandul surs. Rezultatul este returnat n operand.


ADD adun acumulatorul cu operandul surs. Rezultatul este returnat

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.


SUBB scade din acumulator operandul surs i bitul C. Rezultatul este

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

Arhitectura familiei 8xC552 care execut operaii logice poate fi


considerat un procesor boolean de sine stttor. Astfel acesta dispune de
instruciuni proprii, acumulator (bitul C din PSW), execut instruciuni pe un
bit, 4 bii sau un octet i poate adresa direct locaii de memorie sau porturile
de intrare-ieire.
Instruciunile logice sunt:
CLR
terge coninutul acumulatorului sau al altui registru adresat direct.
SETB

seteaz bitul C sau alt bit adresat direct.

Familia de microcontrolere 80C16x _____________________________________________ 14

CPL

complementeaz (n complement fa de 1) acumulatorul sau orice

RL

bit adresabil direct.


rotete la stnga coninutul acumulatorului. Este echivalent cu o

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

care devine egal cu ultimul bit deplasat.


rotete la dreapta coninutul acumulatorului prin intermediul bitului
C care devine egal cu ultimul bit deplasat.

SWAP

rotete la stnga de 4 ori coninutul acumulatorului. Este echivalent

ANL

cu o schimbare a biilor 0-3 cu 4-7.


execut o operaie I ntre doi operanzi. Rezultatul este returnat n

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

apeluri ntr-o pagin de memorie de 2 kB (locaia de salt este adresat


pe 11 bii).
LCALL memoreaz urmtoarea adres n stiv, incrementeaz SP cu 2
i apoi transfer controlul adresei de salt; LCALL poate fi utilizat pentru

apeluri ntr-o pagin de memorie de 64 kB.


AJMP execut un salt la adresa specificat; AJMP poate fi utilizat

pentru salturi ntr-o pagin de memorie de 2 kB (locaia de salt este


adresat pe 11 bii).
LJMP execut un salt la adresa specificat; LJMP poate fi utilizat

pentru apeluri ntr-o pagin de memorie de 64 kB.


SJMP execut un salt la adresa specificat; SJMP poate fi utilizat
pentru apeluri ntr-o pagin de memorie de 256 octei. SJMP este un
salt relativ fa de adresa de pornire n domeniul (-128+127).

15 ________________________________________Aplicaii cu microcontrolere de uz general

JMP

deplasament folosind valoarea din acumulator.


RET transfer controlul adresei de salt salvate n stiv de o

execut un salt relativ la coninutul registrului DPTR, ca

instruciune CALL anterioar i decrementeaz SP cu 2.


Salturi condiionate:
 JZ
execut salt dac acumulatorul este zero. Saltul este relativ


fa de adresa curent.
JNZ execut salt dac acumulatorul este diferit de zero. Saltul este

relativ fa de adresa curent.


JC
execut salt dac bitul C este 1. Saltul este relativ fa de

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

este diferit de zero.


Revenire din ntrerupere:
 RETI transfer controlul ntr-o manier asemntoare cu RET, cu
deosebirea c aceast instruciune valideaz ntreruperile pentru nivelul
curent de prioriti.

1.4. Porturile de intrare-ieire


Controlerul 80C552 are 6 porturi de 8 bii pentru intrri/ieiri digitale.
Fiecare port const ntr-un registru (registrele speciale P0-P5), un
amplificator tampon de intrare (buffer de intrare) i un buffer de ieire
(numai porturile P0 i P4). Porturile P0-P3 sunt identice cu cele ale lui 8051,
cu excepia funciilor adiionale ale portului P1 (liniile P1.6 i P1.7 pot fi
setate ca linii de comunicaie pentru interfaa serial sincron I 2 C; acest lucru
implic un buffer de ieire de tip dren n gol) i a porturilor suplimentare P4
i P5: portul P4 are o funcionalitate asemntoare cu a porturilor P0-P3;
portul P5 poate fi utilizat numai ca port de intrare.
Figura 1.3 arat structura funcional a porturilor de intrare-ieire a
circuitului 80C552. Un bit al registrului portului corespunde unui bit din
registrul special al portului i const ntr-un bistabil D.
Pentru porturile P0-P4 fiecare linie poate fi configurat ca linie de intrare
sau de ieire. n situaia configurrii ca linie de intrare, amplificatorul de
ieire trebuie blocat, blocare realizat prin setarea portului. Aceast

Familia de microcontrolere 80C16x _____________________________________________ 16

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

Setat de funcia alternativ


V DD

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

ters de funcia alternativ


Pin
P5.X

Figura 1.3. Porturile de intrare-ieire

Portul P0, n situaia controlerului 80C552, este folosit numai ca


magistral multiplexat de adrese (octetul inferior) i date.
Portul P2 poate fi utilizat ca octet superior pentru adresarea memoriei
externe pe 16 bii. Dac este folosit adresarea pe 8 bii, este implicat numai
portul P0 i atunci P2 devine port de uz general.
Portul P5 este port numai de intrare i poate utiliza liniile lsate libere de
convertorul analog-numeric.
Amplificatoarele de ieire ale porturilor P2, P3, P4 i P1.0-P1.5 sunt
capabile s conduc 4 intrri compatibile LSTTL. Folosit ca port de ieire, P0
are o capabilitate de 8 intrri LSTTL, dar necesit rezistene externe deoarece
ieirile sunt cu dren n gol.

17 ________________________________________Aplicaii cu microcontrolere de uz general

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

Semnale captur pentru timer


T2
Ieire timer T2
Reset extern timer T2
Ceas interfa serial I 2 C
Date interfa serial I 2 C
Intrare date UART
Ieire date UART
ntrerupere extern 0
ntrerupere extern 1
Intrare extern timer T0
Intrare extern timer T1
Scriere memorie extern
Citire memorie extern

ADC0
ADC1
ADC2
ADC3 Opt intrri analogice pentru
ADC4 convertorul analog numeric
ADC5
ADC5
ADC5

1.5. Modulatorul de impulsuri n durat


Familia 8xC552 conine dou modulatoare de impulsuri n durat,
codificate PWM0, respectiv PWM1. Impulsurile generate de aceste
modulatoare au controlate independent durata i perioada de repetiie.
Structura intern a modulatorului de impulsuri al circuitului 8xC552 este
prezentat n figura 1.4.
Magistral intern

PWM0
Comparator
1/2
f OSC

Prescaler

>>

PWM0

Numrtor
Comparator

>>

PWM1

PWM1

Figura 1.4. Modulatorul de impulsuri n durat

Frecvena de repetiie pentru ambele modulatoare este stabilit de un


prescaler care furnizeaz frecvena de ceas pentru numrtor. Coeficientul de
divizare al prescalerului este definit de registrul special PWMP.

Familia de microcontrolere 80C16x _____________________________________________ 18

Perioada de repetiie a modulatorului PWM este dat de relaia:


fOSC
fPWM =
2 (1 + PWMP ) 255
i, pentru un oscilator de 12 MHz semnific frecvene de repetiie de la 92 Hz
la 23.5 kHz.
Valoarea contorului numrtorul de 8 bii (ntre 0 i 254) este examinat
de dou comparatoare comandate de cte un registru special pentru fiecare
modulator: PWM0, respectiv PWM1.
Coeficientul de umplere stabilit de cele dou registre se determin cu
formula:
PWMx
coef . umplere =
255 PWMx
Aceast structur este capabil s asigure celor dou ieiri impulsuri cu
coeficieni de umplere ntre 0 i 1, n incremente de 1/255.

1.6. Convertorul analog numeric


Modulul analogic const ntr-un multiplexor analogic cu opt intrri, un
registru de aproximaii succesive de 10 bii, un comparator, un convertor
numeric/analogic i logica de comand a acestor blocuri. Tensiunea de
referin i alimentrile sunt asigurate din exterior, pe pini separai.
O conversie dureaz 50 de cicluri main iar semnalul analogic de intrare
trebuie s ndeplineasc condiia: 0 AV SS V REF Semnal V REF+ AV DD
+5V, unde AV SS i AV DD reprezint tensiunile de alimentare analogice iar V REF
tensiunile de referin.
Controlul convertorului analog/numeric este asigurat de registrul special
ADCON, prezentat n tabelul 1.5.
Structura funcional a modulului analogic este prezentat n figura 1.5.
P5

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

Figura 1.5. Convertorul analog/numeric

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.

19 ________________________________________Aplicaii cu microcontrolere de uz general


Tabelul 1.5
ADC.1
ADC.0 ADEX
ADCI
ADCS AADR2 AADR1 AADR0
ADCON (C5h)
ADC.1 Bitul 1 al rezultatului conversiei
ADC.0 Bitul 0 al rezultatului conversiei
ADEX
Validare conversie extern (pin ADCS):
0: conversia este iniializat numai prin program (bitul ADCS)
1: conversia este iniializat prin program sau hardware.
ADCI
Indicator ntrerupere ADC:
- dac este setat, rezultatul conversiei poate fi citit;
- dac este validat, sfritul conversiei poate genera o ntrerupere;
- ct timp este setat nu se poate declana o alt conversie.
Acest bit este numai citire.
ADCS
Starea
convertorului ADCI ADCS Stare convertor
ADC. Poate fi setat prin 0
0 se poate iniia conversie; ADC neocupat.
program sau hardware 0
1 nu poate fi iniiat o nou conversie.
(semnalul
STADC). 1
0 nu poate fi iniiat o alt conversie.
1
1 rezervat
Semnificaia sa este:
AADR2 Comanda multiplexorului analogic. AADR2 AADR1 AADR0 Intrare analogic
AADR1 Selectarea intrrilor portului P5
ADC.0 (P5.0)
0
0
0
AADR0 este:
ADC.1 (P5.1)
0
0
1
ADC.2 (P5.2)
0
1
0
ADC.3 (P5.3)
0
1
1
ADC.4 (P5.4)
1
0
0
ADC.5 (P5.5)
1
0
1
ADC.6 (P5.6)
1
1
0
ADC.7 (P5.7)
1
1
1

Valoarea numeric a tensiunii analogice convertite este dat de relaia:

VADC = 1024

VIN VREF
VREF+ VREF

Este recomandabil ca toate tensiunile analogice (AV SS , AV DD i AV REF ) s


fie asigurate de o surs de alimentare separat.

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.

Familia de microcontrolere 80C16x _____________________________________________ 20

Selectarea modului de lucru i controlul timerelor T0 i T1 sunt asigurate


de registrele speciale TMOD, respectiv TCON descrise n tabelul 1.6.
Tabelul 1.6
Timer 1
Timer 0
TMOD (89h)
GATE
M1
M0
GATE
M1
M0
C/T
C/T
Dac este setat, timerul x funcioneaz dac pinul INTx este la 1 logic i bitul
GATE
TRx (din registrul TCON) este setat. Dac este ters, timerul este condiionat
numai de starea bitului TR.
Dac este setat, modulul funcioneaz ca numrtor (numr tranziiile 10 ale
C/T
pinului Tn). Dac este ters funcioneaz ca timer, numrnd ciclurile main.
M1
M0 Mod
Descriere
0
0
0 Numrtor de 8 bii cu prescaler divizor cu 32
M1, M0
Selecie mod:
0
1
1 Numrtor de 16 bii
1
0
2 Numrtor de 8 bii cu rencrcare automat
1
1
3 T0: numrtor de 8 bii; T1: oprit.
TCON (88h)
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
Indicator depire timer Tx. El este setat n momentul depirii i este ters
TFx
automat n momentul n care unitatea central d controlul rutinei de
ntrerupere.
Comand funcionarea timerului Tx. Dac este setat sau ters, timerul
TRx
funcioneaz, respectiv este oprit.
Indicator pentru frontul ntreruperii externe. Dac ITx este setat, o tranziie
IEx
10 a intrrii INTx va seta acest bit. Bitul este ters automat n momentul n
care unitatea central d controlul rutinei de ntrerupere.
Stabilete dac ntreruperea extern acioneaz pe front sau pe nivel. Dac
este setat, ntreruperea extern este activ pe frontul descresctor al
ITx
semnalului de pe pinul INTx; dac este ters, ntreruperea extern este activ
pe nivelul zero logic al pinului INTx.

Semnificaia celor patru moduri de funcionare este prezentat n


paragrafele urmtoare.
1.7.1
Modul 0
n acest mod timerele T0 sau T1, sunt configurate ca registre de 13 bii.
n momentul n care valoarea numrtorului x trece de la 1FFFh la 0h este
setat automat bitul TFx. Intrarea n numrtor este validat dac bitul TRx
este setat iar bitul GATE i intrarea INTx respect condiiile descrise anterior.
Registrul de 13 bii este format din 8 bii ai registrului THx i 5 bii ai
registrului TLx. Cei 3 bii mai semnificativi ai lui TLx sunt nedeterminai i
trebuie ignorai.
1.7.2
Modul 1
Este identic cu modul 0, numai c registrul de numrare este de 16 bii.
1.7.3
Modul 2
Acest mod configureaz timerele T0 sau T1 ca dou numrtoare de 8
bii, avnd facilitatea de rencrcare: n momentul n care TLx trece de la FFh
la 0h, nu se seteaz numai bitul TFx, dar TLx este ncrcat cu valoarea lui
THx. THx rmne nemodificat.

21 ________________________________________Aplicaii cu microcontrolere de uz general

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

Figura 1.6. Modurile de lucru al timerelor T0 i T1

ntreruperile generate de timerele T0 i T1 sunt gestionate de biii ET0,


respectiv ET1 aflate n registrul special pentru controlul ntreruperilor
(IEN0.1, respectiv IEN0.3).
Timerul T2 este un numrtor de 16 bii conectat la patru registre de
captur de 16 bii i trei registre de comparare de 16 bii. Registrele de
captur sunt folosite pentru a nregistra coninutul registrului timerului T2 n
momentul n care survine o tranziie pe pinul corespunztor (CT0I, CT1I,
CT2I i CT3I). Registrele de comparare sunt folosite pentru a seta, terge
sau comuta biii corespunztori din portul P4 atunci cnd coninutul
registrului T2 este atinge valorile din cele trei registre.
Timerul T2 este format din dou registre de 8 bii TMH2 (octetul mai
semnificativ), respectiv TML2 (octetul mai puin semnificativ).

Familia de microcontrolere 80C16x _____________________________________________ 22

Frecvena de numrare poate fi furnizat de oscilatorul intern (divizat cu


12) sau de la o surs extern (un front cresctor pe pinul T2 P1.4), ulterior
aceste frecvene fiind divizate ntr-un prescaler programabil cu 1, 2, 4 sau 8.
n situaia folosirii timerului T2 ca numrtor, frecvena maxim de lucru
este dubl fa de timerele T0 i T1, respectiv de 1MHz.
Valoarea timerului poate fi citit fr ca acesta s fie oprit dar, acesta
neavnd registre suplimentare de citire, trebuie luate msuri de precauie n
situaia apariiei unei depiri a registrului chiar n timpul citirii.
Registrul timerului T2 nu poate fi scris ci numai ters prin intermediul
unor semnale externe: RST sau un front cresctor pe pinul RT2 (validarea
tergerii pe pinul RT2 este produs prin setarea bitului T2ERTM2CON.5).
Pot fi generate cereri de ntreruperi pentru depiri ale registrului TM2,
att la nivel de 8 bii (depirea registrului TML2), ct i la 16 bii (depirea
registrului TMH2); n ambele situaii, vectorul de ntrerupere este acelai. n
situaia depirii registrului TML2 este setat indicatorul TLBO (din registrul
special TM2CON) iar cnd se produce depirea registrului TMH2 sunt setai
indicatorii T2OV i TLBO. Pentru validarea ntreruperii generate de TMH2 este
necesar setarea biilor ET2 (IEN1.7) i T2IS0 (TM2CON.4). Validarea
ntreruperii produse de TMH2 este fcut prin setarea biilor ET2 (IEN1.7) i
T2IS1

(TM2CON.7).

Indicatorii

setai

de

depire

trebuie

teri

prin

programul de tratare a ntreruperii.


Timerul T2 are n structur patru registre de captur: CT0, CT1, CT2 i
CT3. Aceste registre de 16 bii sunt ncrcate funcie de semnalele externe
CT0I, CT1I, CT2I i CT3I. Funcie de starea registrului special TM2IR, o
dat cu aplicarea semnalelor CTxI se genereaz i o ntrerupere. Coninutul
registrului de control al capturii CTCON ofer posibilitatea selectrii modului
de aciune al semnalelor CTxI: pe front cresctor, pe front descresctor sau
pe ambele tipuri de fronturi.
Timerul TM2 mai conine i trei registre de comparare CM0, CM1 i CM2.
Coninutul acestor registre este verificat la fiecare incrementare a
numrtorului T2. Atunci cnd unul din registrele CMx are aceeai valoare cu
registrul TM2, este setat bitul corespunztor din registrul special TM2IR.
Suplimentar, registrele de comparare mai pot comanda i biii portului P4
funcie de registrele speciale STE i RTE. Astfel, CM0 poate seta biii 0-5 ai
P4 dac sunt setai biii corespunztori din registrul STE; CM1 terge biii 0-5
ai P4 dac sunt setai biii corespunztori din registrul RTE; biii 6 i 7 ai P4
sunt inversai de CM2 dac este setat corespunztor registrul RTE.
Structura intern a timerului T2 i a registrelor de captur i comparare
este prezentat n figura 1.7.

23 ________________________________________Aplicaii cu microcontrolere de uz general

Timerul T2 poate genera nou ntreruperi. Opt indicatoare de ntreruperi


se gsesc n registrul TM2IR iar al noulea este bitul TM2CON.4. Prioritile
ntreruperilor generate de TM2 sunt controlate de registrul IP1.
CT0I Int CT1I
CTI0

CTI1

CT0
=
CM0(s)
Stop
f OSC M12
T2
RT2
T2ER

Int CT2I Int


CTI2

CT1
Int

=
CM1(r)

CT3I Int
CTI3

CT2
Int

CT3
Int

CM2(k)
Int

Prescaler

Int

TML2 TMH2

Figura 1.7. Timerul T2

n concluzie, registrele speciale folosite de timerul T2 sunt TM2CON,


CTCON, STE, RTE, TM2IR, IEN1 i IP1. Coninutul acestora la nivel de bit
este prezentat n tabelul 1.7.
Tabelul 1.7
T2IS1 T2IS0
T2ER
T2BO
T2P1
T2P0
T2MS1 T2MS0
TM2CON (EAh)
Selectare ntrerupere depire 16 bii.
T2IS1
T2IS0
Selectare ntrerupere depire 8 bii.
T2ER
Validare resetare extern; T2 poate fi ters de un front cresctor pe pinul RT2 (P1.5).
T2BO
Indicator ntrerupere depire 8 bii.
M1
0
0
T2P1
M2
0
1
Selectare valoare prescaler.
T2P0
1
0
M4
1
1
M8
Oprit
0
0
T2MS1
Mod timer (fOSC/12)
0
1
Selectare mod de lucru.
T2MS0
Rezervat
1
0
Mod numrtor (pin T2)
1
1
CTN3
CTP3
CTN2
CTP2
CTN1
CTP1
CTN0
CTP0
CTCON (EBh)
Registrul captur 3 comandat de front cztor pe pinul CT3I
CTN3
CTP3
Registrul captur 3 comandat de front cresctor pe pinul CT3I
CTN2
Registrul captur 2 comandat de front cztor pe pinul CT2I
CTP2
Registrul captur 2 comandat de front cresctor pe pinul CT2I
CTN1
Registrul captur 1 comandat de front cztor pe pinul CT1I
CTP1
Registrul captur 1 comandat de front cresctor pe pinul CT1I
CTN0
Registrul captur 0 comandat de front cztor pe pinul CT0I
CTP0
Registrul captur 0 comandat de front cresctor pe pinul CT0I
TG47
TG46
SP45
SP44
SP43
SP42
SP41
SP40
STE (EEh)

Familia de microcontrolere 80C16x _____________________________________________ 24


Dac sunt setai, la comutarea comparatorului CM2, biii corespunztori din P4 sunt setai.
Dac sunt teri, la comutarea comparatorului CM2, biii corespunztori din P4 sunt teri.
Dac este setat, P4.5 va deveni 1 logic cnd CM0=TM2.
Dac este setat, P4.4 va deveni 1 logic cnd CM0=TM2.
Dac este setat, P4.3 va deveni 1 logic cnd CM0=TM2.
Dac este setat, P4.2 va deveni 1 logic cnd CM0=TM2.
Dac este setat, P4.1 va deveni 1 logic cnd CM0=TM2.
Dac este setat, P4.0 va deveni 1 logic cnd CM0=TM2.
TP47
TP46
RP45
RP44
RP43
RP42
RP41
RP40
RTE (EFh)
TP47
Dac sunt setai, la comutarea comparatorului CM2, bitul din portul P4 este inversat.
TP46
Dac este setat, P4.5 va deveni 0 logic cnd CM1=TM2.
RP45
Dac este setat, P4.4 va deveni 0 logic cnd CM1=TM2.
RP44
Dac este setat, P4.3 va deveni 0 logic cnd CM1=TM2.
RP43
Dac
este setat, P4.2 va deveni 0 logic cnd CM1=TM2.
RP42
Dac este setat, P4.1 va deveni 0 logic cnd CM1=TM2.
RP41
RP40
Dac este setat, P4.0 va deveni 0 logic cnd CM1=TM2.
T2OV
CMI2
CMI1
CMI0
CTI3
CTI2
CTI1
CTI0
TM2IR (C8h)
T2OV
Indicator ntrerupere CM2.
CMI2
Indicator ntrerupere CM1.
CMI1
Indicator ntrerupere CM0.
CMI0
Indicator ntrerupere CT3.
CTI3
Indicator ntrerupere CT2.
CTI2
Indicator ntrerupere CT1.
CTI1
CTI0
Indicator ntrerupere CT0.
ET2
ECM2
ECM1
ECM0
ECT3
ECT2
ECT1
ECT0
IEN1 (E8h)
ET2
Validare ntrerupere CM2.
ECM2
Validare ntrerupere CM1.
ECM1
Validare ntrerupere CM0.
ECM0
Validare ntrerupere CT3.
ECT3
Validare ntrerupere CT2.
ECT2
Validare ntrerupere CT1.
ECT1
ECT0
Validare ntrerupere CT0.
PT2
PCM2
PCM1
PCM0
PCT3
PCT2
PCT1
PCT0
IP1 (F8h)
Nivel prioritate depire numrare.
PT2
Nivel prioritate CM2.
PCM2
Nivel prioritate CM1.
PCM1
PCM0
Nivel prioritate CM0.
PCT3
Nivel prioritate CT3.
PCT2
Nivel prioritate CT2.
PCT1
Nivel prioritate CT1.
PCT0
Nivel prioritate CT0.
Dac bitul este setat se selecteaz nivelul superior de prioritate.
TG47
TG46
SP45
SP44
SP43
SP42
SP41
SP40

1.8. Timerul iniializare T3 (watchdog)


Acest timer este destinat iniializrii periodice a controlerului n situaia
existenei unei erori de program (bucl infinit) sau apariiei unor perturbaii
externe care pot comanda aleator procesorul. Dac este validat, timerul T3
genereaz resetul sistemului dac programul nu reiniializeaz periodic
coninutul acestui timer.
Timerul T3 const ntr-un numrtor de 8 bii i un divizor de 11 bii;
prescalerul divizeaz o frecven de 1 MHz (n situaia utilizrii unui oscilator
de 12 MHz).

25 ________________________________________Aplicaii cu microcontrolere de uz general

Dac numrtorul de 8 bii are o tranziie FFh0h, este produs un


impuls care reseteaz controlerul. De asemenea, prin intermediul unui buffer,
semnalul este scos i pe pinul RST unde poate fi utilizat pentru iniializarea
circuitelor de suport. Deoarece este un impuls scurt (circa 3 s), existena
unei capaciti n circuitul extern de reset face semnalul produs de controler
inutilizabil.
Perioada de repetiie a timerului T3 este dictat de valoarea cu care este
rencrcat: perioada minim este de 2 ms, dac timerul este ncrcat cu FFh;
perioada maxim de repetiie este de 512 ms i corespunde unei valori de
rencrcare de 0h. Relaia pentru determinarea perioadei de repetiie este:
24576 (T3 + 1)
[s]
TR =
f OSC
Pentru iniializarea automat a programului, este necesar mai nti,
determinarea timpului de execuie al programului, dup care timerul T3 este
programat cu o valoare acoperitoare. Dac timpul de execuie este mai mare
de 512 ms, este necesar partiionarea programului n mai multe module,
fiecare modul asigurnd o reprogramare a timerului T3.
Pentru a preveni erori de program la rencrcarea sa, timerul T3 este
programat n doi pai: mai nti, este setat bitul WLE (PCON.4), apoi T3 poate
fi ncrcat cu valoarea dorit. Dup ncrcare, WLE este ters automat.
Suplimentar, modulul de iniializare este condiionat i de semnalul
extern EW. Cnd EW are valoarea 0 logic, funcionarea timerului T3 nu se
poate dezactiva prin program.
Schema bloc a modului timer T3 este indicat n figura 1.8.
Bus intern

f OSC /12

Divizor
11 bii
tergere

Timer T3
ncrcare

Bufer

RST

Reset
Scriere
tergere
WLE

Oprit
PCON
ncrcare

EW

Figura 1.8. Timerul T3

n modurile de funcionare cu consum redus de energie, IDLE i


POWER-DOWN, funcionarea timerului T3 poate pune probleme. Astfel, dac n
modul IDLE timerul este funcional, n modul POWER-DOWN funcionarea
timerului este contradictorie cu modul de lucru ales. Pentru a preveni acest
lucru, semnalul extern EW nu las funcionale simultan cele dou module.

Familia de microcontrolere 80C16x _____________________________________________ 26

Bitul de control al timerului T3, WLE, va fi prezentat la paragraful 1.12.1.


unde este descris registrul special PCON.

1.9. Interfaa serial asincron


Aceast interfa serial, cunoscut i sub numele de SIO0, poate
transmite i recepiona date simultan, adic este o interfa full duplex. De
asemenea, registrul de recepie este bufferat: modulul poate iniia o recepie
a unui nou octet chiar dac octetul anterior nu a fost citit din registrul de
recepie. Suplimentar fa de interfaa serial a circuitelor 8051 are cteva
faciliti suplimentare:
protecia la erori de ncadrare (framing error) prin intermediul bitului de
stop;
protecia la erori de paritate, fiind posibil transmisia bitului de paritate;
are un mod de lucru destinat comunicaiei multiprocesor.
Interfaa serial asincron poate opera n patru moduri.
a) modul 0;
b) modul 1;
c) modul 2;
d) modul 3.
Controlul interfeei seriale este fcut de registrul special S0CON, cu
structura prezentat n tabelul 1.8.
S0CON (98H)

SM0

SM1

SM2

SM0 SM1 Mod


SM0
SM1

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.

27 ________________________________________Aplicaii cu microcontrolere de uz general

Transmisia este iniiat de orice instruciune care scrie n registrul


special S0BUF, activnd semnalul SEND (emisie). Acest semnal seteaz pinul
RXD s funcioneze ca ieire a registrului de deplasare i, de asemenea,
determin ca pinul TXD s funcioneze ca ieire a semnalului de ceas.
Semnalul de ceas are o perioad egal cu ciclul main, fiind 1 logic n strile
S6, S1 i S2, respectiv 0 logic n strile S3-S5. Dup transmiterea ultimului
bit, semnalul SEND este dezactivat i indicatorul TI este setat.
Recepia este demarat de tergerea bitului RI, tergere condiionat de
setarea bitului REN. Registrul de control al recepiei este ncrcat cu valoarea
1 1111 1110 i activeaz semnalul RECEIVE (recepie). Ct timp acest semnal
este activ, valoarea portului P3.0 (RXD) este ncrcat i deplasat la stnga
o dat la fiecare ciclu main. n momentul n care valoarea zero, ncrcat
iniial n poziia celui mai puin semnificativ bit, ajunge pe poziia celui mai
semnificativ bit se semnaleaz registrului de control al recepiei s realizeze o
ultim deplasare i ncarc registrul S0BUF. n urmtorul ciclu main
semnalul RECEIVE este dezactivat i indicatorul RI este setat.
Modul 0 este folosit, de regul, pentru interfaarea cu registre externe
de deplasare TTL sau CMOS pentru extinderea numrului de porturi de
intrare-ieire.
1.9.2
Interfaa serial SIO0 n modul 1
Procedura de lucru n acest mod permite transmiterearecepionarea a
10 bii (un bit de start, 8 bii date, un bit de stop) cu o vitez de transmisie
variabil, determinat de frecvena depirilor date de timerul T1.
Structura intern simplificat a interfeei seriale n modul 1 este
prezentat n figura 1.9.

Familia de microcontrolere 80C16x _____________________________________________ 28


Magistral intern
TB8
Scriere S0BUF
D S Q
CL
Mod1 Mod2 Mod3
T1 1/2f os c T1

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

Figura 1.9. Interfaa serial SIO0 (modurile 1, 2 i 3)

Transmisia este iniiat de orice instruciune care scrie n registrul


special S0BUF. Adresarea S0BUF seteaz bitul 9 al registrului de serializare al
transmisiei, ntiineaz unitatea de control c este solicitat o transmisie i
activeaz semnalul SEND (emisie). Transmisia ncepe n urmtorul ciclu
main dar este sincronizat cu depirile date de timerul T1.
Semnalul SEND transmite un bit la ieirea TXD (bitul de start), urmat de
cei 8 bii de date. n momentul n care al noulea bit (bitul setat iniial) din
registrul de deplasare ajunge la extremitatea dreapt a registrului, este
semnalat unitii de control a emisiei c mai este de emis un bit (bitul de
stop), se dezactiveaz semnalul SEND i este setat indicatorul TI.
Recepia este declanat de o tranziie 10 a semnalului de pe pinul
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. Deoarece tactul de
deplasare provenit din timerul T1 este divizat cu 16, starea pinului RXD la
impulsurile de tact cu numerele 7, 8 i 9 determin ce valoare va avea bitul
recepionat: detectorul de bii ia o decizie prin majoritate, valoarea acceptat
fiind gsit n cel puin dou din cele trei stri 7, 8 i 9. Dac decizia
majoritar n situaia primului bit nu este 0, blocul de control deduce c a fost
un fals impuls de start i interfaa este resetat.
Cnd bitul de start, deplasat succesiv, ajunge n registrul de deplasare
pe poziia limit stnga (al noulea bit), se semnaleaz blocului de control al

29 ________________________________________Aplicaii cu microcontrolere de uz general

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.

Familia de microcontrolere 80C16x _____________________________________________ 30

Structura intern este asemntoare cu cea din figura 1.9; diferena


este dat de existena unei surse suplimentare pentru generarea vitezei de
transmisie.
Cu excepia ratei de transmisie, aici determinat de depirile timerului
T1, funcionarea interfeei este identic cu modul 2.
Vitezele de transmisie utilizate curent sunt prezentate n tabelul 1.9.
Tabelul 1.9
Mod
SIO0
0
2

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

Viteza de transmisie pentru modurile 1 i 3 se poate calcula cu


urmtoarea relaie:
rat T1
rata transmisie =
(256 TH1) (32 SMOD 16 )
Setarea timerului T1 trebuie fcut funcie de urmtoarele condiii:

TCON.6=1 pentru validarea funcionrii timerului T1;

TMOD.5=1 i TMOD.4=0 pentru timer T1 n mod 2 (timer de 8 bii cu


rencrcare automat), respectiv TMOD.5=0 i TMOD.4=1 pentru timer T1

n mod 1 (timer de 16 bii folosit pentru viteze mici de transmisie);


TMOD.6=0 pentru a funciona cu divizarea frecvenei oscilatorului intern
sau TMOD.6=1 pentru a diviza o frecven extern;

IEN0.3=0 pentru dezactivarea ntreruperilor timerului T1. Dac T1 este n


modul 1 (timer de 16 bii) este necesar validarea ntreruperii, scopul fiind
rencrcarea registrului TM2.

1.10. Interfaa serial sincron I 2 C


Magistrala I 2 C, realizat de Philips, permite schimbarea de date ntre
unul sau mai multe dispozitive principale (master) i un numr de dispozitive
subordonate (slave), conectate pe dou linii, SDA (date) i SCL (ceas).
Facilitile principale ale magistralei I 2 C sunt:
transfer de date bidirecional ntre master i slave;
arbitrarea coliziunilor de date;
sincronizarea oferit de semnalul SCL permite comunicarea ntre periferice
cu diferite viteze de transmisie;

31 ________________________________________Aplicaii cu microcontrolere de uz general

semnalul SCL poate fi folosit i pentru controlul transmisiei ntre

periferice, n sensul suspendrii sau relurii transferului de date n orice


moment.
Modulul serial sincron al familiei 8xC552 respect specificaiile
magistralei I 2 C, precum i toate modurile de transfer (mai puin modul de
transfer cu vitez mic). Legturile spre exterior ale interfeei sincrone SIO1
sunt pinii SCL (P1.6) i SDA (P1.7); pentru validarea interfeei este
obligatorie setarea celor doi pini ai portului P1.
O configuraie tipic de magistral I 2 C este prezentat n figura 1.10.
V DD
SDA

Bus I 2 C

SCL
SDA SCL
8XC552

Periferic
I2C

Figura 1.10. Configuraia interfeei I 2 C

Interfaa SIO1 poate lucra n patru moduri: emisie circuit principal,


recepie circuit principal, emisie circuit secundar sau recepie circuit secundar.
Registrele speciale responsabile de funcionarea interfeei SIO1 sunt:
S1CON, S1ADR, S1DAT i S1STA. Structura lor este prezentat n tabelul
1.10.
Tabelul 1.10
ENSI
STA
STO
SI
AA
CR1
CR0
S1CON (D8h)
CR2 CR1 CR0 fOSC=6 MHz fOSC=12 MHz
Divizare fOSC
256
0
0
0
23 kHz
47 kHz
224
0
0
1
27 kHz
54 kHz
CR2
192
0
1
0
31 kHz
63 kHz
Selectarea vitezei de
CR1
160
0
1
1
37 kHz
75 kHz
transmisie
CR0
960
1
0
0
6.25 kHz
12.5 kHz
120
1
0
1
50 kHz
100 kHz
60
1
1
0
100 kHz
200 kHz
1
1
1
(0.2562.5) (0.2562.5) 96(256-valoare T1)
ENSI
Dac este ters, SDA i SCL sunt n nalt impedan i orice semnale sunt ignorate.
Dac bitul este ters nu va fi generat condiia de START sau START repetat (START R).
Dac este setat, SIO1 care intr n mod master verific magistrala I2C i dac aceasta este
STA
liber genereaz o condiie START. Dac SIO1 este deja n mod master, SIO1 transmite o
condiie START R. Bitul poate fi setat n orice moment, chiar dac SIO1 este slave.
Indicator de stop. Dac bitul este ters, nu va fi generat o condiie STOP. Dac bitul este
setat i SIO1 este n mod master, n momentul n care va fi detectat pe magistral, circuitul
STO
va terge indicatorul STOP. Dac SIO1 este n mod slave, se va trimite numai o condiie STOP
intern. Oricum, dac SIO1 se comport ca i cum ar fi recepionat o condiie STOP comut
n regimul inexisten adres slave i indicatorul este ters automat.
Indicator ntrerupere. Dac este ters, nu vor fi generate ntreruperi ale SIO1. Dac este setat
SI
concomitent cu bitul EA i ESI1 (din registrul IEN0), va fi generat o ntrerupere n 25 din
cele 26 de stri posibile ale SIO1. SI trebuie ters prin program.
Indicator confirmare. Dac este ters, nu va fi returnat o stare validare pe timpul impulsului
de confirmare a SCL. Dac este setat, va fi returnat o stare de validare pe timpul impulsului
AA
de confirmare a SCL cnd s-a recepionat: o adres de slave, o adres de apel general (bitul
GC din S1ADR este setat) ori un octet de ctre SIO1 aflat n modul master sau slave.
SD7
SD6
SD5
SD4
SD3
SD2
SD1
SD0
S1DAT (DAh)
CR2

Familia de microcontrolere 80C16x _____________________________________________ 32


Octetul recepionat sau transmis pe magistrala I2C. S1DAT mpreun cu indicatorul ACK
SD7SD0 formeaz un registru de deplasare de 9 bii. Datele sunt deplasate pe frontul cresctor al SCL
i trimise la pinul SDA pe frontul cztor al SCL prin intermediul unui buffer BSD7.
GC
S1ADR (DBh)
Adr6
Adr5
Adr4
Adr3
Adr2
Adr1
Adr0
n mod master, coninutul registrului este irelevant. n mod slave reprezint adresa de
Adr6 Adr0
identificare proprie a perifericului.
GC
Dac este setat, dispozitivul va recunoate starea de apel general.
SC4
SC3
SC2
SC1
SC0
S1STA (D9h)
0
0
0
Cei cinci bii pot genera 32 de stri, din care 26 posibile, funcie de modul de lucru al interfeei. Toate
strile sunt prezentate n paragrafele 1.10.1-1.10.5.

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

Modul emisie circuit principal poate fi acum iniializat setnd STA


(S1CON.5). Logica modulului SIO1 va testa magistrala I 2 C i va genera un
START cnd aceasta va fi liber. Dup ce START a fost emis, se seteaz
indicatorul ntreruperii (SI) i valoarea registrului de stare (S1STA) devine
08h. Codul de stare trebuie folosit pentru rutina de tratare a ntreruperii care
va ncrca registrul S1DAT cu adresa dispozitivului secundar i bitul de
direcie (SLA+W). SI trebuie ters prin program.
Dup ce acestea au fost emise i bitul de confirmare de la circuitul
secundar a fost recepionat, este setat din nou SI i S1STA poate conine
mai multe coduri descrise n tabelul 1.10.a.
Tabelul 1.10.a
Cod
[H]

Stare I 2 C

08 S-a emis START.

10 S-a emis START R.

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 datele.


ACK s-a recepionat.

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.

33 ________________________________________Aplicaii cu microcontrolere de uz general


S-a
pierdut
0
0
0 X Se elibereaz magistrala.
Nici o aciune
1
0
0 X Se emite start cnd magistrala este
38 arbitrarea SLA+R/W S1DAT
liber.
sau datele.

Protocolul legturii n modul transmisie circuit principal este prezentat n


figura 1.11.
TM
Emisie reuit
ctre slave

SLA

Ack Date Ack Stop

08

18

28

Urmtoarea transmisie
iniiat cu STAR T R

SLA

10

Nu s-a recepionat Ack


dup adres slave

Ack Stop

20

Nu s-a recepionat Ack


dup octetul de date

Ack Stop

Mod
recepie

30

S-a pierdut arbitrarea


38

Arbitrarea pierdut i
trece n slave

Ack
Ack

Ack
Ack

Ack

38

68 78 80

Continu
alte
mastere

Alte stri slave

Figura 1.11. SIO1 n mod transmisie master (TM)

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

08 S-a emis START.

ncarc SLA+R

0 X

10 S-a emis START R.

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.

Familia de microcontrolere 80C16x _____________________________________________ 34


Octetul va fi recepionat. Nu va fi
S-au
recepionat
0
0 0 0
emis ACK.
50 date. ACK a fost Citete octet
Octetul va fi recepionat. Va fi emis
0 0 1
0
emis.
ACK.
S-au
recepionat
1
0 0 X Va fi emis START R.
0
1 0 X Va fi emis STOP.
58 datele. ACK nu a fost Citete octet
1
1 0 X Va fi emis STOP urmat de START.
emis.

Protocolul legturii n modul recepie circuit principal este prezentat n


figura 1.12.
RM
Recepie reuit
de la slave

S SLA

08

Ack

Date Ack Date Ack Stop

40

50

58

Urmtorul transfer
iniiat cu START R

10

Nu s-a primit confirmare


dup adres slave

Ack Stop

S-a pierdut arbitrarea

Ack
Ack

Arbitrarea pierdut i
trece n slave

SLA

48

38

Ack
38

Ack
68 78 80

Mod
emisie
Continu
alte
mastere

Alte stri slave

Figura 1.12. SIO1 n mod recepie circuit principal

1.10.3

Modul recepie circuit secundar

n acest mod, registrul S1ADR al dispozitivului secundar trebuie ncrcat


cu adresa cu care acesta este identificat de ctre master. Bitul GC (S1ADR. 0 )
este setat dac se dorete ca dispozitivul s rspund la apelul general.
Registrul S1CON trebuie setat n modul urmtor:
S1CON X 1 0 0 0 1 X X
Dup ncrcarea celor dou registre, SIO1 intr n ateptare pn cnd
este apelat prin adresa proprie i bitul de direcie (n acest caz W=0). Dup
recepionarea SLA+W este setat SI, iar n S1STA este gsit un cod folosit de
rutina de tratare a ntreruperii (tabelul 1.10.c). Acest mod mai poate fi activ
n urma pierderii arbitrrii cnd SIO1 era n mod circuit principal (strile 68h
i 78h).
Tabelul 1.10.c
S1DAT
STA STO SI AA
Cod
Stare I C
Urmtoarea aciune I 2 C
S-a
recepionat
X
0 0 0 Octetul va fi recepionat. Nu va fi emis
Nici o aciune
ACK.
60 SLA+W propriu. ACK S1DAT
X
0
0
1
Octetul va fi recepionat. Va fi emis ACK.
a fost emis.
S-a pierdut arbitraX
0 0 0 Octetul va fi recepionat. Nu va fi emis
rea. S-a recepionat Nici o aciune
ACK.
68
SLA+W propriu. ACK S1DAT
0 0 1 Octetul va fi recepionat. Va fi emis ACK.
X
a fost emis.
S-a recepionat un
X
0 0 0 Octetul va fi recepionat. Nu va fi emis
Nici o aciune
ACK.
70 apel general. ACK a S1DAT
X
0
0
1
Octetul va fi recepionat. Va fi emis ACK.
fost emis.
78 S-a pierdut arbitra-Nici o aciune X
0 0 0 Octetul va fi recepionat. Nu va fi emis
2

35 ________________________________________Aplicaii cu microcontrolere de uz general


rea. S-a recepionat S1DAT
ACK.
un apel general.
X
0 0 1 Octetul va fi recepionat. Va fi emis ACK.
ACK a fost emis.
Adresat anterior cu
X
0 0 0 Octetul va fi recepionat. Nu va fi emis
proprie.
adresa
ACK.
recepionat Citete datele
80 S-au
datele. ACK a fost
X
0 0 1 Octetul va fi recepionat. Va fi emis ACK.
emis.
Comutare n modul slave neadresat. Nu
0
0 0 0 este recunoscut adresa proprie slave
sau de apel general.
Comutare n modul slave neadresat. Este
0
0 0 1 recunoscut adresa proprie slave i de
Adresat anterior cu
apel general dac GC=1.
proprie.
adresa
Comutare n modul slave neadresat. Nu
recepionat Citete datele
88 S-au
1
0 0 0 este recunoscut adresa proprie slave
datele. ACK nu a
sau de apel general. Se emite start cnd
fost emis.
magistrala este liber.
Comutare n modul slave neadresat. Este
1
0 0 1 recunoscut adresa proprie slave i de
apel general dac GC=1. Se emite start
cnd magistrala este liber.
Adresat anterior cu
X
0 0 0 Octetul va fi recepionat. Nu va fi emis
adresa apel geneACK.
90 ral. S-au recepio- Citete datele
nat datele. ACK a
X
0 0 1 Octetul va fi recepionat. Va fi emis ACK.
fost emis.
Nu este recunoscut adresa proprie
0
0 0 0 slave sau de apel general.
Este recunoscut adresa proprie slave i
Adresat anterior cu
0
0 0 1 de apel general dac GC=1.
adresa apel geneNu este recunoscut adresa proprie
98 ral. S-au recepio- Citete datele
slave sau de apel general. Se emite
1
0 0 0
nat datele. ACK nu
START cnd magistrala este liber.
a fost emis.

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

Este recunoscut adresa proprie slave i


de apel general dac GC=1. Se emite
START cnd magistrala este liber.
Nu este recunoscut adresa proprie
slave sau de apel general.
Este recunoscut adresa proprie slave i
de apel general dac GC=1.
Nu este recunoscut adresa proprie
slave sau de apel general. Se emite
START cnd magistrala este liber.
Este recunoscut adresa proprie slave i
de apel general dac GC=1. Se emite
START cnd magistrala este liber.

Dac bitul AA (S1CON.2) este ters se va emite un bit de non-confirmare


dup urmtorul octet primit. Ct timp AA este ters, SIO1 nu va rspunde la
adresa proprie sau la apelul general dar dispozitivul verific n continuare linia
i recunoaterea adresei poate fi refcut prin setarea bitului AA.
Protocolul legturii n modul recepie circuit secundar este prezentat n
figura 1.13.

Familia de microcontrolere 80C16x _____________________________________________ 36


Recepie reuit
adres slave sau date

SLA

Ack
60

Date Ack Date Ack Stop sau S


80

Ultimul octet primit


nu este confirmat

88
Ack
68
Apel gen.

Ack
70

Date Ack Date Ack Stop sau S


90

Datele pierdute nu
sunt confirmate
Arbitrarea pierdut i
trece n slave

A0

Ack Stop sau S

Arbitrarea este pierdut


ca master i devine slave
Recepionare apel
general i octei

80

90

A0

Ack Stop sau S


98
Ack
78

Figura 1.13. SIO1 n mod recepie circuit secundar

1.10.4

Modul transmisie circuit secundar

n acest mod, un numr de octei este transmis ctre un dispozitiv


principal receptor. Transferul datelor este iniializat ca n modul c). Dup
scrierea S1ADR i S1DAT, SIO1 ateapt pn este apelat prin adresa proprie
i bitul de direcie (n aceast situaie R=1). Dup ce SLA+R a fost citit,
indicatorul SI este setat i n S1STA este gsit un cod folosit de rutina de
tratare a ntreruperii (tabelul 1.10.d.). Acest mod mai poate fi activ n urma
pierderii arbitrrii cnd SIO1 era n mod circuit principal (starea B0h).
Dac bitul AA (S1CON.2) este ters, SIO1 va transmite ultimul octet i va
intra n starea C0h sau C8h. Modulul va comuta n modul slave neadresat i
va ignora dispozitivul master care va recepiona numai bii de 1 logic. Ct
timp AA este ters, SIO1 nu va rspunde la adresa proprie sau la apelul
general, dar dispozitivul verific n continuare linia i recunoaterea adresei
poate fi refcut prin setarea bitului AA.
S1DAT STA STO SI AA
Cod Stare I 2 C
Urmtoarea
S-a
recepionat
X
0 0 0 Ultimul octet va fi
ncarc
A8 SLA+W propriu. ACK
recepionat.
data
X
0 0 1 Octetul va fi emis. ACK
a fost emis.
S-a pierdut arbitrarea
SLA+R/W.
S-a
X
0 0 0 Ultimul octet va fi
ncarc
recepionat
SLA+R
B0
recepionat.
data
X
0 0 1 Octetul va fi emis. ACK
propriu. ACK a fost
emis.
Octetul din S1DAT a
X
0 0 0 Ultimul octet va fi
ncarc
B8 fost emis. a ACK a
recepionat.
data
X
0
0
1
Octetul va fi emis. ACK
fost primit.

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

37 ________________________________________Aplicaii cu microcontrolere de uz general


Nu este recunoscut adresa proprie slave sau
0
0 0 0 de apel general.
Este recunoscut adresa proprie slave i de
apel general dac GC=1.
Octetul din S1DAT a Nici o 0
0 0 1
Nu este recunoscut adresa proprie slave sau
C0 fost emis. ACK nu a aciune
de apel general. Se emite START cnd
S1DAT 1
0 0 0
fost primit.
magistrala este liber.
Este recunoscut adresa proprie slave i de
apel general dac GC=1. Se emite START
1
0 0 1
cnd magistrala este liber.
Nu este recunoscut adresa proprie slave sau
0
0 0 0 de apel general.
Este recunoscut adresa proprie slave i de
apel general dac GC=1.
Ultimul
octet
din Nici o 0
0 0 1
Nu este recunoscut adresa proprie slave sau
C8 S1DAT a fost emis. aciune
de apel general. Se emite START cnd
S1DAT 1
0 0 0
ACK a fost primit.
magistrala este liber.
Este recunoscut adresa proprie slave i de
apel general dac GC=1. Se emite START
1
0 0 1
cnd magistrala este liber.

Protocolul legturii n modul emisie circuit secundar este prezentat n


figura 1.14.
Recepie adres
proprie slave i emisie
octei
Arbitrarea pierdut i
trece n slave

SLA

n timpul ultimului
octet emis trece n mod
slave neadresat

Ack
A8

Date Ack Date Ack Stop sau S


B8

C0

Ack
B0
Ack 11 Stp/S
C8

Figura 1.14. SIO1 n mod transmisie circuit secundar

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

1.11. Sistemul de ntreruperi


Familia 8XC552 are 15 ntreruperi, fiecare putnd fi asignat la unul din
cele dou nivele de prioritate.
ntreruperile externe INT0 i INT1 pot fi programate s fie active pe
front sau pe nivel funcie de biii IT0 i IT1 din registrul special TCON.
Indicatorii acestor ntreruperi sunt IE0 i IE1 din TCON.

Familia de microcontrolere 80C16x _____________________________________________ 38

ntreruperile timerelor T0 i T1 sunt controlate de indicatorii TF0 i TF1


care sunt setate de depirea registrelor de numrare (excepie o face T1 n
modul 3 mai multe informaii se gsesc n paragraful 1.7.1.).
Cele opt ntreruperi ale timerului T2 sunt generate de indicatorii
CTI0-CTI3 (setate de semnalele de intrare CT0I-CT3I), CMI0-CMI2 (setat
de egalitatea ntre registrul T2 i registrele CM0-CM2) i un

SAU LOGIC

ntre

biii T2BO i T2OV (setai de depirea registrului de 8 bii, respectiv 16 bii).


ntreruperea convertorului analog/numeric este generat de indicatorul
ADCI care este setat n momentul n care rezultatul conversiei este gata de
citit. ntreruperea interfeei asincrone (SIO0) este generat de o operaie SAU
LOGIC ntre indicatorii TI (transmisie) i RI (recepie). ntreruperea interfeei
sincrone (SIO1) este generat de indicatorul SI setat de o stare valid n
registrul S1STA.
Sistemul de ntreruperi este controlat de un set de registre de validare
(IEN0 i IEN1) i registrele de prioritate (IP0 i IP1). Structura acestora
este prezentat n tabelul 1.11.
Indicatorii ntreruperilor sunt verificai n fiecare ciclu main n starea
S5P2. Dac un indicator este setat, sistemul de ntreruperi va genera o
instruciune LCALL ctre rutina de tratare n ciclul main urmtor detectrii
indicatorului setat.
n anumite condiii, instruciunea LCALL poate fi blocat:

o ntrerupere cu prioritate egal sau superioar este n lucru;


ciclul main curent nu este ultimul ciclu al unei instruciuni;
instruciunea curent este o instruciune RETI sau de scriere-citire n unul
din registrele IP0, IP1, IE0 sau IE1.
Tabelul 1.11
EA
EAD
ES1
ES0
ET1
EX1
ET0
EX0
IEN0 (A8h)
EA
Control global al ntreruperilor. Dac este ters, toate ntreruperile sunt dezactivate.
EAD
Validare ntrerupere convertor analog/numeric.
ES1
Validare ntrerupere interfa serial SIO1.
ES0
Validare ntrerupere interfa serial SIO0.
ET1
Validare ntrerupere depire timer T1.
EX1
Validare ntrerupere extern 1.
ET0
Validare ntrerupere depire timer T0.
EX0
Validare ntrerupere extern 0.
ET2
ECM2
ECM1
ECM0
ECT3
ECT2
ECT1
ECT0
IEN1 (E8h)
ET2
Validare ntrerupere depire timer T2.
ECM2
Validare ntrerupere comparator 2.
ECM1
Validare ntrerupere comparator 1.
ECM0
Validare ntrerupere comparator 0.
ECT3
Validare ntrerupere captur 3.
ECT2
Validare ntrerupere captur 2.
ECT1
Validare ntrerupere captur 1.
ECT0
Validare ntrerupere captur 0.

39 ________________________________________Aplicaii cu microcontrolere de uz general


PAD
PS1
PS0
PT1
PX1
PT0
PX0
IP0 (B8h)

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.

Trebuie subliniat faptul c dac un indicator de ntrerupere este activ dar


rutina nu este activat datorit condiiilor de mai sus, exist posibilitatea ca
ntreruperea s fie pierdut dac dup dispariia condiiilor de blocare
indicatorul de ntrerupere este ters.
LCALL introduce n stiv valoarea curent a contorului program i l
ncarc cu adresa de tratare a ntreruperii, conform tabelului 1.12.
Tabelul 1.12
Surs ntrerupere Adres Surs ntrerupere Adres Surs ntrerupere Adres
ntrerupere ext. 0 0003h Interfa SIO1
002Bh Convertor A/N
0053h
000Bh Captur 0
0033h Comparare 0
005Bh
Timer T0
0063h
003Bh Comparare 1
ntrerupere ext. 1 0013h Captur 1
001Bh Captur 2
0043h Comparare 2
006Bh
Timer T1
0023h Captur 3
004Bh Timer T2
0073h
Interfa SIO0

ntoarcerea n programul principal este asigurat de instruciunea RETI


care restaureaz coninutul contorului program cu valoarea dinainte de
ntrerupere.

1.12. Consumul redus de energie


Consumul redus de energie este o facilitate deosebit a familiei 8xC552
fiind extrem de util n situaia controlului unor aparate portabile alimentate
la baterii. Funcie de structura circuitelor externe, introducerea controlerului
ntr-un mod economic de lucru poate asigura reducerea consumului de
energie cu cteva ordine de mrime.
Familia 8xC552 are dou regimuri de lucru cu consum redus de energie:
a) Inactiv (IDLE);
b) Oprit (POWER-DOWN).
Registrul special care controleaz, printre altele, regimul economic de
funcionare este PCON, descris n tabelul 1.13.
Tabelul 1.13

Familia de microcontrolere 80C16x _____________________________________________ 40


SMOD

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.

41 ________________________________________Aplicaii cu microcontrolere de uz general

Familia de microcontrolere 80C16x


Circuitele 80C16x constituie una din cele mai reprezentative familii de
controlere de 16 bii. Ele combin performanele extrem de ridicate ale
unitii centrale (pn la 20 milioane de instruciuni pe secund) cu o gam
larg de periferice foarte utile.
Familia 16x, nefiind constrns de necesitatea pstrrii compatibilitii cu
alte familii anterioare, a putut fi realizat la parametri deosebii, principalele
faciliti fiind:
unitate central de 16 bii, cu frecvene de ceas de 20 MHz sau 40 MHz;
majoritatea instruciunilor sunt executate ntr-un ciclu main, n special
datorit adoptrii unei arhitecturi cu stiv de instruciuni cu patru nivele:
o

timp de execuie a majoritii instruciunilor 50 ns ;

timpi de execuie pentru nmulire (1616 bii) 250 ns, mprire


(32/16 bii) 500 ns;
spaiu liniar de adresare pentru memoria program i memoria de date este
16 MB;
conine o memorie intern: RAM2 kB (din care 1024 destinate registrelor
speciale) i ROM8 kB;
caracteristicile magistralei externe sunt programabile pentru diferite
structuri ale sistemului:
o

magistral extern de date pe 8 bii sau 16 bii;

magistral extern adrese-date multiplexat sau nemultiplexat;

o dispune de semnale pentru arbitrarea magistralei externe


pot fi programate 5 semnale speciale pentru selectare circuitelor externe;
convertor A/D de 10 bii cu 16 intrri i 9.7 ms timp de conversie;
dou module multifuncionale cu 5 timere;
dou module de captur-comparare cu 16 canale;
timer programabil pentru resetare (watchdog);
patru module generatoare de impulsuri modulate n durat;
dou interfee seriale (una de vitez mic, sincron-asincron, cealalt de
vitez mare, numai sincron);
pn la 111 linii de intrare-ieire care se pot configura separat ca intrare
(standard ori trigger Schmitt) sau ieire (push-pull ori dren n gol);
un sistem de ntreruperi special realizat pentru sisteme n timp real (16
nivele de ntrerupere cu 56 de ntreruperi cu vectori separai, timpul mediu
de rspuns la ntrerupere fiind de 300-500 ns);
conine o structur asemntoare DMA denumit PEC (Peripheal Event
Controler Controler pentru evenimente de la periferice) util pentru
transferul unor blocuri de date ntr-un timp foarte scurt;
are implementate soft dou moduri de lucru pentru economisirea energiei
(inactiv i oprit).

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

Familia de microcontrolere 80C16x _____________________________________________ 42

Figura 1.15. Microcontrolerul 80C167

43 ________________________________________Aplicaii cu microcontrolere de uz general

Funcie de tipul structurii interne, cei trei membri ai familiei 80C16x


sunt:
80C166, controler de 16 bii din prima generaie, fr magistral X-BUS;
80C165, controler din generaia a doua, nu conine modulele pentru
convertorul analog/numeric, modulatoarele de impulsuri n durat i
registrele de captur i comparare asociate timerelor;
80C167, varianta maxim de echipare, n structura sa intern fiind
prezente toate modulele standard.
La generaia a doua, datorit prezenei magistralei X-BUS se pot realiza,
la comand, circuite specifice care pot conine module suplimentare: memorie
PROM sau Flash ROM, CAN (standard de comunicaie serial creat de firma
Bosch; termenul reprezint Controller Area Network reea local de
controlere) sau alte circuite.
Descrierea funcional a pinilor circuitului 80C167, cel mai reprezentativ
membru al familiei, este prezentat n figura 2.1, iar structura intern n
figura 2.2.
16
32

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

Figura 1.16. Structura intern a circuitului 80C167

Nucleul de baz al controlerului const ntr-o unitate central care


conine o unitate aritmetic i logic de 16 bii, o stiv (pipeline) de 4
instruciuni, o unitate aritmetic separat pentru nmulire i mprire, un
registru de deplasare i un generator pentru mascare la nivel de bit.

Familia de microcontrolere 80C16x _____________________________________________ 44

Legtura ntre unitatea central i exterior, inclusiv celelalte module


integrate n circuit este realizat de un controler special, interfaa magistralei
externe, o magistral de 16 bii. Controlul legturii cu circuitele externe este
complet la dispoziia utilizatorului: se pot selecta patru mrimi ai magistrale
de adrese (16, 18, 20 sau 24 de bii), dou tipuri de magistrale de date (8 bii
sau 16 bii), magistralele de date putnd fi multiplexate sau nu; de
asemenea, se pot genera un numr de pn la 5 semnale de selecie de
circuite, se poate programa poziia i lungimea semnalelor ALE i RW, se pot
introduce automat 015 stri de ateptare sau, pentru periferice foarte lente,
semnale speciale de ntrziere.
Circuitul mai conine i un sistem programabil de ntreruperi cu prioriti
multiple care gestioneaz 56 de evenimente externe, produse de modulele
interne, externe sau de program.
Informaii suplimentare pot fi gsite n lucrrile: C167 16-Bit CMOS
Single-Chip Microcontroller Data Sheet, C167 16-Bit Single-Chip Microcontroler Users Manual, i la adresa http://www.infineon.com/products/micro/.

1.13. Organizarea memoriei


Spaiul de memorie al familiei de circuite 80C16x este configurat ntr-o
arhitectur Von Neumann, adic instruciunile (codurile) i datele sunt
accesate n acelai spaiu liniar de adresare. Toate zonele de memorie,
separate fizic, incluznd memoriile ROM i RAM interne, zona registrelor
speciale (SFR) i zona extins a registrelor speciale (ESFR), regiunea
adreselor pentru perifericele XBUS, precum i memoria extern sunt
organizate n acelai spaiu comun de adrese.
Circuitul 80C167 dispune de un spaiu total de adresare de 16 MB. Acest
spaiu este aranjat n 256 segmente de 64 kB, fiecare segment la rndul lui
fiind mprit la rndul lui n patru pagini de date a cte 16 kB. Schematic,
organizarea memoriei circuitului 80C167 este prezentat n figura 2.3.
Segment
255

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

Figura 1.17. Harta memoriei circuitului 80C167

45 ________________________________________Aplicaii cu microcontrolere de uz general

Cea mai mare parte a memoriei interne este apelat n segmentul 0,


segmentul sistem. Partea superioar a segmentului sistem (4 kB
00F000h00FFFFh) conin memoria RAM intern i registrele speciale (SFR
i ESFR). Zona inferioar a segmentului 0 (32 kB 000000h007FFFh)
poate fi ocupat de memoria ROM intern. Funcie de coninutul registrului
special SYSCON, memoria ROM intern poate fi adresat din segmentul 1
(010000h017FFFh) pentru a permite accesul memoriei externe i n
jumtatea inferioar a segmentului sistem.
Datele i codurile pot fi memorate n orice zon a memoriei interne, cu
excepia blocurilor rezervate pentru registrele speciale.
Octeii (8 bii) pot fi memorai la adrese pare sau impare. Cuvintele (16
bii) sunt memorate la locaii n ordine cresctoare, octetul inferior la adres
par urmat de octetul superior memorat la o adres impar. Cuvintele duble
(32 bii numai coduri instruciuni) sunt memorate n locaii succesive de
memorie ca dou cuvinte subsecvente. Biii sunt memorai ntotdeauna n
poziia specificat a bitului din cuvntul adresat; bitul 0 corespunde bitului cel
mai puin semnificativ al octetului, n timp ce bitul 15 corespunde bitului cel
mai semnificativ. Adresarea pe bit este suportat de o parte a registrelor
speciale i a memoriei RAM interne i, n totalitate, de registrele de uz
general (GPR).
1.13.1
Memoria ROM intern
Circuitul 80C167 poate rezerva o zon de 32 kB pentru o memorie ROM
sau flash organizat ca 32. Memoria ROM intern este validat sau invalidat
global prin intermediul registrului special SYSCON, funcie de starea pinului
EA la reset sau de comenzi ulterioare. Memoria ROM intern poate fi folosit
att pentru instruciuni, ct i pentru date (constante, tabele de conversie
etc.). ncrcarea codurilor este fcut ntotdeauna de la adrese pare. Accesul
datelor, octei sau cuvinte, este fcut prin intermediul adresrii indirecte sau
directe pe 16 bii; pentru memoria ROM intern nu exist posibilitatea
adresrii pe 8 bii. Accesul memoriei interne, pentru dispozitivele care nu au
incluse acest bloc, produce rezultate impredictibile.
1.13.2

Memoria RAM intern i zona registrelor speciale (SFR)

Zona RAM/SFR se gsete n pagina de date 3 i permite accesul la 2 kB


de memorie RAM (organizat ca 1k16) i la dou blocuri a cte 512 octei de
registre speciale.
De regul, memoria RAM este utilizat pentru:
stiv sistem (cu o mrime programabil);
bancuri de registre de uz general (GPR General Purpose Register);
indicatori surs i destinaie pentru interfaa pentru evenimente de la
periferice (PEC Peripheal Event Controller);
memorare variabile i alte date;
memorare instruciuni.

Familia de microcontrolere 80C16x _____________________________________________ 46

Organizarea memoriei RAM interne este prezentat n figura 2.4. (zona


haurat reprezint locaii adresabile la nivel de bit).
Orice cuvnt sau octet din memoria RAM intern poate fi adresat indirect
sau direct pe 16 bii dac indicatorul paginii de date utilizat (DPPx) este setat
pentru pagina 3 de memorie. Accesul cuvintelor se face de la adrese pare.
Pentru transferul datelor prin intermediul interfeei pentru evenimente de la
periferice (PEC), memoria RAM intern este accesat indiferent de coninutul
registrelor DPP, contnd numai indicatorii surs i destinaie corespunztori
canalului PEC.
Z ona
RA M/ SFR

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

Z ona RAM/ SFR

Figura 1.18. Harta memoriei circuitului 80C167

a)

Stiva sistem

Stiva poate fi definit n memoria RAM la o adres definit de registrul


special SP. Mrimea stivei este controlat de biii STKSZ din registrul special
SYSCON, conform cu tabelul 2.1.
STKSZ
000
001
010
011
100
101, 110
111

Mrime stiv (cuvinte)


256
128
64
32
512
Rezervat
1024

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)

Registrele de uz general (GPR)

Registrele de uz general constau ntr-un bloc consecutiv de 16 locaii de


memorie (fiecare a cte 16 bii) oriunde n interiorul memoriei RAM interne.

47 ________________________________________Aplicaii cu microcontrolere de uz general

Registrul special CP (context pointer indicator context) definete


adresa de baz pentru bancul curent de registre, care const n 16 registre de
16 bii (de la R0 la R15) i 16 registre de 8 bii (de la RL0, RH0 la RL7, RH7).
Registrele GPR de 8 bii se suprapun cu primele opt registre de 16 bii
(R0R7).
Registrele GPR sunt adresate pe 2, 4 sau 8 bii, folosind ca registru de
baz CP (independent de valoarea registrelor DPPx). Cele 16 registre sunt
adresabile i la nivel de bit.
Familia 80C16x permite comutarea rapid a contextului, n fapt a
registrului CP, permind existena simultan n memorie a mai multe bancuri
de registre, chiar suprapuse parial, dar numai cel adresat de registrul CP
este activ.
c)

Indicatorii pentru Interfaa pentru evenimente de la periferice

Aceti indicatori constau n 16 locaii (fiecare a cte 16 bii) poziionate


n memoria RAM intern la adrese de la 00FCE0h la 00FCEEh. Indicatorii sunt
folosii pentru transferul datelor sub controlul interfeei PEC. Fiecare din cele
8 canale ale PEC utilizeaz o pereche de indicatori memorai n dou locaii
consecutive, indicatorul surs (SRCP source PEC), respectiv indicatorul
destinaie (DSTP destination PEC).
n momentul n care este stabilit un transfer de date sub controlul PEC,
indicatorii din perechea de registre SRCP i DSTP permit transferul unor
blocuri de date, de la adresa memorat n SRCP la adresa din DSTP.
d)

Registrele speciale (SFR)

Unitatea central, interfeele cu magistralele, porturile de intrare-ieire i


a modulele interne sunt controlate prin intermediul unor registre speciale
SFR. Aceste registre sunt dispuse n dou blocuri, fiecare a cte 512 octei.
Primul

bloc,

zona

SFR,

este

dispus

memoria

RAM

la

adresele

00FFFFh00FE00h; al doilea bloc, zona ESFR (extended SFR) se gsete la


adresele 00F1FFh00F000h.
Registrele speciale pot fi adresate indirect sau pe 16 bii. Folosind un
deplasament de 8 bii mpreun cu o adres de baz implicit, se pot adresa
cuvintele SFR sau octeii inferiori ai acestora.
Atenie! Modificarea oricrui octet din SFR are ca efect tergerea octetului
neadresat.
Jumtatea superioar a fiecrui bloc de registre speciale este adresabil
la nivel de bit, permind modificarea sau verificarea facil a indicatorilor de
stare ori control pentru modulele interne.
Pentru adresarea registrelor din zona ESFR folosind o adres pe 8 bii
sau adresarea direct la nivel de bit, este obligatorie utilizarea unei
instruciuni
speciale,
EXTR,
instruciune
care
permite
comutarea
mecanismului de adresare din zona SFR n zona ESFR. Totui, pentru

Familia de microcontrolere 80C16x _____________________________________________ 48

adresarea pe 16 bii sau indirect, aceast instruciune nu este necesar. De


asemenea, registrele GPR R0R15 sunt duplicate, astfel nct adresarea lor
este posibil n orice mod fr a necesita comutarea respectiv.
De exemplu:
EXTR
MOV
BFLDL
BSET
MOV

#4
ODP2,#data16
DP6,#mask,#data8
DP1H.7
T8REL,R2

;comut ESFR urmtoarele 4 instruciuni


;ODP2 folosete adresare pe 8 bii
;Adresare pe bit pentru cmpuri de bii
;Adresare pe bit
;T8REL folosete adresare pe 16 bii,
;R2 este duplicat
;EXTR #4 i termin efectul

Pentru a minimiza folosirea instruciunii EXTR, zona ESFR conine, de


regul, registre utilizate n principal la iniializarea sistemului.
Registrele speciale utilizate de circuitul 80C167 sunt prezentate n tabelul
2.2. (unde b reprezint registru adresabil la nivel de bit iar E semnific zona
ESFR), o descriere detaliat a fiecruia gsindu-se la prezentarea fiecrui
modul intern. Este recomandabil utilizarea exact a numelor prezentate n
tabel ntruct programele de dezvoltare (compilatoare, assembler etc.)
folosesc aceste mnemonice.
Nume
ADCIC b
ADCON b
ADDAT
ADDAT2
ADDRSEL1
ADDRSEL2
ADDRSEL3
ADDRSEL4
ADEIC b
BUSCON0 b
BUSCON1 b
BUSCON2 b
BUSCON3 b
BUSCON4 b
CAPREL
CC0
CC0IC b
CC1
CC1IC b
CC2
CC2IC b
CC3
CC3IC b
CC4
CC4IC b
CC5
CC5IC b
CC6
CC6IC b
CC7
CC7IC b
CC8
CC8IC b
CC9

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

49 ________________________________________Aplicaii cu microcontrolere de uz general


FF8Ah
Registru control ntrerupere CAPCOM 9
CC9IC b
CC10
FE94h
Registru CAPCOM 10
FF8Ch
Registru control ntrerupere CAPCOM 10
CC10IC b
CC11
FE96h
Registru CAPCOM 11
FF8Eh
Registru control ntrerupere CAPCOM 11
CC11IC b
CC12
FE98h
Registru CAPCOM 12
FF90h
Registru control ntrerupere CAPCOM 12
CC12IC b
CC13
FE9Ah
Registru CAPCOM 13
FF92h
Registru control ntrerupere CAPCOM 13
CC13IC b
CC14
FE9Ch
Registru CAPCOM 14
FF94h
Registru control ntrerupere CAPCOM 14
CC14IC b
CC15
FE9Eh
Registru CAPCOM 15
FF96h
Registru control ntrerupere CAPCOM 15
CC15IC b
CC16
FE60h
Registru CAPCOM 16
F160h E
Registru control ntrerupere CAPCOM 16
CC16IC b
CC17
FE62h
Registru CAPCOM 17
F162h E
Registru control ntrerupere CAPCOM 17
CC17IC b
CC18
FE64h
Registru CAPCOM 18
F164h E
Registru control ntrerupere CAPCOM 18
CC18IC b
CC19
FE66h
Registru CAPCOM 19
F166h E
Registru control ntrerupere CAPCOM 19
CC19IC b
CC20
FE68h
Registru CAPCOM 20
F168h E
Registru control ntrerupere CAPCOM 20
CC20IC b
CC21
FE6Ah
Registru CAPCOM 21
F16Ah E
Registru control ntrerupere CAPCOM 21
CC21IC b
CC22
FE6Ch
Registru CAPCOM 22
F16Ch E
Registru control ntrerupere CAPCOM 22
CC22IC b
CC23
FE6Eh
Registru CAPCOM 23
F16Eh E
Registru control ntrerupere CAPCOM 23
CC23IC b
CC24
FE70h
Registru CAPCOM 24
F170h E
Registru control ntrerupere CAPCOM 24
CC24IC b
CC25
FE72h
Registru CAPCOM 25
F172h E
Registru control ntrerupere CAPCOM 25
CC25IC b
CC26
FE74h
Registru CAPCOM 26
F174h E
Registru control ntrerupere CAPCOM 26
CC26IC b
CC27
FE76h
Registru CAPCOM 27
F176h E
Registru control ntrerupere CAPCOM 27
CC27IC b
CC28
FE78h
Registru CAPCOM 28
F178h E
Registru control ntrerupere CAPCOM 28
CC28IC b
CC29
FE7Ah
Registru CAPCOM 29
F184h E
Registru control ntrerupere CAPCOM 29
CC29IC b
CC30
FE7Ch
Registru CAPCOM 30
F18Ch E
Registru control ntrerupere CAPCOM 30
CC30IC b
CC31
FE7Eh
Registru CAPCOM 31
F194h E
Registru control ntrerupere CAPCOM 31
CC31IC b
FF52h
Registru control mod CAPCOM 0
CCM0 b
FF54h
Registru control mod CAPCOM 1
CCM1 b
FF56h
Registru control mod CAPCOM 2
CCM2 b
FF58h
Registru control mod CAPCOM 3
CCM3 b
FF22h
Registru control mod CAPCOM 4
CCM4 b
FF24h
Registru control mod CAPCOM 5
CCM5 b
FF26h
Registru control mod CAPCOM 6
CCM6 b
FF28h
Registru control mod CAPCOM 7
CCM7 b
CP
FE10h
Registru indicator context CPU
FF6Ah
CRIC b
Registru control ntrerupere T2 CAPREL
CSP
FE08h
Registru indicator segment cod
F100h E
DP0L b
Registru control direcie P0L

Familia de microcontrolere 80C16x _____________________________________________ 50


F102h E
DP0H b
Registru control direcie P0H
F104h E
DP1L b
Registru control direcie P1L
F106h E
DP1H b
Registru control direcie P1H
FFC2h
DP2 b
Registru control direcie P2
FFC6h
DP3 b
Registru control direcie P3
FFCAh
DP4 b
Registru control direcie P4
FFCEh
DP6 b
Registru control direcie P6
FFD2h
DP7 b
Registru control direcie P7
FFD6h
DP8 b
Registru control direcie P8
DPP0
FE00h
Registru indicator pagin date 0 (10 bii)
DPP1
FE02h
Registru indicator pagin date 1 (10 bii)
DPP2
FE04h
Registru indicator pagin date 2 (10 bii)
DPP3
FE06h
Registru indicator pagin date 3 (10 bii)
F1C0h E
Registru control ntrerupere extern
EXICON b
FF0Eh
Registru control nmulire-mprire
MDC b
MDH
FE0Ch
Registru control nmulire-mprire (cuvnt superior)
MDL
FE0Eh
Registru control nmulire-mprire (cuvnt inferior)
F1C2h E
ODP2 b
Registru control dren n gol P2
F1C6h E
ODP3 b
Registru control dren n gol P3
F1CEh E
ODP6 b
Registru control dren n gol P6
F1D2h E
ODP7 b
Registru control dren n gol P7
F1D6h E
ODP8 b
Registru control dren n gol P8
ONES
FF1Eh
Registru valoare constant 1
FF00h
P0L b
Registru inferior P0
FF02h
P0H b
Registru superior P0
FF04h
P1L b
Registru inferior P1
FF06h
P1H b
Registru superior P1
FFC0h
Registru Port2
P2 b
FFC4h
Registru Port3
P3 b
FFC8h
Registru Port4 (8 bii)
P4 b
FFA2h
Registru Port5
P5 b
FFCCh
Registru Port6 (8 bii)
P6 b
FFD0h
Registru Port7 (8 bii)
P7 b
FFD4h
Registru Port8 (8 bii)
P8 b
PECC0
FEC0h
Registru control canal 0 PEC
PECC1
FEC2h
Registru control canal 1 PEC
PECC2
FEC4h
Registru control canal 2 PEC
PECC3
FEC6h
Registru control canal 3 PEC
PECC4
FEC8h
Registru control canal 4 PEC
PECC5
FECAh
Registru control canal 5 PEC
PECC6
FECCh
Registru control canal 6 PEC
PECC7
FECEh
Registru control canal 7 PEC
PP0
F038h E
Registru perioad PWM0
PP1
F03Ah E
Registru perioad PWM1
PP2
F03Ch E
Registru perioad PWM2
PP3
F03Eh E
Registru perioad PWM3
FF10h
Registru stare program
PSW b
PT0
F030h E
Numrtor sus/jos PWM0
PT1
F032h E
Numrtor sus/jos PWM1
PT2
F034h E
Numrtor sus/jos PWM2
PT3
F036h E
Numrtor sus/jos PWM3
PW0
FE30h
Registru durat impuls PWM0
PW1
FE32h
Registru durat impuls PWM1
PW2
FE34h
Registru durat impuls PWM2
PW3
FE36h
Registru durat impuls PWM3
FF30h
Registru 0 control modul PWM
PWMCON0 b
FF32h
Registru 1 control modul PWM
PWMCON1 b

51 ________________________________________Aplicaii cu microcontrolere de uz general


F17Eh E
Registru control ntreruperi modul PWM
PWMIC b
F108h E
Registru configurare sistem la iniializare
RP0H b
S0BG
FEB4h
Registru rencrcare generator rat transmisie ASC0
FFB0h
Registru control ASC0
S0CON b
FF70h
Registru control ntrerupere eroare ASC0
S0EIC b
S0RBUF
FEB2h
Registru bufer recepie ASC0
FF6Eh
Registru control ntrerupere recepie ASC0
S0RIC b
F19Ch E
Registru control ntrerupere bufer emisie ASC0
S0TBIC b
S0TBUF
FEB0h
Registru bufer emisie ASC0
FF6Ch
Registru control ntrerupere emisie ASC0
S0TIC b
SP
FE12h
Registru indicator stiv
SSCBR
F0B4h E
Registru rat transmisie SSC
FFB2h
Registru control SSC
SSCCON b
FF76h
Registru control ntrerupere eroare SSC
SSCEIC b
SSCRB
F0B2h E
Bufer SSC recepie
FF74h
Registru control ntrerupere recepie SSC
SSCRIC b
SSCTB
F0B0h E
Bufer emisie SSC
FF72h
Registru control ntrerupere emisie SSC
SSCTIC b
STKOV
FE14h
Registru depire superioar stiv
STKUN
FE16h
Registru depire inferioar stiv
FF12h
Registru configurare sistem
SYSCON b
T0
FE50h
Registru CAPCOM T0
FF50h
T01CON b
Registru control CAPCOM T0 i T1
FF9Ch
T0IC b
Registru control ntrerupere CAPCOM T0
T0REL
FE54h
Registru rencrcare CAPCOM T0
T1
FE52h
Registru CAPCOM T1
FF9Eh
T1IC b
Registru control ntrerupere CAPCOM T1
T1REL
FE56h
Registru rencrcare CAPCOM T1
T2
FE40h
Registru T2
FF40h
T2CON b
Registru control T2
FF60h
T2IC b
Registru control ntrerupere T2
T3
FE42h
Registru T3
FF42h
T3CON b
Registru control T3
FF62h
T3IC b
Registru control ntrerupere T3
T4
FE44h
Registru T4
FF44h
T4CON b
Registru control T4
FF64h
T4IC b
Registru control ntrerupere T4
T5
FE46h
Registru T5
FF46h
T5CON b
Registru control T5
FF66h
T5IC b
Registru control ntrerupere T5
T6
FE48h
Registru T6
FF48h
T6CON b
Registru control T6
FF68h
T6IC b
Registru control ntrerupere T6
T7
F050h E
Registru CAPCOM T7
FF20h
T78CON b
Registru control CAPCOM T7 i T8
F17Ah E
T7IC b
Registru control ntrerupere CAPCOM T7
T7REL
F054h E
Registru rencrcare CAPCOM T7
T8
F052h E
Registru CAPCOM T8
F17Ch E
T8IC b
Registru control ntrerupere CAPCOM T8
T8REL
F056h E
Registru rencrcare CAPCOM T8
FFACh
Registru indicator Trap
TFR b
WDT
FEAEh
Registru timer watchdog
WDTCON
FFAEh
Registru control timer watchdog
F186h E
Registru control ntrerupere periferic X-BUS 0
XP0IC b
F18Eh E
Registru control ntrerupere periferic X-BUS 1
XP1IC b
F196h E
Registru control ntrerupere periferic X-BUS 2
XP2IC b

Familia de microcontrolere 80C16x _____________________________________________ 52


F19Eh E
Registru control ntrerupere periferic X-BUS 3
XP3IC b
FF1Ch
Registru valoare constant 0
ZEROS b

e)

Memoria extern

Circuitul 80C167 este capabil s foloseasc un spaiu de memorie de


pn la 16 MB. Memoria extern este adresat numai prin intermediul
interfeei cu magistrala extern.
Funcie de registrele de control ale unitii centrale, sunt suportate patru
mrimi ale bancurilor de memorie:
mod nesegmentat:
64 kB cu A15A0 pe porturile P1 sau P0;

mod segmentat pe 2 bii:

256 kB cu A17A16 pe P4 i A15A0 pe


P1 sau P0;

mod segmentat pe 4 bii:

1 MB cu A19A16 pe P4 i A15A0 pe P1
sau P0;

mod segmentat pe 8 bii:

16 MB cu A23A16 pe P4 i A15A0 pe
P1 sau P0.

Fiecare banc poate fi adresat direct prin intermediul magistralei de


adrese, folosind eventual pentru selectare circuitelor semnalele produse de
circuit.
De asemenea, circuitul 80C167 suport patru tipuri de magistral:
magistral multiplexat pe 16 bii, cu adrese i date pe portul P0;

magistral multiplexat pe 8 bii, cu adrese i date pe portul P0/P0L;

magistral demultiplexat pe 16 bii, cu adrese pe P1 i date pe P0;

magistral demultiplexat pe 8 bii, cu adrese pe P1 i date pe P0L.

Modelul de memorie i modelul de magistral pot fi setate la iniializarea


circuitului, funcie de starea pinilor EA i portului P0 sau, ulterior, pot fi
modificai prin program.
Datele, att octei ct i cuvinte, pot fi adresate numai prin intermediul
adresrii indirecte sau pe 16 bii folosind unul din cele patru registre DPP.
Orice acces la un cuvnt este fcut numai la o adres par.
Pentru transferul de date sub controlul PEC, memoria extern din
segmentul 0 poate fi adresat indiferent de coninutul registrelor DPP, numai
prin intermediul registrelor surs i destinaie.
Memoria extern nu este adresabil la nivel de bit.

1.14. Unitatea central


Sarcinile de baz ale unitii centrale sunt de a-i furniza instruciuni, de
a le decodifica, de a asigura operanzi pentru unitatea aritmetic i logic
(ALU), precum i de a memora rezultatele operaiilor.
Schema bloc a unitii centrale este prezentat n figura 2.5.
Semnificaia blocurilor din structura unitii centrale vor fi prezentate n
paragrafele care urmeaz.

53 ________________________________________Aplicaii cu microcontrolere de uz general

n timp ce accesul la memoria intern este asigurat chiar de procesor


nsui, controlul perifericelor i memoriei externe este fcut prin intermediul
unui bloc separat, interfaa cu magistrala extern. Aceast modalitate permite
procesorului s lucreze n timp ce, un acces la memoria extern, de regul
mai lent, este n curs. Detalii suplimentare sunt prezentate n paragraful
1.15, Interfaa cu magistrala extern (EBC).
Modulele interne ale circuitului lucreaz aproape independent fa de
unitatea central, avnd disponibile un generator de ceas separat. Controlul i
schimbul de date ntre module i unitatea central se realizeaz prin
intermediul unor registre speciale (paragraful d).
SP
STKOV
STKUN
Unitate exec.
Indic. instr. IP
Reg. instr.
Stiv
instruc.
PSW
SYSCON

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

Figura 1.19. Unitatea central a microcontrolerului 80C167

n momentul n care anumite periferice necesit o aciune specific a


unitii centrale, un controler de ntreruperi verific toate cererile existente de
la modulele interne sau externe i, funcie de prioritile acestora, dac sunt
mai ridicate dect a instruciunii curente a unitii centrale, este iniiat o
procedur de ntrerupere care trateaz evenimentul cu prioritatea cea mai
ridicat (paragraful 1.16, Sistemul de ntreruperi i registrele PEC).
Un set de registre speciale controleaz funcionarea nucleului unitii
centrale:
SYSCON, RP0H
configurare general;

PSW

stare i control unitate central;

IP,CSP

acces coduri;

DPP0DPP3

control paginare date;

CP

control acces registre uz general;

Familia de microcontrolere 80C16x _____________________________________________ 54

SP,STKUN,STKOV

control stiv sistem;

MDL,MDH,MDC

registre pentru nmulire i mprire;

ZEROS,ONES

registre cu valori constante.

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.

(execuie) n acest nivel, operaia ncrcat anterior n ALU, este


executat. Suplimentar, sunt actualizai indicatorii din registrul de stare
PSW funcie de rezultat. De asemenea, modificarea registrelor SFR i

EXECUTE

incrementarea sau decrementarea registrelor de uz general folosite pentru


adresare indirect sunt efectuate n acest nivel.
4. WRITE BACK (rescriere) n acest nivel, toi operanzii externi i cei rmai n
memoria RAM n urma instruciunii curente sunt reactualizai.
O particularitate a circuitului 80C167 sunt aa numitele instruciuni
inserate. Aceste instruciuni sunt introduse automat de unitatea central n
situaia n care survine o instruciune care nu poate fi executat ntr-un
singur ciclu main. Aceast inserare este efectuat n nivelul 2
(decodificare), ulterior, procedura fiind asemntoare cu instruciunile
normale. De asemenea, ntreruperile sunt prelucrate prin acelai tip de
inserare de ciclu main.
Fiecare instruciune singular trebuie s treac prin cele patru nivele ale
stivei de instruciuni, indiferent dac fiecare nivel al stivei efectueaz ceva
sau nu. Deoarece parcurgerea unui nivel din stiva de instruciuni necesit un
ciclu main, orice instruciune de sine stttoare are obligatoriu patru cicluri
main. Implementarea stivei de instruciuni permite astfel execuia simultan
a patru instruciuni, fiecare instruciune fiind executat de patru ori mai
repede, ntr-un singur ciclu main.
Bineneles, n situaia existenei unui salt, stiva de instruciuni trebuie
rencrcat. Totui, mecanismul inserare instruciune este optimizat, astfel c
nu ntrzie fluxul execuiei dect cu un singur ciclu main. Mai mult dect
att, dac saltul face parte dintr-o bucl, unitatea central are un mecanism

55 ________________________________________Aplicaii cu microcontrolere de uz general

suplimentar, saltul cache. Procedura const n memorarea locaiei destinaiei


de salt ntr-o locaie special (cache) ntr-un ciclu inserat, la reluarea buclei
eliminndu-se ciclurile suplimentare de inserare.
Deoarece patru instruciuni diferite sunt prelucrate simultan apar, totui
unele probleme care trebuiesc avute n vedere la realizarea aplicaiilor:
a)

Actualizarea indicatorului context

O instruciune care calculeaz adresa unui operand din registrele


generale de lucru prin intermediul registrului CP, de regul nu este capabil
s foloseasc noua valoare a registrului CP imediat dup ncheierea
instruciunii. Pentru a nu fi produse rezultate neateptate, este indicat ca
dup actualizarea registrului CP s urmeze mcar o instruciune care s nu
fac apel la registrele de uz general, ca n exemplul urmtor n scris n
assembler:
In
I n+1
I n+2

b)

SCXT CP,#0FC00h

MOV R0,#data

;selectarea unui nou context


;instruciuni de protecie
;instruciuni care folosesc noul context.

Actualizarea indicatorului paginii de date

O instruciune care calculeaz adresa unui operand prin intermediul


registrelor DPP, de regul nu este capabil s foloseasc noua valoare a
registrelor DPP imediat dup ncheierea instruciunii. Pentru a nu fi produse
rezultate neateptate, este indicat ca dup actualizarea registrelor DPP s
urmeze mcar o instruciune care s nu foloseasc pentru adresare indirect
sau lung registrele DPP, ca n exemplul urmtor n scris n assembler:
In
In+1
In+2

c)

MOV DPP0,#4

MOV DPP0:0000h,R0

;selecteaz pagina 4 date


;instruciuni de protecie
;mut coninutul registrului general R0 la adresa
;010000h (n pagina de date 4).

Actualizarea explicit a indicatorului stivei


Nici una din instruciunile RET, RETI, RETS, RETP sau POP nu este

capabil s foloseasc noua valoare a registrului SP imediat dup actualizarea


acestuia. Pentru a nu fi produse rezultate neateptate, este indicat ca dup
actualizarea explicit a registrului SP s urmeze mcar o instruciune care s
nu foloseasc stiva, ca n exemplul urmtor n scris n assembler:
In
I n+1
I n+2

MOV SP,#0FA40h

POP,R0

d)

Controlul ntreruperilor

;selecteaz vrful stivei


;instruciuni de protecie
;ncarc registrul general R0 cu valoarea aflat
;n vrful stivei.

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

;inactivare general ntreruperi


;instruciune intreruptibil
;instruciune neinteruptibil

Familia de microcontrolere 80C16x _____________________________________________ 56

BSET IEN

I n+k
I n+k+1
I n+k+2

e)

;revalidare ntreruperi
;instruciune neinteruptibil
;instruciune intreruptibil

Iniializarea porturilor de intrare-ieire

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

;seteaz pinul P7.5 ca ieire;


;mod eronat de setare a portului P3

BSET DP7.5
NOP
BSET P7.0

;seteaz pinul P7.5 ca ieire;


;sau alt instruciune care nu afecteaz P3
;mod corect de setare a portului P3

Corect:
In
In+1
In+2

f)

Schimbarea configuraiei sistemului

Instruciunile care urmeaz unei comenzi de schimbare a configuraiei


sistemului prin intermediul registrelor SYSCON, BUSCON i ADDRSEL (de
exemplu segmentri, mrime stiv, alocare memorie intern, caracteristici
memorie adresat etc.) nu pot utiliza imediat resursele definite. Ca regul
obligatorie, accesul codului de la noua zon ROM este posibil numai dup
executarea unui salt absolut n zona respectiv.
1.14.2
Timpul de execuie al instruciunilor
De regul, timpul de execuie al unei instruciuni depinde de unde este
adus instruciunea i, eventual, de unde sunt citii sau scrii operanzii. Modul
cel mai rapid de lucru permis de circuitul 80C167 este atins dac programul
este nregistrat n memoria ROM intern. n acest caz, majoritatea
instruciunilor sunt executate ntr-un ciclu main care, oricum, este timpul
minim de execuie al unei instruciuni.
Accesul la memoria extern nu ncetinete excesiv lucrul circuitului,
ntruct interfaa cu magistrala extern care controleaz dispozitivele externe
lucreaz n paralel cu unitatea central.
De asemenea, durata de execuie a programelor din memoria extern
mai este influenat de modelul magistralei externe, timpii de ateptare
programai etc.
Cteva instruciuni ale circuitului 80C167 au, prin definiie, o vitez mai
mic de execuie; acestea sunt: unele tipuri de salturi, nmulirea, mprirea
i o instruciune special de mutare.
Orientativ, n tabelul 2.3. sunt prezentai timpii de execuie (n ns)
pentru un microcontroler cu ceas de 20 MHz.
Zona memorie
ROM intern
RAM intern
Bus demultiplexat 16 bii
Bus multiplexat 16 bii

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

57 ________________________________________Aplicaii cu microcontrolere de uz general


Bus demux. 8 bii
200
400
200
200
Bus multiplexat 8 bii
300
600
300
300

Funcie de modul de dezvoltare al unei aplicaii, ncrcarea programului


din memoria RAM intern ofer flexibilitate n sensul modificrilor necesare
pentru punerea la punct a aplicaiei, n timp ce, ncrcarea codului din
memoria ROM intern este recomandat n final, dup ce aplicaia a fost pus
la punct.
Pentru a obine o durat minim, trebuie evitat folosirea urmtoarelor
instruciuni:
citirea operanzilor din memoria ROM intern;
citirea operanzilor din memoria RAM intern prin intermediul unor
instruciuni de adresare indirect;
citirea operanzilor din SFR imediat dup scrierea lor;

utilizarea operanzilor din memoria extern;


salturi condiionale imediat dup scrierea registrului de stare PSW;

salturi la adrese nealiniate din memoria ROM intern.

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

nu pot fi adresate direct dar pot fi modificate prin intermediul


instruciunilor de salt;
registrele PSW, SP i MDH nu pot fi modificate explicit prin program dar,

implicit, sunt actualizate de instruciunile executate.


Atenie! Orice scriere a unui octet dintr-un registru SFR terge octetul
complementar neadresat.
Biii SFR rezervai nu pot fi citii. La citire vor avea ntotdeauna
valoarea 0h.
Modificarea prin program a unui registru SFR este prioritar fa de
o actualizare simultan datorat modulelor interne.
a)

Registrul de configurare a sistemului (SYSCON)

Acest registru, adresabil la nivel de bit, asigur configurarea general i


a funciilor de control ale sistemului. Valoarea la iniializare a registrului
depinde de starea pinilor portului P0 i a semnalului EA la momentul
respectiv. Structura registrului SYSCON este prezentat n tabelul 2.4.

XPER-SHARE

VISIBLE

WRCFG

CLKEN

BYTDIS

ROMEN

STKSZ

SGTDIS

SYSCON
(FF12h)

ROMS1

Familia de microcontrolere 80C16x _____________________________________________ 58


Tabelul 1.17

Selecteaz mrimea stivei sistem ntre 32 i 1024 cuvinte.


0h:
memoria ROM intern este n segmentul 0 (000000h007FFFh);
ROMS1
1h:
memoria ROM intern este n segmentul 1 (010000h017FFFh).
0h:
segmentarea este validat (CSP este salvat n stiv);
SGTDIS
1h:
segmentarea este invalidat (CSP nu este salvat n stiv).
0h:
memoria ROM intern dezafectat;
ROMEN
1h:
memoria ROM intern validat.
0h:
pinul BHE validat;
BYTDIS
1h:
pinul BHE (P3.12) poate fi folosit ca intrare-ieire de uz general.
0h:
pinul CLKOUT (P3.15) poate fi intrare-ieire de uz general;
CLKEN
1h:
pinul CLKOUT validat; pe pin se regsete semnalul ceas sistem.
0h:
pinii WR i BHE funcioneaz normal;
WRCFG
1h:
pinul WR se comport ca WRL iar BHE ca WRH.
0h:
accesul la perifericele X-BUS este fcut intern;
VISIBLE
1h:
accesul la perifericele X-BUS este vizibil pe pinii circuitului.
0h:
accesul extern la perifericele X-BUS este dezactivat;
XPERSHARE
1h:
accesul extern la perifericele X-BUS este permis n modul HOLD .
STKSZ

b)

Registrul de stare a procesorului (PSW)

Acest registru, adresabil la nivel de bit, indic starea curent a


circuitului. El conine dou grupuri de bii, unul descriind starea unitii
aritmetice iar cellalt controlnd sistemul de ntreruperi. Suplimentar, este
prezent i un bit, USR0, cu destinaie general. Structura registrului PSW este
prezentat n tabelul 2.5.

ILVL

IEN
HLDEN
USR0
MULIP
E

MULIP

USR0

ILVL

HLDEN

PSW
(FF10h)

IEN

Tabelul 1.18
E

Cmpul de patru bii ILVL (interrupt level) definete nivelul de prioritate


alocat procesorului, ntre 15 (cnd procesorul poate fi ntrerupt numai de o
ntrerupere nemascabil sau ntrerupere generat de o excepie hardware) i
0 (prioritatea cea mai mic poate fi ntrerupt de orice eveniment extern).
IEN=1h sau IEN=0h valideaz sau invalideaz global sistemul de
ntreruperi.
HLDEN=1h sau HLDEN=0h valideaz sau invalideaz semnalele de arbitrare
ale magistralei (BREQ, HLDA i HOLD). Dac bitul este ters, pinii
corespunztori (P6.7P6.5) pot fi utilizai ca intrri/ieiri de uz general.
Indicator de uz general la dispoziia programatorului.
0h:
nu exist nmulire/mprire n curs de execuie;
1h:
operaia de nmulire/mprire este ntrerupt.
Este setat dac operandul surs al unei instruciuni este egal cu numrul cel
mai mic (-8000h pentru cuvinte i 80h pentru octei).
Este setat dac rezultatul operaiei ALU este zero. Pentru operaii booleene
cu un singur operand, Z are valoarea negat a bitului respectiv, n timp ce
pentru operaii booleene cu doi operanzi capt valoarea SAU - NU - LOGIC a
celor doi bii.

59 ________________________________________Aplicaii cu microcontrolere de uz general


Pentru adunare, scdere i complementare fa de 2, V indic o depire a
domeniului maxim a numerelor cu semn (-8000h+7FFFh pentru cuvinte,
respectiv 80h7Fh pentru octei). Pentru nmuliri i mpriri V este setat
dac rezultatul nu poate fi reprezentat ca un cuvnt. Pentru operaii
booleene cu doi operanzi cnd capt valoarea SAU - LOGIC a celor doi bii. De
asemenea, V este utilizat pentru operaii de rotunjire pentru rotiri sticky bit,
dup cum urmeaz:
C
V
Rotunjire
0
0
Nu exist eroare de rotunjire.
0
1
Eroare de rotunjire < LSB.
1
0
Eroare de rotunjire = LSB.
1
1
Eroare de rotunjire > LSB
Dup o operaie de adunare, C indic generarea unui transport al bitului cel
mai semnificativ al operandului (octet sau cuvnt). Dup o scdere sau
comparare, C indic un mprumut. Pentru deplasri sau rotiri, C are valoarea
ultimului bit deplasat. C este ntotdeauna ters dup operaii logice, nmuliri
sau mpriri, cu excepia unei operaii booleene cu doi operanzi cnd capt
valoarea I - LOGIC a celor doi bii.
Este setat dac cel mai semnificativ bit al rezultatului este 1h i ters n caz
contrar. Pentru operaii cu numere ntregi N poate fi interpretat ca bit de
semn. Pentru operaii booleene cu un singur operand, N are valoarea
anterioar a bitului respectiv, n timp ce pentru operaii booleene cu doi
operanzi capt valoarea SAU - EXCLUSIV a celor doi bii.

c)

Indicatorul de instruciuni (IP) i indicatorul segmentului de program


(CSP)
Registrul IP determin adresa pe 16 bii a instruciunii curente ncrcate

din segmentul adresat de CSP. IP nu se regsete n spaiul de memorie


adresabil i, deci, nu poate fi modificat direct de programator. Totui, IP
poate fi modificat, indirect, prin intermediul stivei sistem sau a unui salt.
Registrul CSP selecteaz care segment este utilizat mpreun cu IP
pentru ncrcarea instruciunilor.
Structura celor dou registre este prezentat n tabelul 2.6.
Tabelul 1.19
IP
()

IP
Specific adresa curent din interiorul segmentului SEGNR.

IP
CSP
(FE08h)
SEGNR

SEGNR

Specific segmentul de cod de unde sunt ncrcate instruciunile. Dac


segmentarea este dezactivat, SEGNR este ignorat.

Adresa instruciunii este calculat prin extinderea celor 16 bii ai IP cu


2/4/8 bii ai CSP, funcie de modul de adresare selectat (figura 2.6).
n cazul lucrului cu memorie segmentat, biii pentru selectarea
segmentului de lucru (70/30/10) sunt generai pe pinii de adres
A23/A19/A17A16 ai portului P4 pentru toate apelurile la memoria extern.
Pentru lucrul cu memorie nesegmentat sau n modul Single Chip,
coninutul CSP este nesemnificativ, ntruct memoria extern este limitat
numai la segmentul 0, accesat numai prin IP.

Familia de microcontrolere 80C16x _____________________________________________ 60


Segm ent
15
CSP
0 15
IP
0
F FFF FF h

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

Figura 1.20. Generarea adresei cu IP i CSP

d)

Indicatorii paginilor de date (DPP0, DPP1, DPP2 i DPP3)

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

Specific pagina de date selectat de registrul DPPxPN. Dac segmentarea


este dezactivat, doar primii doi bii mai puin semnificativi sunt
reprezentativi.

Principiul de lucru al paginrii const n concatenarea primilor 14 bii ai


unei adrese indirecte sau ai unei adrese pe 16 bii cu coninutul registrului
DPPx selectat de primii 2 bii ai adresei. Aceast modalitate este prezentat
n figura 2.7.
Pagin date

A dres date 16 bii


15 14 13

1023

1022

D PP3 11

D PP2 10

D PP1 01

D PP0 00

A dres 14 bii n interiorul


paginii (concatenat cu
D PPn)

Figura 1.21. Generarea adresei cu DPP

61 ________________________________________Aplicaii cu microcontrolere de uz general

Atenie! n situaia lucrului cu memorie nesegmentat, doar primii doi bii ai


DPP sunt folosii pentru generarea adresei. n aceast situaie,
valoarea registrelor DPP trebuie modificat cu grij, pentru a nu se
produce rezultate nedorite.
e)

Indicatorul context (CP)

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

Specific adresa de baz a bancului de registre GPR curent.

Atenie! Programatorul trebuie s fie circumspect cu declararea valorii CP


astfel nct GPR s fie ntotdeauna n memoria RAM intern. Acest
fapt implic setarea CP n zona 00F600h00FDFEh.
Cteva moduri de adresare folosesc implicit CP pentru calcularea
adreselor. Acestea sunt:
Adresare pe 4 bii (mnemonic Rw sau Rb) specific o adres relativ la
locaia de memorie indicat de CP. Funcie de operand (cuvnt Rw,
respectiv octet Rb), numrul registrului GPR este sau nu nmulit cu 2
nainte de a fi adunat la coninutul CP (figura 2.8.).
Adres GPR
(4 bii)

CP

x2

RAM
intern

+
Acces
octet

Acces
cuvnt

GPR

Figura 1.22. Calculul adresei 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.

Familia de microcontrolere 80C16x _____________________________________________ 62

f)

Indicatorii stiv sistem (SP), depire superioar stiv (STKOV) i


depire inferioar stiv (STKUN)

Indicatorul stiv sistem este utilizat pentru specificarea adresei curente a


stivei sistem. Registrul SP este pre-decrementat cnd o dat este introdus n
stiv, respectiv post-incrementat cnd o dat este extras din stiv.
Deoarece bitul cel mai puin semnificativ este ters i biii 1512 sunt
setai de ctre circuit, SP aparine domeniului F000hFFFEh, n memoria RAM
intern. Prin program, cu ajutorul indicatorilor de depire STKOV i STKUN,
poate fi creat o stiv virtual, de dimensiuni mai mari.
Indicatorul depire superioar STKOV este comparat cu valoarea SP la
fiecare operaiune care implic folosirea
(SP)<(STKOV) este iniiat o ntrerupere.

stivei

i,

cazul

care

ntreruperea poate fi tratat n dou moduri:


eroare fatal, situaie n care este semnalat faptul c datele din partea
inferioar a stivei sunt compromise;
deplasarea automat a stivei de sistem pentru a permite folosirea stivei
sistem ca Stiv Cache. n acest caz, registrul STKOV trebuie iniializat cu o
valoare care reprezint noua adres curent a stivei sistem la care se
adaug 12 (cele ase cuvinte suplimentare adugate sunt necesare pentru
a preveni orice eroare care putea surveni datorit suprapunerii cu o
ntrerupere, pentru registrele salvate automat de ntrerupere, PSW, IP i
CSP).
Indicatorul depire superioar STKUN este comparat cu valoarea SP la

fiecare operaiune care implic folosirea


(SP)>(STKUN) este iniiat o ntrerupere.

stivei

i,

cazul

care

ntreruperea poate fi tratat n dou moduri, asemntor cu ntreruperea


generat de STKOV.
Atenie! Dac SP este modificat direct, prin intermediul unei instruciuni MOV
i noua valoare este n afara limitelor STKOVSTKUN, nu va fi
generat o ntrerupere.
Structura registrelor pentru controlul stivei sistem este descris n
tabelul 2.9.

Tabelul 1.22

63 ________________________________________Aplicaii cu microcontrolere de uz general


SP
SP
1
1
1
1
1
(FE12h)
STKOV
STKOV
1
1
1
1
1
(FE14h)
STKUN
STKUN
1
1
1
1
1
(FE16h)
SP
Specific adresa curent a stivei sistem.
STKOV
Specific limita inferioar a stivei sistem.
STKUN
Specific limita superioar a stivei sistem.

g)

Registrele pentru nmulire/mprire (MDH, MDL i MDC)


Registrele MDH (FE0Ch) i MDL (FE0Eh) formeaz mpreun un registru

de 32 de bii utilizat implicit de unitatea central pentru operaiile de


nmulire i mprire.
Dup nmulire, MDH conine octetul superior al rezultatului iar MDL pe
cel inferior.
Pentru mprire, MDH este ncrcat cu octetul superior iar MDL cu cel
inferior al dempritului. Dup mprire, MDH conine restul iar MDL ctul.
Registrul de control MDC (FF0Eh) este modificat de unitatea central pe
parcursul
operaiilor
de
nmulire/mprire.
Singurul
bit
accesibil
programatorului MDRIU (registru MD n uz MDC.4) se seteaz dup cum
urmeaz:
dac registrele MDL i MDC sunt modificate prin program sau o operaie de

h)

nmulire/mprire este n curs, indicatorul este setat;


dac registrele MDL i MDC sunt citite, indicatorul este ters.
Registrele constante (ZEROS i ONES)
Aceste registre au valorile setate prin hardware. Registrul ZEROS

(FF1Ch) are valoarea 00h n timp ce registrul ONES (FF1Eh) are valoarea FFh.

1.15. Interfaa cu magistrala extern (EBC)


Cu toate c circuitul 80C167 este nzestrat cu un set puternic de
periferice i memorii interne, acestea acoper numai o mic parte din spaiul
total de memorie de 16 MB. Rolul interfeei cu magistrala extern este tocmai
de a adresa periferice i memorii externe.
Funciile interfeei sunt asigurate de mai multe registre speciale i,
anume, SYSCON (prezentat la 1.14.3.a), BUSCONx (x=50), ADDRSELx
(x=40), precum i de o serie de pini dedicai sau cu funcii alternative
(porturile P0, P1, P3 i P4 i pinii ALE, RD, WR/WRL, BHE/WRH, EA, RSTIN i
READY).
Registrele BUSCON descriu ciclurile magistralei externe funcie de adrese
(multiplexate sau demultiplexate), date (16 bii sau 8 bii), selecie
dispozitive, sincronizarea cu circuitele externe (stri de ateptare, control
READY, ntrzieri ALE i RD/WR). Aceti parametri sunt folosii pentru
accesarea unei zone specifice de adrese definite prin registrul corespunztor
ADDRSEL. Astfel, cele patru perechi BUSCON/ADDRSEL permit accesarea a

Familia de microcontrolere 80C16x _____________________________________________ 64

patru ferestre de adrese independente, n timp ce controlul accesului n afara


acestor zone este realizat de registrul BUSCON0.
Dac circuitul este singular, fr alte dispozitive externe, la iniializare
pinul EA trebuie s fie n starea 1 LOGIC . n aceast situaie, orice acces la
dispozitivele externe genereaz o ntrerupere datorit excepiei ILLBUS.
1.15.1
a)

Modurile de lucru ale magistralei externe

Magistral multiplexat

n modul multiplexat, adresa pe 16 bii din segmentul curent i datele


folosesc portul P0. Adresele i datele sunt multiplexate n timp, fiind separate
n exterior. Registrul de separare are o lime dictat de mrimea magistralei
de date (poate fi de 8 bii sau 16 bii). Adresele superioare, An A16 sunt
extrase n permanen pe portul P4; ele nu sunt multiplexate i nu necesit
registre de separare.
Interfaa cu magistrala extern iniiaz un acces extern prin generarea
semnalului ALE; frontul cztor al ALE comand un registru extern de 16 bii
pentru capturarea adresei. Dup o perioad de timp programabil, adresa
este nlturat de pe magistral. Acum, interfaa cu magistrala extern
activeaz un semnal de comand (RD, WR, WRL sau WRH). Datele sunt
introduse pe magistral fie de EBC (pentru cicluri de scriere), fie de
dispozitivele externe (pentru cicluri de citire). Dup o perioad de timp
funcie de viteza circuitelor externe, datele de pe magistral sunt valide:
ciclu de scriere datele sunt ncrcate i semnalele de comand sunt
dezactivate; circuitul extern trece din nou n starea de nalt impedan;
ciclu de scriere semnalele de comand sunt dezactivate; datele rmn
valide pe magistral pn la un nou ciclu extern.
Diagrama de timp este prezentat n figura 2.9.a.
b)

Magistral demultiplexat

n modul demultiplexat, adresa n interiorul segmentului este pe portul


P1 iar datele folosesc portul P0 (pentru 16 bii) sau P0L (pentru 8 bii).
Magistrala superioar de adrese sunt extrase n permanen pe portul P4.
EBC iniiaz un acces extern prin plasarea adresei pe magistral. Dup o
perioad programabil, EBC activeaz semnalele de comand necesare (RD,
WR, WRL sau WRH). Datele sunt introduse pe magistral fie de EBC (pentru
cicluri de scriere), fie de dispozitivele externe (pentru cicluri de citire). Dup
o perioad de timp funcie de viteza circuitelor externe, datele de pe
magistral sunt valide:
ciclu de scriere datele sunt ncrcate i semnalele de comand sunt
dezactivate; circuitul extern trece din nou n starea de nalt impedan;
ciclu de scriere semnalele de comand sunt dezactivate; datele rmn
valide pe magistral pn la un nou ciclu extern.
Diagrama de timp este prezentat n figura 2.9.b.

65 ________________________________________Aplicaii cu microcontrolere de uz general

c)

Comutarea ntre tipurile de magistral

EBC permite schimbarea dinamic a tipului magistralei, de exemplu n


cazul a dou cicluri externe consecutive. Unele zone de adrese pot folosi
magistrale multiplexate sau demultiplexate, precum i diferii timpi de
ntrziere, semnale de control READY etc. Schimbarea dinamic a magistralei
externe poate fi fcut n dou moduri:
Reprogramarea registrelor BUSCON i ADDRSEL permite fie schimbarea
tipului de magistral pentru o anumit zon de memorie, fie schimbarea
dimensiunii zonei de memorie unde este aplicabil tipul respectiv de
magistral. Reprogramarea permite folosirea unui numr de ferestre cu
parametri diferii mai mare dect cele disponibile prin BUSCONx.

Comutarea ntre ferestre diferite selecteaz automat tipul de magistral


asociat ferestrei respective. Ferestrele de adrese predefinite permit
folosirea diferitelor modaliti de lucru, fr a exista suprapuneri i avnd
numrul limitat la numrul de BUSCONx.
Portul P1 va furniza adresa din interiorul segmentului, chiar dac

BUSCONx seteaz o magistral demultiplexat. Aceasta permite folosirea unui


decodificator extern conectat la portul P1 pentru toate tipurile de magistral.
Folosirea seturilor BUSCON/ADDRSEL este controlat prin intermediul
adreselor rezultate. Cnd este iniiat un acces (instruciuni sau date), adresa
fizic generat definete, dac accesul este fcut intern, folosirea unei
ferestre definite de ADDRSEL41 sau folosirea configuraiei implicite din
BUSCON0. Dup iniializarea registrelor active, sunt selectate i evaluate
automat prin interpretarea adresei fizice. Nu sunt necesare comutri sau
selecii suplimentare pe durata execuiei programului, cu excepia utilizrii
unui numr mai mare de ferestre fa de cel implicit.
Atenie! Nu trebuie schimbat niciodat configurarea zonei de memorie care
asigur instruciunile curente. Datorit stivei de instruciuni, este
dificil de determinat care instruciune va folosi noua configurare.
Un caz particular de comutare a tipului de magistral const n trecerea
la magistral demultiplexat la magistral multiplexat (figura 2.9.c).
Ciclul de magistral pornete prin activarea ALE i generarea adresei pe
porturile P4 i P1. ntruct n modul multiplexat este necesar prezena
adresei i pe portul P0, aceasta va fi furnizat cu o ntrziere de un ciclu
main care are ca efect ntrzierea ciclului de magistral multiplexat i
mrete durata semnalului ALE. Timpul suplimentar este necesar pentru ca
dispozitivul exterior selectat
elibereze magistrala de date.

anterior

pe

magistrala

demultiplexat

Familia de microcontrolere 80C16x _____________________________________________ 66


Ciclu magistral
Segment (P4)

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

Figura 1.23. Modurile de lucru ale magistralei

d)

Dimensiunea magistralei externe de date

EBC poate lucra att cu periferice de 8 bii, ct i cu periferice de 16 bii.


O magistral de 16 bii folosete portul P0, n timp ce magistrala de 8 bii
folosete

P0L.

Aceast

procedur

elimin

registrele,

bufferele

decodificatoarele suplimentare, conducnd i la o scdere a timpului de


execuie.

67 ________________________________________Aplicaii cu microcontrolere de uz general

De asemenea, EBC poate controla accesul pe magistrala de 8 bii a


cuvintelor (16 bii), respectiv acces pe magistral de 16 bii a octeilor:
pentru accesul pe magistral de 8 bii, cuvintele sunt mprite n dou
accese succesive. Primul este accesat octetul inferior, apoi cel superior.
Asamblarea celor doi octei este transparent pentru utilizator, ea intrnd
n sarcina EBC;
accesul unui octet pe o magistral de 16 bii necesit utilizarea semnalelor
BHE (byte high enable) pentru octetul superior, respectiv A0 pentru
octetul inferior. Astfel, cei doi octei ai memoriei pot fi validai
independent fiecare fa de cellalt sau mpreun, pentru accesul
cuvintelor.
Pentru scrierea unui octet la un periferic extern care are o singur
intrare de selecie CS i dou validri pentru scriere WR pentru cei doi octei,
EBC poate genera direct aceste dou semnale, eliminnd circuitul extern
pentru combinarea semnalului WR cu A0 i ALE. n acest caz WR servete ca
WRL (write low byte) iar BHE ca WRH (write high byte). Acest mod de lucru
pentru WR i BHE este setat de bitul WRCFG din registrul SYSCON.
Citirea unui octet pe o magistral de 16 bii se face prin accesarea de
ctre 80C167 a ntregului cuvnt, ulterior nlturnd octetul de prisos. Totui,
trebuie avut grij n situaia citirii dispozitivelor care i schimb starea n
timpul citirii, de exemplu registre FIFO, registre de ntreruperi etc. n acest
caz octeii trebuiesc citii folosind semnalele BHE i A0.
Caracteristicile sistemului n situaia utilizrii celor patru combinaii de
tipuri de magistral i limi a magistralei de date sunt prezentate n tabelul
2.10.
Tabelul 1.23
Mod magistral
8 bii, multiplexat
8 bii, demultiplexat
16 bii, multiplexat
16 bii, demultiplexat

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

Registru, buffer 8 bii


Buffer 8 bii
Registru, buffer 16 bii

P1
P0H
P1

Generarea segmentului de adrese

Pe durata adresrilor externe, EBC genereaz un numr programabil de


linii de adrese pe portul P4, pentru a extinde adresele de pe porturile P0
i/sau P1, aceasta conducnd la creterea spaiului adresat.
Numrul de linii pentru adresarea segmentului este ales la iniializare i
este codificat n cmpul de bii SALSEL din registrul RP0H. Semnificaia biilor
SALSEL este prezentat n tabelul 2.11.

SALSEL
00
01
10

Linii adres segment


A19A16

A23A16

Tabelul 1.24
Spaiu memorie direct adresabil
1 MB
64 kB (minim)
16 MB (maxim)

Familia de microcontrolere 80C16x _____________________________________________ 68


11
256 kB (implicit)
A17A16

f)

Generarea semnalelor de selecie

Pe durata adresrilor externe, EBC genereaz un numr de linii pentru


selecia circuitelor externe CS (chip select) pe portul P6 care permit
selectarea direct a perifericelor externe sau a bancurilor de memorie, fr a
mai necesita un decodificator extern.
Numrul de linii CS este ales la iniializare i este codificat n cmpul de
bii CSSEL din registrul RP0H. Semnificaia biilor CSSEL este prezentat n
tabelul 2.12.
Tabelul 1.25
CSSEL
00
01
10
11

Linii CS
CS2CS0
CS1CS0

CS4CS0

Observaii

Pinii portul P6 liberi pentru IO


Implicit

Ieirile CSx sunt asociate cu registrele BUSCONx i devin active (nivel 0


LOGIC )

pentru orice acces n zona definit de ADDRSELx. Pentru orice acces n

afara ferestrei respective, CSx devine inactiv (nivel 1 LOGIC ).


Semnalele CS opereaz n patru moduri definite de biii CSWENx i
CSRENx din registrele BUSCON1 4, ca n tabelul 2.13.
CSWEN

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.

n concluzie, EBC suport multe configuraii pentru circuitele externe.


Prin creterea numrului liniilor de adres segment, 80C167 poate adresa
liniar un spaiu de 256 kB, 1 MB sau 16 MB. Acest lucru permite folosirea unui
numr mare de circuite de memorie, permind, de asemenea i adresarea
unui mare numr de periferice, fiind obligatorie utilizarea unor decodificatoare
externe.
Liniile CS ale circuitului permit adresarea direct a dispozitivelor externe,
fr a mai fi necesare decodificatoare.
Aceste faciliti permit creterea performanelor sistemului. De exemplu,
folosind 4 linii de adres segment i 5 linii CS, se pot adresa 5 bancuri de
memorie de 1 MB, fr nici un circuit extern.

69 ________________________________________Aplicaii cu microcontrolere de uz general

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)

Controlul semnalului ALE


Lungimea semnalului ALE i timpul de meninere a adresei pe magistral

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

Figura 1.24. Controlul lungimii ALE

b)

Stri de ateptare

Circuitul 80C167 permite ajustarea ciclurilor EBC pentru a se ncadra n


cerinele cerute de timpul de acces mai mare al dispozitivelor externe. Aceste
stri de ateptare semnific timpul total cu care este ntrziat apariia pe
magistral a datelor fa de adrese. ntrzierea poate fi programat de
cmpul de bii MCTC din BUSCONx n 0 15 incremente de 50 ns (pentru
frecvena ceasului sistem de 20 MHz).
Dac accesul extern este necesar instruciunii curente, procesorul va
atepta ntr-o stare inactiv.

Familia de microcontrolere 80C16x _____________________________________________ 70

Diagrama de timp a procedurii este descris n figura 2.11.


Ciclu normal
Segment
(P4)
A LE
Bus (P0)

A dr.

Date/Instr

A dr.

D ate

RD

Bus (P0)
WR

Cicluri ateptare

Figura 1.25. Inserare stri de ateptare

c)

Programarea intervalului de nalt impedan

Timpul de nalt impedan este definit ca intervalul dup care


dispozitivul extern (periferic, memorie etc.) elibereaz magistrala de date
dup dezactivarea semnalului RD, conform figurii 2.12.
Ciclu normal
Segment
(P4)
A LE
Bus (P0)

A dr.

Date/Instr

RD
Ciclu ateptare

Figura 1.26. Inserare stri de ateptare

Aceast procedur este necesar pentru dispozitivele externe care i


comut prea lent starea magistralei lor de date, din ieire n nalt impedan.
Pe timpul acestei ntrzieri, unitatea central nu este inactiv.
Aceast ntrziere este setat funcie de bitul MTTC al registrului
BUSCONx.
d)

ntrzierea semnalelor RD i WR

Programatorul are posibilitatea ajustrii comenzilor de scriere i citire


pentru a ine cont de necesitile dispozitivelor externe. Controlul ntrzierii
semnalelor RD i WR stabilete intervalul ntre frontul cztor al ALE i frontul
cztor al semnalului respectiv de comand. Cu aceast ntrziere validat,
diferena ntre cele dou fronturi cztoare este de 25 ns (pentru frecvena
ceasului sistem de 20 MHz). Procedura este descris n figura 2.13.
ntrzierea semnalelor RD/WR nu mrete durata ciclului de acces i, n
general nu ncetinete unitatea central. Oricum, pentru magistrala
multiplexat, driverul unui circuit extern poate intra n conflict cu adresele

71 ________________________________________Aplicaii cu microcontrolere de uz general

80C167 dac este folosit un semnal RD normal. De aceea, modul multiplexat


trebuie programat ntotdeauna cu semnale RD/WR ntrziate. Controlul acestei
proceduri este realizat de bitul RWDC din registrul BUSCONx.
Ciclu normal
Segment
(P4)
A LE
Bus (P0)

Date/Instr

RD
Bus (P0)
WR

Figura 1.27. Inserare stri de ateptare semnale RD/WR

e)

Controlul semnalului READY

n situaii n care strile de ateptare nu sunt suficiente sau cnd timpul


de rspuns al dispozitivului extern nu este constant, circuitul 80C167 asigur
cicluri EBC care sunt terminate (sincron sau asincron) prin intermediului
semnalului READY. n acest caz, unitatea central insereaz mai nti un
numr de cicluri de ateptare (07) dup care intr n mod inactiv, ateptnd
ca semnalul READY s devin activ.
Funcionarea n acest mod este programat prin bitul RDYEN din registrul
BUSCONx. n acest caz, din cmpul de bii MCTC utilizat pentru definirea
numrului de cicluri de ateptare au urmtoarea destinaie:
MCTC.20 stabilesc numrul de stri de ateptare;

MCTC.3

definete modul sincron sau asincron(MCTC.3=1, respectiv 0).

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

Alte proprieti ale magistralei, cum ar fi modul de formare a semnalelor


selecie, folosirea READY, lungimea ALE, modul multiplexat sau

demultiplexat, ntrzierea semnalelor RD/WR, timpii de ntrziere etc., sunt


condiionate de registrele BUSCON04. Patru din aceste registre dispun de un
registru de selecie a adresei ADRSEL14 care permit definirea a patru zone
de adres i caracteristici specifice ale magistralei n aceste ferestre. Pentru

Familia de microcontrolere 80C16x _____________________________________________ 72

spaiul de memorie neocupat de aceste patru registre, controlul este asigurat


de BUSCON0.
a)

Registrele pentru controlul magistralei (BUSCON04, ADDRSEL14)


Cele

patru

perechi

de

registre

BUSCON41/ADDRSEL41

permit

definirea a patru zone separate de adrese n spaiul de memorie al circuitului


80C167. n fiecare din aceste zone, accesul extern poate fi controlat n unul
din cele patru moduri de funcionare ale magistralei.
Fiecare registru ADDRSEL utilizeaz n fereastra definit parametrii EBC
definii de registrul BUSCON asociat. n afara ferestrelor definite de ADDRSEL,
opereaz parametrii determinai de BUSCON0.
Structura registrelor este prezentat n tabelul 2.14.

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

ALECTL4 ALECTL3 ALECTL2 ALECTL1 ALECTL0

BUSACT4 BUSACT3 BUSACT2 BUSACT1 BUSACT0

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

Setare adres de start fereastr.


Selectare mrime fereastr.

RGSZ

73 ________________________________________Aplicaii cu microcontrolere de uz general

b)

Registrul de control la iniializare (RP0H)

Acest registru stabilete numrul de semnale generate de 80C167


utilizate pentru selectarea circuitelor externe, precum i pentru generarea
adresei segmentului.
Registrul RP0H nu poate fi schimbat prin program, dar citirea sa ofer
informaii referitoare la configurarea sistemului.
Structura registrului este prezentat n tabelul 2.15.
Tabelul 1.28
RP0H
(F108h)
X
SALSEL
CSSEL

CSSEL

Configurare periferice X-BUS. Rezervai pentru periferice X-BUS.


Selectarea liniilor de adres pentru segment. Descris la 1.15.1.e).
Selectarea semnalelor CS. Descris la 1.15.1.f).

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;

portul P1 (dac a fost utilizat pentru adrese) conine ultima adres

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

Familia de microcontrolere 80C16x _____________________________________________ 74

dispozitivele externe prin intermediul acelorai linii ale magistralei EBC. n


acest timp, circuitul 80C167 secundar i poate continua programul dar fr a
mai avea acces la magistrala extern.
Dac procesorul secundar solicit un acces la magistrala sa extern
ocupat de un alt procesor principal, solicit accesul la magistrala proprie prin
intermediul semnalului BREQ.
Arbitrarea magistralei externe este validat prin setarea bitului HLDEN
din registrul PSW. Dac bitul este ters, 80C167 nu va rspunde la cererile
HOLD sosite de la alte procesoare principale.
a)

Cedarea magistralei
Accesul

la

EBC

este

cerut

prin

sosirea

semnalului

HOLD.

Dup

completarea ciclului curent al EBC (dac exist), elibereaz magistrala


extern i acord accesul prin emiterea semnalului HLDA. n timpul acestei
stri, 80C167 seteaz magistrala extern dup cum urmeaz:
liniile de adrese i date n nalt impedan;
ALE este inut n starea 0 LOGIC ;

liniile de comand RD,WR/WRH,BHE/WRH sunt inute n starea 1

liniile CSx sunt n starea 1

LOGIC

LOGIC ;

sau n nalt impedan.

Dac circuitul necesit acces la magistrala sa extern n acest mod,


activeaz cererea de magistral BREQ pentru a semnaliza circuitului de
arbitrare a magistralei. BREQ poate fi activat numai pe parcursul acestui mod.
b)

Preluarea magistralei

Magistrala extern este redat circuitului 80C167 prin trecerea liniei


HOLD n starea 1 LOGIC .
Funcie de logica de arbitrare, EBC poate fi returnat n dou
circumstane:
circuitul extern nu mai solicit resursele partajate ale sistemului i renun
din proprie iniiativ la acestea;
80C167 are nevoie s acceseze magistrala extern i o revendic prin
intermediul semnalului BREQ. Logica de arbitrare poate s decid sau nu
dezactivarea semnalului HLDA pentru a elibera magistrala, funcie de
prioritatea diferitelor activiti.
Diagramele de timp a protocolului de arbitrare a magistralei sunt
descrise n figura 2.12.a. i b.
1.15.6
Interfaa cu magistrala X-BUS
Circuitul 80C167 este nzestrat cu o interfa proprie care permite
legtura perifericelor interne, speciale sau la comand, cu unitatea central.
n prezent, interfaa X-BUS este apt s suporte pn la trei periferice
de acest tip.

75 ________________________________________Aplicaii cu microcontrolere de uz general


HOLD
HLDA
BRE Q
CSx
Alte
semnale
a. Cedarea magistralei
HOLD
HLDA
BRE Q
CSx
Alte
semnale
b. Obinerea magistralei

Figura 1.28. Arbitrarea magistralei externe

Pentru fiecare periferic este rezervat o zon de memorie controlat de


registrele XBCON i XADRS.
Perifericele X-BUS sunt adresate n mod
asemntor cu circuitele externe, pe 8 sau 16 bii, cu sau fr magistral
separat de adrese.

1.16. Sistemul de ntreruperi i registrele PEC


Arhitectura familiei 80C167 suport mai multe mecanisme pentru un
rspuns rapid i flexibil la cererile de servicii generate de surse variate,
interne sau externe.
Aceste mecanisme includ:
Tratarea normal a ntreruperilor unitatea central suspend execuia
programului curent i efectueaz un salt la o rutin de tratare a
ntreruperii. Starea curent a programului (IP, PSW i, dac este validat
segmentarea, CSP) este salvat n stiva sistem. O structur cu 16 nivele i

4 grupuri de prioritate ofer utilizatorului posibilitatea s stabileasc


ordinea n care sunt rezolvate cererile concomitente.
Tratarea ntreruperilor prin intermediul Controlerului de evenimente de la
periferice (PEC) rezid ntr-o manier mai rapid de a servi ntreruperile.
Declanat de o ntrerupere normal, PEC realizeaz transferul unui octet
sau cuvnt ntre dou locaii din segmentul sistem prin intermediul unuia
din cele 8 canale PEC disponibile. Avantajul acestei proceduri const n
eliminarea necesitii salvrii strii programului (IP, PSW i CSP) i n
viteza sa deosebit de ridicat: unitatea
programului curent numai un ciclu main.

central

oprete

execuia

Familia de microcontrolere 80C16x _____________________________________________ 76

Tratarea excepiilor (TRAP) este activat ca rspuns la condiiile speciale


care survin n timpul execuiei programului. Un caz special este generat de
ntreruperea extern nemascabil NMI. Excepiile hardware au ntotdeauna
cea mai mare prioritate, necesitnd reacia imediat a sistemului. Pot fi
generate i prin program prin intermediul instruciunii TRAP care permite

generarea unei ntreruperi software cu un vector specificat.


Tratarea ntreruperilor externe circuitul 80C167 permite conectarea la
sursele externe de ntrerupere prin intermediul unor intrri pentru
ntreruperi rapide, standard sau nemascabile. Cu excepia ntreruperii
nemascabile i a resetului, toate celelalte intrri sunt funcii alternative ale
porturilor de intrare-ieire.

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

77 ________________________________________Aplicaii cu microcontrolere de uz general

compuse dintr-o rdcin care specific sursa i un sufix care specific


destinaia (IR cerere de ntrerupere, respectiv IE validare ntrerupere).
Ultimele patru locaii din tabel sunt destinate perifericelor X-BUS. n
situaia n care nu exist astfel de periferice conectate, locaiile respective pot
fi folosite ca surse de ntreruperi software.
Sursa ntreruperii
sau cererii PEC
Registru CAPCOM 0
Registru CAPCOM 1
Registru CAPCOM 2
Registru CAPCOM 3
Registru CAPCOM 4
Registru CAPCOM 5
Registru CAPCOM 6
Registru CAPCOM 7
Registru CAPCOM 8
Registru CAPCOM 9
Registru CAPCOM 10
Registru CAPCOM 11
Registru CAPCOM 12
Registru CAPCOM 13
Registru CAPCOM 14
Registru CAPCOM 15
Registru CAPCOM 16
Registru CAPCOM 17
Registru CAPCOM 18
Registru CAPCOM 19
Registru CAPCOM 20
Registru CAPCOM 21
Registru CAPCOM 22
Registru CAPCOM 23
Registru CAPCOM 24
Registru CAPCOM 25
Registru CAPCOM 26
Registru CAPCOM 27
Registru CAPCOM 28
Registru CAPCOM 29
Registru CAPCOM 30
Registru CAPCOM 31
Timer T0
Timer T1
Timer T2
Timer T3
Timer T4
Timer T5
Timer T6
Timer T7
Timer T8
GPT 2 CAPREL
ADC complet
A/D eroare depire
ASC0 emisie
ASC0 buffer emisie
ASC0 recepie
ASC0 eroare
SSC emisie

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

Familia de microcontrolere 80C16x _____________________________________________ 78


SCRIR
SCRIE
SCRINT
SSC recepie
0000B8h 2Eh
SCEIR
SCEIE
SCEINT
SSC eroare
0000BCh 2Fh
PWMIR
PWMIE
PWMINT
0000FCh 3Fh
Canal PWM 0...3
XP0IR
XP0IE
XP0INT
Periferic X-BUS 0
000010h 40h
XP1IR
XP1IE
XP1INT
Periferic X-BUS 17
000104h 41h
XP2IR
XP2IE
XP2INT
Periferic X-BUS 2
000108h 42h
XP3IR
XP3IE
XP3INT
Periferic X-BUS 3
00010Ch 43h

Sistemul de ntreruperi este controlat global de registrul PSW (descris n


paragraful 1.14.3.b). Suplimentar, fiecare din cele 56 de ntreruperi dein
propriul lor registru de control (numele este format dintr-o rdcin care
desemneaz sursa ntreruperii i sufixul IC interrupt control).
Structura celor 56 de registre este identic cu cea din tabelul 2.17.
Tabelul 1.30
IC
IR
IE

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.

Indicatorul IR este setat de hardware n momentul n care survine o


cerere de ntrerupere de la modul. Indicatorul este ters automat o dat cu
intrarea n rutina de tratare, cu excepia canalelor PEC la care cmpul COUNT
a fost decrementat pn la 00h. Aceasta declaneaz o ntrerupere normal
ca rspuns la transferul unui bloc complet de date de ctre PEC.
Cmpurile de bii ILVL i GLVL sunt folosite pentru arbitrarea
ntreruperilor i, eventual, pentru o arbitrare secundar n situaia unor cereri
cu aceeai prioritate sosite simultan.
Atenie! Toate ntreruperile cu aceeai prioritate trebuie s fie programate n
grupuri cu prioriti diferite.
Pentru ntreruperile servite de PEC, numrul canalului asociat este
derivat din cmpurile ILVL i GLVL. Astfel, programnd o surs cu prioritatea
15, sunt selectate canalele PEC7 4 n timp ce o prioritate 14 selecteaz
canalele PEC3 0 (numrul canalului PEC este determinat de cel mai puin
semnificativ bit al ILVL la care se adaug cei doi bii ai GLVL). n acest mod
cererile PEC simultane sunt tratate n ordinea prioritii, de la PEC7 la PEC0.
Tabelul 2.18 prezint lista excepiilor hardware i software, locaia
vectorilor asociai, numrul i prioritilor excepiilor.
ntreruperile software pot fi generate de la orice adres de vector, ntre
000000h i 0001FCh. Prioritatea ntreruperii software este cea definit de
cmpul de bii ILVL din registrul PSW (descris n paragraful 1.14.3.b).

Tip B

Tip A

RESET

79 ________________________________________Aplicaii cu microcontrolere de uz general


Tabelul 1.31
Locaie
Numr Prioritate
Indicator
Tip excepie
Vector
TFR
vector excepie excepie
Reset hardware
RESET
Reset software

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

Funcionarea canalelor Controlerului pentru evenimente de


la periferice (PEC)
Modulul PEC al circuitului 80C167 furnizeaz 8 canale pentru mutarea
unui octet sau cuvnt ntre dou locaii din segmentul 0. Acesta este cel mai
rapid rspuns posibil la un eveniment i, de regul, este suficient pentru
tratarea ntreruperii de la unele periferice (de exemplu interfeele seriale,
convertorul analog numeric etc.).
Fiecare canal este controlat de un registru de control/numrtor, PECCx
i de o pereche de indicatori, surs i destinaie, pentru transferul datelor,
SRPCx, respectiv DSTPx (source pointer, destination pointer).
Structura registrelor PECCx, identice ntre ele, este prezentat n tabelul
2.19.

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

indicatorii nu sunt modificai;


incrementeaz DSTPx cu 1 sau 2 (funcie de BWT );
incrementeaz SRCPx cu 1 sau 2 (funcie de BWT );
rezervat.
transfer 16 bii;
transfer 8 bii.

Familia de microcontrolere 80C16x _____________________________________________ 80


Destinat numrrii transferurilor PEC .
Coninutul cmpului COUNT stabilete aciunea canalului PEC : efectuarea
unui numr oarecare de deplasri, transfer continuu sau nici un transfer.
COUNT COUNT Indicator
Aciunea canalului PEC
COUNT
anterior modificat ntrerupere
FFh
FFh
0
Transfer continuu.
Numrul de transferuri stabilit de COUNT .
FEh02h FDh01h
0
Oprire servicii PEC; generare ntrerupere.
01h
00h
1
00h
00h
(1)
Nici o aciune.
DSTP0 00FCE2h DSTP4 00FCF2h SRCP0 00FCE0h SRCP4 00FCF0h
DSTP1 00FCE6h DSTP5 00FCF6h SRCP1 00FCE4h SRCP5 00FCF4h
DSTP2 00FCEAh DSTP6 00FCFAh SRCP2 00FCE8h SRCP6 00FCF8h
DSTP3 00FCEEh DSTP7 00FCFEh SRCP3 00FCECh SRCP7 00FCFCh
SRPCx i DSTPx specific locaiile ntre care datele vor fi transferate.

n mod normal, canalul PEC permite servirea unui numr specificat de


cereri pn cnd COUNT, prin decrementare, ajunge la valoarea 00h. n
aceast situaie este activat o ntrerupere specific numrului canalului PEC.
Transferul continuu este selectat dac valoarea COUNT este iniializat cu
FFh. n acest caz COUNT nu este decrementat i canalul PEC respectiv va
servi orice cerere pn cnd va fi dezactivat.
Cnd COUNT este decrementat de la 01h la 00h dup un transfer,
indicatorul de ntrerupere nu este ters, genernd o nou cerere de
ntrerupere de la aceeai surs.
Dac valoarea lui COUNT este 00h, canalul respectiv este inactiv, n
schimb este activat rutina de tratare asociat evenimentului. Aceasta
permite alegerea, dac o ntrerupere de nivel 15 sau 14 este tratat de PEC
sau de rutina de tratare.
Transferurile PEC sunt efectuate numai dac prioritatea lor este mai
mare dect prioritatea procesorului. Toate sursele de cereri de ntrerupere
trebuie s foloseasc fiecare canale PEC diferite, altminteri pentru cereri
simultane va fi efectuat un singur transfer.
Indicatorii surs i destinaie (SRCPx, respectiv DSTPx) desemneaz
locaiile ntre care datele sunt mutate. Fiecare pereche de indicatori este
asociat cte unuia din cele 8 canale PEC. Transferul datelor prin canalele
PEC nu folosete registrele DPP ntruct SRCPx i DSTPx sunt folosite numai
n interiorul segmentului zero.
Locaiile indicatorilor pentru canalele PEC neutilizate pot fi folosite
pentru pstrarea datelor, ca memorie RAM.
Atenie! Setarea transferului unui cuvnt (BWT=0) oblig respectivul canal
PEC s lucreze cu indicatorii surs i destinaie la adrese pare.
1.16.3
Prioritile sistemului de ntreruperi
ntreruperile propriu-zise i transferurile PEC pot fi validate, arbitrate i,
eventual, dac au ctigat arbitrajul, pot fi servite sau dimpotriv, pot fi
dezactivate, situaie n care cererea este neglijat i nu este servit.
Validarea i invalidarea ntreruperilor poate fi fcut prin trei mecanisme:

81 ________________________________________Aplicaii cu microcontrolere de uz general

Biii de control (IE) permit comutarea fiecrei surse de cereri, astfel


nct modulul respectiv poate emite o cerere de ntrerupere sau nu. De
asemenea, exist i posibilitatea validrii/invalidrii globale prin bitul IEN
din registrul PSW;

Nivelul de prioritate selecteaz automat un grup de ntreruperi care vor fi


recunoscute, neglijnd celelalte surse. Prioritatea unei surse care ctig
arbitrarea este comparat n permanen cu prioritatea unitii centrale
(biii ILVL din PSW), ntreruperea fiind servit numai dac are o prioritate
mai mare ca a unitii centrale. Un modul intern care are setat nivelul de
prioritate 0 va avea dezactivat ntreruperea.
Instruciunile ATOMIC i EXTend dezactiveaz automat toate cererile de

ntrerupere pe durata urmtoarelor 14 instruciuni.


Administrarea sistemului de ntreruperi se face prin crearea unor clase
de ntreruperi, clase care acoper un set de ntreruperi cu aceeai importan;
ntreruperile din aceeai clas nu trebuie s incomodeze una pe alta. Circuitul
80C167 realizeaz aceasta prin dou procedee:
Clase cu pn la 4 membri care folosesc acelai nivel de ntrerupere
(ILVL) dar sunt difereniate prin grupul de prioriti (GLVL). Aceasta este

funcionarea implicit a sistemului de ntreruperi;


Se pot realiza clase cu mai mult de 4 membri prin asocierea a dou nivele
de prioriti (ILVL), fiecare cu grupurile sale. Fiecare rutin de tratare a
ntreruperilor din interiorul acestei clase va seta nivelul unitii centrale la
un cel mai mare nivel de prioritate din clas. Toate cererile cu prioritate
egal sau mai mic vor fi omise, adic nici o ntrerupere a clasei definite
nu va fi servit.

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.

Familia de microcontrolere 80C16x _____________________________________________ 82

Circuitul 80C167 permite ca printr-o singur instruciune, SCXT, s


salveze toate registrele de lucru (GPR). Instruciunea nu salveaz n stiv cele
16 registre ci, pur i simplu, modific registrul CP care conine adresa de baz
a bancului GPR. Totui, celelalte registre utilizate eventual n subrutin
(DPPx, MDH, MDL etc.) trebuie salvate clasic, n stiva sistem.
1.16.5
Timpul de rspuns la ntrerupere
Timpul de rspuns la ntrerupere reprezint timpul ntre setarea unui
indicator de cerere a ntreruperii i momentul n care unitatea central d
controlul rutinei de tratare a ntreruperii.
Datorit modului de lucru al unitii centrale prin stiva de instruciuni,
nainte de a se da controlul rutinei de tratare, sunt executate instruciunile
prezente n stiv; n concluzie, timpul de execuie al acestora influeneaz
timpul de achitare al ntreruperii.
Timpul minim de rspuns este de 5 tacte (125 ns pentru procesor la 40
MHz) i este atins cu respectarea urmtoarelor condiii: instruciunile sunt
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 6 tacte (150 ns pentru procesor la
40 MHz).
Timpul de rspuns crete corespunztor pentru orice ntrziere produs
de instruciunea curent (N) sau cele dou anterioare (N-1 i N-2) executate
nainte de intrarea n rutin, cum ar fi:
dac instruciunea N modific registrul PSW i instruciunea N-1 a

actualizat indicatorii de stare, timpul de rspuns poate crete cu dou


tacte (50 ns);
dac instruciunea N citete un operand din memoria ROM intern, sau
dac este o instruciune de apel sau revenire din subrutin, excepie
software sau acces de tipul MOV Rn,[Rm+#Data16] , timpul de rspuns

poate crete cu dou tacte (50 ns);


condiiile interne ntre instruciunile N-2/N-1, N-1/N sau N impun o
modificare a registrelor PSW sau SP, timpul de rspuns poate crete cu un

tact (25 ns).


Cazul cel mai defavorabil este atins pentru 12 tacte (300 ns pentru
procesor la 40 MHz). n general, programatorul trebuie s evite urmtoarele:
ncrcarea instruciunilor din locaii externe;
citirea operanzilor din locaii externe;
scrierea rezultatului n locaii externe.
Problema este diferit n cazul folosirii canalelor PEC, modalitate care,
prin definiie, este mai rapid.
Timpul minim de rspuns este de 3 tacte (75 ns pentru procesor la 40
MHz) i este atins cu respectarea urmtoarelor condiii: instruciunile sunt

83 ________________________________________Aplicaii cu microcontrolere de uz general

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;

CAPIN intrarea captur a bancului de timere GPT2.

Pentru fiecare din aceti pini, declanarea ntreruperii sau transferului


PEC pot fi produse de tranziii ale semnalului de intrare fie pozitive, fie
negative, fie ambele.
Selectarea frontului este realizat ntr-un registru de control al
perifericului asociat portului respectiv. Prioritatea ntreruperii este
determinat de registrul de control al ntreruperii de la modulul respectiv iar
vectorul rutinei de tratare va fi cel prestabilit pentru modul.
Atenie! Pentru a putea fi folosit ca intrare de ntrerupere extern, pinii
trebuie setai ca intrri n registrul de control al portului respectiv.
n tabelul 2.20 sunt prezentai pinii porturilor care pot fi folosii ca surse
de ntreruperi externe, funciile de baz a pinilor i registrele de control.
Pin
P2.015
P8.07
P1H47
P7.47
P3.2
P3.5
P3.7

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

Cnd un pin CCxIO se folosete ca intrare de ntrerupere extern,


cmpul de bii CCMODx din registrul corespunztor CCx trebuie setat
corespunztor:
dac CCMODx=01h, ntreruperea este generat de un front cresctor pe
pinul CCxIO;

Familia de microcontrolere 80C16x _____________________________________________ 84

dac CCMODx=02h, ntreruperea este generat de un front descresctor pe


pinul CCxIO;

dac CCMODx=03h, ntreruperea este generat att de un front cresctor,


ct i descresctor pe pinul CCxIO.

n aceste trei cazuri coninutul timerului CAPCOM va fi pstrat n


registrul de captur CCx, indiferent dac timerul funcioneaz sau nu. Dac
indicatorul CCxIE este setat, este solicitat un transfer PEC sau o ntrerupere
cu vectorul CCxINT.
Pinii T2IN i T4IN pot fi utilizai pentru generarea unei ntreruperi
externe cnd timerele T2 sau T4 asociate sunt configurate n modul capturare
(cmpurile T2M sau T4M din T2CON, respectiv T4CON, sunt egale cu 03h).
Frontul activ al semnalului este determinat de cmpurile T2IR i T4IR
din registrele T2IC, respectiv T4IC:

front cresctor, pentru T2IR sau T4IR egali cu 01h;

front cresctor, pentru T2IR sau T4IR egali cu 02h;

ambele fronturi, pentru T2IR sau T4IR egali cu 02h.


n aceste trei cazuri, coninutul registrului timerului auxiliar T3 va fi

capturat n registrele T2 sau T4, funcie de tranziiile de pe pinii T2IN sau


T4IN. Dac indicatorii T2IE sau T4IE sunt setai, este solicitat un transfer
PEC sau o ntrerupere cu vectorii T2INT, respectiv T4INT.
Pinul CAPIN difer puin de ceilali pini de intrare de timer, el putnd fi
utilizat pentru generarea unei ntreruperi fr a afecta funciile perifericului.
Dac indicatorul T5SC din registrul T5CON este ters, funcia de captur a
registrului CAPREL nu este activ iar orice tranziie a semnalului pe pinul
CAPIN va seta indicatorul de ntrerupere CRIR din registrul CRIC.
Astfel, registrul CAPREL poate fi nc utilizat pentru rencrcarea
timerului T5 din bancul GPT2, n timp ce pinul CAPIN este folosit ca surs
extern de ntrerupere.
Cmpul CI din registrul T5CON stabilete modul de activare a ntreruperii
funcie de tranziia semnalului:
CI=01hntreruperea este generat de frontul cresctor;

CI=02hntreruperea este generat de frontul descresctor;

CI=03hntreruperea este generat de ambele fronturi.


n toate situaiile, dac bitul CRIE este setat, vor fi solicitate un transfer

PEC sau o ntrerupere cu vectorul CRINT.


Pinii de intrare descrii pn acum ca surse de ntreruperi externe sunt
testai la fiecare 200 ns de unitatea central, astfel nct evenimentele
externe sunt explorate i detectate la 200 ns (pentru procesor la 40 MHz).
Circuitul 80C167 dispune de ali 8 pini care pot fi utilizai ca surse de
ntrerupere extern, cu diferena c acetia sunt explorai la fiecare 25 ns,
chiar mai repede dect ntreruperile interne.

85 ________________________________________Aplicaii cu microcontrolere de uz general

Este vorba de 8 pini ai portului P2 (P2.8P2.15, funcii alternative


CC8IOCC15IO) care pot fi programai individual n acest mod de ntrerupere
rapid, de asemenea, putnd selecta tipul tranziiei semnalului. Registrul de
control al ntreruperilor externe EXICON este prezentat n tabelul 2.21.
Tabelul 1.34
EXICON
(F1C0)
EXIxE

EXI7E
00:
01:
10:
11:

EXI6E

EXI5E

EXI4E

EXI3E

EXI2E

EXI1E

EXI0E

ntreruperea extern inactiv; mod implicit;


ntrerupere pe front cresctor;
ntrerupere pe front descresctor;
. ntrerupere pe ambele fronturi.

Toate aceste ntreruperi externe folosesc canalele CC8CC15 i vectorii


lor de ntrerupere. Utilizarea pinilor respectivi pentru captur/comparare nu
mai este posibil, dar se pot folosi n continuare ca pini de intrare-ieire.
Atenie! Chiar dac ntreruperile de pe aceti pini sunt eantionate la 25 ns,
arbitrarea i prelucrarea ntreruperilor este fcut tot la 100 ns.
1.16.7
Excepii
Excepiile sunt tratate ca ntreruperi standard. Totui, excepiile ofer
posibilitatea ocolirii procesului de arbitrare a prioritii, procedur n care este
necesar o reacie imediat a sistemului. Excepiile sunt nemascabile i sunt
ntotdeauna prioritare fa de ntreruperile normale, indiferent de prioritatea
acestora. Circuitul 80C167 ofer dou astfel de mecanisme:
excepii hardware declanate de evenimente care apar n timpul
execuiei programului (acces ilegal la memorie, coduri inexistente etc.);
excepii software iniiate prin program.
a)

Excepiile software
Sunt iniiate de instruciunea TRAP care produce un apel prin program la

o rutin de tratare a ntreruperii. Numrul excepiei specificat ca operand al


instruciunii TRAP definete vectorul, de unde va fi executat saltul.
Execuia instruciunii TRAP produce un efect similar cu o ntrerupere
tratat de acelai vector cu deosebirea c nu este afectat nici un indicator de
ntrerupere.
b)

Excepiile hardware

Excepiile hardware sunt produse de erori sau stri specifice ale


sistemului care survin pe durata rulrii unui program i care nu pot fi
detectate n fazele anterioare de proiectare a aplicaiei. O excepie poate fi
generat i intenionat, de exemplu, pentru excepia UNDOPC (cod inexistent)
se pot emula instruciuni adiionale.
n momentul n care a fost detectat una din cele opt excepii posibile
pentru circuitul 80C167, unitatea central execut un salt la locaia
vectorizat pentru locaia respectiv. Funcie de excepie, instruciunea care a
cauzat-o poate fi terminat sau ignorat nainte de a se da controlul rutinei
de tratare a excepiei.

Familia de microcontrolere 80C16x _____________________________________________ 86

Excepiile hardware sunt nemascabile i au ntotdeauna prioritate fa de


orice alt activitate a unitii centrale. Dac n cursul aceluiai ciclu sunt
detectate mai multe excepii, va fi servit excepia cea mai prioritar
(prioritile excepiilor sunt prezentate n tabelul 2.18).
n mod automat sunt salvate n stiv registrele PSW, CSP (numai n mod
segmentat) i IP; nivelul ntreruperii unitii centrale din registrul PSW este
setat la maxim (15), dezactivnd celelalte eventuale ntreruperi.
Pentru a restaura starea unitii centrale, o rutin de tratare a unei
excepii trebuie ncheiat la fel ca o rutin de ntrerupere normal prin
instruciunea RETI.
Cele opt excepii hardware sunt mprite n dou clase dup cum
urmeaz:
Clasa A (prioritate II):
ntrerupere extern nemascabil (NMI);

depire inferioar stiv sistem (STKUF);

depire superioar stiv sistem (STKOF);

Clasa B (prioritate III):


cod instruciune nedefinit (UNDOPC);

instruciune protejat cu format incorect (PRTFLT);

acces cuvnt la adres impar (ILLOPA);

salt la adres impar (ILLINA);

acces ilegal la magistrala extern (ILLBUS).

Cele 8 excepii sunt administrate de 4 vectori de ntrerupere (000002h


NMI, 000010hSTKOF, 000018hSTKUF, 000028htoate excepiile din clasa
B), astfel nct pentru departajarea lor este folosit registrul TFR.
Structura registrului TFR (trap flag register), precum i semnificaia
fiecrui indicator sunt prezentate n tabelul 2.22.

NMI

STKOF

STKUF

UNDOPC

ILLBUS

ILLINA

ILLOPA

PRTFLT

UNDOPC

STKUF

STKOF

TFR
(FFACh)

NMI

Tabelul 1.35

Indicator setat de o tranziie descresctoare pe pinul NMI. Registrul IP,


salvat automat n stiv, conine adresa urmtoarei instruciuni.
Setat n momentul n care indicatorul stivei sistem este decrementat la o
valoare mai mic dect cea definit n registrul STKOV (descris la 1.14.3.f).
Pentru restabilirea sistemului n urma acestei excepii trebuie verificat spaiul
excedentar rmas n stiv (cel puin de dou ori cte 6 octei pentru
registrele IP, CSP i PSW). Altfel, soluia este executarea unei iniializri a
sistemului (instruciunea SRST).
Setat n momentul n care indicatorul stivei sistem este incrementat la o
valoare mai mare dect cea definit n registrul STKUN (descris la 1.14.3.f).
Setat dac instruciunea curent, decodificat de unitatea central, nu este o
instruciune valid. Registrul IP salvat n stiv conine adresa instruciunii
care a produs excepia. Rutina de tratare poate fi folosit pentru emularea
unor instruciuni neimplementate.

87 ________________________________________Aplicaii cu microcontrolere de uz general


Setat dac una din instruciunile speciale protejate este executat fr a
PRTFLT
respecta condiiile specificate. Instruciunile protejate sunt: DISWDT, EINIT,
IDLE, PWRDN, SRST i SRVWDT.
Setat n momentul n care este ncercat un acces (scriere sau citire) de
ILLOPA
operand pe 16 bii la o adres impar.
ILLINA
Setat dac este executat un salt la o adres impar.
Setat n condiiile n care fr a fi definit magistrala extern, exist o
ILLBUS
solicitare de acces la aceasta (ncrcare cod, scriere sau citire operanzi).

Atenie! Rutinele de tratare a excepiilor trebuie s tearg indicatorul din


registrul TFR.
Setarea prin program a unui indicator din registrul TFR are acelai
efect cu acela al unei setri hardware.
Iniializrile sistemului (reset, reset software i reset timer watchdog)
pot fi asimilate unor excepii cu nivel de prioritate I i vector la adresa
000000h. Aceste excepii au prioritatea cea mai mare i ntrerup orice alt
activitate a procesorului.
Excepiile din clasa A sunt urmtoarele ca prioritate. n situaia n care
survin simultan ntreruperi de clasa A, este stabilit intern urmtoarea
prioritate: NMI, SKTOF, STKUF.
Excepiile din clasa B sunt cel mai puin prioritare. Deoarece partajeaz
acelai vector de ntrerupere, cele cinci evenimente pot fi ordonate ca
prioritate numai prin rutina de tratare a excepiei.

1.17. Porturile de intrare-ieire


Circuitul 80C167 dispune de un numr de 111 linii de intrare-ieire
organizate dup cum urmeaz:
un port de 16 bii (portul P2);

opt porturi de 8 bii (porturile P0 format din P0L i P0H, P1 format din
P1L i P1H, P4, P6, P7 i P8);

un port de 15 bii (portul P3);

un port de 16 bii numai pentru intrri (portul P5).

Toate aceste linii pot fi utilizate ca intrri/ieiri de uz general controlate


prin program sau pot fi folosite de modulele interne ori interfaa cu magistrala
extern.
Toate liniile sunt adresabile la nivel de bit; toate liniile sunt programabile
individual ca intrri sau ieiri (cu excepia portului P5). Unele porturi (P2, P3,
P6, P7 i P8) pot fi programate individual ca ieiri push-pull sau cu dren n
gol.
Un set de registre speciale controleaz funcionarea porturilor de intrareieire:
P0L, P0H, P1L, P1H, P2, P3, P4,
registre de date;
P5, P6, P7, P8

DP0L, DP0H, DP1L, DP1H, DP2,


DP3, DP4, DP6, DP7, DP8

registre control direcie semnale;

Familia de microcontrolere 80C16x _____________________________________________ 88

registre control ieiri.

ODP2, ODP3, ODP6, ODP7, ODP8

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)

DP0L.0 P0H.0 P0L.0

DP0L.1 P0H.1 P0L.1

DP0L.2 P0H.2 P0L.2

DP0L.3 P0H.3 P0L.3

DP0L.4 P0H.4 P0L.4

DP0L.5 P0H.5 P0L.5

DP0L.6 P0H.6 P0L.6

P0L
(FF00h)

DP0L.7 P0H.7 P0L.7

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

89 ________________________________________Aplicaii cu microcontrolere de uz general

Registrul de date al portului P0L sau P0H bitul y.


0h:
linia P0X.y este intrare;
1h:
linia P0X.y este ieire.

Funciile alternative ale portului P0


Dac EBC este validat, portul P0 este folosit ca magistral de date sau
magistral
multiplexat
date/adrese.
Dac
interfaa
extern
este
demultiplexat pe 8 bii, portul P0H este disponibil pentru utilizare ca linii de
intrare-ieire.
De asemenea, portul este folosit pentru configurarea automat a
sistemului la iniializare. Astfel, iniial portul este configurat ca intrare i
fiecare linie este prevzut cu o rezisten intern pentru a asigura citirea
unor nivele 1 LOGIC . Utilizatorul, prin intermediul unor rezistene externe a
cror valoare trebuie stabilit funcie de specificaiile circuitului (aceste
rezistene pot rmne conectate permanent, fr a-i stnjeni funcionarea),
are posibilitatea de a selecta anumii pini care vor avea nivel 0 LOGIC .
La sfritul iniializrii, configuraia selectat va fi scris n registrul
BUSCON0 iar liniile portului P0H vor fi nregistrate n registrul RP0H. n final,
rezistenele interne sunt deconectate de la linii i portul P0 comut n modul
de funcionare setat.
n timpul accesrii magistralei externe n mod multiplexat, pe portul P0
sunt emise mai nti adresa din interiorul segmentului curent dup care portul
este comutat ca intrare i ateapt citirea datelor sau instruciunilor care
urmeaz. Pe durata ciclurilor de scriere, P0 genereaz nti adresa dup care
scrie octetul sau cuvntul.
Pe durata ciclurilor externe demultiplexate P0 citete instruciunile sau
datele care sosesc ori genereaz octei sau cuvinte de date.
Stabilirea direciei portului n situaia validrii EBC se face automat de
ctre hardware. n aceast situaie programul nu trebuie s execute scrieri
ctre acest port.
Structura i direcia pinilor portului P0 pentru funciile alternative sunt
prezentate n figura 2.15.
1.17.2
Portul P1
Cele dou porturi de 8 bii P1L i P1H reprezint jumtatea inferioar,
respectiv superioar a portului P1. 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 DP1L i DP1H.

Familia de microcontrolere 80C16x _____________________________________________ 90


P0H.7
D15
A15
AD15
P0H.6
D14
A14
AD14
P0H.5
D13
A13
AD13
P0H.4
D12
A12
AD12
P0H.3
D11
A11
AD11
P0H.2
D10
A10
AD10
P0H.1
D9
A9
AD9
P0H.0
D8
A8
AD8
P0L.7
D7
D7
AD7
AD7
P0L.6
D6
D6
AD6
AD6
P0L.5
D5
D5
AD5
AD5
P0L.4
D4
D4
AD4
AD4
P0L.3
D3
D3
AD3
AD3
P0L.2
D2
D2
AD2
AD2
P0L.1
D1
D1
AD1
AD1
P0L.0
D0
D0
AD0
AD0
Port de
Magistral
Magistral
Magistral Magistral
uz general 8 bii demux. 16 bii demux. 8 bii mux. 16 bii mux.

Figura 1.29. Funciile alternative ale portului P0

Structura registrelor de control ale portului P1 sunt prezentate n tabelul


2.24.

P1H
(FF06h)

DP1L
(F104h)

DP1H
(F106h)

P1X.y
DP1X.y

DP1H.0 DP1L.0 P1H.0 P1L.0

DP1H.1 DP1L.1 P1H.1 P1L.1

DP1H.2 DP1L.2 P1H.2 P1L.2

DP1H.3 DP1L.3 P1H.3 P1L.3

DP1H.4 DP1L.4 P1H.4 P1L.4

DP1H.5 DP1L.5 P1H.5 P1L.5

DP1H.6 DP1L.6 P1H.6 P1L.6

P1L
(FF04h)

DP1H.7 DP1L.7 P1H.7 P1L.7

Tabelul 1.37

Registrul de date al portului P1L sau P1H bitul y.


0h:
linia P1X.y este intrare;
1h:
linia P1X.y este ieire.

Funciile alternative ale portului P1


P1 este folosit ca magistral de adrese A0A15 n situaia utilizrii unei
magistrale externe demultiplexate.
Pinii P1H.74 pot fi folosii ca intrri de captur pentru modulele
CAPCOM. De asemenea, aceste patru linii sunt utilizabile ca intrri pentru
ntreruperi externe. Ca un efect colateral, posibilitatea capturrii unor intrri
poate fi folosit i dac portul este folosit ca magistral de adrese. Astfel,
unele modificri ale liniilor superioare de adrese pot fi detectate i declana
cereri de ntrerupere.
Pe durata accesrii magistralei externe, portul P1 este folosit numai ca
magistral de adrese. ns n aceeai situaie, dac accesul este multiplexat i

91 ________________________________________Aplicaii cu microcontrolere de uz general

nici un registru BUSCONx nu selecteaz o magistral demultiplexat, portul P1


poate fi folosit ca port de uz general.
Structura i direcia pinilor portului P1 pentru funciile alternative sunt
prezentate n figura 2.16.
P0H.7
P0H.6
P0H.5
P0H.4
P0H.3
P0H.2
P0H.1
P0H.0
P0L.7
P0L.6
P0L.5
P0L.4
P0L.3
P0L.2
P0L.1
P0L.0
Port de
uz general

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

Figura 1.30. Funciile alternative ale portului P1

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.10 DP2.10 P2.10

ODP2.11 DP2.11 P2.11

ODP2.12 DP2.12 P2.12

ODP2
(F1C2h)

ODP2.13 DP2.13 P2.13

DP2
(FFC2h)

ODP2.14 DP2.14 P2.14

P2
(FFC0h)

ODP2.15 DP2.15 P2.15

Tabelul 1.38

al portului P2 bitul y.
este intrare;
este ieire.
este ieire push-pull;
este ieire dren n gol.

Funciile alternative ale portului P2


Toate liniile portului P2 servesc i ca linii de intrare de captur sau linii
de ieire de comparare pentru modulul CAPCOM1 (CC0IOCC15IO).

Familia de microcontrolere 80C16x _____________________________________________ 92

Dac o linie a portului P2 este folosit ca o intrare de captur, starea


bistabilului de intrare, care reprezint starea pinului, este direcionat ctre
modulul CAPCOM.
Cnd o linie a portului P2 este folosit ca o ieire de comparare (pentru
modurile 1 i 3; detalii suplimentare n paragraful 1.21), ndeplinirea condiiei
afecteaz direct bistabilul de ieire al liniei.
n ambele situaii, utilizatorul are acces liber la pinii portului, chiar dac
sunt folosii ca intrri de captur. Dac programul intenioneaz s scrie
concomitent cu modulul de comparare, conform regulii generale are prioritate
scrierea software.
Toate liniile P2.0P2.15 pot fi utilizate ca intrri ntreruperi externe
standard iar P2.8P2.15 pot fi folosite ca intrri ntreruperi externe rapide
(EXxIN). De asemenea, P2.15 este ntrebuinat i ca intrare pentru timerul
T7 al modulului CAPCOM2 (T7IN).
Structura i direcia pinilor portului P2 pentru funciile alternative sunt
prezentate n figura 2.17.
P2.15
CC15IO
EX7IN
P2.14
CC14IO
EX6IN
P2.13
CC13IO
EX5IN
P2.12
CC12IO
EX4IN
P2.11
CC11IO
EX3IN
P2.10
CC10IO
EX2IN
P2.9
CC9IO
EX1IN
P2.8
CC8IO
EX0IN
P2.7
CC7IO
P2.6
CC6IO
P2.5
CC5IO
P2.4
CC4IO
P2.3
CC3IO
P2.2
CC2IO
P2.1
CC1IO
P2.0
CC0IO
Port de
I/O captur/comparare
Intrri
uz general
CAPCOM1
ntreruperi rapide

T7IN

Intrare timer
T7

Figura 1.31. Funciile alternative ale portului P2

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.0 DP3.0 P3.0

ODP3.1 DP3.1 P3.1

ODP3.2 DP3.2 P3.2

ODP3.3 DP3.3 P3.3

ODP3.4 DP3.4 P3.4

ODP3.5 DP3.5 P3.5

ODP3.6 DP3.6 P3.6

ODP3.7 DP3.7 P3.7

ODP3.8 DP3.8 P3.8

ODP3.9 DP3.9 P3.9

ODP3.10 DP3.10 P3.10

ODP3.11 DP3.11 P3.11

ODP3
(F1C6h)

DP3.12 P3.12

DP3
(FFC6h)

ODP3.13 DP3.13 P3.13

P3
(FFC4h)

DP3.15 P3.15

93 ________________________________________Aplicaii cu microcontrolere de uz general


Tabelul 1.39

al portului P3 bitul y.
este intrare;
este ieire.
este ieire push-pull;
este ieire dren n gol.

Funciile alternative ale portului P3


Liniile portului P3 au multiple utilizri care includ intrri/ieiri de control
i semnale pentru timere, cele dou interfee seriale,
sincronizare BHE/WRH i ieirea ceasului sistem CLKOUT.

semnalele

de

Dac funcia alternativ este configurat ca o intrare, citirea se face din


bistabilul de intrare care reflect starea pinului. Aceste funcii sunt: T0IN,
T2IN, T3IN, T4IN (intrri de numrare timere T0, T2, T3 respectiv T4),
T3EUD (intrare de numrare sus/jos timer T3), CAPIN (intrare captur GPT2)
i RxD0 (recepie ASC0).
Cnd funcia alternativ este o ieire, semnalul este trecut printr-o
poart I - LOGIC cu ieirea portului. Acest lucru implic programatorului setarea
liniei ca ieire (DP3.y=1) i apoi setarea pinului (P3.y=1). Semnalele de
ieire care folosesc portul P3 sunt: T3OUT (ieire timer T3), T6OUT (ieire
timer T6), TxD0 (emisie ASC0), BHE/WRH (octet superior valid/scriere octet
superior) i CLKOUT (ceas sistem).
Semnalele MRST (emisie SSC), MTSR (recepie SSC) i SCLK (ceas
transmisie SSC) sunt semnale att de intrare ct i de ieire.
Structura i direcia pinilor portului P3 pentru funciile alternative sunt
prezentate n figura 2.18.

Familia de microcontrolere 80C16x _____________________________________________ 94


P3.15

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

Figura 1.32. Funciile alternative ale portului P3

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

Registrul de date al portului P4 bitul y.


0h:
linia P4.y este intrare;
1h:
linia P4.y este ieire.

Funciile alternative ale portului P4


Pentru ciclurile externe care folosesc segmentarea memoriei, un numr
variabil de pinii ai portului P4 (funcie de coninutul cmpului SALSEL din
registrul RP0H descris n paragraful 1.15.3.b) sunt folosii pentru generarea
adreselor superioare. Eventualii pini rmai liberi pot fi ntrebuinai ca linii de
intrare-ieire de uz general. Structura i direcia pinilor portului P4 pentru
funciile alternative sunt prezentate n figura 2.19.
P4.7
P4.6
P4.5
P4.4
P4.3
P4.2
P4.1
P4.0
Port de
uz general

A17
A16
Memorie
256 k

A19
A18
A17
A16
Memorie
1 M

A23
A22
A21
A20
A19
A18
A17
A16
Memorie
4 M

Figura 1.33. Funciile alternative ale portului P4

95 ________________________________________Aplicaii cu microcontrolere de uz general

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

Registru de date al portului P5 bit y (numai citire).

P5.y

Funciile alternative ale portului P5


Fiecare linie a portului P5 este utilizat i ca intrare a multiplexorului
analogic pentru convertorul analog/numeric. Suplimentar, portul P5 poate
asigura ase intrri pentru timere. Structura i direcia pinilor portului P5
pentru funciile alternative sunt prezentate n figura 2.20.
P5.15
P5.14
P5.13
P5.12
P5.11
P5.10
P5.9
P5.8
P5.7
P5.6
P5.5
P5.4
P5.3
P5.2
P5.1
P5.0
Port de
uz general

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

Figura 1.34. Funciile alternative ale portului P5

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

Registrul de date al portului P6 bitul y.


0h:
linia P6.y este intrare;
1h:
linia P6.y este ieire.

ODP6.0 DP6.0 P6.0

ODP6.1 DP6.1 P6.1

ODP6.2 DP6.2 P6.2

ODP6.3 DP6.3 P6.3

ODP6.4 DP6.4 P6.4

ODP6.5 DP6.5 P6.5

ODP6.6 DP6.6 P6.6

P6
(FFCCh)

ODP6.7 DP6.7 P6.7

Tabelul 1.42

Familia de microcontrolere 80C16x _____________________________________________ 96


ODP6.y

0h:
1h:

linia P6.y este ieire push-pull;


linia P6.y este ieire dren n gol.

Funciile alternative ale portului P6


Funcie de coninutul registrului RP0H pot folosi ca ieiri liniile portului
P6 pn la 5 semnale de selecie CSx. De asemenea, portul P6 mai este
folosit i de semnalele pentru arbitrarea magistralei externe (BREQ, HLDA i
HOLD). Structura i direcia pinilor portului P6 pentru funciile alternative sunt
prezentate n figura 2.21.
P6.6
P6.6
P6.5
P6.4
P6.3
P6.2
P6.1
P6.0
Port de
uz general

BREQ
HLDA
HOLD
CS4
CS3
CS2
CS1
CS0
Funcii
alternative

Figura 1.35. Funciile alternative ale portului P6

Pentru a asigura selecia circuitelor n timpul iniializrii sau cedrii


magistralei, liniile de selecie CSx dispun de rezistene interne de pull-up.
Dac este programat vreo ieire n modul dren n gol, rezistenele interne
nu vor mai fi active.
1.17.8
Portul P7
Acest port este utilizat pentru intrri/ieiri de uz general, pe 8 bii,
direcia fiecrei linii putnd fi selectat din registrul DP7. Fiecare ieire poate
fi comutat n mod push-pull sau dren n gol prin intermediul registrului
ODP7. Structura registrelor de control ale portului P7 sunt prezentate n
tabelul 2.30.

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.

Funciile alternative ale portului P7

ODP7.0 DP7.0 P7.0

ODP7.1 DP7.1 P7.1

ODP7.2 DP7.2 P7.2

ODP7.3 DP7.3 P7.3

ODP7.4 DP7.4 P7.4

ODP7.5 DP7.5 P7.5

ODP7.6 DP7.6 P7.6

P7
(FFD0h)

ODP7.7 DP7.7 P7.7

Tabelul 1.43

97 ________________________________________Aplicaii cu microcontrolere de uz general

Liniile P7.4P7.7 pot fi utilizate ca intrri de captur sau ieiri de


comparare CC28IOCC31IO. La folosirea lor n acest scop trebuie s se in
cont de precauiile descrise la portul P2. Similar, ca celelalte intrri/ieiri
CAPCOM, aceste linii pot fi utilizate i pentru achiziionarea unor ntreruperi
externe standard.
Liniile P7.0P7.3 pot servi ca ieiri pentru modulul modulator de
impulsuri n durat (PWM). Semnalele de ieire al acestor module sunt trecute
printr-o poart SAU - EXCLUSIV cu bistabilul de ieire al portului pentru a permite
negarea semnalului PWM (dac P7.03=1). Structura i direcia pinilor
portului P7 pentru funciile alternative sunt prezentate n figura 2.22.
P7.7
P7.6
P7.5
P7.4
P7.3
P7.2
P7.1
P7.0
Port de
uz general

CC31IO
CC30IO
CC29IO
CC28IO
POUT3
POUT2
POUT1
POUT0
Funcii
alternative

Figura 1.36. Funciile alternative ale portului P7

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

ODP8.0 DP8.0 P8.0

ODP8.1 DP8.1 P8.1

ODP8.2 DP8.2 P8.2

ODP8.3 DP8.3 P8.3

ODP8.4 DP8.4 P8.4

ODP8.5 DP8.5 P8.5

ODP8.6 DP8.6 P8.6

P8
(FFD4h)

ODP8.7 DP8.7 P8.7

Tabelul 1.44

al portului P8 bitul y.
este intrare;
este ieire.
este ieire push-pull;
este ieire dren n gol.

Funciile alternative ale portului P8


Toate liniile portului P8 pot fi folosite, cu precauiile descrise la portul P2
ca linii de intrare-ieire pentru modulul CAPCOM i, de asemenea, pentru
achiziionarea ntreruperilor externe. Structura pinilor portului P8 pentru funciile alternative sunt prezentate n figura 2.23.

Familia de microcontrolere 80C16x _____________________________________________ 98


P8.7
P8.6
P8.5
P8.4
P8.3
P8.2
P8.1
P8.0
Port de
uz general

CC23IO
CC22IO
CC21IO
CC20IO
CC19IO
CC18IO
CC17IO
CC16IO
Funcii
alternative

Figura 1.37. Funciile alternative ale portului P8

1.18. Modulatorul de impulsuri n durat


Modulul pentru modularea impulsurilor n durat PWM permite generarea
a patru semnale modulate n durat independente. Pentru un circuit cu
frecvena de ceas de 20 MHz, frecvena acestor semnale este cuprins ntre
4.8 Hz i 10 MHz (impulsuri aliniate pe front) sau ntre 2.4 Hz i 5 MHz
(semnale aliniate central).
Modulul PWM const n 4 canale independente. Fiecare canal conine un
numrtor sus/jos de 16 bii PTx, un registru de 16 bii pentru perioada de
repetiie PWx, un registru de 16 bii pentru durata impulsului PPx, un bistabil
virtual, dou comparatoare, precum i logica de control necesar. Lucrul celor
patru canale este controlat de dou registre PWMCON0 i PWMCON1 iar pentru
controlul ntreruperilor generate de PWM se folosete registrul PWMIC.
De asemenea, un control asupra ieirilor PWM l au i registrele speciale
ale portului P7 (P7, DP7 i ODP7) prezentate n paragraful 1.17.8.
Schema bloc a modulelor PWM este prezentat n figura 2.24 (zonele
haurate reprezint registrele aflate sub controlul utilizatorului).
Registru
perioad PPx
Comparator
Clock1
Control

Control
tergere
numrtor

Numrtor
sus/jos PTx

Clock2
Comparator

Control ieire

Bistabil
POUTx
Control
scriere

Registru
durat PWx

Figura 1.38. Schema bloc a modulului PWM

1.18.1
Moduri de operare
Modulul PWM dispune de patru moduri de funcionare:
PWM standard:
genereaz impulsuri aliniate pe front;

99 ________________________________________Aplicaii cu microcontrolere de uz general

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.

n acest mod, numrtorul PTx al canalului respectiv numr cresctor pn


cnd atinge valoarea registrului de perioad PPx. Urmtorul impuls de ceas
provoac iniializarea numrtorului.
Semnalul de ieire POUTx este n nivel 1

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

acest mod, numrtorul PTx al canalului respectiv numr cresctor pn


cnd atinge valoarea registrului de perioad PPx. Urmtorul impuls de ceas
provoac schimbarea direciei de numrare a numrtorului care continu s
numere descresctor pn atinge valoarea 0h. Urmtorul impuls de ceas
comut iar direcia de numrare, cresctor, procedura continund n acelai
mod.
Ieirea PWM este n starea 1 LOGIC ct timp coninutul PTx este mai mare
sau egal cu valoarea PPx. Ieirea este comutat n 0

LOGIC

cnd valoarea PTx

scade sub valoarea PPx.


Perioada semnalului PWM n modul 1 se poate calcula cu relaia:
P PWM Mod1 =2[PPx]+2
Acest mod este denumit i aliniat central ntruct valoarea registrului
PWx afecteaz fronturile cresctoare i descresctoare ale impulsului, n mod
simetric.
Modul de funcionare este ilustrat n figura 2.25.b.

Familia de microcontrolere 80C16x ____________________________________________ 100

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 )

pe pinul de ieire al canalului PWM0. Semnalul produs de PWM1 este

disponibil n continuare pe pinul POUT1.


Modul de funcionare este ilustrat n figura 2.25.c.
Atenie! Ieirile POUTx sunt funcii alternative ale portului P7. Ieirile
portului P7 pot fi setate s fie cu dren n gol, situaie n care, prin
intermediul unor rezistene externe pot fi realizate conexiuni
I - CABLAT ntre ieirile POUTx, permind suficiente combinaii ntre
modulele PWM pentru obinerea unor trenuri de impulsuri.
d)

Modul 3
Modul 3 este selectat setnd indicatorii PSx din registrul PWMCON1. Acest

mod este disponibil numai pentru canalele PWM2 i 3.


n acest mod, timerul PTx este pornit prin program iar el numr pn la
atingerea valorii din registrul PPx. Urmtorul impuls de ceas provoac
tergerea PTx i oprirea numrrii.
Ieirea PWM este comutat n nivel 1
este comutat n 0

LOGIC

LOGIC

ct timp PTxPWx. Semnalul

dup tergerea PTx, adic PTx<PWx.

n concluzie, setarea modulului PWM n acest mod produce un impuls


singular care are frontul cresctor declanabil prin program iar durata
controlat prin registrele PWx i PPx.
Chiar dup declanarea numrrii (realizat prin setarea indicatorului
PTRx din registrul PWMCON0), durata impulsului poate fi modificat prin
program, scriind n registrul PTx. Aceste multiple redeclanri sunt posibile
oricnd timerul este activ (PTRx=1). De exemplu, dac registrul PTx este
ncrcat

cu

valoarea

din

PPx,

urmtorul

impuls

numrtorului.
Modul de funcionare este ilustrat n figura 2.25.d.

va

declana

oprirea

101 _______________________________________Aplicaii cu microcontrolere de uz general


PPx=7
PTx
100%
87.5%
75%
50%
25%
12.5%
0%

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

Figura 1.39. Modurile de funcionare ale PWM

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;

controlul funcionrii i a ntreruperii este asigurat de registrele PWMCON0,


PWMCON1 i PWMIC.

a)

Numrtorul PTx
Prin intermediul bitului PTIx din registrul PWMCON0 se poate selecta

pentru fiecare numrtor PTx frecvena de numrare (fie frecvena ceasului


sistem, fie aceasta divizat cu 64). Frecvena este aplicat numrtoarelor
dac biii corespunztori PTRx sunt setai.
n tabelul 2.32 sunt prezentate cteva frecvene produse de PWM pentru
un circuit cu ceas sistem la 20 MHz, funcie de modurile de operare, frecvena
de intrare i coninutul registrului durat impuls.

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

Registrul de perioad PPx

Este un registru de 16 bii care este folosit pentru programarea perioadei


ciclului PWM, adic a frecvenei de repetiie. n funcionare, este comparat

Familia de microcontrolere 80C16x ____________________________________________ 102

valoarea registrelor PPx i PTx, la egalitate, funcie de modul de lucru,


executndu-se tergerea registrului PTx i schimbarea direciei de numrare.
c)

Registrul de durat PWx


Registrul de 16 bii PWx controleaz valoarea coeficientului de umplere al

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

Registrele de control PWMCON0 i PWMCON1


Registrul PWMCON0 controleaz funcionarea celor patru numrtoare i

administreaz ntreruperile modulului. Prin intermediul unor instruciuni pe


cmpuri de bii (de exemplu BFLDL sau BFLDH) este posibil comutarea
simultan, pentru toate numrtoarele a modului de funcionare.
Registrul PWMCON1 controleaz modul de funcionare i semnalele de
ieire a celor patru canale PWM.
Structura celor registre este prezentat n tabelul 2.34.
Tabelul 1.47
PWMCON0
(FF30h)
PIRx
PIEx
PTIx
PTRx
PWMCON1
(FF32h)
PSx
PB01
PMx
PENx

PIR3 PIR2 PIR1 PIR0 PIE3 PIE2 PIE1 PIE0 PTI3 PTI2 PTI1 PTI0 PTR3 PTR2 PTR1 PTR0

0h:
1h:
0h:
1h:
0h:
1h:
0h:
1h:

nu sunt generate ntreruperi;


canalul x genereaz ntrerupere.
ntreruperea generat de canalul x dezactivat;
ntreruperea generat de canalul x validat.
timerul x numr cu frecvena unitii centrale;
timerul x numr cu f CPU /64.
timerul x este deconectat de la intrarea de ceas;
timerul x este conectat de la intrarea de ceas.

PS3 PS2

0h:
1h:
0h:
1h:
0h:
1h:
0h:
1h:

PB01

PM3 PM2 PM1 PM0 PEN3 PEN2 PEN1 PEN0

nu are nici o semnificaie;


canalul x lucreaz n modul 3.
nu are nsemntate;
canalele 0 i 1 lucreaz n modul 2.
canalul x lucreaz n modul 0;
canalul x lucreaz n modul 1.
ieirea canalului x dezactivat (se genereaz numai ntrerupere);
ieirea canalului x funcional.

Atenie! tergerea n timpul funcionrii canalului PWMx a bitului PTRx oprete numrtorul, meninnd neschimbat ieirea corespunztoare.

103 _______________________________________Aplicaii cu microcontrolere de uz general

Modificarea prin program a registrului PTx produce actualizarea


imediat a ieirii.
1.18.3
ntreruperile modulului PWM
Fiecare din cele patru canale PWM pot genera o cerere individual de
ntrerupere. Fiecare din aceste canale activeaz un modul de ntrerupere PWM
care, la rndul su, solicit o ntrerupere controlerului de ntrerupere.
Rutina de tratare trebuie s determine, pe baza indicatorului PIR din
registrul PWMCON0, ce canal a generat ntreruperea. Indicatorii PIRx sunt
setai la nceputul unui nou ciclu PWMx.
Atenie! Indicatorii PIRx nu sunt teri automat de circuit la intrarea n
rutina de tratare a ntreruperii astfel nct este obligatorie tergerea
lor prin program.
Structura registrului PWMIC este identic cu a celorlalte registre de
control a ntreruperilor descrise n paragraful 1.16.1, tabelul 2.17.

1.19. Convertorul analog numeric


Circuitul 80C167 dispune de un convertor analog/numeric cu o rezoluie
de 10 bii, un circuit de eantionare i un multiplexor analogic pentru
selectarea uneia din cele 16 intrri analogice (intrri partajate cu portul P5).
Este recomandabil ca tensiunile de referin V AREF i V AGND s fie generate
printr-o surs separat de cea a circuitelor logice pentru a reduce
interferenele cu alte semnale.
Controlul funcionrii ADC este asigurat de registrele ADCON (selectare
mod funcionare, canal convertit etc.), ADAT i ADAT2 (rezultate conversie).
ntreruperile generate de convertor sunt administrate de registrele
ADCIC i ADEIC.
Schema bloc a modulului ADC este prezentat n figura 2.26.
ADCON

MUX

AN0

AN15

Eantionare

Control
conversie

ntreruperi:
ADCIR, ADEIR

Convertor
10 bii

Rezultate:
ADAT, ADAT2

V A REF

V A GND

Figura 1.40. Structura intern a modulului ADC

1.19.1
Moduri de lucru
Modulul ADC permite urmtoarele moduri de conversie:
conversie singular;
conversie continu;
conversie multipl singular;
conversie multipl continu;

Familia de microcontrolere 80C16x ____________________________________________ 104

ateptare semnal citire rezultat;


inserare canal.
Funcionarea modulului ADC este controlat de registrul special ADCON,

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

Control timp conversie. Descris n paragraful 1.19.2.


Control timp eantionare. Descris n paragraful 1.19.2.
Indicator cerere inserare canal.
Validare cerere inserie canal.
Regim ateptare semnal citire rezultat.
Conversie n curs.
Start conversie.
00:
conversie singular;
01:
conversie continu;
10:
conversie multipl singular;
11:
conversie multipl continu.
Selectare canal intrare. n mod multiplu, selecteaz primul canal convertit.
CHNR

ADRES

Numrul intrrii convertite.


Rezultat conversie curent (10 bii).
CHNR

ADRES

Numrul intrrii inserate.


Rezultat conversie inserat (10 bii).

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

105 _______________________________________Aplicaii cu microcontrolere de uz general

Aceste moduri sunt selectate prin programarea cmpului ADM cu valorile


2h (pentru un singur canal) sau 3h (mai multe canale). Acest mod asigur
conversia unui ir de intrri analogice, ncepnd cu canalul specificat n
cmpul ADCH i terminnd cu canalul 0, fr a fi necesare intervenii prin
program pentru schimbarea numrului canalului.
Dup pornirea convertorului (bitul ADST setat), canalul specificat n
ADCH va fi convertit. Dup ce conversia a fost finalizat, este setat indicatorul
ADCIR iar convertorul pornete automat o nou conversie a canalului imediat
inferior. ADCIR va fi setat dup fiecare conversie complet. Dup convertirea
canalului 0, secvena se consider ncheiat.
n modul conversie multipl singular, convertorul se va opri automat i
va terge biii ADBSY i ADST.
n modul conversie multipl continu, convertorul va iniia automat o
nou secven de conversii ncepnd cu intrarea specificat de ADCH.
Dac bitul ADST este ters prin program, convertorul i va continua
activitatea pn la finalul conversiei canalului 0.
Diagrama de timp a unei conversii multiple este prezentat n figura
2.27.a.
Ateptare semnal citire rezultat
n modul normal de lucru al ADC, dac un rezultat anterior nu a fost citit
din registrul ADAT nainte de terminarea unei noi conversii, rezultatul anterior
este pierdut ntruct registrul ADAT va conine noul rezultat. Pierderea
rezultatului anterior este marcat prin setarea indicatorului de depire
ADEIR.
Este indicat utilizarea acestui mod de lucru pentru a evita generarea
unor ntreruperi ADEIR i pierderea unor rezultate, n special n modul
continuu.
n acest caz, dac valoarea anterioar din ADAT nu a fost citit i
rezultatul unei noi conversii este gata, noul rezultat este pstrat ntr-un
registru temporar iar declanarea unei noi conversii este suspendat. Dup
citirea valorii anterioare din ADAT, registrul temporar este ncrcat n registrul
ADAT (genernd o ntrerupere ADCIR) iar conversia suspendat este reluat.
Diagrama de timp a unei conversii cu ateptarea semnalului de citire este
prezentat n figura 2.27.b.
Inserare canal
n acest mod este permis convertirea unei intrri ADC specifice, chiar
dac modulul execut alte conversii, fr a schimba modul curent de operare.
La finalul conversiei inserate, ADC i continu activitatea normal.
Atenie! Cmpul CHNR care determin numrul canalului inserat, nu trebuie
modificat n timpul executrii unei conversii inserate.

Familia de microcontrolere 80C16x ____________________________________________ 106

Declanarea unei conversii inserate poate fi fcut n dou moduri:


setarea prin program a bitului ADCRQ din registrul ADCON;

o comparare sau captur a registrului CC31.

A doua metod permite declanarea inserrii unui canal sincronizat cu


evenimentele gestionate de registrele CAPCOM (identitatea ntre registrul
timerului i registrul CAPCOM sau capturarea unui eveniment extern).
Atenie! Bitul ADCRQ va fi setat de orice ntrerupere solicitat de canalul
CAPCOM CC31, indiferent dac modul inserat este activ sau nu.
Pentru a preveni orice incidente, este recomandabil tergerea
bitului ADCRQ nainte de intrarea n modul inserat.
Nu poate fi declanat o alt conversie inserat dac alta este deja
n curs.
Dac n timpul inserrii unei conversii convertorul este pornit de
ctre program pentru o conversie normal, inserarea este ignorat.
Pentru a preveni aceasta, este recomandabil testarea bitului
ADBSY nainte de inserarea unei conversii.
Registrul temporar este folosit pentru pstrarea datelor, att n
modurile normale ct i n modul de inserare.
Diagrama de timp a unei conversii inserate este prezentat n figura
2.27.c.
1.19.2
Timpii de conversie
Principiul de funcionare oblig ca, la iniierea unei conversii, s fie mai
nti ncrcat condensatorul din circuitul de eantionare. Timpul de ncrcare
al acestui condensator este cunoscut ca timp de eantionare. Convertorul
analog/numeric fiind realizat pe principiul registrului cu aproximaii succesive,
necesit 10 pai, cte unul pentru fiecare bit, pentru finalizarea conversiei. Pe
durata acestor 10 pai, condensatorul de eantionare este n permanen
ncrcat i descrcat prin pinul V AREF .

107 _______________________________________Aplicaii cu microcontrolere de uz general


Conversie canal
AN3
AN2
AN1
AN0
AN3
AN2
Scrie ADDAT
ADDAT plin
Generare IRQ

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

c) Modul inserare canal

Figura 1.41. Modurile de lucru ale ADC

ntruct condensatorul trebuie s ating valoarea final ntr-un timp ct


mai scurt, trebuie ca att rezistena intern a intrrii analogice, ct i a sursei
de alimentare analogice s fie ct mai mici pentru a putea debita un curent
ct mai mare.
Timpul necesar acestor dou aciuni (eantionare i conversie) poate fi
programat ntr-un domeniu, funcie de setarea registrului ADCON. Trebuie
amintit totui, c timpul de conversie nu depinde att de microcontroler ct
de parametrii electrici ai componentelor analogice.
Semnificaia biilor ADCTC i ADSTC este prezentat n tabelul 2.36.
Tabelul 1.49

ADCTC Timpul de conversie t CC


00
01
10
11

TCL32
TCL128
TCL64

ADSTC Timpul de eantionare t SC


00
01
10
11

t CC
t CC 2
t CC 4
t CC 8

Timpul total al conversiei este 10t CC + 2t SC + 4TCL.


1.19.3
Controlul ntreruperilor ADC
La sfritul fiecrei conversii, indicatorul ADCIR din registrul ADCIC este
setat. Aceast cerere de ntrerupere poate genera o ntrerupere cu vectorul
ADCINT sau un transfer PEC.

Familia de microcontrolere 80C16x ____________________________________________ 108

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

109 _______________________________________Aplicaii cu microcontrolere de uz general

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

Figura 1.42. Timerele GPT1

T3OTL
T3OE

T3UDE
T3UD

T3R
T3M

T3I

T3R

T3UD

T3UDE

T3OE

T3CON
(FF42h)

T3OTL

Tabelul 1.50

T3M

T3I

Fiecare depire a timerului T3 comut bitul T3OTL. Dac T3OE=1h i P3.3


este setat ca ieire, ieirea T3OUT reflect starea lui T3OTL.
T3OTL poate fi utilizat pentru declanarea ncrcrii timerelor T2 sau T4.
Selectare direcie numrare pentru blocul GPT1. Pinul T3EUD (P3.4) trebuie
programat ca intrare.
TxUDE
TxUD
Pin TxEUD
Direcie numrare
X
0
0
Cresctoare
X
0
1
Descresctoare
0
1
0
Cresctoare
1
1
0
Descresctoare
0
1
1
Cresctoare
1
1
1
Descresctoare
Validare funcionare timer (T3R=1h).
000: mod funcionare timer;
001: mod funcionare numrtor;
010: mod funcionare timer comandat de T3IN activ n 0 LOGIC ;
011: mod funcionare timer comandat de T3IN activ n 1 LOGIC ;
1XX: Rezervat.
Selecteaz modul de aciune al intrrii T3IN (mod numrtor) sau
coeficientul de prescalare a frecvenei de ceas (mod timer).

Frecvenele de intrare n timer, rezoluia i perioada rezultat din


coeficientul de prescalare ales sunt prezentate n tabelul 2.38. Tabelul este
valabil i pentru modurile timer comandat, precum i pentru T2 i T4.

Modul timer comandat

Familia de microcontrolere 80C16x ____________________________________________ 110

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]

Valoare T2I , T3I , T4I


0h
8
2500
0.4
26

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 ;

dac este 1h, timerul este validat dac

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.

Frecvena maxim de intrare este f CPU /8. Pentru a garanta o numrare


corect a tranziiilor de pe pinul T3IN, nivelul semnalului trebuie s fie 0
LOGIC

b)

sau 1

LOGIC

cel puin o perioad 8t CPU .

Timerele T2 i T4

Ambele timere au exact aceeai funcionare. Ele pot funciona ca timere,


timere comandate sau numrtoare i au acelai opiuni pentru frecvene i
semnalul de numrare la fel ca timerul T3.
Fa de timerul T3, aceste dou timere dein suplimentar modul de
concatenare cu timerul T3 sau pot funciona ca registre de captur ori
rencrcare dar nu dispun de bistabilul de ieire T3OTL.
Structura celor dou registre de control, T2CON i T4CON este prezentat
n tabelul 2.40.

T4CON
(FF44h)

TxUDE
TxUD
TxR

TxM

TxI

T2R

T2M

T2I

T4R

T4UD T2UD

T2CON
(FF40h)

T4UDE T2UDE

111 _______________________________________Aplicaii cu microcontrolere de uz general


Tabelul 1.53

T4M

T4I

Selectare direcie numrare. Identic cu cmpurile T3UDE i T3UD prezentate


n tabelul 2.37.
Validare timer. Identic cu bitul T3R din tabelul 2.37.
000: mod funcionare timer;
001: mod funcionare numrtor;
010: mod funcionare timer comandat de TxIN activ n 0 LOGIC ;
011: mod funcionare timer comandat de T3IN activ n 1 LOGIC ;
100: mod funcionare rencrcare;
101: mod funcionare captur;
11X: Rezervat.
Selecie constant prescaler (mod timer) sau fronturi active (mod numrtor). n modul timer, similar cu cmpul T3I din tabelul 2.39.

Funcionarea timerelor auxiliare T2 i T4 n regimurile numrtor sau


timer este identic cu funcionarea timerului T3.
Concatenarea timerelor T2 i T4
Folosirea bitului T3OTL ca surs de semnal pentru un timer auxiliar,
permite concatenarea timerului T3 cu timerul T2 sau T4. Funcie de frontul
ales pentru comanda timerului auxiliar, concatenarea formeaz un timer sau
numrtor de:
32 de bii, dac ambele fronturi ale T3OTL sunt selectate s comute

timerul auxiliar;
33 de bii, dac numai front cresctor sau descresctor al T3OTL este

selectat s comute timerul auxiliar.


Direciile de numrare ale celor dou timere pot fi diferite, permind o
mare varietate de configuraii.
Rencrcarea timerului T3
Acest regim este selectat prin setarea cmpului TxM din registrul TxCON
cu valoarea 4h. n acest mod, timerul T3 este ncrcat cu coninutul unui
timer auxiliar, condiionat fie de o comutare a intrrii T3OTL, fie a intrrii
timerului auxiliar TxIN.
Atenie! Dac este utilizat ca registru de rencrcare, timerul auxiliar se
oprete automat, indiferent de valoarea bitului TxR.
Dac este folosit pentru declanarea ncrcrii tranziia semnalului
T3OTL se va declana o ntrerupere T3IR.
Trebuie evitat folosirea aceluiai eveniment pentru ambele timere
auxiliare, unitatea central ncercnd s ncarce valorile din ambele
registre. n acest caz valoarea T2 este neglijat i este ncrcat
valoarea din T3.

Familia de microcontrolere 80C16x ____________________________________________ 112

Sub controlul T3OTL sunt posibile mai multe configuraii de rencrcare,


funcie de fronturile active utilizate:
Dac sunt selectate ambele fronturi ale tranziiei T3OTL, timerul T3 va fi

rencrcat la fiecare depire superioar sau inferioar cu valoarea din


timerul auxiliar. Este modul implicit de funcionare n acest regim.
Dac este selectat un singur front al T3OTL, timerul T3 va fi rencrcat la

fiecare a doua depire.


Folosind modul cu un singur front al T3OTL pentru ambele timere auxiliare
(o ncrcare dintr-un timer auxiliar declanat de frontul cresctor, n timp
ce cealalt ncrcare, din cellalt timer auxiliar, declanat de frontul
descresctor) este posibil realizarea unui modulator de impulsuri n
durat extrem de flexibil.
Capturarea valorii timerului T3
Acest regim este selectat prin setarea cmpului TxM din registrul TxCON

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.

113 _______________________________________Aplicaii cu microcontrolere de uz general

Coninutul fiecrui timer poate fi citit sau modificat de unitatea central


prin intermediul registrelor T5 i T6. Scrierea registrului prin program are
prioritate fa de orice alt modificare produs de hardware.
Schema bloc a blocului de timere GPT2 este prezentat n figura 2.29.
T5EUD
f C PU /2

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

Figura 1.43. Timerele GPT2

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

Validare regim rencrcare din registrul CAPREL.


Fiecare depire a timerului T6 comut bitul T6OTL. Dac T6OE=1h i P3.1
este setat ca ieire, ieirea T6OUT reflect starea lui T6OTL. Dac T6OE este
ters, P3.1 poate fi utilizat ca pin de port de intrare-ieire.
T6OTL poate fi utilizat ca intrare pentru T5 n regim numrtor.
Selectare direcie numrare pentru blocul GPT2. Pinul T6EUD (P5.10) trebuie
programat ca intrare.
TxUDE
TxUD
Pin TxEUD
Direcie numrare
X
0
0
Cresctoare
X
0
1
Descresctoare
0
1
0
Cresctoare
1
1
0
Descresctoare
0
1
1
Cresctoare
1
1
1
Descresctoare
Validare funcionare timer (T6R=1h).
000: mod funcionare timer;
001: mod funcionare numrtor;
010: mod funcionare timer comandat de T6IN activ n 0 LOGIC ;
011: mod funcionare timer comandat de T6IN activ n 1 LOGIC ;
1XX: Rezervat.
Selecteaz frontul activ al intrrii T6IN (mod numrtor) sau coeficientul de
prescalare a frecvenei de ceas (mod timer).

Modul timer

Familia de microcontrolere 80C16x ____________________________________________ 114

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]

Valoare T5I, T6I


0h
8
5000
0.2
13

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

Modul timer comandat


Acest mod este selectat de cmpul T6M din registrul T6CON 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 T6IN (P5.12). n acest sens, pinul P5.12 trebuie setat ca
intrare.
Bitul T6M.0 selecteaz nivelul activ al intrrii: dac este 0h, timerul este
validat dac T6IN are nivelul 0
T6IN are nivelul 1

LOGIC ;

dac este 1h, timerul este validat dac

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.

Frecvena maxim de intrare este f CPU /4. Pentru a garanta o numrare


corect a tranziiilor de pe pinul T6IN, nivelul semnalului trebuie s fie 0
LOGIC

b)

sau 1

LOGIC

cel puin o perioad 4t CPU .

Timerul T5
Timerul T5 poate funciona ca timer, timer comandat sau numrtor i

are acelai opiuni pentru frecven i semnalul de numrare la fel ca timerul


T6.
Structura registrului de control T5CON este prezentat n tabelul 2.44.

115 _______________________________________Aplicaii cu microcontrolere de uz general

Funcionarea timerului auxiliar T5 n regimurile numrtor sau timer este


identic cu funcionarea timerului T6.
Concatenarea timerelor T5 i T6
Folosirea bitului T6OTL ca surs de semnal pentru timerul auxiliar,
permite concatenarea timerului T6 cu timerul T5. Funcie de frontul ales
pentru comanda timerului auxiliar, concatenarea formeaz un timer sau
numrtor de:
32 de bii, dac ambele fronturi ale T6OTL sunt selectate s comute
timerul auxiliar;
33 de bii, dac numai front cresctor sau descresctor al T6OTL este

selectat s comute timerul auxiliar.


Direciile de numrare ale celor dou timere pot fi diferite, permind o
mare varietate de configuraii.
Rencrcarea timerului T6
Acest regim este selectat prin setarea bitului T6SR din registrul T6CON.
n acest mod, timerul T6 este ncrcat cu coninutul registrului CAPREL,
condiionat de o depire la numrare a timerului T6, simultan cu declanarea
unei ntreruperi T6IR.

T5SC
T5CLR
CI

T5UDE
T5UD
T5R
T5M

T5I

T5R

T5UD

CI

T5UDE

T5CLR

T5CON
(FF46h)

T5SC

Tabelul 1.57

T5M

T5I

Validare captur n registrul CAPREL.


Activare tergere timer la capturare.
00:
captura dezactivat;
01:
captur pe front cresctor a semnalului CAPIN;
10:
captur pe front descresctor a semnalului CAPIN;
11:
captur pe ambele fronturi ale semnalului CAPIN;
Selectare direcie numrare. Identic cu cmpurile T6UDE i T6UD prezentate
n tabelul 2.41.
Validare timer.
00:
mod funcionare timer;
01:
mod funcionare numrtor;
10:
mod funcionare timer comandat de T5IN activ n 0 LOGIC ;
11:
mod funcionare timer comandat de T5IN activ n 1 LOGIC .
Selecie constant prescaler (mod timer) sau fronturi active (mod
numrtor). n modul timer, similar cu cmpul T6I din tabelul 2.42. Pentru
modul numrtor are urmtoarea semnificaie.
x00: numrtorul T5 dezactivat;
001: front cresctor pe T5IN;
010: front descresctor pe T5IN;
011: orice tranziie pe T5IN;
101: front cresctor pe T6OTL;
110: front descresctor pe T6OTL;
111: orice tranziie pe T6OTL.

Capturarea valorii timerului T5


Acest regim este selectat prin setarea bitului T5SC din registrul T5CON.

Familia de microcontrolere 80C16x ____________________________________________ 116

Acest mod presupune ncrcarea valorii curente a timerului T5 n


registrul CAPREL ca rspuns la tranziia semnalului pe pinul extern CAPIN,
simultan cu setarea indicatorului de ntrerupere CRIR. Acelai eveniment
poate terge coninutul timerului T5 dup ncrcarea sa, dac bitul T5CLR din
registrul T5CON este setat.
Semnalul de declanare poate fi un front cresctor, descresctor sau
ambele. Selectarea tranziiei este fcut de cmpul CI din registrul T5CON.
Atenie! Nivelul semnalului de pe pinul CAPIN trebuie s-i pstreze starea
cel puin 4t CPU .
Multiplicarea frecvenei
Deoarece funciile de rencrcare i captur a registrului CAPREL pot fi
validate individual de biii T5SC i T6SR, cele dou funcii pot fi setate
simultan. Aceast facilitate a GPT2 permite generarea unei frecvene de ieire
care este un multiplu al frecvenei de intrare.
Acest regim poate fi implementat n modul urmtor:
timerul T5 funcioneaz n mod numrtor, cresctor, la o frecven

suficient pentru rezoluia dorit, fie aceasta f CPU /32;


semnalul de multiplicat este aplicat pe pinul CAPIN;

cnd survine o tranziie a semnalului CAPIN, valoarea T5 este ncrcat n


CAPREL i T5 este ters; n acest mod, CAPREL va conine valoarea
timpului ntre dou evenimente externe, msurat n incremente de T5;

timerul T6 funcioneaz n mod numrtor, descresctor, la o frecven


funcie de multiplicarea dorit, fie aceasta f CPU /4; T6 este ncrcat cu
valoarea CAPREL la depirea inferioar. Aceasta nseamn c valoarea
din CAPREL reprezint timpul ntre dou depiri a T6 msurat n
incremente de 8 ori mai rapide dect ale timerului T5;

fiecare depire a T6 seteaz indicatorul de ntrerupere T6IR i poate fi


obinut n exterior pe pinul T6OUT, avnd o frecven de 8 ori mai mare
dect a semnalului de pe CAPIN.

n acest mod, relativ simplu, fr a fi necesar nici o component


extern, este realizat multiplicatorul de frecven.
1.20.3
ntreruperile blocurilor de timere GPT1 i GPT2
Ori de cte ori survine o depire FFFFh0000h sau 0000hFFFFh la
oricare timer sau numrtor, se seteaz un indicator de ntrerupere
T2IRT6IR din registrul TxIC corespunztor. Aceasta va produce o
ntrerupere cu vectorii TxINT sau o cerere de serviciu PEC dac indicatorii de
validare a ntreruperii TxIE sunt setai.
Suplimentar, la blocul GPR2 poate fi generat o ntrerupere la tranziia
semnalului CAPIN cu sensul corespunztor cu setarea cmpului CI din
registrul T5CON. Aceasta produce setarea indicatorului CRIR din registrul

117 _______________________________________Aplicaii cu microcontrolere de uz general

CRIC i generarea unei ntreruperi cu vectorul CRINT sau o cerere de serviciu


PEC.
Structura registrelor de control a ntreruperilor TxIC i CRIC este
prezentat n paragraful 1.16.1, tabelul 2.17.

1.21. Comparatoarele i registrele de captur


Circuitul 80C167 dispune de dou module de captur i comparare
(CAPCOM) aproape identice care constau n 32 de registre care
interacioneaz cu 4 timere.
Modulele CAPCOM pot captura coninutul unui timer condiionat de un
eveniment intern sau extern sau pot compara coninutul unui timer cu o
valoare dat i, n caz de egalitate, s modifice starea unor semnale externe.
Acest mecanism permite generarea i controlul unor secvene temporale de
pn la 16 canale pentru fiecare modul, fr a necesita circuite externe i cu
un minim de intervenie a programului.
Astfel, modulele CAPCOM pot fi utilizate pentru operarea unor
evenimente externe extrem de rapide cum ar fi: generarea de forme de und
i impulsuri, modularea n durat a impulsurilor, nregistrarea momentului la
care survin diferite evenimente externe etc. De asemenea, modulele CAPCOM
permit implementarea a cel mult 16 timere software.
Rezoluia maxim a modulelor CAPCOM a unui circuit cu frecvena de
ceas de 40 MHz este de 200 ns.
Fiecare modul CAPCOM conine dou timere de 16 bii (T0 i T1 pentru
CAPCOM1, respectiv T7 i T8 pentru CAPCOM2), dou registre de rencrcare
(TxREL), i un banc de 16 registre de captur/rencrcare (CC0CC15 n
CAPCOM1, respectiv CC16CC31 n CAPCOM2).
Frecvena de intrare n modulele CAPCOM este programabil, fie
provenit din frecvena unitii centrale (divizat cu un coeficient
programabil), fie derivat din depirile timerului T6 din blocul GPT2. T0 i
T7 pot opera i n modul numrtor, permind contorizarea unor evenimente
externe.
Fiecare registru de comparare/rencrcare poate fi programat individual
pentru una din funciuni i poate fi asociat unuia din cele dou timere ale
modulului. Fiecare registru de comparare/rencrcare dispune de un pin de
intrare-ieire asociat (cu excepia CC24CC27 pe pinii P1H.4P1H.7 care nu
au dect funcii de captur).
Sunt generate ntreruperi specifice pentru fiecare eveniment
capturare/comparare sau depiri ale timerelor.
Schema bloc a modulelor CAPCOM este prezentat n figura 2.30.

de

Familia de microcontrolere 80C16x ____________________________________________ 118

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

Figura 1.44. Schema bloc a modulelor CAPCOM


Tabelul 1.58
T01CON
(FF50h)
T78CON
(FF20h)
TxR
TxM

TxI

T1R

T1M

T1I

T0R

T0M

T0I

T8R

T8M

T8I

T7R

T7M

T7I

Validare funcionare timer Tx.


0h:
mod timer (semnal de intrare derivat din ceasul sistem);
1h:
mod numrtor (semnale de intrare extern sau depiri timer T6).
Coeficient divizare f CPU (pentru TxM=0): K=2 TxI+3 . Pentru TxM=1:
X00: numrare depiri timer T6;
X01: numrare fronturi cresctoare ale T0IN sau T7IN;
X10: numrare fronturi descresctoare ale T0IN sau T7IN;
X11: numrare ambele fronturi ale T0IN sau T7IN.

n toate modurile, timerele funcioneaz numai n sens cresctor.


Unitatea central poate citi sau modifica orice registru Tx i la scriere are
prioritate asupra modificrilor produse de hardware.
Modul timer
Acest mod este selectat pentru timerele Tx dac biii TxM din registrele
T01CON i T78CON sunt teri. Semnalul de ceas este asigurat de prescaler
care divizeaz frecvena unitii centrale cu un coeficient funcie de cmpul
TxI: K=2 3+TxI .
Frecvenele de intrare n timer, rezoluia i perioada rezultat din
coeficientul de prescalare ales sunt prezentate n tabelul 2.38.a).
Modul numrtor
Acest mod este selectat prin setarea cmpului TxM. n acest mod sunt
contorizate depirile produse de timerul T6 sau de tranziiile semnalelor

119 _______________________________________Aplicaii cu microcontrolere de uz general

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

Familia de microcontrolere 80C16x ____________________________________________ 120


ACCx

CCMODx

0h:
1h:
000:
001:
010:
011:

CCx alocat T0/T7;


CCx alocat T1/T8
Modul CC dezactivat;
Captur front pin CCxIO;
Captur front pin CCxIO;
Captur fronturi pin CCxIO.

100:
101:
110:
111:

Comparare
Comparare
Comparare
Comparare

mod
mod
mod
mod

0;
1;
2;
3.

Atenie! Un eveniment de captur/comparare al canalului CC31 poate fi


folosit pentru declanarea inserrii unui canal al modulului ADC
(prezentat n paragraful 1.19.d).
a)

Modul captur
Ca rspuns la un eveniment extern, coninutul timerelor T0/T1 sau

T7/T8 este ncrcat n registrul de captur alocat, funcie de modulul


CAPCOM utilizat i de valoarea bitului ACCx.
Evenimentul extern care produce capturarea registrului Tx este un front
cresctor, descresctor sau ambele ale intrrii CCxIO i poate fi selectat prin
program. Evenimentul care produce captura seteaz indicatorul corespunztor
CCxIR, genernd o ntrerupere cu vectorul CCxINT sau o cerere de transfer
PEC.
Atenie! Pinul folosit pentru evenimentul extern CCxIO trebuie setat ca
intrare. Dac este setat ca ieire, funcia de captur se declaneaz
numai prin program, modificnd valoarea bitului, n scopuri de
testare.
Pentru a garanta interceptarea corect a semnalului extern, este
obligatoriu ca acesta s-i pstreze starea cel puin 8t CPU .
b)

Modurile de comparare

Modurile de comparare permit declanarea unor evenimente externe


sincronizate cu valoarea registrelor numrtoarelor CAPCOM.
Valoarea memorat n registrele CCx este comparat n permanen cu
coninutul timerului alocat (T0/T1 sau T7/T8) i, n cazul egalitii, este
generat un semnal extern pe pinul CCxIO sau este setat indicatorul de
ntrerupere CCxIR.
Cnd oricare dou registre de comparare sunt setate la aceiai valoare,
indicatorii lor de ntreruperi sunt setai simultan, iar semnalul de ieire
programat va fi generat la 8t CPU dup ce timerul urmrit a atins valoarea de
comparare. Mai departe, chiar dac timerul este incrementat sau setat prin
program, compararea cu valoarea respectiv este dezactivat.
Cele patru moduri de comparare posibile la circuitul 80C167 sunt
selectate prin intermediul cmpului CCMODx din registrul CCMx.
Modul de comparare 0
Acest regim genereaz numai o ntrerupere, utilizabil n scopuri de
sincronizare a programului. Modul 0 pentru registrul CCx este selectat prin
setarea cmpului CCMODx din registrul CCMx la valoarea 4h.

121 _______________________________________Aplicaii cu microcontrolere de uz general

n acest mod indicatorul de ntrerupere CCxIR este setat de fiecare dat


cnd registrele CCx i Tx au aceiai valoare. Modul de comparare 0 permite
generarea a mai multor cereri de ntrerupere datorit posibilitii modificrii
coninutului registrului CCx pentru acelai ciclu de numrare al timerului
(perioada pn la care timerul genereaz o depire).
Pinul corespunztor CCxIO nu este afectat i poate fi utilizat ca pin de
intrare-ieire.
Modul de comparare 1
Modul 1 este selectat prin setarea cmpului CCMODx la valoarea 5h.
Cnd valoarea registrului timerului devine egal cu valoarea registrului
de comparare, acest regim de funcionare seteaz indicatorul de ntrerupere
CCxIR i comut ieirea CCxIO. Comutarea ieirii se face prin citirea
bistabilului de ieire, inversarea sa i rescrierea lui n bistabil.
De asemenea, acest mod permite modificarea coninutului registrului
CCx pe parcursul unui ciclu de timer.
Atenie! Dac bistabilul de ieire al portului este scris simultan cu
evenimentul de comparare, va avea prioritate programul.
Canalele CC2427 vor genera numai ntreruperile corespunztoare
fr a modifica pinii de ieire.
Valoarea iniial a ieirii comutate poate fi aleas prin program.
Modul de comparare 2
Modul 2 este selectat prin setarea cmpului CCMODx la valoarea 6h.
Funcioneaz asemntor cu modul 0 genernd numai ntreruperi, cu
excepia faptului c n acest regim nu se pot genera mai multe ntreruperi
pentru acelai ciclu de timer.
Modul de comparare 3
Modul 3 este selectat prin setarea cmpului CCMODx la valoarea 7h.
Funcioneaz asemntor cu modul 1 genernd ntreruperi i comutnd
ieirea CCxIO, numai c n acest regim nu se pot genera mai multe
ntreruperi pentru acelai ciclu de timer. De asemenea, att indicatorul de
ntrerupere CCxIR ct i ieirea CCxIO sunt setate de concordana ntre
registre i sunt terse cnd timerul alocat genereaz o depire.
n situaia n care registrul de rencrcare TxREL este identic cu registrul
de comparare CCx, se genereaz numai ntreruperea iar semnalul de ieire
este nemodificat.
Modul de comparare cu registru dublu

Familia de microcontrolere 80C16x ____________________________________________ 122

n acest mod dou registre CCx lucreaz mpreun pentru a controla un


singur pin de ieire.
Astfel, registrele CC0CC7 i CC16CC23 formeaz bancul 1 de
registre, n timp ce registrele CC8CC15 i CC24CC23 formeaz bancul 2
de registre. n acest mod, un registru din bancul 1 i un registru din bancul 2
formeaz un registru pereche i controleaz pinul de ieire alocat bancului 1.
Acest regim de lucru poate fi selectat individual pentru fiecare registru
pereche: registrul din bancul 1 setat n modul de comparare 1 iar registrul din
bancul 2 setat n modul 0.
La detectarea egalitii ntre Tx i unul din registrele pereche, este setat
indicatorul de ntrerupere corespunztor registrului CCx iar pinul CCxIO este
comutat. Dac registrele pereche au aceiai valoare, sunt generate simultan
dou cereri de ntrerupere, corespunztoare celor dou registre CCx, n timp
ce ieirea CCxIO este comutat o singur dat.

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,

T1INT, T7INT, T8INT sau CC0INTCC31INT sau sunt solicitate transferuri


PEC.
Structura registrelor de control a ntreruperilor TxIC i CCxIC sunt
prezentate n tabelul 2.17 din paragraful 1.16.1.

1.22. Timerul de iniializare watchdog


Pentru a permite restabilirea sistemului dup o eroare hardware sau
software, circuitul 80C167 are prevzut un timer de iniializare, denumit n
continuare watchdog timer (WDT).
Rolul acestuia este de a reseta unitatea central dac datorit unei
blocri a sistemului, programul de aplicaie nu servete unitatea WDT. Aceast
procedur previne o funcionare defectuoas pentru o durat mai mare dect
cea prestabilit pentru reiniializare.
Structura intern a blocului watchdog este prezentat n figura 2.31.
:2
:128

MUX

f CPU

WDTL

WDTH

WDTR
RSTOUT

WDTIN

Control

WDTREL

Reset

Figura 1.45. Blocul watchdog

123 _______________________________________Aplicaii cu microcontrolere de uz general

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

Valoarea de rencrcare a octetului superior.


Setat de WDT la depire.
0h:
frecven de intrare f CPU /2;
1h:
frecven de intrare f CPU /128.

Dup orice iniializare software (instruciunea SRST), hardware sau WDT,


modulul watchdog este validat i ncepe incrementarea de la 0000h cu
frecvena f CPU /2. Prin program, prin intermediul bitului WDTIN, frecvena de
incrementare se poate modifica la f CPU /128.
Timerul WDT poate fi oprit prin instruciunea DISWDT care nu este
executat dect n intervalul dintre iniializare i instruciunile EINIT (sfrit
iniializare) sau SRVWDT (servire WDT).
Dac WDT nu este dezactivat, el continu s numere, chiar n modul
inactiv (prezentat n paragraful 1.26). Dac nu este rencrcat prin
instruciunea SRVWDT pn n momentul n care a ajuns la valoarea FFFFh, la
urmtoarea incrementare WDT va declana iniializarea sistemului.
Atenie! Dup o iniializare hardware care activeaz ncrctorul bootstrap
(prezentat n paragraful 1.25.), WDT va fi dezactivat.
Perioada de aciune a blocului WDT poate fi programat n dou moduri:
fie prin selectarea frecvenei de numrare (WDTIN), fie prin modificarea
valorii de rencrcare (WDTREL).
Perioada ntre servirea WDT i declanarea unei iniializri se poate
determina cu relaia:

2 (1 + WDTIN6 ) 216 WDTREL 2 8


TWDT =
fCPU

Orientativ, sunt prezentate valorile maxime i minime ale T WDT (n


milisecunde) pentru un procesor cu f CPU =20 MHz.
WDTREL WDTIN=0 WDTIN=1
FFh
00h

25.6
6.55

1.6
419

1.23. Interfaa serial asincron/sincron


Interfaa serial asincron/sincron, denumit n continuare ASC0
permite comunicarea serial ntre circuitul 80C167 i alte microcontrolere,
microprocesoare sau alte periferice externe.

Familia de microcontrolere 80C16x ____________________________________________ 124

ASC0 admite o comunicaie full-duplex asincron pn la o vitez de 625


KBaud sau half-duplex sincron pn la o vitez de 2.5 MBaud (pentru uniti
centrale cu frecvena de ceas de 20 MHz).
n mod asincron, datele sunt transferate n formatul de 8 sau 9 bii, cu
generarea bitului de paritate i un numr de bii de stop selectabili. Pentru
creterea siguranei transmisiei, sunt detectate erorile de paritate, depire i
ncadrare. Emisia i recepia sunt dublu bufferate. Pentru generarea ratei de
transmisie, ASC0 dispune de un timer de 13 bii. Pentru scopuri de testare,
ASC0 are un regim de funcionare n bucl nchis.
n mod sincron, datele sunt transmise sincronizate fa de un ceas de
deplasare asigurat de modul. Pentru modul multiprocesor, ASC0 dispune de
un mecanism pentru separarea datelor de adrese.
Controlul modulului ASC0 este asigurat de registrul S0CON prezentat n
tabelul 2.48.

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

generator rat de transmisie oprit (ASC0 dezactivat);


generator rat transmisie validat.
mod de lucru standard;
mod de lucru n bucl.
generare rat transmisie n mod standard;
reducere rat de transmisie cu 2/3.
validare paritate par;
validare paritate impar.

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).

O transmisie este iniiat prin scrierea registrului de emisie S0TBUF prin


intermediul unei instruciuni sau a unui transfer PEC. Dup ce o transmisie a
fost finalizat, registrul S0TBUF este ters.
Transmisia datelor este dublu bufferat, adic un nou caracter poate fi
scris n registru nainte ca transmisia primului caracter s fie complet. Acest
mod de lucru permite transmiterea caracterelor unul dup altul, fr
intervale.

125 _______________________________________Aplicaii cu microcontrolere de uz general

Recepia datelor este validat de bitul S0REN. Dup ce recepia unui


caracter a fost ncheiat, datele i, eventual, bitul de paritate pot fi citite din
registrul de recepie S0RBUF.
i recepia datelor este dublu bufferat, aceasta permind recepionarea
caracterului urmtor nainte ca cel deja recepionat s elibereze registrul
S0RBUF.
Dac sunt validate, indicatorul de eroare la ncadrare i indicatorul
ntrerupere la erori de recepie S0EIR sunt setate dac registrul S0RBUF nu a
fost citit pn la terminarea recepiei caracterului urmtor.
Modul de lucru n bucl nchis (bitul S0LB) permite recepionarea
simultan a datelor transmise. De regul, acest mod este folosit pentru
testarea rutinelor specifice fr a fi necesare nici o legtur extern.
1.23.1
Modul asincron
n modul asincron, ASC0 permite o legtur full-duplex la care att
emitorul, ct i receptorul folosesc acelai format al datelor i aceiai vitez
de transmisie.
Datele sunt transmise pe pinul TXD0 (P3.10) i sunt recepionate pe
pinul RXD0 (P3.11).
Structura intern a modulului ASC0 n modul asincron este prezentat n
figura 2.32.
Rencrcare
S0R
:2

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

Figura 1.46. Structura ASC0 n modul asincron

Datele transmise n modul asincron pot avea urmtoarea structur:


cadre de 7 bii de date plus un bit de paritate generat automat (S0M=3h);

cadre de 8 bii de date (S0M=1h);

cadre de 8 bii de date plus un bit de paritate generat automat (S0M=7h);

cadre de 9 bii de date (S0M=4h).

Familia de microcontrolere 80C16x ____________________________________________ 126

Transmisia a 9 bii permite i folosirea unui regim special, de


atenionare, pentru facilitarea schimburilor de date pe o singur linie de
transmisie n sistemele multiprocesor.
Astfel, dac este selectat regimul atenionare (S0M=5h), mesajele vor fi
de dou tipuri:
adrese, cnd bitul 9 al mesajului este 1 LOGIC ;
date, cnd bitul 9 al mesajului este 0 LOGIC .
Cnd un procesor dorete s transmit un bloc de date la alt procesor,
mai nti transmite un octet care identific destinaia. Un octet adres este
recepionat de toate procesoarele conectate ntre ele i dac adresa este
recunoscut de unul din ele, acesta comut modul atenionare urmnd s
recepioneze blocul de date care urmeaz.
Aceast procedur este direct utilizabil n situaia n care este un singur
emitor i mai multe receptoare. Dac se dorete ca orice alt procesor s
preia controlul asupra liniei de transmisie, este necesar adoptarea unei
interfee care permite lucrul cu mai multe emitoare pe aceiai linie, de
exemplu EIA RS-485.
Cadrele de date sunt formate din trei elemente de baz:
bit de start;
date (8 sau 9 bii, mai nti bitul mai puin semnificativ);
terminator (unu sau doi bii de stop).
start D0

D1

D2

D3

D4

D5

start D0

D1

D2

D3

D4

D5

D6 D7 stop stop
(paritate)
D6 D7 D8 stop stop
(paritate)
(atenionare)

Transmisia asincron pornete la prima depire a timerului pentru


generarea ratei de transmisie dup ncrcarea registrului S0TBUF. nainte de
transmiterea ultimului bit (un bit de stop), este setat indicatorul de
ntrerupere S0TBIR pentru semnaliza c datele au fost transmise.
Recepia este declanat de o tranziie descresctoare a semnalului de
pe pinul RXD0. Datele recepionate sunt eantionate la o vitez de 16 ori mai
mare dect viteza de transmisie, astfel nct valoarea bitului recepionat este
luat printr-o decizie majoritar relativ la eantioanele 7, 8 i 9. Dac n urma
deciziei majoritare bitul de start nu rezult zero, operaiunea de deserializare
este stopat.
Dup ce ultimul bit a fost recepionat, octetul este transferat n registrul
S0RBUF i este setat indicatorul S0RIR pentru a semnala recepionarea unui
octet.
1.23.2
Modul sincron
n modul sincron, ASC0 permite o legtur half-duplex utilizat de
regul, pentru extensii ale perifericelor de intrare-ieire.
Datele sunt transmise i recepionate pe pinul RXD0 (P3.11) n timp ce
pinul TXD0 (P3.10) este folosit pentru ceasul de transmisie.

127 _______________________________________Aplicaii cu microcontrolere de uz general

Structura intern a modulului ASC0 n modul sincron este prezentat n


figura 2.33.
Transmiterea sincron ncepe la patru cicluri dup ce datele au fost
ncrcate n S0TBUF. La transmiterea ultimului bit de date este setat
indicatorul de ntrerupere S0TBIR.
Recepia

sincron

este

iniiat

la

setarea

bitului

S0REN.

Datele

recepionate sunt deplasate sincron cu tactul produs pe pinul TXD0. Dup al


optulea tact, datele sunt transferate n S0RBUF i este setat indicatorul de
ntrerupere S0RIR. Scrierea n registrul S0TBUF n timpul recepiei nu are nici
un efect asupra acesteia iar transmisia nu este iniiat.
Rencrcare
S0R
:2

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

Figura 1.47. Structura ASC0 n modul sincron

Atenie! Pentru transmisie pinul P3.11 (RXD0) trebuie setat ca ieire


(P3.11=1h i DP3.11=1h).
Pentru recepie, pinul P3.11 trebuie setat ca intrare (P3.11=1h i
DP3.11=0h).
n ambele cazuri, pinul P3.10 (TXD0) trebuie setat ca intrare
(P3.10=1h i DP3.10=0h).
1.23.3
Generarea ratei de transmisie
Blocul ASC0 are un timer de 13 bii i un registru de rencrcare (S0BG)
dedicat pentru generarea ratei de transmisie.
Timerul numr ceasul unitii centrale divizat cu 2 i poate fi comandat
de bitul S0R. Fiecare depire a timerului produce un tact de deplasare
pentru registrele de serializare. De asemenea, la depire timerul este
ncrcat cu valoarea din registrul S0BG.
Frecvena rezultat este divizat
funcionare selectat prin bitul S0BRS.

din

nou,

funcie

de

modul

de

Familia de microcontrolere 80C16x ____________________________________________ 128

Modurile de determinare a vitezelor de transmisie asincrone, respectiv


sincrone sunt prezentate n relaiile urmtoare, iar cteva exemple de setri
pentru vitezele standard pentru un procesor cu frecvena ceasului de 20 MHz
n tabelul 2.49.
fCPU
BAUD ASINC =
(32 + 16 S0BRS ) (1 + S0BG )

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.4% +3.3% 00140015h


-1.4% +1.0% 002A002Bh
-0.2% +1.0% 00550056h
-0.2% +0.4% 00AC00ADh
-0.2% +0.1% 015A015Bh
-0.1% +0.1% 02B502B6h
-0.0% +0.0% 15B215B3h

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;

S0TIR activat nainte de transmiterea ultimului bit din cadrul transmis.


Aparine registrului S0TIC i genereaz ntreruperea S0TINT;

S0RIR activat cnd datele recepionate sunt mutate n S0RBUF. Aparine


registrului S0RIC i genereaz ntreruperea S0RINT.

n cazul detectrii unei erori (paritate, ncadrare sau depire pentru


modul asincron sau depire n modul sincron), este setat indicatorul
corespunztor din registrul S0CON i este declanat o ntrerupere S0EIR cu
vectorul S0EINT.
Structura registrelor de control a ntreruperilor S0TIC, S0TBIC, S0RIC
i S0EIC sunt prezentate n tabelul 2.17 din paragraful 1.16.1.

1.24. Interfaa serial sincron de vitez


Interfaa serial sincron de vitez (denumit n continuare SSC) permite
un mod flexibil de comunicare ntre circuitul 80C167 i alte microprocesoare,
microcontrolere sau periferice externe.
Blocul SSC permite comunicaii sincrone la viteze de pn la 10 MBaud
(pentru procesoare cu frecvena de ceas de 40 MHz).

129 _______________________________________Aplicaii cu microcontrolere de uz general

Sunt programabile numrul de bii, ordinea biilor n mesaj, polaritatea i


faza tactului de serializare.
Registrele de transmisie i recepie sunt dublu bufferate. Generarea ratei
de transfer este fcut prin intermediul unui timer propriu de 16 bii.
Interfaa SSC poate fi configurat n multe moduri, astfel nct ea poate
fi compatibil cu interfaa ASC0 (n modul sincron), poate opera n sisteme
multiprocesor sau poate realiza legtura cu periferice SPI.
Astfel, modulul SSC permite interfaarea cu registre de deplasare externe
(n scopul extinderii capabilitilor de intrare-ieire), memorii seriale (E 2 ROM)
sau alte controlere (de exemplu, pentru reele locale).
Datele sunt transmise sau prelucrate pe pinul MTSR (P3.9) i MRST
(P3.8). Semnalul de sincronizare este obinut pe pinul SCLK (P3.13).
Schema bloc a interfeei SSC este prezentat n figura 2.34.
Generator baud

SCLK

Control tact

f CPU
SSCTIR
SSCRIC
SSCEIC

Control SSC

Stare

MTSR
Control
pin

Control

Registru
deplasare 16 bii
SSCTB

MRST

SSCRB

Figura 1.48. Structura interfeei SSC

Registrul de control al interfeei SSCCON are dou moduri de utilizare,


funcie de starea bitului SSCEN, prezentate n tabelul 2.50:

pe durata programrii, SSCEN=0h, se pot modifica biii de control (a);

n utilizare, SSCEN=1h, se pot testa indicatorii de stare (b).

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

Validare interfa SSC i mod lucru SSCCON.


0h:
circuit secundar; opereaz cu tact extern de la SCLK;
1h:
circuit principal; genereaz semnal de tact pe SCLK.
1h:
SSC este resetat automat la o eroare a ratei de transmisie.
1h:
verific erorile ratei de transmisie,
1h:
verific erorile de faz.
1h:
verific erorile de la recepie.
1h:
verific erorile de la transmisie.
0h:
semnalul SCLK inactiv este n starea 0 LOGIC ; frontul activ este ;
1h:
semnalul SCLK inactiv este n starea 1 LOGIC ; frontul activ este .
0h:
deplasare date transmise pe front activ SCLK, ncrcare date pe
cellalt front;
1h:
ncrcare date recepionate pe front activ SCLK, deplasare date pe
cellalt front.

Familia de microcontrolere 80C16x ____________________________________________ 130

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

Validare interfa SSC i mod lucru SSCCON.


Circuit secundar/principal.
Setat ct timp o transmisie este n curs. Nu trebuie modificat.
Eroare transmisie (ctul ntre tactul existent i cel presupus de circuitul
secundar egal cu 2 sau 0.5).
Eroare faz (recepioneaz schimbri ale datelor n zona frontului tactului de
eantionare).
Eroare recepie (recepie complet nainte ca bufferul s fie citit).
Eroare transmisie (este iniiat un transfer nainte de modificarea registrului
de transmisie)
Numrul bitul deplasat. Nu trebuie modificat.

Registrul de deplasare al SSC este conectat att la pinul de emisie ct i


la pinul de recepie. Astfel, transmisia i recepia datelor sunt sincronizate i
au loc n acelai timp.
La transmisie, ca circuit principal, procedura este iniiat imediat dup ce
registrul SSCTB a fost ncrcat. Ca circuit secundar, pornirea transmisiei este
condiionat de sosirea tactului de serializare. SSCTB este mutat n registrul
de serializare imediat ce acesta este gol.
Dup ce transferul a nceput, este setat indicatorul de ntrerupere
SSCTIR pentru a semnala c este posibil rencrcarea registrului SSCTB.
Cnd numrul programat de bii (216) a fost transferat, coninutul
registrului de deplasare este mutat n registrul SSCRB i va fi setat indicatorul
de ntrerupere SSCRIR.

Transferul datelor poate avea loc n mai multe moduri:


numrul de bii cuprins ntre 2 i 16;
transferul poate ncepe cu bitul cel mai semnificativ sau cel mai puin
semnificativ;
tactul de deplasare n stare inactiv poate fi 0 LOGIC sau 1 LOGIC ;
biii pot fi deplasai pe frontul activ sau inactiv al tactului de serializare;
viteza de transmisie poate fi aleas ntre 302 Baud i 10 MBaud (pentru
frecvena unitii centrale de 40 MHz);
tactul de deplasare poate fi generat (pentru circuitul principal) sau
recepionat (pentru circuitul secundar).
Alegnd ordinea de transmisie a biilor (SSCHB=0h), interfaa este

compatibil cu interfaa ASC0 a circuitului 80C167 sau cu interfaa serial a


familiei 8051; selectnd SSCHB=1h, comunicaia este compatibil cu
perifericele SPI. Indiferent de ordinea de transmitere a biilor, n registrele
SSCTB i SSCRB datele vor fi ntotdeauna aliniate la dreapta, cu bitul cel mai
puin semnificativ pe poziia 0.

131 _______________________________________Aplicaii cu microcontrolere de uz general

Interfaa SSC folosete trei linii a portului P3 pentru legtura cu celelalte


circuite. Setrile acestor pini depind de modul de operare, circuit principal sau
secundar.
Direcia pinilor (intrare-ieire) depinde de modul de operare. Pentru a
funciona ca ieire, este obligatorie setarea bistabilul de ieire respectiv
ntruct ieirea pinului este produs de o poart I - LOGIC care admite ca
intrri bistabilul de ieire (setat, 1 LOGIC ) i funcia alternativ a portului.
Direcia pinilor trebuie selectat de utilizator funcie de modul de lucru,
conform cu tabelul 2.51.
Circuit principal
Pin
Funcie Bistabil
Direcie
SCLK (P3.13) ieire P3.13=1 DP3.13=1
MTSR (P3.9) ieire P3.9=1 DP3.9=1
MRST (P3.8) intrare P3.8=x DP3.8=0

Funcie
Intrare
Intrare
Ieire

Tabelul 1.64
Circuit secundar
Bistabil Direcie
Tip
P3.13=x P3.13=0

P3.9= x DP3.9=0

P3.8=1 DP3.8=1 ODP3.8=1

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

dezactiveaz din nou linia.


setarea liniilor MRST ca ieiri cu dren n gol, fiind posibil astfel realizarea
unei conexiuni I - CABLAT . i n acest caz identificarea circuitului secundar
care a transmis mesajul se poate face fie prin transmiterea unei adrese de
identificare de ctre circuitul principal, fie prin selectarea hardware a
perifericului dorit.
Iniializarea pinului SCLK a circuitului principal trebuie fcut cu atenie

pentru a nu genera impulsuri parazite care s perturbe circuitele secundare.


Procedura recomandat este urmtoarea:
setare nivel inactiv linie SCLK
SSCPO=x;

Familia de microcontrolere 80C16x ____________________________________________ 132

setare pin port cu valoarea anterioar P3.13=x;

setare pin ca ieire

DP3.13=1h;

validare interfa SSC

SSCEN=1h;

dac SSCPO=0h, n final se seteaz bistabilul de ieire P3.13=1h.

n acest mod de funcionare este posibil schimbarea rolurilor ntre


circuitul principal i unul secundar. Aceast modificare trebuie fcut cu
atenie la ordinea reprogramrii pinilor, pentru a nu provoca conflicte de
magistral.
Structura unui sistem full-duplex este prezentat n figura 2.35.
1.24.2
Operarea half-duplex
n modul de lucru half-duplex este necesar o singur linie att pentru
transmisia ct i pentru recepia datelor. Datele sunt schimbate pe linia care
conecteaz pinii MRST i MTSR ale tuturor dispozitivelor, n timp ce semnalul
de sincronizare este asigurat de legtura ntre pinii SCLK.
Circuit principal
Reg.depls.
MTSR

Circuit secundar 1
Reg.depls.
MTSR

MRST

MRST

SCLK

SCLK
Circuit secundar 2
Reg.depls.
MTSR
MRST
SCLK

Figura 1.49. Interfaa SSC n modul full-duplex

Dispozitivul principal controleaz transferul datelor prin generarea


tactului de transmisie iar circuitul secundar l recepioneaz. Deoarece
schimbul de date se face pe o singur linie, transmisia ntre expeditor i
destinatar n situaia n care acetia se afl la distan mare se poate face i
indirect, datele fiind schimbate ntre dispozitive intermediare.
Asemntor cu modul full-duplex, exist dou metode pentru a evita
coliziunea datelor:
un singur transmitor este activ la un moment dat pe linie;
dispozitivele care nu transmit date au selectate ieiri de tip dren n gol.
Deoarece pinii de ieire i de intrare (MTSR i MRST) sunt conectai
mpreun la fiecare circuit, un circuit emitor va regsi informaia transmis
i la receptorul propriu, prin compararea datelor transmise i recepionate
fiind astfel posibil detectarea rapid a unor probleme pe linia de transmise
(scurtcircuit, linii neadaptate etc.).
Structura unui sistem half-duplex este asemntoare cu structura
sistemului full-duplex prezentat n figura 2.33, singura diferen fiind dat

133 _______________________________________Aplicaii cu microcontrolere de uz general

de dispariia legturilor de date MTSRMTSR , MRSTMRST care n


aceast arhitectur devine MTSR+MRSTMTSR+MRST .
1.24.3
Viteza de transmisie
Interfaa serial SSC are propriul generator de rate de transmisie, cu
timer de 16 bii i cu facilitatea de rencrcare.
Generatorul are asigurat frecvena de intrare dintr-un divizor cu 2 a
frecvenei unitii centrale. Timerul numr continuu descresctor i poate fi
validat prin bitul SSCEN din registrul SSCCON.
Registrul de rencrcare SSCBR are dou funciuni: la citire, cu interfaa
SSC validat, restituie coninutul timerului; dac interfaa SSC este
dezactivat, indic valoarea de rencrcare.
Formula pentru determinarea vitezei de transmisie este prezentat n
relaia urmtoare:
fCPU
BAUDSSC =
2 (1 + SSCBR )
Cteva valori orientative ale vitezei de transmisie pentru un procesor cu
frecvena ceasului de 20 MHz sunt prezentate n tabelul 2.52.
Tabelul 1.65
Vitez transmisie Valoare rencrcare Vitez transmisie Valoare rencrcare
REZERVAT
0000h
1 MBaud
0009h
5 MBaud
0001h
100 kBaud
0063h
3.3 MBaud
0002h
10 kBaud
03E7h
2.5 MBaud
0003h
1 kBaud
270Fh
2 MBaud
0004h
152.6 Baud
FFFFh

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.

Erori de rat de transmisie, numai pentru circuitul secundar, dac semnalul


SCLK are o deviaie mai mare de 100% fa de valoarea programat.
Pentru a fi detectat aceast eroare, este necesar ca i circuitul secundar
s aib programat o vitez de transmisie cu circuitul principal. Este setat
indicatorul SSCBE validat de bitul SSCBEN, ambele din registrul SSCCON.

Erori de transmisie, numai pentru circuitul secundar, n momentul n care


un circuit principal solicit date de la un circuit secundar iar acesta nu a
schimbat datele din registrul SSCTB. n aceast situaie, circuitul

Familia de microcontrolere 80C16x ____________________________________________ 134

secundar va emite totui vechiul coninut al registrului de transmisie dar


este posibil coliziunea datelor, n sensul c linia de transmisie poate fi
deja ocupat de alt emitor. Este setat indicatorul SSCTE validat de bitul
SSCTEN, ambele din registrul SSCCON.
1.24.5
Controlul ntreruperilor SSC
ntreruperile generate de interfaa SSC sunt gestionate de trei registre
de ntrerupere SSCRIC, SSCTIC i SSCEIC respectiv pentru evenimente de
recepie, transmisie i erori.
ntreruperea de recepie este generat n momentul n care este copiat
registrul de deplasare SSC n registrul SSCRB. Este semnalat de indicatorul
SSCRIR i are vectorul SCRINT.
ntreruperea de transmisie este generat n momentul n care este copiat
registrul SSCTB n registrul de deplasare SSC i, n cazul circuitelor
secundare, transmisia a nceput prin recepionarea semnalului SCLK. Este
semnalat de indicatorul SSCTIR i are vectorul SCTINT.
ntreruperea generat de erori a fost prezentat n paragraful 1.24.4,
este semnalat de indicatorul SSCEIR i are vectorul SCEINT.
Structura registrelor de control a ntreruperilor SSCRIC, SSCTIC i
SSCEIC sunt prezentate n tabelul 2.17 din paragraful 1.16.1.

1.25. ncrctorul bootstrap


ncrctorul bootstrap, denumit n continuare BSL, asigur un mecanism
pentru ncrcarea programului de lucru la microcontrolerului prin intermediul
interfeei seriale ASC0, fr a fi necesar existena nici unui circuit ROM (fie
el intern sau extern).
Modulul BSL ncarc datele n memoria RAM intern, dar este posibil i
transferarea programului n memoria extern, folosind o rutin secundar.
Blocul BSL poate fi folosit pentru ncrcarea aplicaiei complete n
sistemele fr circuite ROM, poate ncrca numai programe temporare, de
test sau calibrare n sistemele definitivate ori se poate utiliza pentru
ncrcarea programelor pentru dispozitivele Flash-ROM.
1.25.1
Intrarea n modul BSL
Familia 80C16x intr n acest mod dac, la sfritul iniializrii, pinul
P0L.4 are nivel 0 LOGIC . Codurile pentru execuia BSL sunt memorate ntr-un
circuit intern special, Boot-ROM, care nu are nici o legtur cu memoria ROM
intern.
Dup intrarea n acest mod, unitatea central exploreaz pinul RXD0
pentru a detecta un octet zero (adic un bit de start, opt bii 0h i un bit de
stop). Funcie de durata de recepie a acestui octet, unitatea central
determin viteza de transmisie i iniializeaz interfaa ASC0 n mod
corespunztor. Folosind aceiai vitez de transmisie, circuitul rspunde pe

135 _______________________________________Aplicaii cu microcontrolere de uz general

interfa cu un octet de control funcie de tipul su: 80C165AAh,


80C166-55h, 80C167A5h.
n momentul n care microcontrolerul ntr n modul BSL, registrele de
control sun setate automat la urmtoarele valori:
Timer WDT dezactivat;
Indicator context CP FA00h;

Indicator stiv SP FA40h

Registru STKUN FA40h;

Registru STKOV FA0Ch;

Registru SYSCON FA40h;

Registru S0CON 8011h;

Registru S0BG funcie de vitez;

Registru BUSCON0 funcie de configuraia de iniializare;

TXD0 (P3.10 i DP3.10) 1h.

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

eroare de msurare a acestei


ntre rata de transfer real i
transfer corect de date, este
de 2.5%. n principiu, cu ct

Familia de microcontrolere 80C16x ____________________________________________ 136

viteza de transfer a datelor este mai mic, cu att eroarea de corelare a


vitezelor este mai mic.

1.26. Consumul redus de energie


Pentru a mri durata de funcionare a unui sistem care are alimentarea
asigurat de la baterii sau acumulatori cu o resurs limitat, circuitul 80C167
are prevzute dou regimuri economice de funcionare inactiv i oprit.
1.26.1
Modul inactiv
n acest mod, toate perifericele, inclusiv timerul WDT sunt funcionale;
este oprit numai funcionarea unitii centrale.
Coeficientul de reducere al puterii consumate depinde de frecvena
procesorului i este dat de relaia urmtoare:
20 + 3fCPU [MHz]
K=
0.4
30 + 8fCPU[MHz]
Intrarea n modul inactiv este fcut prin executarea instruciunii IDLE.
Terminarea modul inactiv se face prin orice cerere de ntrerupere care
are indicatorul xxxIE validat. Dup executarea instruciunii RETI de la
sfritul rutinei de tratare a ntreruperii, unitatea central continu execuia
programului de la urmtoarea instruciune dup IDLE. Pentru o cerere care
este programat pentru un serviciu PEC, dup terminarea transferului
unitatea central rmne n modul IDLE.
Atenie! ntreruperile sau serviciile PEC vor fi executate i vor scoate
procesorul din modul inactiv numai dac prioritatea lor curent este
mai mare dect a unitii centrale (stabilit n registrul PSW
cmpul ILVL).
O alt cale de terminare a modului inactiv este activarea semnalului
extern de ntrerupere nemascabil NMI ori executarea unei iniializri externe.
De asemenea, este posibil ieirea din modul inactiv printr-o iniializare
produs de timerul WDT.
1.26.2
Modul oprit
Pentru a reduce i mai mult consumul de energie, programatorul are la
dispoziie i acest regim. n modul oprit toat activitatea microcontrolerului
este stopat, numai coninutul memoriei RAM pstrndu-se nealterat.
Coeficientul de reducere al puterii consumate este semnificativ, n plus
fa de modul inactiv fiind posibil i reducerea tensiunii de alimentare cu
50%.
Modul oprit asigur reducerea puterii consumate de circa 20000 de ori,
prelungindu-se corespunztor durata de funcionare a sursei de alimentare.
Intrarea n modul oprit este fcut prin intermediul instruciunii PWRDN.
Modul oprit poate fi terminat numai prin generarea unei iniializri
externe.

137 _______________________________________Aplicaii cu microcontrolere de uz general

Pentru a proteja unitatea central de o intrare neintenionat n modul


oprit, exist dou modaliti:
instruciunea PWRDN este o instruciune protejat, pe 32 de bii, fiind puin

probabil s fie executat din ntmplare;


instruciunea este efectiv numai dac semnalul NMI este activ n timpul

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

datorit alimentrii, procesorul va intra n modul oprit; dac nu va funciona


normal n continuare.
1.26.3
Starea pinilor de ieire pe parcursul modurilor economice
Pe durata modului inactiv, cnd oscilatorul unitii centrale este oprit,
toate perifericele i continu funcionarea lor normal. Din acest motiv, toate
porturile configurate ca ieiri pstreaz ultima valoare scris n bistabilii de
ieire.
Dac pinul este folosit de un modul intern, starea sa reflect situaia
perifericului.
Pinii care sunt folosii pentru controlul magistralei externe trec ntr-o
stare care reprezint valoarea lor inactiv (de exemplu, WR trece n 1 LOGIC iar
ALE n 0

LOGIC )

iar alii au valoarea de la ultimul acces EBC (de exemplu

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.

1.27. Setul de instruciuni


Pentru a obine performane maxime ntr-o arhitectur cu stiv de
instruciuni, setul de instruciuni a fost optimizat pentru a funciona n
filozofia unui procesor RISC. Aceast filozofie a condus la urmtoarele
tendine pentru realizarea instruciunilor:

Familia de microcontrolere 80C16x ____________________________________________ 138

Coduri realizarea unor operaiuni care necesit secvene de instruciuni


utilizate frecvent. Se evit transferul n i din registre temporare, cum ar fi
acumulatorul sau bii de tip transport sau mprumut. Este permis
executarea n paralel a sarcinilor, de exemplu salvarea strii procesorului
la intrarea n ntreruperi sau subrutine.
Este evitat o structur complicat de codificare i, de asemenea, structuri
complexe de adresare. Aceasta scade timpul decodificrii instruciunilor
permind i o dezvoltare simpl a compilatoarelor.
Cele mai utilizate instruciuni sunt codificate ntr-un singur cuvnt. Aceasta
permite alinierea codului la nivel de cuvnt i evitarea existenei unor
circuite complicate pentru aliniere.
Operanzii admii de procesor sunt de tip cuvnt (16 bii), octet (8 bii)
sau bit. Modurile de baz de adresare folosite pentru operanzi sunt directe,
indirecte sau imediate.
n cele ce urmeaz sunt prezentate instruciunile circuitului 80C167
organizate pe clase i pe tipuri de operanzi.
Instruciuni aritmetice

Adunarea a dou cuvinte sau octei

ADD

ADDB

Adunarea cu transport a dou cuvinte sau octei

ADDC

ADDCB

Scderea a dou cuvinte sau octei

SUB

SUBB

Scderea cu transport a dou cuvinte sau octei

SUBC

SUBCB

nmulire 1616 bii cu sau fr semn

MUL

MULU

mprire 1616 bii cu sau fr semn

DIV

DIVU

mprire 3216 bii cu sau fr semn

DIVL

DIVLU

Complement fa de 1 pentru cuvnt sau octet

CPL

CPLB

Complement fa de 2 pentru cuvnt sau octet

NEG

NEGB

AND

ANDB

OR

ORB

XOR

XORB

Instruciuni logice

I - LOGIC

SAU - LOGIC

SAU - EXCLUSIV

ntre dou cuvinte sau octei


ntre dou cuvinte sau octei
ntre dou cuvinte sau octei

Comparri i control bucle

Comparare ntre dou cuvinte sau octei

CMP

CMPB

Comparare ntre dou cuvinte cu postincrementare


cu 1 sau 2

CMPI1

CMPI2

Comparare ntre dou cuvinte cu postdecrementare


cu 1 sau 2

CMPD1

CMPD2

Manipulare cmp de bii n octet superior sau inferior BFLDH

BFLDL

Setare bit

Instruciuni booleene bii

BSET

139 _______________________________________Aplicaii cu microcontrolere de uz general

tergere bit

BCLR

Mutare bit

BMOV

Mutare bit negat

BMOVN

I - LOGIC

BAND

SAU - LOGIC

SAU - EXCLUSIV

Comparare ntre doi bii

ntre doi bii


ntre doi bii
ntre doi bii

BOR
BXOR
BCMP

Instruciuni deplasare i rotire

Deplasare dreapta cuvnt

SHR

Deplasare stnga cuvnt

SHL

Rotire dreapta cuvnt

ROR

Rotire stnga cuvnt

ROL

Deplasare aritmetic dreapta cuvnt

ASHR

Instruciuni normalizare

Determinare numr deplasri normalizare cuvnt

PRIOR

Instruciuni mutare date

Mutare standard cuvnt sau octet

MOV

MOVB

Mutare octet la o locaie de cuvnt cu extensie


de semn sau de zero

MOVBS

MOVBZ

Instruciuni stiva sistem

Introducerea unui cuvnt n stiv

PUSH

Extragerea unui cuvnt din stiv

POP

Schimbarea contextului registrelor GPR

SCXT

Instruciuni salt

Salt condiionat la o adres absolut, indirect


sau relativ n segmentul curent

JMPA

Salt necondiionat la adres n orice segment

JMPS

Salt condiionat la o adres relativ n segmentul


curent funcie de starea unui bit

JB

JNB

Salt condiionat la o adres relativ n segmentul


curent funcie de starea unui bit cu inversarea
bitului n caz de salt

JBC

JNBS

JMPI JMPR

Instruciuni apel subrutine

Apel condiionat la adres absolut, indirect


sau relativ n segmentul curent

CALLA CALLI CALLR

Apel necondiionat la adres n orice segment

CALLS

Apel condiionat la o adres absolut n segmentul

Familia de microcontrolere 80C16x ____________________________________________ 140

curent i salvarea n stiv a unui registru selectabil

PCALL

Apel necondiionat de ntrerupere sau excepie

TRAP

Instruciuni rentoarcere subrutine

Rentoarcere din segmentul curent

RET

Rentoarcere din orice segment

RETS

Rentoarcere din segmentul curent i aducerea


din stiv a unui registru selectabil

RETP

Rentoarcere din rutin ntrerupere

RETI

Instruciuni control sistem

Iniializare software

SRST

Intrare mod inactiv

IDLE

Intrare mod oprit

PWRDN

Servire timer WDT

SRVWDT

Invalidare timer WDT

DISWDT

Terminare rutin iniializare

EINIT

Instruciuni diverse

Nici o aciune

NOP

Definirea unor instruciuni neintreruptibile

ATOMIC

Comutare moduri adresare reg, bitoff i bittadr


pentru zona ESFR

EXTR

Suprapunere pagini date folosind o pagin special


de date n locul DPP i opional comutare n
zona ESFR

EXTP

EXTPR

Suprapunere pagini date folosind un segment specific


n locul DPP i opional comutare n zona ESFR
EXTS

EXTSR

Unele instruciuni care sunt critice pentru funcionare unitii centrale


sunt denumite instruciuni protejate. Pentru a crete protecia mpotriva unor
ncrcri eronate de cod, aceste instruciuni folosesc 32 de bii pentru
decodificare. O instruciune protejat trebuie s aib codul operaiunii repetat
de dou ori n al doilea cuvnt al instruciunii iar octetul urmtor codului s
fie complementul acestuia.
Instruciunile protejate sunt DISWDT, EINIT, IDLE, PWRDN, SRST i
SRVWDT. Apariia unei erori de decodificare la o astfel de instruciune
provoac apariia unei excepii hardware prin setarea indicatorului PRTFLT
din registrul TFR (prezentate n 1.16.7).
Atenie! Circuitul nu dispune de aritmetic BCD. Calculele BCD pot fi
efectuate prin convertirea datelor BCD n cod hexazecimal,
efectuarea calculelor, urmat de convertirea rezultatului n BCD. Se
pot folosi facilitile de nmulire/mprire ale circuitului sau, dac

141 _______________________________________Aplicaii cu microcontrolere de uz general

exist suficient spaiu, se pot face conversii rapide pe baz de


tabele.
Instruciunea PRIOR permite emularea simpl a operaiilor n virgul
flotant cu un numr mic de alte instruciuni.
Dac este folosit pentru iniializare memoria ROM intern (pinul
EA=1h la iniializare), circuitul trebuie s conin aceast memorie
i trebuie s aib un vector de iniializare valid i un program
corespunztor.
La alocarea memoriei ROM interne n segmentul 0 sau 1 nu trebuie
executate instruciuni dect din memoria extern sau RAM intern.

Familia de microcontrolere 80C16x ____________________________________________ 142

143 _______________________________________Aplicaii cu microcontrolere de uz general

2. Dezvoltarea sistemelor cu microcontrolere


Scopul acestui capitol este de a prezenta cteva unelte software strict
necesare oricrui utilizator, sisteme de dezvoltare pentru testarea soluiilor
hardware i software i nu n ultimul rnd, cteva aplicaii i drivere de uz
general cu un accent deosebit pus pe interfeele I 2 C.
Avnd ca punct de pornire aceste cunotine, un utilizator i poate
dezvolta propriile sale aplicaii, n cele mai diverse domenii: sisteme de
alarm, automatizri casnice din cele mai diverse, mbuntiri ale electronicii
automobilului etc. Practic, domeniul de utilizare al microcontrolerelor nu este
limitat dect de natura semnalelor care trebuiesc controlate (i, evident, de
existena traductoarelor necesare) i de imaginaia utilizatorului.

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.

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 144

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]

unde: fiier.c reprezint programul surs care va fi compilat i transformat


n fiier obiect .obj.
list_control conine directivele din linia de apel.
Cele mai importante comenzi din list_control utilizate de i C51
C166 sunt prezentate n continuare:
TINY (numai C166), SMALL, COMPACT, MEDIUM (numai C166) sau LARGE

selecteaz modelul de memorie corespunztor;


CODE adaug la fiierul de ieire .lst mnemonicele n asamblor generate de

compilator;
DEBUG adaug la fiierul de ieire .obj informaii pentru depanare;

HOLD (numai C166) specific explicit spaiul de memorie utilizat de obiecte


near, idata, sdata sau bdata;

145 _______________________________________Aplicaii cu microcontrolere de uz general

Exemplu: C166 prog.c HOLD (near 6) toate variabilele care ocup mai
puin de 6 octei sunt alocate n zona near.

INTERVAL (numai C51) specific un interval diferit de 3 octei pentru

vectorii de ntrerupere;
INTVECTOR (numai C51) declar deplasamentul pentru tabela vectorilor

de ntrerupere n situaia n care tabela nu este memorat de la adresa 0h;


MOD167 valideaz utilizarea instruciunilor 80C167;

OPTIMIZE

inspecteaz

codul

final

eliminnd

unele

slbiciuni

ale

compilatoarelor. OPTIMIZE este urmat de o valoare zecimal care descrie


tipul de optimizare ales:
(0) mbuntete timpul de prelucrare prin efectuarea calculelor
care conin constante, inclusiv calculul adreselor; de asemenea,
compilatorul elimin salturile inutile (JMP la JMP);
-

(1) elimin fragmentele de cod neutilizate i analizeaz salturile

condiionate pentru a sesiza dac prin schimbarea condiiei acesta


poate fi eliminat;
(2) amelioreaz accesul la variabilele care sunt incluse direct n

operatori, eliminnd necesitatea utilizrii de registre intermediare;


(3) elimin instruciunile MOV redundante;

(4) nu mai rezerv memorie pentru variabilele i parametrii care sunt


transferai prin registre; de asemenea, optimizeaz instruciunile
CASE/SWITCH prin transformarea lor n tabele de salturi sau n

secvene comparare-salt;
(5) permite calculul unic a unor expresii identice care apar n rutine;

de asemenea, optimizeaz buclele din program, n sensul ncrcrii


valorilor constante n afara buclei;
PECDEF (numai C166) rezerv spaiul necesar pentru pointerii surs i

destinaie ai PEC;
SRC creeaz n locul fiierului obiect un fiier surs care poate fi asamblat
cu macroasamblorul corespunztor.
Tipuri de date

n tabelul 3.1.a) sunt prezentate cuvintele cheie suplimentare pentru C51


iar n tabelul 3.1.b) pentru C166. Suplimentar, variabilele pot fi combinate n
structuri sau uniuni, iruri multidimensionale iar adresarea lor poate fi fcut
prin pointeri. Directiva de tip sfr, att pentru C51 ct i pentru C166
simplific adresarea registrelor speciale.
Tabelul 2.1
Tip date
a)
C51
bit
signed char
unsigned char

Dimensiune

Domeniu de valori

1 bit
1 octet
1 octet

0 sau 1
-128 +127
0 +255

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 146


signed int
2 octei
-32768 +32767
unsigned int
2 octei
0 +65535
signed long
4 octei
-2147483648 +2147483647
unsigned long
4 octei
0 +4294967295
float
4 octei
1.176E-38 3.40E+38
pointer
13 octei
adresa obiectului n funcie de zona de memorie
Tipuri de date pentru SFR
sbit
1 bit
0 sau 1
sfr
1 octet
0 +255
sfr16
2 octei
0 +65535
b)
C166
bit
1 bit
0 sau 1
signed char
1 octet
-128 +127
unsigned char
1 octet
0 +255
signed int
2 octei
-32768 +32767
unsigned int
2 octei
0 +65535
signed long
4 octei
-2147483648 +2147483647
unsigned long
4 octei
0 +4294967295
float
4 octei
1.176E-38 3.40E+38
double
8 octei
1.7E-308 1.7E+308
pointer
14 octei
adresa obiectului n funcie de zona de memorie
Tipuri de date pentru SFR
sbit
1 bit
0 sau 1
sfr
2 octei
0 +65535

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

147 _______________________________________Aplicaii cu microcontrolere de uz general


memorie; dimensiunea unui ir sau structuri este limitat la 16
kB
pointer 32 bii, permind accesul complet la ntregul spaiu de
huge
memorie; dimensiunea unui ir sau structuri nu mai este limitat
la 16 kB

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

La C166, spaiile de memorie near, far i huge pot fi aplicate i


pointerilor. Un pointer near permite adresarea oricrui obiect care folosete
stiva sau este definit n zonele near, sdata, idata sau bdata. Un pointer
far poate accesa toate obiectele din spaiul de memorie al lui 80C16x,

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 148

dimensiunea obiectului fiind limitat la 16 kB. n situaia pointerului huge,


dimensiunea obiectului adresat poate fi mai mare de 16 kB.
Pentru modelele de memorie segmentate (toate, cu excepia lui TINY),
pentru adresarea pointerilor sunt folosite registrele DPPx, dup cum urmeaz:
DPP0

pointeri huge i far

DPP1

pointeri near grupul NCONST

DPP2

pointeri near grupul NDATA

DPP3

pointeri grupurile SDATA sau SYSTEM

Bancuri de registre i mascarea registrelor


C51 suport 4 bancuri de memorie utilizabile pentru programul curent.
Definirea bancului de registre utilizat este fcut fie n linia de comand, fie
printr-o directiv #pragma, conform sintaxei:
REGISTERBANK (n)
Sintaxa pentru definirea bancului de registre folosit de o procedur C
este:
[tip] nume_funcie ([parametri]) [model] [reentrant] using n
unde n reprezint numrul bancului de registre utilizat.
Mascarea registrelor permite o optimizare global a utilizrii registrelor
interne. Folosirea acestei faciliti mbuntete programul prin eliminarea
salvrilor inutile n stiv a registrelor unitii centrale. Mascarea registrelor
este activat de directiva REGFILE sau poate fi generat automat i de
editorul de legturi L51.
Masca de registre este un cuvnt a crei semnificaie este:
MSB
VAL

Registru
VAL este setat pentru a indica o masc valid.
ACC CY PSW

DPL DPH R0

R1

R2

R3

R4

R5

R6

LSB
R7

C166 suport pn la 128 de bancuri de registre logice, fiecare banc


fiind compus din 16 registre R0R15.
Adresa de baz a bancului de registre curent este dat registrul SFR CP
(Context Pointer). Dac o procedur este declarat cu atribut using,
compilatorul genereaz codul necesar pentru schimbarea bancului de registre
i salvarea CP anterior, precum i pentru revenirea la vechiul CP la
terminarea rutinei.
Este recomandat ca aceast funcie a compilatorului s fie utilizat n
ntreruperi sau pentru programele de aplicaie n timp real.
Sintaxa pentru definirea bancului de registre este:
[tip] nume_funcie ([parametri]) using banc_registre
unde banc_registre este un nume care identific bancul de registre pe
parcursul procesului de editare a legturilor.
banc_registre poate fi folosit de funcii diferite i este chiar
recomandabil ca, pentru ntreruperile cu acelai nivel de prioritate, s fie
folosit acelai banc de registre.

149 _______________________________________Aplicaii cu microcontrolere de uz general

C166 suport o mascarea a registrelor care poate fi aplicat


prototipurilor sau declaraiilor externe de funcii. Mascarea registrelor
specific ce registre sunt modificate n timpul execuiei funciei. Informaia
este utilizat de compilator pentru optimizarea alocrii registrelor i
minimizarea timpului de execuie i a lungimii codului.
Un exemplu de utilizare al acestei faciliti este prezentat n continuare:
[extern][tip] nume funcie ([parametri]) @=reg_mask

unde: [extern][tip] nume funcie ([parametri]) este sintaxa standard de


definire a funciei;
reg_mask este o valoare numeric, pe 16 bii, corespunztoare
urmtoarei codificri:
MSB
Registru
utilizat

LSB
-

MDX R12 R11 R10

R9

R8

R7

R6

R5

R4

R3

R2

R1

R0

Valoarea 0 a reg_mask, valoare implicit, specific utilizarea tuturor


registrelor. Valoarea 0x8000h indic faptul c nici un registru nu este afectat
de funcie. MDX reprezint registrele MDL, MDH i MDC utilizate de mprire i
nmulire.
ntreruperi
Compilatorul C51 are cuvinte specifice care permit programatorului un
control complet asupra ntreruperilor, bancurilor de registre utilizate i a
funciilor care vor fi apelate la sosirea unei cereri de ntrerupere.
Specificarea adresei de start a vectorului de ntrerupere pentru sistemele
de dezvoltare la care programul de test se ncarc de la adresa 8000h trebuie
folosit directiva INTVECTOR/NOINTVECTOR (fie n linia de comand, fie cu
#pragma).
Sintaxa unei funcii de ntrerupere este:
void nume_funcie (void)[model][reentrant] interrupt n [using m]

unde n este numrul ntreruperii i m numrul bancului de registre utilizat.


Compilatorul C166 permite programatorului controlul complet asupra
tuturor aspectelor referitoare la ntreruperi sau bancurile de registre. C166
genereaz codul necesar pentru a efectua procedurile optime n ntreruperi.
C166 ofer suportul necesar i pentru canalele PEC. Zonele cu date PEC
trebuie declarate n spaiul de memorie sdata, sau trebuie declarate explicit
n segmentul 0 de memorie. Pentru rezervarea zonelor de memorie necesare
PEC trebuie folosit directiva PECDEF urmat de numrul canalelor utilizate
(de exemplu: #pragma PECDEF (1,3,4-7)).
Sintaxa folosit pentru ntreruperi este urmtoarea:
void nume_funcie (void) interrupt definire_vector [using reg_mask]

unde: definire_vector reprezint:

identificator ntrerupere = numr excepie;

identificator ntrerupere;

numr excepie.

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 150

C166 permite definirea unui vector de ntrerupere fie n form simbolic,


fie n form absolut. Legtura ntre forma absolut i simbolic este dat de
relaia:
adres_vector = numr_excepie * 4
Utilizarea procedurilor de ntrerupere prezint urmtoarele particulariti:
dac nu este utilizat comutarea bancului de registre (atributul using),

toate registrele utilizate n rutin sunt salvate n stiv;


registrele SFR, MDC, MDL i MDH, dac sunt utilizate n rutin, sunt salvate
automat n stiv iar la ieire sunt restaurate;
nu este posibil trecerea sau ntoarcerea de parametri;
din ntrerupere pot fi apelate orice funcii standard C (toate sunt
reentrante);
funcia este terminat de instruciunea RETI.
Transmiterea parametrilor

Cunoaterea modului n care sunt transferai parametrii la apelul unei


funcii este util n cazul n care se scriu att funcii att n asamblare ct i
n C.
C51 poate transfera pn la trei parametrii folosind registrele
procesorului, conform cu tabelul 3.5 Dac nu sunt registre disponibile sau
dac se folosete directiva #pragma NOREGPARAMS, parametrii sunt
transmii folosind locaii din memorie n funcie de modelul de memorie
folosit.
Tabelul 2.5
Tip parametru
Parametrul 1
Parametrul 2
Parametrul 3

char, pointer 1
octet
R7
R5
R3

int, pointer 2
octei
R6 i R7
R4 i R5
R2 i R3

long, float

pointer generic

R4, R5, R6, R7


R4, R5, R6, R7

R1, R2, R3
R1, R2, R3
R1, R2, R3

Valoarea ntoars de funcie se afl n registrele unitii centrale, dup


cum se prezint n tabelul 3.6
Tabelul 2.6
Tipul valorii returnate
Bit
(unsigned) char
(unsigned) int
(unsigned) long
Float
pointer generic

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)

C166 permite transferul a maxim cinci parametri prin intermediul


registrelor de uz general ale unitii centrale R8R12. Dac toate cele cinci
registre sunt utilizate, va fi folosit stiva sistem. De asemenea, stiva este
folosit pentru pstrarea variabilelor automate i poate fi accesat prin
intermediul registrului R0. Pentru transmiterea valorilor de tip bit este folosit
R15.

151 _______________________________________Aplicaii cu microcontrolere de uz general

Valorile returnate de proceduri sunt pstrate n registre fixe (prezentate


n tabelul 3.7, n funcie de natura acestora. n acest mod, interfaarea cu
programele scrise n asamblor este foarte mult uurat.
Tabelul 2.7
Valoare returnat
Bit
(unsigned) char
(unsigned) int
(unsigned) long
Float
Double
near pointer
far/huge pointer

Registru
R4.0
RL4
R4
R4,R5
R4,R5
R4R7
R4
R4,R5

Observaii

LSB n R4, MSB n R5


format 32 bii IEEE. exponent i semn n R5
format 64 bii IEEE. exponent i semn n R7
deplasament n R4, selector n R5

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

seteaz registrul BUSCON.0BUSCON.3; definete numrul de

_RWDC

cicluri de ateptare la accesul memoriei;


seteaz registrul BUSCON.4; definete ntrzierea semnalelor
RD/WR;

_MTTC

seteaz registrul BUSCON.5; programeaz intervalul de nalt

_RDYEN

impedan;
seteaz registrul BUSCON.12; valideaz utilizarea semnalului
READY pentru terminarea ciclului de memorie;

_CLKEN

seteaz registrul SYSCON.8; valideaz producerea semnalului


CLKOUT pe pinul P3.15;

_BYTDIS

seteaz registrul SYSCON.9; valideaz producerea semnalului


BHE pe pinul P3.12;

_SGTDIS

seteaz registrul SYSCON.11; invalideaz segmentarea (pentru


modelul de memorie TINY);

_STKSZ

seteaz registrul SYSCON.13SYSCON.15; definete mrimea

EXT_RAM

stivei ntre 32 i 1024 cuvinte;


valideaz semnalul WR pe pinul P3.13;

WATCHDOG

dezactiveaz timerul de iniializare;

CLR_MEMORY valideaz tergerea memoriei RAM la iniializare;


INIT_VARS

valideaz iniializarea variabilelor declarate explicit.

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 152

Mai multe informaii despre registrele de configurare pot fi gsite n


paragraful 2.3.1, Caracteristici programabile ale magistralei i 2.2.3,
Registrele speciale ale unitii centrale.
PUTCHAR.C conine cteva rutine utilizate pentru transmiterea de caracte-

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

[expr1] [,expr2] [,expr3]

[;comentariu]

Semnificaia elementelor de mai sus este urmtoarea:


etichet : o valoare simbolic a adresei fizice a instruciunii utilizat pentru
salturi, apeluri de subrutine i depanatoare;
mnemonic
un set de caractere recunoscut de asamblor ca instruciune a
unitii centrale;

153 _______________________________________Aplicaii cu microcontrolere de uz general

operanzii asociai instruciunii respective.


Operanzii acceptai de A51 i A166, care pot fi n numr de la 0 pn la
3, sunt prezentai n tabelul 3.8.a), respectiv 3.8.b).

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.

Operanzii instruciunilor sunt expresii primare. Expresiile constau n


numere, simboluri i operatori.
n continuare, vor fi prezentate numai particularitile specifice
asambloarelor A51 i A166:
Numerele pot fi reprezentate n cod hexazecimal (h,H), zecimal (d,D), octal
(o,O,q,Q) sau binar (b,B). Sunt admise numai iruri de unul sau dou
caractere ASCII.
Simbolurile reprezint valori numerice sau adrese. Se pot utiliza ca valori
numerice n expresii unde sunt folosite constante numerice.
Pot fi definite de utilizator sau pot fi speciale, cuvinte rezervate (GPR,
ORG, $ etc.).
Simbolurile pot avea la C166 urmtoarele atribute: TYPE (tipul simbolului
bit, byte, word, data3 etc.; folosite pentru determinarea tipului
accesului i selectarea instruciunii potrivite de exemplu MOVB sau
MOVW), SECTION (segmentul de memorie care conine cod, constante sau
variabile), SCOPE (ntinderea simbolului local pentru module, global,
public sau extern pentru constante i simboluri relocatabile), VALUE
(valoarea

numeric

sau

deplasamentul

simbolului)

CHANGEABLE

(simbolurile definite cu directiva SET pot fi modificate pe parcursul


programului).

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 154

Simbolurile pot fi relocatabile, adic ele sunt evaluate n momentul editrii


legturilor. Aceste simboluri sunt: numele de seciuni, numele de grupuri,
variabilele i etichetele, constantele externe.
Operatorii sunt prezentai n tabelul 3.9. (cu sunt marcai operatorii
admii numai de C166).
Tabelul 2.9
Operator
()
.
BIT PTR,BYTE PTR,
WORD PTR,BITWORD
PTR,NEAR PTR,FAR
PTR
DATA3,DATA4,DATA8
DATA16
DPP0-DPP3
SEG
PAG
SOF
POF
BOF
HIGH,LOW
NOT
+,*,/,MOD
+,SHL(<<),SHR(>>)
AND(&),OR(|),
XOR (^)
LT(<),LE(<=)
GT(>),GE(>=)
ULT, ULE, UGT, UGE
SHORT

Semnificaie
schimbarea ordinii de evaluare
separator poziie bit
tip pointer

constant 3 bii (0-7), 4 bii (0-15), 8 bii (0-256),


respectiv 16 bii (0-65535)
indicator pagin de date
numr segment variabil (64 kB)
numr pagin variabil (16 kB)
deplasament segment variabil
deplasament pagin variabil
poziie bit
valoarea octetului superior, respectiv inferior
complement
semnul expresiei
nmulire, mprire, rest modulo
adunare, scdere
deplasare stnga, dreapta
I LOGIC , SAU LOGIC , respectiv SAU EXCLUSIV LOGIC
comparare: mai mic, mai mic sau egal, mai mare,
respectiv mai mare sau egal
comparri fr semn: mai mic, mai mic sau egal, mai
mare, respectiv mai mare sau egal
generarea unui salt relativ sau apel la subrutin n
domeniul 128/+127 cuvinte

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]

nume numele segmentului definit;

tip indic spaiul de memorie utilizat; poate fi CODE (memorie program), XDATA
(memorie

extern),

DATA

(memorie

date

intern),

IDATA

(memorie

intern

adresabil indirect) i BIT (memorie adresabil la nivel de bit);

relocatabil poate fi PAGE (segmentul ncepe la adrese divizibile cu 256),


INPAGE (segmentul trebuie inclus ntr-un bloc de 256 octei), INBLOCK (segmentul
trebuie inclus ntr-un bloc de 2048 octei), BITADDRESABLE, (segmentul trebuie
inclus n zona adresabil la nivel de bit), UNIT (este adresa iniial, de tip bit sau
octet, pentru un segment bit, respectiv toate celelalte tipuri), OVERLAYABLE

(segmentul poate fi suprapus cu alte segmente);


simbol xxxx expresie

simbol numele segmentului definit;

155 _______________________________________Aplicaii cu microcontrolere de uz general

xxxx poate fi CODE, XDATA, DATA, IDATA i BIT i semnific tipul spaiului de

memorie alocat simbolului;


expresie const ntr-o valoare numeric relocatabil; nu trebuie s conin

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).

iniializarea i rezervarea spaiului de memorie:


[etichet:] xx expresie_numeric

etichet reprezint adresa simbolic ncepnd cu care este rezervat spaiul de

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).

editarea legturilor programului:


PUBLIC simbol [,simbol [,]]
PUBLIC declar numele unui simbol care n alte module este definit EXTRN.
EXTRN tip_segment (simbol),
EXTRN declar numele simbolurilor utilizate n alte module. Fiecare simbol extern are definit un tip
de segment (CODE, DATA, IDATA XDATA, BIT sau NUMBER fr tip) care definete
utilizarea simbolului.

controlul strii asamblorului i selectarea segmentului:


END este ultima linie dintr-un program surs, marcnd sfritul acestuia;
ORG expresie este folosit pentru modificarea contorului de adrese la valoarea expresie
pentru a stabili adresa de nceput a modulului;
RSEG segment selecteaz un segment definit anterior i l folosete ca segment de lucru;
xSEG [AT adres] xSEG poate fi CSEG,DSEG,XSEG,ISEG BSEG; este folosit pentru
declararea segmentelor absolute de la adres; dac AT adres nu este specificat, este
continuat ultimul segment; dac nu este selectat nici un segment, este creat un nou segment
ncepnd cu adresa 0h;
USING expresie notific asamblorului care banc de registre va fi utilizat.

Directivele asamblorului A166 se pot caracteriza ca:


definiii de seciuni (SECTION):
nume SECTION tip_seciune[tip_aliniere][tip_combinare][nume_clas]

nume numele seciunii;

tip_seciune poate fi CODE, DATA sau BIT;

tip_aliniere seciunea poate fi nealiniat (implicit) sau aliniat la nivel de BIT,


BYTE, WORD (la adrese pare), DWORD (la adrese divizibile cu 4), PAGE (aliniat la 16
kB), SEGMENT (aliniat la 64 kB), BITADDRESSABLE (la adrese pare n zona 0FD00h0FDFEh) sau PECADDRESSABLE (la adrese pare n zona 0FDE0h-0FDFEh);

tip_combinare specific dac seciunea este sau nu combinat cu seciuni din


alte module; A166 admite urmtorii specificatori: PRIVATE (necombinat), PUBLIC
(seciunile care au acelai nume vor fi combinate ntr-o singur seciune), GLOBAL
(determin vizibilitatea seciunii sau simbolurilor pentru ntreaga aplicaie), COMMON
(toate seciunile cu acelai nume i acest atribut vor fi suprapuse n memorie
formnd o singur seciune), SYSSTACK (toate seciunile cu acelai nume i acest
atribut vor fi combinate ntr-o singur seciune care constituie stiva sistem),
USRSTACK (asemntor cu SYSSTACK, numai c stiva este dispus oriunde n

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 156


memorie i este adresat cu DPPn:deplasament), GLBUSRSTAK (similar cu
USRSTACK), AT (folosit pentru plasarea seciunii la o adres absolut).

definiii de grupuri (GROUP):


nume CGROUP/DGROUP nume_seciune [,nume_seciune [,]]

nume numele grupului;

CGROUP/DGROUP specific dac este grup de cod, respectiv de date;

nume_seciune seciunile care aparin membrilor grupului; exist posibilitatea


alocrii unei pseudo-seciuni SYSTEM care specific o seciune absolut n pagina 3.

setare DPPn (ASSUME):


ASSUME DPPn: [obiect]

DPPn poate fi DPP0, DPP1, DPP2 sau DPP3;

obiect reprezint domeniile care vor fi adresate cu unul din registrele DPPn, i
anume:

nume_seciune

(inclusiv

SYSTEM),

nume_grup,

nume_variabil sau

_simbol.

rezervare resurse (REGDEF, REGBANK, SSKDEF, PECDEF,

PROC/ENDP,

DEFR/DEFA/DEFB):
nume_banc_registre REGBANK [domeniu] [,]

nume_banc_registre numele bancului de registre;

domeniu registrele care vor fi comutate de instruciunea SCXT.

[nume_banc_registre] REGDEF domeniu [,]

aceeai semnificaie cu REGBANK.


SSKDEF mrime_stiv

mrime_stiv poate avea valorile 0, 1, 2 sau 3, stiva avnd mrimea de 256,

128, 64 respectiv 32 cuvinte n zonele 0FA00h-0FBFFh, 0FB00h-0FBFFh, 0FB80h0FBFFh, respectiv 0BFC0h-0FBFFh.


PECDEF nr_canal [,nr_canal [,]]

nr_canal reprezint numrul canalului PEC pentru care este rezervat memoria.

PROC/ENDP sunt folosite mpreun pentru a defini o etichet pentru o secven de


instruciuni denumite procedur.
nume PROC [tip]

nume ENDP sau


nume PROC TASK [nume_task][INTNO [nume_intr][=nr.intr]]

nume reprezint numele procedurii;

tip poate fi NEAR (implicit) sau FAR;

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

sunt folosite pentru definirea unor nume personalizate de SFR,

adrese absolute interne din RAM, respectiv locaii adresabile la nivel de bit.

definiii de simboluri (EQU, SET, BIT, LIT):


nume EQU expresie

asigur pentru simbolul nume valoarea rezultat din expresie.


nume SET expresie

creeaz un nou simbol nume care poate fi redefinit cu valoarea rezultat din

expresie.
nume BIT expresie

asigneaz valoarea expresie variabilei de tip bit nume.


nume LIT ' ir_caractere'

157 _______________________________________Aplicaii cu microcontrolere de uz general

asigur substituirea identificatorului nume cu textul ' ir_caractere' .

rezervare memorie (DBIT, DS, DSB, DSW):


[nume[:]] Dxxx expresie aloc variabilei nume un numr de bii (DBIT) sau octei
(DS) egali cu valoarea expresie. DSB i DSW

aloc numrul de octei sau cuvinte

corespunztor dar nu se pot utiliza n seciuni de tip bit.

iniializare memorie (DB/DW, DBPTR/DSPTR/DPPTR):


[nume[:]] Dx valoare iniializeaz un octet (DB) sau un cuvnt (DW) cu mrimea
valoare.
[nume[:]] DxPTR valoare iniializeaz un pointer de segment (DSPTR), de pagin
(DPPTR) sau de bit (DBPTR), cu mrimea valoare.

legturi ale programului (PUBLIC/GLOBAL, EXTERN):


PUBLIC nume [,nume[,]]
GLOBAL nume [,nume[,]]
EXTERN

[DPPn]

nume:tip

[,] specific simbolurile care vor fi referite n

modulul curent dar sunt definite n alt modul (n care simbolurile sunt definite ca
PUBLIC sau GLOBAL)

controlul asamblrii (ORG, EVEN):


ORG expresie modific contorul de program n interiorul seciunii curente. Valoarea
expresie seteaz contorul la valoarea dorit relativ fa de adresa de start a seciunii.
EVEN asigur alinierea codului sau datelor urmtoare la adrese pare.

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)DEBUG informeaz asamblorul s introduc n fiierul de ieire

informaiile despre simboluri pentru a fi utilizate de programele de


depanare.
(NO)REGISTERBANK specific bancurile de registre utilizate de modul.

INCLUDE (fiier) insereaz coninutul fiier n programul surs.


fiier poate conine definiii, programe surs etc.

Cele mai importante comenzi utilizate de A166 sunt prezentate n


continuare:
(NO)DEBUG informeaz asamblorul s introduc n fiierul de ieire

informaiile despre simboluri pentru a fi utilizate de programele de


depanare.
INCLUDE insereaz coninutul fiierului specificat n programul surs,
imediat dup linia de control,

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 158

(NO)MOD166

specific faptul c toate numele descrise n specificaia

hardware pentru 80C166 sunt cunoscute asamblorului. Dac se lucreaz cu


alt controler trebuie folosit comanda NOMOD166 urmat de o comand
INCLUDE pentru redefinirea registrelor speciale.

(NO)SEGMENTED specific asamblorului dac va lucra n mod nesegmen-

tat (memorie adresabil de maxim 64 kB) sau segmentat.


(NO)SYMBOLS specific asamblorului s introduc n fiierul .lst lista de

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;

ramsize (valoare) specific mrimea memoriei RAM interne n octei;

precede,bit,data,idata,stack,xdata,code permit definirea adreselor diferitelor spaiilor de memorie, conform cu tabelul 1.10:
Tabelul 2.10

159 _______________________________________Aplicaii cu microcontrolere de uz general


Parametru
Spaiu adrese
Domeniu adrese
Tip segment
precede
bancuri registre i memorie adresabil
00h-2Fh
DATA, IDATA
la nivel de bit
bit
memorie adresabil la nivel de bit
00h-7Fh
BIT, DATA, IDATA
data
memorie adresabil direct
00h-7Fh
DATA, IDATA
idata
memorie adresabil indirect
00h-FFh
IDATA
stack
memorie adresabil indirect
00h-FFh
IDATA
xdata
memorie extern
0000h-FFFFh
XDATA
code
memorie program
0000h-FFFFh
CODE

pdata (valoare) specific folosirea pentru adresarea memoriei XDATA a


portului P2. Pentru a folosi aceast metod de adresare utilizatorul trebuie
s modifice corespunztor fiierul de configurare STARTUP.A51 astfel nct
adresa paginat s fie setat corect.
Cele mai importante comenzi din list_control utilizate de L166 sunt

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

(NCONST(0,03FFF), NCODE(0,F9FF), NDATA(04000,07FFF),


NDATA0(04000,07FFF), SDATA(0C000,0FFFF), SDATA0(0C000,0FFFF),
IDATA(0FA00,0FDFF), IDATA0(0FA00,0FDFF), BIT(0FD00,0FDFF),
BIT0(0FD00,0FDFF), BDATA(0FD00h,0FDFF), BDATA0(0FD00,0FDFF))

GROUPS specific o adres de start sau ordinea de alocare pentru un grup.


Toate seciunile care nu sunt declarate cu directiva SECTIONS i care sunt
membre ale grupului respectiv sunt alocate conform argumentelor din
directiva GROUPS.
Exemplu: L166 prog.obj GROUPS (NDATA (0x1000), NCONST)
Toate seciunile membre ale grupului NDATA sunt alocate la adresa
0x1000, dup care este alocat i grupul NCONST.

NODEFAULTLIBRARY dezactiveaz legarea automat a bibliotecilor C la

programul final. n situaia n care este folosit aceast directiv,


programatorul trebuie s adauge manual n linia de comand numele
bibliotecilor care sunt necesare pentru linkeditare.
NOINIT dezactiveaz tergerea memoriei RAM interne la iniializare.

NOMAP elimin harta memoriei i lista grupurilor din fiierul list de ieire.

Harta memoriei conine informaii despre structura memoriei fizice i


afieaz asignarea adreselor pentru seciunile programului.
PURGE elimin complet informaiile de depanare din fiierul list de ieire.

RESERVE anun L166 s evite folosirea adreselor n zona de memorie


specificat, de la adres_start pn la adres_sfrit.

Sintax: RESERVE (adres_start - adres_sfrit)


SECTIONS definete o adres fizic de memorie sau ordinea seciunilor
specificate. Toate seciunile definite n aceast directiv sunt alocate

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 160

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

reprezint LIB51 sau LIB166, funcie de familia de microcontrolere utilizat;

comand

poate lipsi, caz n care este afiat promptul '*' pentru a indica ateptarea unei

comenzi, sau este una din urmtoarele instruciuni:


ADD nume_fiier [(nume_modul,)][,] TO bibliotec adaug modulul
(modulele) nume_modul din fiierul nume_fiier la librria bibliotec;

CREATE bibliotec creeaz o nou bibliotec vid;

DELETE

bibliotec

(nume_modul,)

terge

din

bibliotec

modulul

(modulele) nume_modul,.

LIST bibliotec [TO fiier_list][PUBLICS] afieaz la consol sau n


fiier_list coninutul bibliotec, nsoite eventual de o list a modulelor cu
atributul PUBLICS.

Convertorul fiiere obiect-hexazecimal


Convertorul de fiiere obiect n fiiere Intel hex (OHS51 i OH166)
permite transformarea fiierelor absolute (.obj) n fiiere Intel hex
transferabile pe interfaa serial ctre memoria RAM a sistemului de
dezvoltare.
Sintaxa liniei de comand este asemntoare pentru ambele familii de
microcontrolere:
OHxxx fiier_obiect
unde:
Ohxxx

reprezint OH51 sau OH166;


fiier_obiect este numele fiierului .obj care va fi convertit n fiier hex.

161 _______________________________________Aplicaii cu microcontrolere de uz general

OH166 poate avea i argumentul [H167] care indic programului


folosirea unui format Intel hex 386, format necesar pentru sistemele cu
80C167 care au memorii EPROM la adrese peste 0FFFFh.
2.1.5
Depanatoare
Firma Franklin a realizat pachete de programe de depanare dezvoltate pe
calculatoare compatibile PC, pentru ambele familii de microcontrolere:
dScope-51 i dScope-166.
dScope este un depanator simbolic pentru limbaje de nivel nalt cu o
interfa utilizator orientat pe ferestre DOS. Utilizarea este uurat prin
folosirea de meniuri derulante sau linii de comand.
Ambele pachete au o structur asemntoare, fiecare coninnd un
simulator hardware (DS51, respectiv DS166) i o interfa cu monitorul
sistemului de dezvoltare (TS51, respectiv TS166).
Programele dezvoltate pot fi testate integral, toate funciile perifericelor
(timere, convertoare A/D etc.) fiind simulate. Depanatorul permite ncrcarea
fiierelor n format Intel hex existnd posibilitatea executrii lui pas cu pas,
introducerea de breakpoint-uri, vizualizarea coninutului SFR, memoriei i a
unor variabile, structuri sau iruri de date.
Pachetele de programe dScope-51 i dScope-166 sunt extrem de vaste i
prezentarea lor in extenso depete scopul acestei lucrri. Utilizatorilor li se
recomand consultarea referinelor bibliografice dScope-51 Users Guide, Keil
Elektronik GmbH i DScope 166 Users Guide, Keil Elektronik GmbH.
2.1.6
Monitoare
Monitoarele folosite pentru dezvoltarea aplicaiilor cu microcontrolere
sunt formate din dou componente distincte: un monitor tip terminal i un
monitor PROM.
Monitorul de tip terminal este un program DOS lansat pe calculatorul PC
care controleaz sistemul de dezvoltare. Principalele faciliti asigurate de
monitoarele MON51 (pentru familia 8xC552) i MON166 (pentru familia
80C16x) sunt:
selectarea i parametrii portului serial de interfaare (definii n linia de
comand):
MONxx

[parametru] parametru reprezint COM1COM4 (numele portului serial

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).

ncrcarea unor fiiere Intel hex n memoria sistemului de dezvoltare:


ncrcarea unui fiier este fcut conversaional, la comanda <F2> sau
<Alt>2, monitorul rspunznd cu: (Input File: ).

administrarea unor puncte de ntrerupere (break point):


BS adres definire adres break point;
BK numr tergere global break point (cu parametrul ALL) sau numai anumite
puncte funcie de numr;

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 162


BL afiare asociere ntre adres i numr break point;
BE numr validare global break point (cu parametrul ALL) sau numai anumite
puncte funcie de numr;
BD numr invalidare global break point (cu parametrul ALL) sau numai anumite
puncte funcie de numr.

lansarea n execuie a unui program din memoria RAM a sistemului de


dezvoltare:
g [adres_start[,adres_final]].

execuia pas cu pas a unui numr de instruciuni de program din memoria


RAM a sistemului de dezvoltare:
t [numr_pai] numr_pai reprezint ci pai vor fi executai la o comand.

este permis afiarea, modificarea, asamblarea, dezasamblarea unor


poriuni din memoria intern, extern, date sau program.
De asemenea, monitorul terminal este considerat consol de ctre
programele aplicative care folosesc funciile PUTCHAR.C sau GETKEY.C.
Pentru interfaarea ntre sistemul de dezvoltare i PC-AT (conector
DIN25) este recomandat o cablare ca n figura 3.
TxD 2
RxD 3
GND 7

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

Figura 2.1. Interfaarea PC cu sistemul de dezvoltare

Monitorul PROM este destinat s asigure rutinele eseniale ale sistemului


cu sistemul de dezvoltare, protocolul de legtur pe interfa RS232 cu
calculatorul PC, utilizatorul avnd posibilitatea de a aduga i alte programe
necesare.
Monitorul PROM poate fi personalizat de utilizator prin intermediul
fiierelor de configurare.
Sistemele cu 80C16x, datorit facilitii Bootstrap Loader (descris n
paragraful 2.13), se pot dispensa, cel puin n faza de dezvoltare a aplicaiei,
de memoriile PROM, programele monitor fiind ncrcate n faza de iniializare
direct de pe PC.

2.2. Sisteme de dezvoltare


Sistemele de dezvoltare descrise n acest paragraf au fost proiectate
innd cont de cteva condiii:
compatibilitate cu instrumentele software dezvoltate pe PC;
accesibilitate deplin la toate facilitile microcontrolerului;

163 _______________________________________Aplicaii cu microcontrolere de uz general

interconectare simpl cu un PC pentru a facilita transferul facil al


programelor dezvoltate;
simplitatea schemei necesar pentru a permite utilizatorului adugarea
numai a circuitelor strict necesare aplicaiei.
n concluzie, sistemul de dezvoltare permite controlul total, prin
intermediul programelor compilate pe un PC, asupra funcionrii
microcontrolerului, lsnd i posibilitatea utilizatorului de a aduga circuite
specifice (convertoare DAC, circuite I 2 C, ceas de timp real, precum i alte
periferice).
2.2.1
Microcontrolerul 80C552
Sistemul de dezvoltare propus pentru circuitul 80C552 poate fi realizat
fizic pe o plac de circuit EUROCARD , la care aproximativ 1/3 din suprafaa
plcii poate fi rezervat utilizatorului pentru adugarea de circuite
suplimentare.
Principalele faciliti ale schemei prezentate n figura 3.1 sunt:
surs de alimentare de 5 V i 100 mA;
este prevzut o protecie pentru prevenirea alimentrii inverse a
sistemului de dezvoltare;
sistemul de dezvoltare are prevzute jumpere pentru selectarea tipului de
circuit utilizat (80C, 83C sau 87C) precum i pentru selectarea
memoriei ROM (interne sau externe semnalul EA);

schimbul de date cu PC-ul este realizat implicit prin intermediul unei


interfee RS-232 cu ASC0 n modul 1 cu caracteristicile:
vitez:
2400 baud;
numr de bii date: 8;
fr paritate;
un bit de stop.
memorie extern RAM pentru ncrcare programe pn la 32k 8;
memorie extern ROM pentru programul monitor pn la 32k 8;
are suportul realizat pentru adugarea de circuite I 2 C i display LCD;
decodificatorul U5 HCT138 permite selectarea a 8 periferice externe, cu
adresele S0 S7, respectiv n primii 16 kB ai spaiului de memorie RAM,
conform cu tabelul 3.11.
Tabelul 2.11
Selecie
S0
S1
S2
S3
S4
S5
S6
S7

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

utilizarea unui circuit special destinat interfeei RS-232, MAX232, d


posibilitatea folosirii tensiunilor bipolare nestabilizate produse de acesta

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 164

(aproximativ 10V) pentru alimentarea ctorva circuite analogice cu


condiia de a avea un consum foarte mic i fr a avea pretenia unei
caliti bune a tensiunii de alimentare.
C1
33p

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

Figura 2.2. Sistem de dezvoltare cu 80C552

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

165 _______________________________________Aplicaii cu microcontrolere de uz general

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;

JP3 i JP4 pe poziie A16/A15 selecteaz RAM, iar pe poziie A19

selecteaz ROM;
JP6 pe poziie V CC selecteaz memorie de 1 MB, iar pe poziie A18

selecteaz memorie de 2/4 MB;


JP7 pe poziie A19 selecteaz RAM, iar pe poziie V CC selecteaz

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);

JP9 valideaz ncrctorul bootstrap;


JP10 i JP11 seteaz cmpul BTYP din registrul BUSCON0 care are
urmtoarea semnificaie:
JP10 (P0.6)
OFF
OFF
ON
ON

JP11 (P0.7)
OFF
ON
OFF
ON

Mod lucru EBC


Magistral 16 bii multiplexat
Magistral 16 bii demultiplexat
Magistral 8 bii multiplexat
Magistral 8 bii demultiplexat

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

Numr linii selectare


CS0CS4
linie CS
CS0 i CS1
CS0CS2

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)

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 166

comunicarea ntre microcontroler i calculator se face printr-o interfa


serial asincron RS-232;
placa dispune de un buton pentru generarea unei ntreruperi nemascabile
NMI (S1) i unul pentru reset extern (S2);
alimentarea sistemului se face prin intermediul unei surse stabilizate
LM7805 (LM323) cu o tensiune 8V12V la un curent de maxim 300 mA;

167 _______________________________________Aplicaii cu microcontrolere de uz general


VCC

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

ROM /RA M ROM/RA M ROM /RA M ROM/RAM

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

Figura 2.3. Sistem de dezvoltare cu 80C167

tot sistemul de dezvoltare este realizabil pe o plac EUROCARD , din care


aproximativ 1/3 din suprafaa plcii poate fi rezervat utilizatorului pentru
adugarea de circuite suplimentare.

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 168

2.3. Afiarea informaiilor


Multe din dispozitivele controlate de microcontrolere, necesit unele
elemente de semnalizare pentru verificarea strii sistemului. Dac n unele
situaii sunt suficiente cteva LED-uri sau digii cu 7 segmente, acestea
putnd fi comandate direct de porturile de intrare/ieire, unele aplicaii pot
necesita afiarea unor informaii mai complexe, cum ar fi caractere alfanumerice, caractere speciale i chiar imagini vectoriale (drepte, cercuri,
ptrate etc.).
Trebuie menionat c, deoarece porturile microcontrolerului sunt qvasi
bidirecionale, LED-ul trebuie conectat ntre V CC i pinul portului prin
intermediul unei rezistene de 470 sau 520 ohmi.
Dintre nenumratele posibiliti pentru afiarea informaiilor, vor fi
prezentate numai dispozitivele de afiare pe tub catodic i cele cu display
alfanumeric LCD.
2.3.1
Afiarea pe tub catodic
Principiul funcionrii acestor dispozitive se bazeaz pe producerea, de
ctre microcontroler, a dou semnale analogice pentru comanda deplasrii
spotului tubului catodic pe orizontal i vertical (X i Y), precum i a unui
semnal digital pentru comanda amplificatorului video (Z).
Pentru un amator, realizarea circuitelor suport pentru un tub catodic
(surse de nalt tensiune, amplificatoare video de vitez foarte mare etc.) pot
fi prohibitive. Totui, pentru aplicaii de laborator, se poate utiliza un
osciloscop
catodic,
setat
corespunztor,
care
preia
semnalele
microcontrolerului pentru a le afia.
O schem bloc de realizare a unui asemenea dispozitiv este prezentat n
figura 3.3.
Port IO

DAC 8 bii
Y

Port IO

DAC 8 bii

OK
Z

Figura 2.4. Dispozitiv de afiare pe osciloscop

n continuare, este prezentat un program, n asamblor pentru 80C552,


care poate fi folosit pentru afiarea unor caractere alfanumerice recepionate
pe interfaa serial.
Caracterele sunt generate prin intermediul unor matrice de 88 pixeli.
Utilizatorul poate aduga alte caractere introducnd n tabel valorile dorite.

/**************************************************************************\

169 _______________________________________Aplicaii cu microcontrolere de uz general


** Descriere:
Rutin afiare caractere pe osciloscop
**
**
**
** 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:
**
**
**
\**************************************************************************/
ch_o
data
30h
; date DAC orizontal
ch_v
data
31h
; date DAC vertical
oriz
data
32h
; pozitie inceput caracter x
vert
data
33h
; pozitie inceput caracter y
; Setari initiale (pozitie reticul)
mov
oriz,#79h
;iniializare inceput text
mov
vert,#79h
;
setport:

nextchr:

mov
mov
mov

p2,#1
r0,#20h
r1,#40h

;acesam porturile cu adresele


;0x0120 (DAC orizontal) si
;0x0140 (DAC vertical)

mov
movc
jz

DPTR,#txt
A,@DPTR
gata

; citim textul de afisat


; citim un caracter
; este 0 -> gata

inc
push
push

DPTR
DPL
DPH

; ptr. caracter urmator


; salvam ptr caracter

mov

DPTR,#gen_c

; ptr. generattor caractere

clr
subb

C
A,#20h

; stergem CY pt. subb


; scadem offset tabel pt. ASCII

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

; initializare DAC vertical

A,@DPTR
ch_o,oriz
A
B,A
endpixel
afis
ch_o
A,B
r3,nextpixel

;
;
;
;
;
;
;
;
;

inc
inc
djnz

ch_v
DPTR
r2,nextlin

; DAC la urmatorul rand


; ptr. la urmatorul rand
; salt la urmatoarea linie

mov

oriz,ch_o

; setare poz. inceput caracter urm.

pop
POP
jmp
ret

DPH
DPL
nextchr

; refacere DPTR cu ptr. caracter urm.

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:

calculam ptr. in tabelul cu


caratere in functie de caracterul
care trebuie sa fie afisat
DPTR + chr*8
un carcter are 8 coloane si
8 randuri

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

; desenam urmatorul caracter

;ateptare 1 us

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 170


nop
nop
clr
nop
nop
nop
nop
nop
setb
ret

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
;[
;\
;]
;^
;_
;+

Folosirea osciloscopului prezint o serie de avantaje, n sensul c,


programnd convenabil tensiunile de comand U X i U Y , ecranul poate fi
transformat n display grafic putnd fi generate chiar imagini simple, create

171 _______________________________________Aplicaii cu microcontrolere de uz general

din segmente de linii. Un astfel de program pentru desenarea unui reticul la


coordonate X,Y este prezentat n continuare.
/**************************************************************************\
** Descriere:
Rutin afiare vectori pe osciloscop
**
**
**
** 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:
**
**
**
\**************************************************************************/
ch_o
data
30h
;orizontal
ch_v
data
31h
;vertical
oriz
data
32h
vert
data
33h
dep_sd
data
34h
dep_sj
data
35h
; Setari initiale (pozitie reticul)
mov
oriz,#79h
;iniializare repere, (oriz, vert)
mov
vert,#79h
;este pozitie cetrului reticulului
mov
dep_sd,#79h
mov
dep_sj,#7eh
reticul:

sub_r:

wait1:

ret0:

wait2:

ret1:

mov
mov
mov

p2,#1
r0,#20h
r1,#40h

;acesam porturile cu adresele


;0x0120 (DAC orizontal) si
;0x0140 (DAC vertical)

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

;desenam linia veritcala


;ne deplasam pe verticala
;desenam un pixel la (ch_o, ch_v)

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

;deseneam linia orizontlala

a,ch_o
@r0,a
a,ch_v
@r1,a

;afisare pixeli

;ateptare 1 us

p4.2

;set z

;comandam DAC-ul orizontal


;comandam DAC-ul vertical
;asteptam un timp pt. desenare

r7,wait2
afis

ret
afis:

mov
movx
mov
movx
nop
nop
nop
nop
nop
clr

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 172


nop
nop
nop
nop
nop
setb
ret

;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

173 _______________________________________Aplicaii cu microcontrolere de uz general


11
DB4
H/L
Bitul 4 de date
12
DB5
H/L
Bitul 5 de date
mod 4 bii
13
DB6
H/L
Bitul 6 de date
14
DB7
H/L
Bitul 7 de date

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

Scrie date n CG RAM sau DD


RAM.

40s

Citete date din CG RAM sau


DD RAM.

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
**

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 174


**
**
** Ultima modificare la data: 23 nov 1998
**
** Istoric:
**
**
**
** Observatii:
**
**
**
\**************************************************************************/
#ifndef _LCD_H_
#define _LCD_H_
1
#include <typedef.h>
//#define _LCD_BUFFER_
extern
extern
extern
extern
extern
extern
extern
#define
#define
#define
#define
#define
#define

void
void
void
void
void
void
void

/* validare lucru bufferat */

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);

scrie o comanda la LCD


scrie date la LCD
initializare LCD
sterge LCD (buffer LCD)
sterge LCD (sirect la LCD)
// scrie txt la rand,col
// scrie chr la rand,col

/* Blink ON Cursor OFF */


/* Blink OFF Cursor ON */
//
//
//
//

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_

175 _______________________________________Aplicaii cu microcontrolere de uz general


void iLCDcmd(char c)
{
waitLCD();
LCDwcmd(c);
}
#endif
\*************************************************************************
LCDdata = transmite date LCD-ului
*************************************************************************/
void LCDdta(char d)
{
waitLCD();
LCDwdta(d);
}
/* ***************************************************************************
RS R/W 7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
0
1
Display Clear
0
0
0
0
0
0
0
0
1
x
Display/Cursor Home
0
0
0
0
0
0
0
1
I/D S
Cursor direction, Display Shift
0
0
0
0
0
0
1
D
C
B
D = Display ON/OFF
C = Cursor ON/OFF
B = Blink ON/OFF
0
0
0
0
0
1
S/C R/L x
x
Shift Display(1), Move Cursor(0)
Shift Right(1), Shift Left(0)
0
0
0
0
1
DL N
0
x
x
DL=1->8bit, DL=0->4bit
N=1->Dual line, N=0->Single line
0
0
0
1
------- ACG --------CG RAM Address Set
0
0
1
----------- ACG --------DD RAM Address Set
0
1
BF ----------- AC ---------Busy Flag, Address Counter
1
0
------- Write Data ---------Write data to CG RAM or DD RAM
1
1
------- Read Data ----------Read data from CG RAM or DD RAM
**************************************************************************** */
\*************************************************************************
LCD_init = initilizare LCD
*************************************************************************/
void LCD_init(void)
{
#ifdef _LCD_BUFFER_
iLCDcmd(0x38); // function set.8 biti, 2 linii, 5x7 dot matrix
iLCDcmd(0x06); // entry mode set.Increment adr, no display shift
iLCDcmd(0x0C); // display ON.Dissplay on/off control,Cursor ON
iLCDcmd(0x01); // clear disp
LCDclear(0);
LCDclear(1);
#else
LCDcmd(0x38);
LCDcmd(0x06);
LCDcmd(0x0C);
LCDcmd(0x01);
#endif
}

//
//
//
//

function set.8 biti, 2 linii, 5x7 dot matrix


entry mode set.Increment adr, no display shift
display ON.Dissplay on/off control,Cursor ON
clear disp

\*************************************************************************
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;

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 176


do
poz = XBYTE[0x0102];
while (poz & 0x80);
if((poz == 0x17) || (poz == 0x57))
return 1;
LCDwcmd(++poz | 0x80);
return 0;
}
\*************************************************************************
CursorLeft = muta cursorul la stanga
*************************************************************************/
bit CursorLeft(void) // 1=BOL
{
data byte poz;
do
poz = XBYTE[0x0102];
while (poz & 0x80);
if((poz == 0x00) || (poz == 0x40))
return 1;
LCDwcmd(--poz | 0x80);
return 0;
}
\*************************************************************************
scrie un text la randul si coloana specificata
LCDput = apelata atunci cand se foloseste dublu bufferarea
LCDstr = apelata atunci cand nu se foloseste dublu bufferarea
*************************************************************************/
#ifdef _LCD_BUFFER_
void LCDput(bit rand, char col, char* txt)
#else
void LCDstr(bit rand, char col, char* txt)
#endif
{
data 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_
iLCDcmd(0x80 | (rand ? (0x40 + col) : col ));
#else
LCDcmd(0x80 | (rand ? (0x40 + col) : col ));
#endif
for(i=0; txt[i] && (i <= LCD_SIZE); i++)
LCDdta(txt[i]);
/*
for(i=0; txt[i] && (i <= LCD_SIZE); i++)
if(txt[i] != '\n')
LCDdta(txt[i]);
else
i--;
*/
}

\*************************************************************************
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

177 _______________________________________Aplicaii cu microcontrolere de uz general


//
//

col = (col > 0x17) ? 0x17 : col;


col = (col < 0) ? 0 : col;
LCDcmd(0x80 | (rand ? (0x40 + col) : col ));
LCDdta(chr);

}
*/
#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;

// Inhibam afisarea pe LCD

if(c < col)


// copletam cu spatii albe pina la colana
{
for( ;c < col; c++)
LCDTXT[r][c] = ' ';
LCDTXT[r][c] = 0;
}
// copiem textul
for(c = col,i=0; txt[i] && (c < LCD_SIZE) ; c++, i++)
LCDTXT[r][c] = txt[i];
LCDTXT[r][c] = 0;
// Validam afisarea, marcam ca exista date noi de afisat
fLCD = fLCDon = 1;
}
#endif

2.4. Tastatur matricial


Pentru citirea tastaturii se folosete portul P4 al microcontrolerului.
Programul expus n continuare permite citirea att a tastaturilor 3x4 ct
i a tastaturilor 4x4. Forma acestor tastaturi i decodarea lor este prezentat
n figura de mai jos. Legarea tastaturii la portul P4 s-a fcut n aa fel nct
s se obin acelai cod pentru aceeai tast att n cazul folosirii tastaturii
3x4 ct i a tastaturii 4x4; deoarece citirea tastaturii folosete logica negat
sunt necesare rezistene la V CC la fiecare pin al portului P4. Modul de
conectare a tastaturii este prezentat n figura 3.5.

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 178


1 2 3
4 5 6
7 8 9
* 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.

Se citesc coloanele (P4.4P4.7);

Pasul 3.

Se emite pe colane ce s-a citit i se seteaz rndurile ca intrri


(P4.0P4.3) 1111;

Pasul 4.

Se citete i complementeaz valoarea portului P4.

Pasul 5.

Dac valoarea citit este diferit de zero, atunci este apsat o


tast. Astfel se obine un cod unic la apsarea unei taste i de
asemenea se pot obine i coduri unice la apsarea unor combinaii
de taste.
Codurile obinute la tastatur sunt interpretate folosind declaraiile din
fiierul KBRDCODE.H.
Pentru iniializarea tastaturii se apeleaz funcia KBRD_init care
seteaz portul P4 i, dac se folosete bufferul de tastatur, se iniializeaz
pointerii de citire i scriere.
Folosirea bufferului pentru citirea tastaturii este mprit n dou funcii.
Prima funcie iKBRD_read este apelat n ntreruperi i depune codurile
tastelor apsate ntr-o stiv implementat cu ajutorul unui buffer cu adresare
circular. Citirea din aceast stiv, se face acolo unde este necesar folosind o
a doua funcie KBRD_read. Indicarea apsrii unei taste se face prin
indicatorul KBRDHIT care se poate verifica nainte de apelul funciei
KBRD_read.
n cazul n care nu se folosete bufferul de tastatur se apeleaz numai
funcia KBRD_read care ntoarce unul din codurile de eroare sau codul tastei
apsate.
Nici una din funcii nu ateapt ca s fie apsata o tast i deci trebuie
apelate n polling.
Programele surs folosesc fiierele de definiii SYSTEM.H i TYPEDEF.H
care sunt prezentate n anexe.
/**************************************************************************\
** Titlu:
KBRDCODE.H
**
** Descriere:
Codurile returnate de KBRDread() la citirea tastaturii **
**
**
** Versiune:
2.0
**
** nceput la:
August 97
**
** Autor:
tefan Suceveanu, Pratco s.r.l. Bucureti, Romnia
**

179 _______________________________________Aplicaii cu microcontrolere de uz general


** Compilator C: C51 V2.27, Franklin Software, Inc.
**
**
**
** Acest modul conine urmtoarele funcii:
**
**
declaraii de coduri
**
**
**
** Ultima modificare la data: 23 nov 1998
**
** Istoric:
**
**
**
\**************************************************************************/
#ifndef
_KBRDCODE_H_
#define
_KBRDCODE_H_
// Tastatura 3x4 si/sau 4x4
#define
Kb1
0x18
#define
Kb2
0x28
#define
Kb3
0x48
#define
Kb4
0x14
#define
Kb5
0x24
#define
Kb6
0x44
#define
Kb7
0x12
#define
Kb8
0x22
#define
Kb9
0x42
#define
Kbo
0x11
#define
Kb0
0x21
#define
Kbd
0x41
#define
KbA
0x88
#define
KbB
0x84
#define
KbC
0x82
#define
KbD
0x81
/* combinatii
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define

* 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

/*
/*
/*
/*
/*
/*

s-a apsat ENTER(#) dup ce s-a scris ceva nou */


s-a apsat ESC(*) fr nici un numr introdus */
sa introdus un numr i se ateapt ENTER sau ESC */
nu s-a ntmplat nimic */
tast necunoscut */
s-a apsat ENTER(#) fr nici un numr introdus */

#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
**

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 180


**
introdusa linia #define KBRD_BUFFER
**
**
**
\**************************************************************************/
#ifndef
_KBRD_H_
#define _KBRD_H_
#include <typedef.h>
#include "..\main\system.h"
//#define _KBRD_BUFFER_
#ifdef _KBRD_BUFFER_
extern bit fKBRD_ERR;
extern byte iKBRD_read(void);

// a aprut o eroare la citirea tastaturii


// citete direct portul de tastatura i depune
//datele n bufferul de tastatur

#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);

// Dac se folosete bufferarea.


KBRD_BUFF[KBRD_BUFF_SIZE]; // bufferul de tastatur
KBRD_R,KBRD_W;
// poziia de scriere si citire
// a aprut o eroare la citirea tastaturii
// citete direct portul de tastatur i depune datele n
// buffer

#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;

181 _______________________________________Aplicaii cu microcontrolere de uz general


}
\*************************************************************************
Funciile de citire a tastaturii:
byte iKBRD_read(void): citire bufferat a tastaturii. Se apeleaz din
ntreruperi.
byte KBRD_read(void): citire nebufferat a tastaturii.
*************************************************************************/
#ifdef _KBRD_BUFFER_
byte iKBRD_read(void)
#else
byte KBRD_read(void)
#endif
{
data byte t,poz;
static data byte to;
P4 = 0xf0;
t = P4 | 0x0f;
P4 = t;
t = ~P4;

//
//
//
//

se
se
se
se

scot pe coloane 1111


citesc rndurile
scot pe rnduri
citesc i se complementeaz

if(!t)
to = 0;
if((t == to) || (!(t & 0xf0)))
return 0;
to = t;
KBHIT = 1;

// s-a apsat o tasta

#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

Rutine pentru utilizarea tastaturii i display-ului LCD n


sistemele cu 80C167
Performanele ridicate ale circuitului 80C167 permit utilizarea facil nu
numai a unui simplu display LCD alfanumeric, ci chiar i a unui display grafic
LCD i chiar a unei tastaturi matriciale de 16 rnduri x 16 coloane (256 taste).
n scopul pstrrii compatibilitii cu perifericele sistemului de dezvoltare
80C552, aplicaia curent va prezenta utilizarea unui display LCD 4 rnduri x

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 182

20 caractere (LM16x21A) i o tastatur 4x4. Folosind principiile expuse,


utilizatorul poate extinde sau reduce dispozitivele la necesitile dorite.
Modul de conectare a celor dou periferice la sistemul de dezvoltare este
prezentat n figura 3.5.
1 2 3 A
4 5 6 B
7 8 9 C
* 0 # D

P2.3
P2.2
P2.1
P2.0

LM 16X21A
D7 D6 D5 D4 D3 D2 D1 D0

EN R/W RS

P8.7 P8.5 P8.3 P8.1


P2.11 P2.9
P2.4 P2.6
P2.5 P2.7
P8.6 P8.4 P8.2 P8.0
P2.10
Figura 2.6. Display i tastatur pentru 80C167

Principiul de lucru cu tastatura i display-ul este identic cu cel descris


anterior. Pentru conectarea display-ului s-a preferat comanda direct pe port
I/O n locul conectrii pe magistrala de date a microcontrolerului datorit
vitezei foarte mici a dispozitivului i incapacitii circuitului 80C167 de a
produce semnale suficient de lente pentru comanda acestuia.
/**************************************************************************\
** Titlu:
KBRD.C
**
** Descriere:
Modul pentru accesare display LM16x21A i tastatur 4x4 **
**
**
** Versiune:
2.0
**
** nceput la:
August 97
**
** Autor:
tefan Suceveanu, Pratco s.r.l. Bucureti, Romnia
**
** Compilator C: C166, Franklin Software, Inc.
**
**
**
** Acest modul conine urmtoarele funcii:
**
**
void cmdLCD(char c):
comand LCD;
**
**
void initLCD(void):
resetare i iniializare LCD;
**
**
char readLCD(void):
citete caracter din CG/DD RAM LCD;
**
**
void dataLCD(char c):
scrie caracter in CG/DD RAM LCD;
**
**
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):
terge rndul specificat (4 terge tot)**
**
unsigned int kbd(void):
citete un caracter de la tastatura 4*4**
**
**
** Ultima modificare la data: 24 iunie 1998
**
** Istoric:
**
**
**
\**************************************************************************/
#pragma MOD167
#include
#include
#include
#include

<reg167.h>
<stdio.h>
<ctype.h>
<intrins.h>

/* special function register 80C167


/* standard I/O .h-file
/* standard I/O .h-file

*/
*/
*/

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;

/* set port 2 out (LCDcmd)


/* set port 8 in (date)

*/
*/

P2 &= 0xf7ff;
P2 |= 0x0400;
P2 &= 0xfdff;

/* Dezactivare LCD (P2.11)


/* R/W = 1 (P2.10)
/* RS = 0
(P2.9)

*/
*/
*/

183 _______________________________________Aplicaii cu microcontrolere de uz general


P2 |= 0x0800;

/* Validare LCD

*/

/* Validare LCD

*/

DP8 = 0xff;
_nop_();

/* set port 8 out

*/

P8 = c;
P2 &= 0xf1ff;

/* depune cmd la LCD


*/
/* dezactivare LCD,R/W = 0,RS = 0 */

P2 |= 0x0800;
P2 &= 0xf7ff;

/* validare LCD
/* dezactivare LCD

*/
*/

/* validare LCD, R/W=1, RS=1

*/

/* dezactivare LCD

*/

DP8 = 0xff;
_nop_();

/* set port 8 out

*/

P8 = c;

/* depune data la LCD

*/

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);
}

/*
/*
/*
/*

function set.8 bii, 2 linii, 5x7 dot matrix


entry mode set.Increment adr, no display shift
display ON. Display on/off control
clear display.

void putLCD(char rind, char coloana, char *s)


{
unsigned char cmd;
switch(rind)
{
case 0: cmd = 0x80;break;
case 1: cmd = 0xc0;break;
case 2: cmd = 0x94;break;
case 3: cmd = 0xd4;break;
default: break;
}
cmd += coloana;
cmdLCD(cmd);
for(cmd = 0; s[cmd]; cmd++)
dataLCD(s[cmd]);
}
void chrLCD(char rind, char coloana, char c)
{
unsigned char cmd;

*/
*/
*/
*/

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 184


switch(rind)
{
case 0: cmd = 0x80;break;
case 1: cmd = 0xc0;break;
case 2: cmd = 0x94;break;
case 3: cmd = 0xd4;break;
default: break;
}
cmd += coloana;
cmdLCD(cmd);
dataLCD(c);
}
void clrLCD(char rind)
{
unsigned char cmd;
bit sters = 1;
switch(rind)
{
case 0: cmd = 0x80;break;
case 1: cmd = 0xc0;break;
case 2: cmd = 0x94;break;
case 3: cmd = 0xd4;break;
default: cmd = 0x01;sters=0;break;
}
cmdLCD(cmd);
if(sters)
for(cmd=0; cmd< 20;cmd++)
dataLCD(' ');
}
unsigned int kbd(void)
{
unsigned int t;
static unsigned int to;

/* Tastatura 4*4

*/

DP2 = 0x000f;
ODP2 = 0x00ff;
_nop_();
P2 = 0;

/* P2.0-3 set OUT


/* P2.0-7 set OPEN DRAIN

*/
*/

/* OUT

*/

DP2 = 0x0e0f;
_nop_();
t = P2 & 0x00f0;

/* P2.4-7 set IN
/* P2.9-B pentru LCD
/* IN

*/
*/
*/

DP2 = 0x0ef0;

/* P2.4-7 set OUT


/* P2.0-3 set IN

*/
*/

_nop_();
P2 = t;

/* OUT value

*/

t |= (P2 & 0x000f);

/* IN or value

*/

t = (~t) & 0x007f;


if(!t)
to = 0;
if((t == to) || (!(t & 0x000f)))
return 0;
to = t;
switch (t)
{
case 0x11:
case 0x21:
case 0x41:
case 0x01:
case 0x12:
case 0x22:
case 0x42:
case 0x02:
case 0x14:
case 0x24:
case 0x44:
case 0x04:
case 0x18:
case 0x28:
case 0x48:
case 0x08:
default:

/* 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

*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/

*/

185 _______________________________________Aplicaii cu microcontrolere de uz general


}
return(t);
}

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,
**

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 186


**
char** retsir)
**
**
Scrie txt pe rndul i coloana [row,col] pe LCD
**
**
Citete maxim len digii care sunt returnai n retsir
**
**
**
** Ultima modificare la data: 24 iunie 1998
**
** Istoric:
**
**
**
** Observaii:
**
**
**
\**************************************************************************/
#pragma DEBUG OBJECTEXTEND CODE SYMBOLS
#include <reg552.h>
#include <typedef.h>
#include <string.h>
#include "kbrd.h"
// funcii pentru citirea tastaturii
#include "kbrdcode.h"
// codurile returnate de tastatur
#include "lcd.h"
// funcii pentru lucru cu LCD
extern xdata int kbstate,
kbsstate;

// starea citirii tastaturii


// substarea citirii tastaturii

#define Nsir 5
xdata char l[Nsir+1];

// int are maximum 5 cifre -32768 32767


// buffer pentru numrul citit de la tastatura

/* 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!

GI_WAIT = se ateapt ENTER(#) sau ESC(*)


GI_ESC = s-a apsat ESC(*)
1
= s-a apsat ENTER(#)
modifica i folosete variabila global kbstate
pentru iniializare kbsstate trebuie setat cu 0
modific i folosete variabila global kbstate
La ieire kbstate se iniializeaz cu 0

*/
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))

187 _______________________________________Aplicaii cu microcontrolere de uz general

//
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

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 188


return 1;
break;
default:
break;
}
}
return GI_WAIT;
}
/* *************************************************************************
Returneaz n 'retsir' adresa ctre textul care s-a introdus (numai cifre)
Returneaz un char cu urmtoarea semnificaie
GI_ESC
-1
s-a apsat ESC(*) fr nici un numr introdus
GI_WAIT
-2
s-a introdus un numr i se ateapt ENTER sau ESC
GI_NOINPUT
-3
nu s-a ntmplat nimic
GI_KBRERR
-4
tast necunoscut
GI_NODATA
-5
s-a apsat ENTER(#) fr nici un numr introdus
GI_OK
-6
s-a apsat ENTER(#) dup ce s-a introdus ceva
Parametrii la apel:
row,col:
rndul si coloana pe care se va scrie mesajul
txt:
un mesaj care se va afia pe LCD
len:
numrul de caractere citite
retsir:
pointer la irul de caractere introdus
*************************************************************************** */
char getnomber(byte row, byte col, char *txt, char len, char** retsir)
{
static bit first=1,refresh=0,fput=1,virgula;
static char k=0;
*retsir = NULL;

// numai daca GI_OK se ntoarce pointer la ir

if(len < 0) // reset


{
first = 1;
fput = 1;
refresh = 0;
k = 0;
return GI_NOINPUT;
}
if(fput)
{
BlinkON();
if(txt)
LCDstr(row, col, txt);
else
LCDstr(row, col, "\0");
fput=0;
}
if(!k)
virgula = 0;
switch(KBRD_read())
{
case Kb0:
if(k < len && k < Nsir)
l[k++] = '0';
first = 0;
refresh = 1;
break;
case Kb1:
if(k < len && k < Nsir)
l[k++] = '1';
first = 0;
refresh = 1;
break;
case Kb2:
if(k < len && k < Nsir)
l[k++] = '2';
first = 0;
refresh = 1;
break;
case Kb3:
if(k < len && k < Nsir)
l[k++] = '3';
first = 0;
refresh = 1;
break;

189 _______________________________________Aplicaii cu microcontrolere de uz general


case Kb4:
if(k < len && k < Nsir)
l[k++] = '4';
first = 0;
refresh = 1;
break;
case Kb5:
if(k < len && k < Nsir)
l[k++] = '5';
first = 0;
refresh = 1;
break;
case Kb6:
if(k<len && k < Nsir)
l[k++] = '6';
first = 0;
refresh = 1;
break;
case Kb7:
if(k<len && k < Nsir)
l[k++] = '7';
first = 0;
refresh = 1;
break;
case Kb8:
if(k<len && k < Nsir)
l[k++] = '8';
first = 0;
refresh = 1;
break;
case Kb9:
if(k<len && k < Nsir)
l[k++] = '9';
first = 0;
refresh = 1;
break;
case KbA:
// punct zecimal
if(!virgula)
// dac nu avem nici o virgula
{
if(k<len && k < Nsir)
l[k++] = '.';
// punem o virgul
first = 0;
refresh = 1;
virgula = 1;
}
break;
case KbB:

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;

case Kbo: // c = '*';


k = 0;
first = 1;
fput = 1;

// semn doar n prima poziie

// ESC

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 190


refresh = 0;
LCDcmd(0x0c);
return GI_ESC;
break;

// nici un numr introdus

case Kbd: // c = '#';


if(first)
{
k = 0;
first = 1;
fput = 1;
refresh = 0;
BlinkOFF();
return GI_NODATA;
}
else
{
k = 0;
first = 1;
fput = 1;
refresh = 0;
BlinkOFF();
*retsir = l;
return GI_OK;
}
break;
//
//
//
//

case NKb:
if(first)
return GI_NOINPUT;
break;

//
//

default:
return GI_KBRDERR;
break;

// ENTER

// nici un numr introdus

// avem ceva in retcode

// nu este apsat nici o tast

// 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;
}

2.5. Extinderea capacitilor aritmetice


Realizarea unor aplicaii rapide n asamblor poate fi dificil n situaia n
care algoritmul trebuie s prelucreze valori numerice. O problem poate
consta n conversia din cod hexazecimal, folosit intern pentru reprezentarea
numerelor, n cod zecimal, necesar pentru o afiare inteligibil pe un display
sau un terminal. O alt chestiune poate fi creterea preciziei de reprezentare
a numerelor, de exemplu de la 8 bii (numere pozitive n domeniul 0255) la
32 de bii (numere pozitive n domeniul 04 294 967 295), sau reprezentarea
i operaiile aritmetice cu numere raionale.
2.5.1
Aritmetic BCD
Pentru circuitul 80C552 realizarea unor calcule n cod BCD este facilitat
de existena instruciunii DA (ajustare zecimal a acumulatorului pentru
adunare). Circuitul 80C167 nu are o astfel de instruciune i rutina nu poate fi
adaptat pentru acesta.

191 _______________________________________Aplicaii cu microcontrolere de uz general

Pentru creterea vitezei de execuie se


calculelor n hexazecimal, urmnd ca numai
(pe terminal sau pe un display LCD) s fie
este recomandat s fie fcut n asamblor,

recomand efectuarea complet a


datele care urmeaz s fie afiate
convertite n cod BCD. Procedura
evitnd funcia C sprintf.

Programul respectiv folosete pentru conversie un tabel unde sunt


memorate valorile BCD a fiecrui semioctet, funcie de poziia acestuia.
/**************************************************************************\
** Descriere:
Rutin conversie hexazecimal BCD
**
**
**
** Versiune:
1.0
**
** Inceut la:
Iunie 96
**
** 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:
**
**
hex0-1 octeii cod hexazecimal
**
**
char5-0 rezultat sute de mii uniti
**
**
**
\**************************************************************************/
hex0
data
53h
;numarul care urmeaza sa fie hex1 data
;convertit
char0
data
33h
;rezultatul conversiei char1
data
; max 65535char2
data
35h
char3
data
36h
char4
data
37h
char5
data
38h
;\0
r_0
r_1
r_2

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

;iniializare registre lucru

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

;conversie zeci, unitati

;formare z+u

;conversie mii, sute

54h
34h

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 192

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

;conversie zeci, unitati

movc

a,@a+dptr

;formare z+u

;conversie mii, sute

;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

Creterea preciziei de reprezentare a numerelor n virgul


fix i virgul flotant
Unele aplicaii realizate n asamblor pot necesita precizii aritmetice mai
mari dect cele implicite pe 8 bii (n situaia circuitului 80C552).
n cele ce urmeaz sunt prezentate cteva rutine utile pentru lucrul pe
16 de bii. Extinderea dimensiunii datelor de la 8 la 16 de bii asigur
creterea posibilitilor de reprezentare a numerelor ntregi, de la [0-255] la
[0-4294967285].
Pentru funcia transcedental introdus (sinus) asigurarea unei precizii
de 16 de bii este dificil de realizat: implementarea unei dezvoltri n serie

193 _______________________________________Aplicaii cu microcontrolere de uz general

depete clar posibilitile unor microcontrolere cu posibiliti aritmetice


reduse (de exemplu 80C51) iar determinarea valorilor pe baz de tabel cu
valori memorate este prohibitiv datorit dimensiunilor foarte mari a acestuia.
Rutinele care urmeaz determin funcia sinus folosind un tabel de 256 de
valori, creterea preciziei la 16 bii fiind asigurat de un algoritm de
interpolare.
/**************************************************************************\
** Descriere:
Rutin afiare vectori pe osciloscop
**
**
**
** 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:
**
**
load_16
**
**
load_32
**
**
mul_16
**
**
div_16
**
**
add_16
**
**
sub_16
**
**
add_32
**
**
sub_32
**
**
low_16,mid_16,high_16
**
**
sinus
**
**
**
** Ultima modificare la data: 23 nov 1998
**
** Istoric:
**
**
**
** Observatii:
**
**
**
\**************************************************************************/
PUBLIC load_16, ?load_16?byte
PUBLIC load_32, ?load_32?byte
PUBLIC mul_16, ?mul_16?byte
PUBLIC div_16, ?div_16?byte
PUBLIC add_16, ?add_16?byte
PUBLIC sub_16, ?sub_16?byte
PUBLIC add_32, ?add_32?byte
PUBLIC sub_32, ?sub_32?byte
PUBLIC low_16, mid_16, high_16
PUBLIC sinus,?sinus?byte
math_32_data
math_32_code
sinus_DATA
sinus_CODE

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

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 194


mov
mov
mov
mov
ret

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

doi octei furnizai de program la operand


c
a,op_0
a,?add_16?byte + 1
;octet LSB
op_0,a
a,op_1
a,?add_16?byte
;octet MSB + C
op_1,a
a,op_2
a,#0
;propagare C
op_2,a
a,op_3
a,#0
;propagare carry
op_3,a

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

;octet 3 (msb) + 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

195 _______________________________________Aplicaii cu microcontrolere de uz general


mov
mov
subb
mov
mov
subb
mov
ret

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

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 196


mov
tmp_0,#0
mov
tmp_1,#0
mov
tmp_2,#0
mov
tmp_3,#0
mov
r1,?div_16?byte ;ncrcare divizor
mov
r0,?div_16?byte+1
mov
r5,#32
;numr bucle
;start mprire
div_loop:
call
shift_d
;deplasare mpritor i ntoarce MSB n C
mov
a,r6
;deplasare C n LSB rest
rlc
a
mov
r6,a
mov
a,r7
rlc
a
mov
r7,a
;test r7:r6 >= r1:r0
clr
c
mov
a,r7
;scdere r1-r7 pentru comparare r1 < r7
subb
a,r1
; a = r7 - r1, c setat dac r7 < r1
jc
cant_sub
; r7>r1 sau r7=r1
jnz
can_sub
;salt dac r7>r1
;dac r7 = r1, test dac r6>=r0
clr
c
mov
a,r6
subb
a,r0
; a = r6 - r0, c setat dac r6 < r0
jc
cant_sub
can_sub:
;scdere divizor din rest
clr
c
mov
a,r6
subb
a,r0
; a = r6 - r0
mov
r6,a
mov
a,r7
subb
a,r1
; a = r7 - r1 - c
mov
r7,a
setb
c
; deplasare 1 n ct
jmp
quot
cant_sub:
clr
c
; deplasare 0 n ct
quot:
call
shift_q
; deplasare c n ct
djnz
r5,div_loop
; terminat?
; mutare 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
shift_d:
;deplasare divizor un bit la stnga; MSB n C
clr
c
mov
a,op_0
rlc
a
mov
op_0,a
mov
a,op_1
rlc
a
mov
op_1,a
mov
a,op_2
rlc
a
mov
op_2,a
mov
a,op_3
rlc
a
mov
op_3,a
ret
shift_q:
;deplasare ct un bit la stnga; C n LSB
mov
a,tmp_0
rlc
a
mov
tmp_0,a
mov
a,tmp_1
rlc
a
mov
tmp_1,a
mov
a,tmp_2
rlc
a
mov
tmp_2,a
mov
a,tmp_3
rlc
a
mov
tmp_3,a
ret

197 _______________________________________Aplicaii cu microcontrolere de uz general


RSEG
sinus_DATA
?sinus?byte:
DS 2
; argumentul si rezultatul (HIGH, LOW)
RSEG
sinus_CODE
; Argumentul este in domeniul 0h-0ffffh caruia ii corespunde
; un domeniu 0-90 grade
; Rezultatul este in domeniul 0h-7fffh caruia ii corespunde
; un domeniu 0-1
sinus:
mov
A,?sinus?byte
; HIGH argument
mov
DPTR,#sin_tab
; inceput tabel sinus
mov
mul
add
mov
mov
adc
mov

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

; sin(HIGH(i)) + panta * LOW(i)

; 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,

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 198


7fffh

Pentru calcule n virgul flotant, utilizatorul trebuie s-i stabileasc mai


nti formatul de reprezentare al acestor numere. Un numr n virgul flotant
este reprezentat printr-un exponent E i o mantis M, mantisa ntotdeauna
subunitar i normalizat (bitul cel mai semnificativ, cu excepia bitului de
semn, este diferit de zero). Valoarea numrului reprezentat n virgul flotant
este 2 E-1 M.
Astfel, standardul IEEE 754 pentru numere n virgul flotant, prevede
urmtoarele structuri pentru reprezentare pe 32 de bii, respectiv 64 de bii:
0
1
2
MMMM MMMM MMMM MMMM EMMM MMMM

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.

2.6. Filtre numerice


n programele pentru achiziie de date este uneori util implementarea
unor filtre numerice, de exemplu rejecia frecvenei de 50 Hz.
n continuare se prezint un program scris n C i cu o funcie scris n
asamblare.

199 _______________________________________Aplicaii cu microcontrolere de uz general

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]

Deoarece operaiile matematice folosind numere n virgula flotant sunt


foarte mari consumatoare de timp, vom implementa filtrul numeric folosind
operaii matematice pe numere ntregi. Pentru meninerea preciziei i
caracteristicii filtrului numeric calculat vom nmulii coeficienii cu o constant
i dup aceea i vom rotunji la cel mai apropiat numr ntreg pe 32 de bii
(long int). Constanta trebuie aleas astfel nct s nu apar depire n
calculele noastre considernd valoarea maxim a rezultatului convertorului
analog numeric i cea mai mare valoarea a coeficientului.
Caracteristica filtrului FOB 50Hz n dB
0
-5
-10
-15
-20

|H|
[dB]-25
-30
-35
-40
-45
-50
46

47

48

49

50
f [Hz]

51

52

53

54

Figura 2.7 Caracteristica filtrului FIR eliptic FOB

Valoarea cea mai mare a coeficienilor filtrului nostru este de aproximativ


3, valoarea maxim obinut la ieirea convertorului analog numeric este de
0x3FF=1.023 i valoare ce mai mare care poate fi reprezentat pe 32 de bii
este de 0x7FFFFFFF= 2.147.483.647. Valorile intermediare obinute n calculul
filtrului sunt formate din adunarea a 4 nmuliri. Astfel se poate determina

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 200

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=

A = [16384, 31685, 46344, 30035, 14723];


B = [15512, 30825, 46337, 30825, 15512];

Funcia de tratare a ntreruperilor sosite de la convertorul analog


numeric apeleaz o funcie scris n asamblare care ntoarce rezultatul
conversiei pe 10 bii ntr-un unsigned int.
Conform regulilor de transfer a valorilor returnate n R6 se gsete
partea MSB iar n R7 partea LSB.
Interfaa serial RS232 a microcontrolerului este programat n 19200,8,N,1
i este folosit pentru transferul eantioanelor ctre PC.
La compilare se pot folosi dou directive:
IMPLEMENT_FILTER:
valorile eantioanelor transmise sunt trecute prin
filtrul numeric implementat. Dac nu este
specificat
aceast
directiv
de
compilare,
eantioanele trimise sunt cele obinute de la
convertorul analog numeric
IMPLEMENT_DAC10BITS: eantioanele obinute de la convertorul analog
numeric sunt reprezentate pe 10 bii i dac
aceast directiv de compilare nu este specificat
atunci rezultatul conversiei este pe numai 8 bii
(cei mai semnificativi).
/**************************************************************************\
** Titlu:
FILTRU.C
**
** Descriere:
Implementarea unui fltru 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:
**
**
Filtru numeric
**
**
Watchdog
**
**
Main
**
**
**
** Ultima modificare la data: 23 sep 1999
**
** Istoric:
**
**
**
** Observatii:
**
**
Foloseste functia int getadc() scrisa in asamblare in
**
**
fiserul ASMFUNC.ASM
**
\**************************************************************************/
#pragma DEBUG OBJECTEXTEND CODE SYMBOLS
#include <Reg552.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <absacc.h>

201 _______________________________________Aplicaii cu microcontrolere de uz general


#include <typedef.h>
/* Canalul pe care se face achizitia de date */
#define CHANEL
6
/* Ordinul filtrului trebuie sa fie putere a lui 2 */
#define FILTER_ORDER 4
;****************************************************************
// OPTIUNI DE COMPILARE:
//
IMPLEMENT_FILTER
achizitia de date este filtrata
//
IMPLEMENT_DAC10BITS achizitia de date se face pe 10 biti
//
altfel pe 8 biti
;****************************************************************
//#define IMPLEMENT_FILTER 1
//#define IMPLEMENT_DAC10BITS
1
// Avem 3 LED-uri care se aprind in functie de nivelul semnalului
#ifdef IMPLEMENT_DAC10BITS
#define
HIGH_DAC
999
#define
LOW_DAC
870
#else
#define
HIGH_DAC
0xf8
#define
LOW_DAC
0xc8
#endif // IMPLEMENT_DAC10BITS
// rezultatul conversiei analog-numerice (este setat in intrerupere
// si citit in functia main)
data unsigned int DAC;
// indicator terminare converisie analog-numerica (setat in interupere
// si resetat in functia main)
bit fadc;
// Un sir de caractere de identificare
code char xx[] = "\nPRACON(R) V4.02 (c)StSoft 1999 - PRATCO s.r.l. Bucharest Romania.
CP 61-137 RO7550";
#ifdef IMPLEMENT_FILTER
// vector pt. implementarea listelor circulare necesare filtrului numeric
data long xfilter[FILTER_ORDER];
data long yfilter[FILTER_ORDER];
data char xi=0,yi=0;
// indexul in listele circulare
// Coeficientii filtrului numeric
// Pentru viteza nu se va lucra numai cu operatii pe numere intregi.
// Coeficientii au fost determinati in Matlab pentru un filtru opreste
// banda de ordin 4 cu frecventele de taiere [47Hz, 53Hz]. Coeficientii
// determinati au fost inmultiti cu 16384 si convertiti la intreg. S-a ales
// valoarea de 2 14 =16384 (0x4000) pt. ca operatia de inmultire si impartire
// poate fi realizata prin rotire la stanga si respective la dreapta de 14
// ori.
data const long a[FILTER_ORDER + 1] = {16384, 31685, 46344, 30035, 14723};
data const long b[FILTER_ORDER + 1] = {15512, 30825, 46337, 30825, 15512};
#endif // IMPLEMENT_FILTER
// definitiile functiilor externe din fiserul ASMFUNC.ASM
extern int getadc(void);
// definitiile functiilor C din acest fisier
// ===============================================================
// WATCHDOG
// ===============================================================
void watchdog(void)
{
PCON |= 0x10;
// setam intai (PCON.4)
T3 = 0x01;
// setam valoarea timerului watchdog (2*100ms)
}
#ifdef IMPLEMENT_FILTER
// ===============================================================
// FILTER = Filtru digital.
//
Y = FILTER(B, A, X) Filtreaza esantioanele prezentate
//
secvential in X folosind coeficientii filtrului prezentati in
//
vectorii A si B.
//
Metoda de calcul este:
//
y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb)
//
- a(2)*y(n-1) - ... - a(na+1)*y(n-na)
// !!!! Din considerente de viteza ordinul filtrului trebuie sa fie
// !!!! o putere a lui 2 si operatiile se fac pe numere intregi.
// !!!! Pentru precizia calculelor coeficientii filtrului sunt inmultiti
// !!!! cu o constanta 2^14, iar rezulatutul este impartit cu aceeasi

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 202


// !!!! constanta. Daca constanta este o putere a lui 2 atunci operatiile
// !!!! de inmultire si impartire pot fi implementate folosind rotri la
// !!!! stanga si respective la dreapta.
// ===============================================================
long filter(long x)
{
register char i=0;
register long bx=0, ay=0;
for(i = FILTER_ORDER; i > 0; i--)
{
bx += b[i] * xfilter[xi++ & (FILTER_ORDER - 1)];
ay += a[i] * yfilter[yi++ & (FILTER_ORDER - 1)];
}
xfilter[xi++ & (FILTER_ORDER - 1)] = x;
bx = (bx + b[0]*x - ay);
bx /= 16384;
//bx = bx >> 14; // impartim tot la 16384=0x4000=2^14
yfilter[yi++ & (FILTER_ORDER - 1)] = bx;
return(bx);
}
#endif // IMPLEMENT_FILTER
// ===============================================================
// MAIN routine
// ===============================================================
void main(void)
{
long f=0;
unsigned int old_val = 0;
// long dummy=0;
// numarul de bucle facute in asteptare
watchdog();
#ifdef IMPLEMENT_FILTER
// Stergem listele circulare
memset(xfilter, 0x00, sizeof(xfilter));
memset(yfilter, 0x00, sizeof(yfilter));
#endif
// Aprindem tote LED-urile ON
P4 = 0xff;
// [0xfe = yellow, 0xfd = red, 0xfb = green]
// Setam interfata seriala la 19200,8,N,1
EA = 0;
// invalidam toate intreruperile
S0CON = 0x52;
// Setam interfata seriala
TMOD = 0x20;
PCON |= 0x80;
TH1 = 0xfd;
// 19200, 8, N, 1
TR1 = 1;
ADCON = 0x00; // resetam ADCI, satrtare soft ADEX=0 ADCI=0 ADCS=0
ADCON |= CHANEL;
// canalul care este folosit pt achizitie
ADCON |= 0x08;
// setam ADCS (start ADC)
fadc = 0;
EAD = 1;

// stergem indicatorul terminare achizitie


// validam intreruperile de la ADC

// Pentru generarea frecventei de achizitie folosim PWM1 cu factor


// de umplere 50% si frecventa de 150.588Hz. Semnalul de la iesirea
// PWM1 este folosit pentru pornirea conversiei analog numerice
// PWMP = 71; // folosim PWM1 ca sa generam 301.176Hz
// PWMP = 216;
// folosim PWM1 ca sa generam 99.929Hz
PWMP = 143;
// folosim PWM1 ca sa generam 150.588Hz
PWM1 = 0x80; // factor de umplere de 50% -> tact extern ADC
// Iesirea PWM0 este folosita pentru aprinderea LED-ului POWER
PWM0 = 0x00;
// POWER LED ON
EA = 1;
// puts(xx);

// validam intruperile
// trimitem mesajul de identificare

ADCON |= 0x20;
// ADCON |= 0x08

// ADC START extern


// ADC START soft

// B U C L A
while(1)
if(fadc)
{
fadc = 0;

// stergem indicatorul sfarsit conversie

P R I N C I P A L A
//
// daca avem date de la convertorul ADC

203 _______________________________________Aplicaii cu microcontrolere de uz general


#ifdef IMPLEMENT_FILTER
f = filter(DAC);
#endif // IMPLEMENT_FILTER
DAC &= 0x3fe;
if(DAC > HIGH_DAC)
P4 = 0xfb;
else
if(DAC < LOW_DAC)
P4 = 0xfd;
else
P4 = 0xfe;
#ifdef IMPLEMENT_FILTER
printf("%ld\t", f);
#else
printf("%u\t", DAC);
#endif // IMPLEMENT_FILTER
//
printf("%ld\t", dummy);
//
dummy = 0;
watchdog();
}
//
else
//
dummy++;
}

// 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

;citim rezultatul conversisi


;schimbam high cu low din A

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 204


anl
A,#03h
;mascam ADC9 si ADC8
mov
R6,A
;partea MSB a lui int [max = 0x03]
mov
A,ADCH
anl
A,#3fh
rl
A
rl
A
mov
R7,A
;partea LSB a lui int
mov
A,ADCON
;low part from ADC
rlc
A
rlc
A
rlc
A
anl
A,#03h
orl
A,R7
; partea LSB a lui int
mov
R7,A
ret
;=================================================================
END

n continuare este prezentat programul MATLAB cu care s-a proiectat


filtrul FIR FOB prezentat anterior.
fs=150.588;
% frecventa de esantionare Hz
N=512;
%nr. de puncte pt desenarea graficelor
%proiectam un FOB cu fl=47Hz si fh=53Hz
fl=47;
fh=53;
Wl=fl*2/fs;
Wh=fh*2/fs;
Rp=0.01;
% max. lost in passband [dB]
Rs=40;
% attenuation in stopband [dB]
Ne=2;
% ordinul filtrului eliptic
% proiectam un FOB eliptic
[Be, Ae] = ellip(Ne, Rp, Rs, [Wl Wh], 'stop');
%Be = fir1(33, [Wl Wh], 'stop'); Ae = [1 0];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
Be = round(Be*16384)
Ae = round(Ae*16384)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[He, We] = freqz(Be, Ae, N);
%plot(We*fs/(2*pi), abs(He), 'r-'); grid on;
plot(We*fs/(2*pi), abs(He), 'r-'); grid on;
title('Caracteristica filtrului FOB 50Hz');
xlabel('Hz');
ylabel('A');
figure;
fx = We*fs/(2*pi);
ix = find(fx>50);
plot(fx(ix-40:ix+40), 20*log10(abs(He(ix-40:ix+40))), 'r-'); grid on; hold on;
%plot(fx, 20*log10(abs(He)), 'r-'); grid on; hold off;
title('Caracteristica filtrului FOB 50Hz in dB');
xlabel('f [Hz]');
ylabel('|H| [dB]');
t=(1:150)/fs;
s1=sin(2*pi*t*15);
s2=sin(2*pi*t*20);
s3=sin(2*pi*t*45);
s4=sin(2*pi*t*50);
s5=sin(2*pi*t*55);
s=round((s1+s2+s3+s4+s5)*1023);
%figure;
%plot(t,s);
sf=round(filter(Be, Ae, s));
%sf=filter(Be, Ae, s);
figure;
plot(t,s,t,sf);
S=fft(s,512);
SF=fft(sf,512);
W=(0:255)/256*fs/2;
figure;
plot(W, abs(S(1:256)), 'r-', W, abs(SF(1:256)), 'g-'); grid on;
title('Filtrarea unui semnal');
xlabel('Hz');
ylabel('|FFT|');

205 _______________________________________Aplicaii cu microcontrolere de uz general

2.7. Ceas de timp real


Exist multe metode i circuite care pot fi folosite n implementarea unui
ceas de timp real.
Ce mai simpl metod este folosirea unui timer intern microcontrolerului
programarea acestui ca s genereze ntreruperi la un interval de timp
prestabilit. Aceast metod are avantajul c nu necesit componente auxiliare
i este foarte uor de implementat dar principalele dezavantaje sunt c rutina
necesar implementrii calendarului i ceasului este destul de lung i deci
microcontrolerul trebuie s consume mult timp cu acest proces. Un alt
dezavantaj este c atunci cnd procesorul se afl n modul power
management timerul nu funcioneaz, i implementarea unui sistem de
back-up a microcontrolerului este neeconomic datorit consumului ridicat al
acestuia mpreun cu circuitele aferente (RAM, EPROM, latch-uri etc.) n
comparaie cu consumul unui circuit integrat specializat.
Pentru implementarea unui ceas de timp real se poate folosi timerul T1
care este utilizat pentru generarea tactului pentru interfaa serial, sau
timerul T0 care poate fi programat pentru generarea de ntreruperi ntre
750ns i 192s (oscilator 16MHz i 8xC552).
/**************************************************************************\
** Titlu:
TIMER0.H
**
** Descriere:
Folosirea Timerului T0 ca generator de tic-uri
**
**
Implementarea unui ceas de timp real
**
**
Declaratii de constante si functii
**
**
**
** 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:
**
**
Definerea tiplului TTIME
**
**
Declararea variabilei totic ca contor de ticuri
**
**
Declaratiile functiilor:
**
**
bit T0_int(long tic) = iniializare T0
**
**
TTIME T0_ReadTime() = macro citire contor tic-uri
**
**
TTIME T0_DiffTime(TTIME otic) = calculeaza diferenta **
**
intre doua valori TTIME
**
**
**
** Ultima modificare la data: 23 nov 1998
**
** Istoric:
**
**
**
** Observatii:
**
**
**
\**************************************************************************/
#ifndef _TIMER0_H
#define _TIMER0_H
1
#include <typedef.h>
/* Tipul variabilei care va mentine cotorul de tic-uri [byte pt. viteza]*/
typedef byte TTIME;
/* Contorul de ticuri se va tine in 'data' pentru viteza */
extern data TTIME t0tic;
/* initializare timer 0 cu tic=[750ns...192us], ret=1->eroare */
bit T0_init(long tic);
/* Citeste contorul de ticuri */
#define
T0_ReadTime()

(tic)

/* Calculeaza diferenta de timp in tic-uri */


TTIME T0_DiffTime(TTIME otic);
#endif
/**************************************************************************\
** Titlu:
TIMER0.C
**

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 206


** Descriere:
Folosirea Timerului T0 ca generator de tic-uri
**
**
Implementarea unui ceas de timp real
**
**
Declaratii de constante si functii
**
\**************************************************************************/
#pragma DEBUG OBJECTEXTEND CODE SYMBOLS
/* #pragma REGISTER BANK(0) */
#include <reg552.h>
#include <stdio.h>
#include <absacc.h>
#include "timer0.h"
/* comenteaza linia urmatoare pt introducere program de test*/
#define NO_MAIN
1
/* la cate ticuri se va executa functia utilizator [valoare = 2**n]*/
#define DO_T0_USRFNCT
0x7f
/* definire valorile minime si maxime ale intervalului de timp
intre 2 tic-uri in ns */
#define MIN_TIC
750l
#define MAX_TIC
192000l
data TTIME t0tic;
/* contor de tic-uri */
extern void on_T0tic(void); /* functie utilizator apelata la fiecare tic */
bit fonT0tic;
/* flag tratare functie utilizator externa */
\*************************************************************************
int_T0(void) = Functia care este apelata in intreruperi pentru T0
Foloseste bancul 3 de registrii
*************************************************************************/
void int_T0(void) interrupt 1 using 3
{
if(!((t0tic++) && DO_T0_USRFNCT)) /* din cand in cand apeleaza fnct usr */
if(!fonT0tic)
/* ? apel inhibat ? */
{
fonT0tic = 1; /* inhibam eventualele apeluri ale functiei on_T0tic */
/* daca timpul de executie al acesteia este mai mare */
/* decat intervalul dintre 2 intreruperi
*/
on_T0tic();
/* apelam functia utilizator
*/
fonT0tic = 0; /* validam apelurile ulterioare ale functiei on_T0tic */
}
}
\*************************************************************************
Program de test
*************************************************************************/
#ifndef NO_MAIN
main()
{
TTIME Start,xtic;
EA = 0;
/* PENTRU QUARTZ DE 16
SCON = 0x52;
/*
TMOD = 0x20;
/*
PCON = PCON | 0x80; /*
TH1 = 0xf7;
/*
TR1 = 1;
/*
EA = 1;

/* DISABLE ALL INTERRUPTS */


MHz, 9600 BAUDS */
SCON */
/* setup serial port control */
TMOD */
/* hardware (9600 BAUD @16MHZ)*/
SMOD = 1 */
TH1 */
Timer 1 Start */
/* ENABLE ALL INTERRUPTS */

/* Setare Timer 0 la 100000ns = 100us = 0.1s */


if(T0_init(100000))
printf("Eroare initializare T0 la 0.1ms\n");
Start = T0_ReadTime();
while(1)
if((xtic=T0_DiffTime(Start)) > 10)
{
Start = T0_ReadTime();
printf("TIC %u\n", xtic);
}
}
#endif
\*************************************************************************
T0_DiffTime(TTIME otic) = calculeaza diferenta intre 2 valori de tic
*************************************************************************/
TTIME T0_DiffTime(TTIME otic)
{
/*
return 0; */
return((t0tic >= otic) ? (t0tic-otic) : (0xff-otic+t0tic));

207 _______________________________________Aplicaii cu microcontrolere de uz general


/*
}

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) */

*/
*/

/* verificam domeniul de valabilitate pt. tic in [ns] */


if((tic < MIN_TIC) || (x > MAX_TIC))
return 1;
/* intoarcem ca aparut o eroare */
x = 256-tic/MIN_TIC;
EA = 0;
/* DISABLE ALL INTERRUPTS */
fonT0tic = 0;
/* Setare Timer 0 */
TMOD = TMOD | 0x02; /* Timer 0 auto reload */
TH0 = (char)x;
TR0 = 1;
/* start timer 0 */
ET0 = 1;
/* enable timer 0 interrupt */
EA = 1;
/* ENABLE ALL INTERRUPTS */
return 0;
}

Modul de programare i de folosire al timerului T0 este prezentat n


programul de mai sus. Pornirea timerului T0 se face prin apelul funciei
T0_init care are ca parametru intervalul de timp dorit ntre 2 ntreruperi.
Aceast valoare este mai nti verificat dac se ncadreaz n limitele admise
pentru frecvena oscilatorului. Dac oscilatorul are o frecven diferit de
16MHz, trebuiesc recalculate valorile minime i maxime (MIN_TIC i
MAX_TIC) i nlocuirea acestora n fiierul TIMER0.H.
Funcia care se apeleaz n ntreruperi incrementeaz valoarea global a
contorului de ticuri T0tic care este implementat ca unsigned char n zona
de memorie data din considerente de vitez. Valoarea contorului este
verificat pentru a se vedea dac se poate apela funcia utilizator. Aceast
funcie trebuie s se numeasc void on_T0tic(void) i dac aceasta
lipsete trebuie modificat funcia int_T0 apelat n ntreruperi. Pentru
inhibarea reapelului funciei utilizator nainte de terminarea acesteia (funcia
poate s nu fie reentrant) este implementat o interblocare folosind
indicatorul fonT0tic.
A doua metod de implementare a unui ceas de timp real, prezentat n
continuare, folosete un circuit specializat RTC72421. Acesta este vzut ca un
periferic n spaiul de adresare al microcontrolerului. Comunicaia ntre RTC i
microcontroler se face pe 4 bii (D0D3). Acest circuit conine un oscilator
propriu i poate s furnizeze ora i data. De asemenea acest circuit poate fi
programat s genereze i ntreruperi la un anumit interval de timp ct i la o
anumit or (alarm).
Registrele interne ale acestui circuit sunt definite n fiierul SYSTEM.H
din anexe i au descrierea din tabelul 3.12.

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 208


Tabelul 2.14
Nume
Gam
Adresa
Data
D3
D2
D1
D0
registru valoare
Hexa A3 A2 A1 A0
S8
S4
S2
S1
SEC01
0
0
0
0
0
09
S40
S20
S10
SEC10
1
0
0
0
1
05
M8
M4
M2
M1
MIN01
2
0
0
1
0
09
M40
M20
M10
MIM10
3
0
0
1
1
05
H8
H4
H2
H1
HOUR01
4
0
1
0
0
09
H20
H10
HOUR10
5
0
1
0
1
02
PM/AM
D8
D4
D2
D1
DAY01
6
0
1
1
0
09
D20
D10
DAY10
7
0
1
1
1
03
M8
M4
M2
M1
MON01
8
1
0
0
0
09
M10
MON10
9
1
0
0
1
01
Y8
Y4
Y2
Y1
YEAR01
A
1
0
1
0
09
Y80
Y40
Y20
Y10
YEAR10
B
1
0
1
1
09
W4
W2
W1
WEEK
C
1
1
0
0
06
30 adj IRQ flag
BUSY
HOLD
REG D
D
1
1
0
1
t1
t0
MASK
REG
E
E
1
1
1
0
Intr/Stnd
TEST
STOP
RESET
REG
F
F
1
1
1
1
24/12

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

ntreruperi i este controlat de registrul E (REG E). Ieirea este open-drain i

209 _______________________________________Aplicaii cu microcontrolere de uz general

nu depinde de CS0 i CS1. Valoarea rezistenei sarcinii legate la V cc trebuie s


fie de minimum 2K2.
Registrul de control D
HOLD (D0). Setnd acest bit la valoarea 1
0

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

RTC-ul trebuie s incrementeze

registrul de secunde S1, acesta va fi incrementat la o secund dup ce bitul


HOLD redevine 0
Dac CS1 = 0

LOGIC

LOGIC ,

(HOLD trebuie s fie setat mai puin de o secund).

atunci HOLD = 0

LOGIC .

BUSY (D1) este folosit pentru a determina dac registrele de la S1 la W


pot fi accesai pentru scriere sau citire, acest lucru fiind posibil numai atunci
cnd bitul BUSY =0. Acest bit poate fi numai citit (read only). Pentru a
accesa registrele RTC de la S1 la W este indicat s se respecte algoritmul
prezentat n figura 3.8.
HOLD  1

BUSY
0
HOLD  0

HOLD  0

scrie sau citete


registrele S1W

wait 190 s

Figura 2.8. Diagrama de utilizare a RTC 72421

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

Cnd IRQ =1 atunci este cerut o

Bitul

MASK

mpreun

cu

t0

t1

INTR/STND controleaz intervalul de timp pentru generarea pulsurilor la pinul


STD.P. Bitul MASK are rolul de ON/OFF, INTR/STND controleaz forma de
und i t0 mpreun cu t1 controleaz perioada.
Cnd RTC-ul este n modul INTERRUPT, ieirea STD.P va rmne n
starea 0 pn cnd se va scrie 0 n bitul IRQ. Cnd RTC-ul este n modul
STANDARD pinul STD.P va rmne n starea 0 pn cnd se va reseta
manual bitul IRQ dar nu mai mult de 7.8125 ms atunci cnd bitul IRQ se va
reseta automat.

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 210

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

ADJ (D3). La setarea acestui bit se ajusteaz registrele

secundelor la 00, conform tabelului 3.13. Acest bit se va reseta automat


dup 76.3s. Ct timp acest bit este setat, registrele RTC nu pot fi accesate.
Tabelul 2.15
Valoarea sec. nainte de ajustare Incrementare minute Valoarea sec. dup ajustare
30 59
DA
00
01 29
NU
00

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

ATENIE Limea impulsului depinde de momentul resetrii bitului IRQ flag.


n momentul setrii biilor t0 i t1 ncepe o perioad. Biii t0 i
t1 nu sunt asociai nici unui contor.
Registrul de control F
RESET (D0). Acest bit este utilizat pentru resetarea contorilor interni cu
frecvena mai mic de 1Hz. La reset nu vor fi afectai registrele de ceas sau
dat. Atta timp ct RESET = 1 numrtoarele vor fi oprite. Pentru a reporni

211 _______________________________________Aplicaii cu microcontrolere de uz general

numrtoarele, bitul RESET trebuie resetat la valoare 0. Dac CS1 = 0


atunci RESET = 0.
STOP (D1). Cnd bitul STOP este 1 va opri reeaua de divizare a
frecvenei de 8192Hz, iar cnd este 0 RTC-ul va funciona normal. Exist o
ntrziere de 122s dup schimbarea strii acestui bit.
24/12 (D2). Acest bit este utilizat pentru selectarea modului de indicare
a orei n format 24 (cnd este setat la valoarea 1) sau 12 (cnd este setat
valoarea 0). n modul 24 ore, trebuie ignorat valoarea bitului PM/AM.
TEST (D3). Acest bit este folosit pentru testare i trebuie setat la
valoarea 0 pentru ca RTC-ul s funcioneze normal.
Observaii
1. n timpul ajustrii la 30 secunde (30 sec adj.) poate apare un impuls la
pinul STD.P.
Ieirea STD.P i va menine starea n care este cnd bitul STOP = 1
atunci cnd INTR/STND = 0 (modul STANDARD).
2. Nu se va produce nici o modificare a ieirii STD.P ca urmare a scrierii n
registrele de la S1 la H1.
3. Un semnal mai mare de 4/5V DD trebuie aplicat pe pinul CS1 pentru
circuitul s fie activat i trebuie s fie mai mic de 1/5 V DD pentru a nu
apare un curent rezidual nedorit.
4. Pentru protecia datelor la punerea sub tensiune, CS1 trebuie s fie activat
dup cel puin 2s, iar la anularea tensiunii, CS1 trebuie trecut n starea
0 cu cel puin 2s nainte
Iniializarea i setarea alarmei trebuie fcut conform organigramei din
figura 3.9.
Funciile prezentate n continuare permit setarea, citirea i scrierea
din/n circuitul integrat RTC-72421. Explicaiile din cod, mpreun cu
descrierea registrelor circuitului din paragraful anterior, sunt suficiente pentru
a nelege codul prezentat n continuare. Trebuie menionat c n ntreruperea
RTC au fost implementate i dou timere care vor fi decrementate pn la
anularea valorii setate n prealabil n variabilele secF1 i/sau secF2, moment
n care se vor seta indicatorii fF1 i respectiv fF2.
Programele surs folosesc fiierele de definiii SYSTEM.H i TYPEDEF.H
care sunt prezentate n anex.

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 212


START

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

extern code char days[8][3];


extern
extern
extern
extern
extern
extern
extern

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

intrerupere RTC (1s)


intrerupere RTC (1/64s = 15.625ms)
functie speciala (1 dupa secF1 * 1/64s)
functie speciala (1 dupa secF2 * 1/64s)
// contor de ticuri (++ la fiecare 15.625ms)
// dupa cate 1/64s se seteaza fF1
// dupa cate 1/64s se seteaza fF2

((tic >= otic) ? (tic-otic) : (0xffff-otic+tic))

213 _______________________________________Aplicaii cu microcontrolere de uz general


extern
extern
extern
extern

bit RTC_busy(void);
void RTC_init(void);
void RTC_clr(void);
void RTC_read(void);

//
//
//
//

citire bit BUSY


initializare RTC
sterger date RTC
citire date RTC

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;

//
//
//
//
//
//
//
//

Flag intrerupere RTC (1s)


Flag intrerupere RTC (1/64s = 15.625ms)
Flag inerval de timp scurs 1
Flag inerval de timp scurs 2
suntem in apelul functiei ticRTC
incrementat de 1/64s (15.625ms)
itervalul de timp in 1/64s pentru setarea lui fF1
itervalul de timp in 1/64s pentru setarea lui fF2

bit RTC_busy(void);
void RTC_init(void);
void RTC_clr(void);
void RTC_read(void);

//
//
//
//

citire bit BUSY


initializare RTC
stergere date din RTC
citire RTC

extern idata byte RTC_ck;

// folosit pentru verificarea functinarii RTC-ului

\*************************************************************************
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;

// supraveghere functionare RTC cu timer 0

}
\*************************************************************************
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
*************************************************************************/

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 214


void RTC_read(void)
{
while(RTC_busy());
RTC_DATA[2] = (XBYTE[regDAY10] & 0x03) + '0';
RTC_DATA[3] = (XBYTE[regDAY1] & 0x0f) + '0';
RTC_DATA[4] = '/';
RTC_DATA[5] = (XBYTE[regMON10] & 0x01) + '0';
RTC_DATA[6] = (XBYTE[regMON1] & 0x0f) + '0';
RTC_DATA[7] = '/';
RTC_DATA[8] = (XBYTE[regYEAR10] & 0x0f) + '0';
RTC_DATA[9] = (XBYTE[regYEAR1] & 0x0f) + '0';
RTC_DATA[10] = ' ';
RTC_DATA[11] = (XBYTE[regHOUR10] & 0x03) + '0';
RTC_DATA[12] = (XBYTE[regHOUR1] & 0x0f) + '0';
// RTC_DATA[13] = ':';
RTC_DATA[13] = (XBYTE[regSEC1] & 0x01) ? ':' : ' ';
RTC_DATA[14] = (XBYTE[regMIN10] & 0x07) + '0';
RTC_DATA[15] = (XBYTE[regMIN1] & 0x0f) + '0';
RTC_DATA[16] = ':';
RTC_DATA[17] = (XBYTE[regSEC10] & 0x07) + '0';
RTC_DATA[18] = (XBYTE[regSEC1] & 0x0f) + '0';
RTC_DATA[19] = 0;
// RTC_DATA[19] = ;
RTC_DATA[20] = XBYTE[regWEEK] & 0x07;
memcpy(RTC_DATA, days[RTC_DATA[20]], 2);
// ww

// 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;
//

INT=1/64s(00), STND=1(0), MASK=0 (0000)


INT=1sec(01), STND=1(0), MASK=0 (0100)
INT=1min(10), STND=1(0), MASK=0 (1000)
INT=1hour(11), STND=1(0), MASK=0 (1100)
30adj=0, irq=0, busy=0, hold=0 (0000)
test=0, 24h=1, stop=0, reset=0 (0100)

strcpy(RTC_DATA, "wwdd/mm/yy hh:mm:ss w");


012345678901234567890
secF1 = 60;
secF2 = 180;

// implicit fF1 setat din minut in minut


// implicit fF2 setat din 3 minute in 3 minute

\*************************************************************************
Stergerea datelor din RTC
*************************************************************************/
void RTC_clr(void)
{
char adr;
IT1 = 1;
EX1 = 1;

// INT1 on falling edge


// Enable extarnal interrupt 1 (RTC)

XBYTE[regF_RTC] = 0x07;

// test=0,24h=1,stop=1,reset=1 (0111)

215 _______________________________________Aplicaii cu microcontrolere de uz general


for(adr=0; adr<0x0d; adr++)
XBYTE[RTC_ADR + adr] = 0x00;
//

XBYTE[regE_RTC]
XBYTE[regE_RTC] =
// XBYTE[regE_RTC]
// XBYTE[regE_RTC]
XBYTE[regD_RTC] =
XBYTE[regF_RTC] =
}

= 0x00; //
0x04;
//
= 0x08; //
= 0x0c; //
0x00;
//
0x04;
//

INT=1/64s(00), STND=1(0), MASK=0 (0000)


INT=1sec(01), STND=1(0), MASK=0 (0100)
INT=1min(10), STND=1(0), MASK=0 (1000)
INT=1hour(11), STND=1(0), MASK=0 (1100)
30adj=0, irq=0, busy=0, hold=0 (0000)
test=0, 24h=1, stop=0, reset=0 (0100)

\*************************************************************************
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;

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 216


while(RTC_busy());
XBYTE[regYEAR10] = x;
XBYTE[regYEAR1] = val - x*10;
XBYTE[regD_RTC] = 0x00;
}
\*************************************************************************
Setarea zilei din saptamana
*************************************************************************/
void setRTCweek(byte val)
{
while(RTC_busy());
XBYTE[regWEEK] = val & 0x07;
XBYTE[regD_RTC] = 0x00;
}

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

Figura 2.10. Utilizarea circuitului I 2 C PCF8583

Descrierea circuitului

217 _______________________________________Aplicaii cu microcontrolere de uz general

tensiunea de alimentare a circuitului: 2,5V6V;


tensiunea de alimentare a ceasului de timp real (070C): 1.0V6V;
tensiunea necesar pentru meninerea datelor: 1.0V6V;
curentul consumat n ateptare (f SCL =0Hz): maxim 50A;
data cu calendar pe 4 ani;
ora n format 12 sau 24;
baza de timp 32,768Hz sau 50Hz;
programarea pe interfa I 2 C;
adresa I 2 C este 1 0 1 0 0 0 A0 R/W;

incrementarea automat a contorului de adrese;


programarea alarmei, registrelor de dat/or;
generarea de ntreruperi;
RAM CMOS static de 256octei;
oscilator incorporat cu frecvena de 32.768kHz;
autoinializare la punerea sub tensiune (Power on Reset).
Octeii de la 00h la 07h sunt folosii de RTC pentru memorarea strii,
datei i a orei. Octeii cu adresa ntre 08h i 0Fh pot fi folosii pentru setarea
alarmei sau ca zon de memorie. Octeii de la 10h la FFh pot fi folosii ca
memorie RAM.
PCF8583 poate funciona ca ceas (cu tact de 32.768kHz sau de 50Hz)
sau ca contor de evenimente, mod n care numrtoarele se vor incrementa
pentru fiecare tact al oscilatorului (generatorului de evenimente).
O alarm poate fi setat la o anumit dat, sptmnal sau zilnic ori la
apariia unui numr de evenimente.
n modul ceas, registrul de la adresa 07h poate fi setat pentru
numrarea sutimilor de secund, secundelor, minutelor sau zilelor. Dac
alarma nu este programat, atunci vor fi contorizate zilele.
Dac s-a produs un eveniment care a dus la declanarea alarmei,
indicatorul de alarm din registrul de stare este setat, rmnnd setat pn
cnd se execut o operaie de citire.
Structura registrelor i memoriei interne este prezentat n tabelul 3.15.
MOD CEAS
CONTROL/STARE
Miimi de secund
1/10s
1/100s
Secunde
10s
1s
Minute
10min
1min
Format, AM/PM, ore
F A 10h
1h
An / Zile
ani 10z
1z
Ziua / Luni
ziua 10l
1l
Timer
10z
1z

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

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 218


CONTROL ALARM
CONTROL ALARM 08h
Alarma zecimi de secund
Alarm
09h
1/10s
1/100s
D1
D0
Alarm secunde
Alarm
0Ah
10s
1s
D3
D2
Alarm Minute
Alarm
0Bh
10m
1m
D5
D4
*
Alarm ore
liber
0Ch
F A 10h
1h
*
Alarma an / ziua
liber
0Dh
10z
1z
xx
Alarma ziua / luna
liber
0Eh
ziua 10l
1l
Alarm timer
Alarm timer
0Fh
10z
1z
T1
T0
10h
liber
liber
M
FFh

n continuare, n tabelul 3.16, sunt caracterizate registrele de


programare ale circuitului. Toate registrele interne sunt terse la iniializare.
Tabelul 2.18
Bit
Descriere
Registrul de stare i comand (adres 00h)
Indicator de registru contor (dac bitul de validare a alarmei este 0 atunci acest
0 indicator i va schimba starea din secund n secund cu un factor de umplere
de 50%).
Indicator de alarm (dac bitul de validare a alarmei este 0 atunci acest indicator
1
i va schimba starea din minut n minut cu un factor de umplere de 50%).
Bit validare alarm:
0  alarm inhibat. Indicatorii de mai sus vor bascula, spaiul de memorie de
la adresa 08h la 0Fh din RAM este spaiu liber i poate fi folosit de
2
utilizator;
1  alarm validat (registrul de la adresa 08h este registrul de control al
alarmei).
Indicator citire mascat:
3 0  citirea de la adresele 05h i 06h se va face nemascat;
1  citirea direct a contorilor de luni i zile.
Mod de funcionare:
00  mod ceas 32.768KHz;
4,5 01  mod ceas 50Hz;
10  mod contor de evenimente;
11  mod test;
Indicator PAUZ:
6 0  contorizare;
1  memorarea i meninerea ultimelor valori ale contorilor.
Indicator STOP:
7 0  contorizare;
1  oprirea i resetarea contorilor;
Registrul contor ore (adres 04h)
0,1
Orele (unitile) n format BCD
2,3
4,5 Zecile de ore n format binar
6

Indicator AM/PM: 0 = AM, 1= PM


Format or:
7 0 = format 24h, indicatorul AM/PM nu se modific;
1 = format 12h, indicatorul AM/PM se va modifica.
Registrul contor ani/zile (adres 05h)

219 _______________________________________Aplicaii cu microcontrolere de uz general


0,1,
Zilele (unitile) n format BCD
2,3
4,5 Zecile de zile (n format binar de la 0 la 3)
Anii (de la 0 la 3, 0 = an bisect). Dac bitul citire mascat este setat atunci la
citire aceti bii vor fi 0.
Registrul contor zi din sptmn/lun (adres 06h
Bit
Descriere
0,1
Luna (unitile) n format BCD
2,3
4 Zecile de luni n format binar de la 0 la 1
5,6 Ziua din sptmn, n format binar de la 0 la 6. Dac bitul citire mascat este
7 setat atunci la citire aceti bii vor fi 0.
Registrul control alarm (adres 07h)
Bit
Descriere
Funcii contor (timer):
000 = fr contor;
001 = sutimi de secund;
010 = secunde;
0,1
011 = minute;
2
100 = ore;
101 = zile;
110 = nefolosit;
111 = mod test, toi contorii vor numra n paralel.
3 Validare ntreruperi timer: 0 = invalidate, 1 = validate
Funcii alarm:
00 = nu se va declana alarma
4,5 01 = alarma zilnic (la ora specificat)
10 = alarm sptmnal (la ziua din sptmn i ora setate)
11 = alarma la data i ora setat
6 Validarea alarmei de la contor (timer): 0 = invalidat, 1 = validat
Validarea ntreruperilor de la alarm: 0 = invalidate, 1 = validate.
7 ntreruperile vor fi generate numai dac este setat bitul de validare a
ntreruperilor din registrul de stare i control.
6,7

Toate registrele de alarm au aceeai structur ca registrele de date i


se gsesc ncepnd cu adresa 08h.
O alarm este generat atunci cnd coninutul registrelor de alarm au
aceeai valoare cu registrele de date corespunztoare (comparare la nivel de
bit). Biii care reprezint anul i ziua din sptmn nu vor fi comparai la
alarma pentru o anumit dat. n cazul alarmei zilnice, nu vor fi luai n
consideraie i biii care reprezint luna. n cazul alegeri alarmei sptmnale,
coninutul registrului de alarmare a lunii are funciunile din tabelul 3.17.
Bit
0
1
2
3
4
5
6
7

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;

Ieire de ntrerupere INT

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 220

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.

221 _______________________________________Aplicaii cu microcontrolere de uz general

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

b) Mod citire din RTC (scriere-setare adres, citire date)


Confirmare de la slave Confirmare de la master Neconfirmare de la master
S Slave Address 1

D ate

D ate

n octei
autoincrementare
adres

R/ W

autoincrementare
adres

c) Mod citire imediat din RTC fr setarea adresei

Figura 2.11. Operarea circuitului PCF8583

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

Caracteristicile mai importante ale circuitului sunt:


tensiune de alimentare ntre 2,5V i 6V;
timp de eantionare determinat de magistrala I 2 C;
patru intrri analogice care pot fi programate n mod comun sau
diferenial;
autoincrementarea canalelor.

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 222

Descrierea pinilor circuitului este prezentat n tabelul 3.20 iar n tabelul


3.21 este prezent structura octetului de comand i control (al doilea octet
trimis).
Tabelul 2.20
Pin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

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

tensiune de alimentare negativ


linia de date I 2 C
linia de tact I 2 C
intrare-ieire oscilator
selecia oscilatorului intern sau extern
masa analogic
intrare, tensiune de referin
ieire analogic
tensiune de alimentare pozitiv
Tabelul 2.21

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

01: 3 intrri difereniale


AIN0

channel 0

AIN0

AIN1

channel 1

AIN1

channel 2

AIN2

AIN2
AIN3

6
7

AIN3

channel 0

channel 1

10: Intrri difereniale i


11: 2 intrri difereniale
normale combinate
Validare ieire convertoare D/A (1 = validat)
0

223 _______________________________________Aplicaii cu microcontrolere de uz general


MSB
D7

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)

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 224

ciclu de scriere autonom


incrementarea automat a adresei
protecie la descrcri electrostatice de pn la 4kV (modelul corpului
uman).
Funcionalitatea pinilor capsulei este descris n tabelul 3.22, adresa I 2 C
a memoriei n tabelul 3.23. i structura octetului de comand n tabelul 3.24.
Tabelul 2.22
Pin
1
2
3
4
5
6
7
8

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

n modul de scriere multioctet se poate scrie peste nceputul


zonei de protecie dac adresa primului octet este chiar nainte
de nceputul zonei protejate.

Adresarea memoriei

225 _______________________________________Aplicaii cu microcontrolere de uz general

Pentru nceperea transferului, circuitul master trebuie s transmit un


START, adresa I 2 C a circuitului, selecia blocului de memorie i bitul de
direcie (R/W).
Operaia de scriere
Modul de scriere multioctet este validat dac pinul MODE este legat la
V DD , iar dac este legat la V SS atunci este selectat modul de scriere paginat.
Pinul MODE poate fi modificat dinamic. Modul de scriere octet cu octet este
independent de valoarea MODE. Dac pinul MODE este nelegat atunci singurul
mod de scriere este cel octet cu octet i de aceea este recomandat legarea
la V DD sau la V SS a acestui pin.
Dup semnalul START, dispozitivul master transmite adresa circuitului
slave terminat cu zero (R/W = 0) i astfel dispozitivul slave, dup validarea
recepiei, ateapt al doilea octet care este interpretat ca adresa locaiei de
memorie din blocul selectat anterior (n primul octet). Circuitul slave va valida
recepia.
Scrierea unui octet
n acest mod, dup transmiterea adresei prezent mai sus, dispozitivul
master va transmite un octet care va reprezenta data care va fi nscris la
adresa selectat. Dispozitivul slave va valida recepia i master-ul va
transmite STOP. Ciclul de scriere este 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.a).
Scrierea mai multor octei
Dac semnalul MODE este 1 atunci se pot scrie mai muli octei n aceeai
operaie de scriere plecnd de la o adres oarecare. Dispozitivul master poate
s transmit pn la 8 octei care vor fi nscrii la adrese succesive plecnd
de la adresa stabilit iniial. Fiecare octet transmis este validat de circuitul
slave iar la sfrit dispozitivul master trebuie s transmit STOP. Ciclul de
scriere este pornit dup primirea semnalului STOP. ntre dou comenzi de
scriere (a blocurilor de maxim 8 octei) trebuie ateptat 20 ms pentru ca
memoria s definitiveze ciclul de scriere. Procedura de lucru este descris n
figura 3.12.b).
Scrierea paginat
Acest mod este selectat dac semnalul MODE este 0. n acest mod se pot
scrie n aceeai ciclu pn la 16 octei, cu condiia ca acetia s se afle n
aceeai pagin (biii din adres A9A4 identici). Ca i mai sus, dispozitivul
master va transmite adresa de nceput i apoi octeii de date. Adresa va fi
incrementat automat atunci cnd circuitul slave valideaz recepia octetului.
La sfrit dispozitivul master trebuie sa transmit STOP. Ciclul de scriere este

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 226

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).

227 _______________________________________Aplicaii cu microcontrolere de uz general


ACKL
ACKL
ACKL
DEV SEL

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

b) Scriere paginat i multioctet


ACKL
NACKL

DEV SEL

DATA OUT

START

STOP
R/W

c) Citire de la adres curent a unuia sau mai muli octei


ACKL

DEV SEL

BYTE ADDR

START

ACKL

ACKL

DEV SEL
START

R/W

NACKL

DATA OUT
R/W

STOP

d) Citirea de la o adres oarecare a unuia sau mai muli octei


ACKL
ACKL
ACKL

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

Figura 2.12. Citirea/scrierea datelor n memoria ST24C08

Citirea de la o adres oarecare a unuia sau mai muli


octei

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 228

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

Pini quasi bidirecionali


Masa
Pini quasi bidirecionali
Ieire cu dren n gol semnal de ntrerupere
Tact I 2 C
Intrare/ieire date I 2 C
Tensiune de alimentare pozitiv (2,5V 6V)

Adresa perifericului I 2 C, n variantele PCF8574, respectiv PCF8574A


este urmtoarea:
PCF8574
MSB
0

A2

A1

A0

LSB
R/W

A2

A1

A0

R/W

PCF8574A
0

Fiecare pin poate fi programat independent ca intrare sau ieire.


Programarea ca intrare se face prin trecerea n starea 1 LOGIC a pinului
respectiv. Semnalul de ntrerupere este generat atunci cnd cel puin unul din
pini i modific starea fa de ultimul acces. Pinul INT rmne zero pn la
urmtorul acces la circuit sau pn cnd starea semnalelor de la pinii P0P7
coincide cu starea memorat.
Dup iniializare, toate ieirile sunt n starea 1
intrri.

LOGIC

putnd fi folosite ca

229 _______________________________________Aplicaii cu microcontrolere de uz general

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

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 230


_Read
equ mSlnomem+mSlnosub+mSlread ;Citeste fara subadresa
;
ERROR
equ 0
;Eroare generala
mError
equ 1 SHL ERROR
;
MSTNOTREADY
equ 1
;Master \Ready
mMstNotReady
equ 1 SHL MSTNOTREADY
;
BYTE1EXPECTED
equ 2
;Asteapta primul bit
mByte1Expected equ 1 SHL BYTE1EXPECTED ;
INBLOCK2
equ 3
;E/R Bit 2
mInBlock2
equ 1 SHL INBLOCK2
;
;
*********************************************************
;
* Data / Definitii registre
*
;
*********************************************************
;
IICBit
Segment Bit
Rseg
IICBit
;
public IIC_Error
IIC_Error:
dbit
1
;Bit Eroare IIC
;
IICBitAdr
Segment Data BitAddressable
Rseg
IICBitAdr
;
IICCntrl:
ds
1
;Registru control bit-addesabil IIC
;
IICPar
Segment Data
Rseg
IICPar
;
SlaveAddress:
ds
1
;Adresa Slave + R/W
DataCount1:
ds
1
;Contor bloc 1
DataIndex1:
ds
1
;Adresa buffer transfer block 1
SubAddress:
ds
1
;Subadresa (daca exista)
DataCount2:
ds
1
;Block 2 Count
DataIndex2:
ds
1
;Block 2 Transfer Buffer Address
;
;
*****************************************************************
;
* Simboluri utilizte in proceduri
*
;
*
*
;
*
Slv
- Adresa slave
*
;
*
SlvW
- Adresa slave + Write
*
;
*
SlvR
- Adresa slave + Read
*
;
*
Sub
- Subadresa
*
;
*
D1[0..L-1]
- Sir date (DataIndex1)
*
;
*
L
- Lungime D1 (DataCount1)
*
;
*
D2[0..M-1]
- Sir date (DataIndex2)
*
;
*
M
- Lungime D2 (DataCount2)
*
;
*
S
- Start
*
;
*
P
- Stop
*
;
*
A
- Ack
*
;
*
N
- Nack
*
;
*
*
;
*****************************************************************
IICCode
Segment Code InBlock
Rseg
IICCode
;
; *******************************************************************************
; * IIC_Test_Device:
*
; *
PROCEDURE ( SlaveAddress ) BYTE/BIT/None ;
*
; *
*
; * Format IIC:S SlvW A P
*
; *
*
; *******************************************************************************
?IIC_Test_Device:
mov
DataCount1,#0
;\Data
mov
a,#_Test_Device
sjmp
IICInOutBlock1
;
; *******************************************************************************
; * IIC_Write_Memory:
*
; *
PROCEDURE ( SlaveAddress, Count, SourcePtr, SubAddr ) BYTE / BIT / None *
; *
*
; *
L
= Contor
*
; *
D1 = Pointer sursa
*
; *
Sub = Subadresa
*
; *
*
; * Format IIC:S SlvW A Sub
A D1[0]
A P { DelayNVMemory }
*
; *
S SlvW A Sub+1
A D1[1]
A P { DelayNVMemory }
*
; *
.................................................
*
; *
S SlvW A Sub+L-1 A D1[L-1] A P { DelayNVMemory }
*
; *
*
; *******************************************************************************
?IIC_Write_Memory:
mov
a,#_Write_Memory

231 _______________________________________Aplicaii cu microcontrolere de uz general


sjmp
IICInOutBlock1
;
; *******************************************************************************
; * IIC_Read_Sub:
*
; *
PROCEDURE ( SlaveAddress, Count, DestPtr, SubAddr ) BYTE / BIT / None ; *
; *
*
; *
M
= Contor
*
; *
D2 = Pointer destinatie
*
; *
Sub = Subadresa
*
; *
*
; * Format IIC:S SlvW A Sub A S SlvR A D2[0] A D2[1] A ..... A D2[L-1] N P
*
; *
*
; *******************************************************************************
?IIC_Read_Sub:
mov
a,#_Read_Sub
sjmp
IICInOutBlock2
;
; *******************************************************************************
; * IIC_Write_Sub:
*
; *
PROCEDURE ( SlaveAddress, Count, SourcePtr, SubAddr ) BYTE / BIT / None *
; *
*
; *
L
= Contor
*
; *
D1 = Pointer sursa
*
; *
Sub = Subadresa
*
; *
*
; * Format IIC:S SlvW A Sub A D1[0] A D1[1] A ..... A D1[L-1] A P
*
; *
*
; *******************************************************************************
?IIC_Write_Sub:
mov
a,#_Write_Sub
sjmp
IICInOutBlock1
;
; *******************************************************************************
; * IIC_Write_Sub_SWInc:
*
; *
PROCEDURE ( SlaveAddress, Count, SourcePtr, SubAddr ) BYTE / BIT / None *
; *
*
; *
L = Contor
*
; *
D1= Pointer sursa
*
; *
Sub = Subadresa
*
; *
*
; * Format IIC:S SlvW A Sub
A D1[0]
A P
*
; *
S SlvW A Sub+1
A D1[1]
A P
*
; *
..............................
*
; *
S SlvW A Sub+L-1 A D1[L-1] A P
*
; *
*
; *******************************************************************************
?IIC_Write_Sub_SWInc:
mov
a,#_Write_Sub_SWinc
sjmp
IICInOutBlock1
;
; *******************************************************************************
; * IIC_Write:
*
; *
PROCEDURE ( SlaveAddress, Count, SourcePtr ) BYTE / BIT / None ;
*
; *
*
; *
L = Contor
*
; *
D1= Pointer sursa
*
; *
*
; * Format IIC: S SlvW A D1[0] A D1[1] A ..... A D1[L-1] A P
*
; *
*
; *******************************************************************************
?IIC_Write:
mov
a,#_Write
sjmp
IICInOutBlock1
;
; *******************************************************************************
; * IIC_Read_Status:
*
; *
PROCEDURE ( SlaveAddress, DestPtr ) BYTE / BIT / None ;
*
; *
*
; *
M = 1
*
; *
D2= Pointer destinatie
*
; *
*
; * Format IIC:S SlvR A D2[0] N P
*
; *
*
; *******************************************************************************
?IIC_Read_Status:
mov
DataIndex1,DataCount1
mov
DataCount1,#1
; Urmeaza IIC_Read
;
; *******************************************************************************
; * IIC_Read:
*
; *
PROCEDURE ( SlaveAddress, Count, DestPtr ) BYTE / BIT / None ;
*
; *
*
; *
M = Contor
*
; *
D2= Pointer destinatie
*

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 232


; *
*
; * Format IIC: S SlvR A D2[0] A D2[1] A ..... A D2[M-1] N P
*
; *
*
; *******************************************************************************
?IIC_Read:
orl
SlaveAddress,#1 ;Set bit citire in adresa slave
mov
a,#_Read
sjmp
IICInOutBlock2
;
; *******************************************************************************
; * IIC_Write_Sub_Write:
*
; *
PROCEDURE ( SlaveAddress, Count1, SourcePtr1, SubAddr,
*
; *
Count2, SourcePtr2 ) BYTE / BIT / None ;
*
; *
*
; *
L
= Contor1
*
; *
D1 = Pointer sursa 1
*
; *
M
= Contor 2
*
; *
D2 = Pointer sursa 2
*
; *
Sub = Subadresa
*
; *
*
; * Format IIC: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
*
; *
*
; *******************************************************************************
?IIC_Write_Sub_Write:
mov
a,#_Write_Sub
sjmp
_IICInOut
; *******************************************************************************
; * IIC_Write_Sub_Read:
*
; *
PROCEDURE ( SlaveAddress, Count1, SourcePtr1, SubAddr,
*
; *
Count2, DestPtr2 ) BYTE / BIT / None ;
*
; *
*
; *
L
= Contor1
*
; *
D1 = Pointer sursa 1
*
; *
M
= Contor 2
*
; *
D2 = Pointer destinatie 2
*
; *
Sub = Subadresa
*
; *
*
; * Format IIC:S SlvW A Sub A D1[0] A D1[1] A ..... A D1[L-1] A S SlvR A
*
; *
D2[0] A D2[1] A ..... A D2[M-1] N P
*
; *
*
; *******************************************************************************
?IIC_Write_Sub_Read:
mov
a,#_Read_Sub
sjmp
_IICInOut
;
IICInOutBlock2: mov
DataCount2,DataCount1
mov
DataIndex2,DataIndex1
mov
DataCount1,#0
sjmp
_IICInOut
;
IICInOutBlock1: mov
DataCount2,#0
; Fall Into _IICInOut
;
;
************************************************************************
;
* _IICInOut
*
;
*
*
;
*
Intrari: definitie octet control din acumulator
*
;
*
*
;
*
- Bit 7 = 1
Citeste slave
*
;
*
= 0
Scrie slave
*
;
*
- Bit 6 = 1
Slave nu este EEPROM
*
;
*
= 0
Slave este EEPROM
*
;
*
- Bit 5 = 1
Emisie fara subadresa
*
;
*
= 0
Emisie cu subadresa
*
;
*
- Bit 4 = 1
Slave fara autoinc. subadresa
*
;
*
= 0
Slave cu autoinc. subadresa
*
;
*
- Bit 3..Bit 0 0
*
;
*
*
;
*
Iesire:
*
;
*
Stare daca transmisia a fost reusita:
*
;
*
A = 0, Carry = 0, IIC_Error = 0
*
;
*
daca au fost erori la transmisie
*
;
*
A <> 0, Carry = 1, IIC_Error = 1
*
;
*
*
;
************************************************************************
_IICInOut:
anl
IICCntrl,#7
;Stergere biti control
orl
IICCntrl,a
;Setare biti control
;
jb
IICCntrl.SLNOSUB,IICInOutKernel ;Jump daca \subadresa
jnb
IICCntrl.SLNOINCR,IICInOutKernel ;Jump daca autoinc. subadr.
;
;
*************************************************

233 _______________________________________Aplicaii cu microcontrolere de uz general


;
;

IICNextByte:

;
;
;
;
IICNVM_Delay1:
IICNVM_Delay2:
;
IICSkipDelay:

* Slave cu \autoinc. subadresa


*
*************************************************
mov
DataIndex2,DataCount1
;Foloseste DataIndex2 ca nr. local
mov
DataCount1,#1
;Seteaza contor bloc 1 la 1
acall
IICInOutKernel
;Emisie un octet
jnz
IICExit
;Eroare
inc
SubAddress
;Incrementare subadresa
inc
DataIndex1
;Incrementare DataIndex1
jb
IICCntrl.SLNOMEM,IICSkipDelay
;Omite daca \EEPROM
jb
IICCntrl.SLREAD,IICSkipDelay
;Omite daca \scriere
**********************************
* Intarziere dupa scriere EEPROM *
**********************************
mov
r1,#2*NVM_Write_Delay
mov
r0,#249
djnz
r0,IICNVM_Delay2
djnz
r1,IICNVM_Delay1
djnz
sjmp

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
;
;
***********************************************************

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 234


;
;
;
;
;
;
;
;
;
;

* Modulul este folosit pt setare viteza IIC de timer T1


*
***********************************************************
orl
tmod,#00100000b
;Set T1 AutoReload (Mode 2)
mov
th1,#IICTimerReload
;Setare registre T1
mov
tl1,#IICTimerReload
;
setb
tr1
;Start timer
ljmp
Init_Slave
*****************************************
* Vector intrerupere absolut SIO1
*
*****************************************
Cseg
At 002Bh
push
psw
mov
psw,#08h
ljmp
IIC_Int

;
IICIntCode

;Vector intrerupere SIO1


;selectare RegisterBank 1

Segment Code Unit


Rseg
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
;
;
*********************************************************

235 _______________________________________Aplicaii cu microcontrolere de uz general


;
;
;
;
;
SendSlvAdr:

;
;
;
;
;
;
;
;
;
;

;
;
;
;
;
;
;
;
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
*

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 236


;
;

;
;
;
;
;
;
;
;
;
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

;Decrementare contor date


;Slavare date rec.
;Actualizare pointer date

;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

237 _______________________________________Aplicaii cu microcontrolere de uz general


;
;
;
;
;
;
;
;

;
;
;
;
;
;
;
;
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

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 238


;
;
;
;
;
;
;
;
;

;
;
;
;
;
;
;
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

;Decrementare contor date


;Date
;Actualiyare pointer date

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

239 _______________________________________Aplicaii cu microcontrolere de uz general


SaveData:
;
;
;
;
;
;
;
;
Send_Slave:

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

2.9. Timere de vitez mare


n multe aplicaii este necesar implementarea de contoare soft. n
continuare se prezint doua rutine pentru implementarea a 8 contori soft.
Ambele funcii primesc un octet i, n funcie de starea biilor din acest octet
sau n funcie de starea anterioara a acestora, se incrementeaz sau nu
contorul aferent. Prima funcie 'count' implementeaz 8 contoare pe 32 de
bii care pot fi setate independent ca s numere cresctor sau descresctor,
pe frontul cresctor sau descresctor i cu marcarea depirii capacitii de
numrare i a modificrii valorii. A doua funcie implementeaz 8 contoare
care pot numra numai cresctor sau descresctor cu marcarea modificrii
valorii contorului.
/**************************************************************************\
** Titlu:
COUNT.H
**
** 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.
**
**
**
** Headerul funciilor referitoare la contoare soft.
**
**
**
** Ultima modificare la data: 10 februarie 1998
**
** Istoric:
**
\**************************************************************************/
#ifndef _COUNT_H_
#define _COUNT_H_
1
#include <typedef.h>

/* definitiile unor tipuri de date */

/* Definire stari contor */


#define C_ISNEW
0x01
/* valoare noua */
#define C_STATE
0x02
/* semnalului de intrare [C_ISUP/C_ISDOWN] */
#define C_ISUP
0x02
/* semnalul de intrare este 'sus' */
#define C_ISDOWN
0x00
/* semnalul de intrare este 'jos' */
#define C_OVERFLOW
0x04
/* depire contor */
#define C_COUNTDOWN 0x08
/* numr pe frontul descresctor */
#define C_RISINGEDGE 0x10
/* 1 = numr pe frontul cresctor */
/* Definirea structurii unui contor */
typedef struct
{
blword count;
/* valoarea contorului unsigned long int */
byte
flags;
/* starea contorului */
} TCOUNTER;
#define N_COUNTERS

/* numarul de contoare - multiplu de 8 */

/* definire alocare memorie pentru contoare */


extern xdata TCOUNTER counters[N_COUNTERS];
/* definirea funciilor implementate */
void reset_count(byte n);
/* resetarea unui contor */

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 240


void reset_counts(void);
void count(byte val);
void quick_count(byte val);

/* resetarea tuturor contoarelor */


/* implementeaza 8 contoare */
/* implementare 8 contoare rapizi */

#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;

// identificam fronturile cresctoare */


// identificam fronturile descresctoare */

for(i = 0; i < 8; i++)


{
pflags = &(counters[i].flags);
pcx
= &(counters[i].count);
if(*pflags & C_RISINGEDGE)
{
sd = sd << 1;
if(CY)
*pflags ^= IS_UP;
sc = sc << 1;
if(CY)

// numrm pe frontul cresctor


// n CY mark front descresctor
// marcam noua stare
// n CY mark front cresctor

241 _______________________________________Aplicaii cu microcontrolere de uz general


{
if(*pflags & C_COUNTDOWN)
(*pcx)--;
else
(*pcx)++;

// decrementm
// incrementm

*pflags |= C_ISNEW | (*pcx ? 0x00 : C_OVERFLOW);


*pflags |= IS_UP;
// marcm noua stare
}
}
else
{
sc = sc << 1;
if(CY)
*pflags |= IS_UP;
sd = sd << 1;
if(CY)
{
if(*pflags & C_COUNTDOWN)
(*pcx)--;
else
(*pcx)++;

// numrm pe frontul descresctor


// n CY mark front cresctor
// marcam noua stare
// n CY mark front descresctor

// decrementam
// incrementam

*pflags |= C_ISNEW | (*pcx ? 0x00 : C_OVERFLOW);


*pflags ^= IS_UP;
// marcam noua stare
}
}
}
}
/************************************************************************
Implementeaz 8 contoare soft. Valoarea newval este comparat bit cu
bit cu valoarea anterioar i dac a aprut un front cresctor se
incrementeaz contorul corespunztor.
*************************************************************************/
void quick_count(byte newval)
{
static data byte oldval;
data byte s,i;
// numara pe front crescator
/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*** EXEMPLU ***
front
------ ---|
|-------v____ ____^
oldval = 0000
0010
0010
0000
newval = 0000
0010
0000
0010
---------------xor
= 0000
0000
0010
0010 -> '1' = un front
newval = 0000
0010
0000
0010
---------------and
= 0000
0000
0000
0010 -> '1' = frontul cresctor
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
s = (oldval ^ newval) & newval;
// numr pe front descresctor
/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*** EXEMPLU ***
front
------ ---|
|-------v____ ____^
oldval = 0000
0010
0010
0000
newval = 0000
0010
0000
0010
---------------xor
= 0000
0000
0010
0010 -> '1' = un front
newval = 0000
0010
0010
0000
---------------and
= 0000
0000
0010
0000 -> '1' = frontul descresctor
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
// s = (oldval ^ newval) & oldval;
oldval = newval;
if(s)
for(i = 7; i; i++)
{
s = s << 1;
// rotim la stiga prin CY
if(CY)
// daca CY=1 => front
{
counters[i].count.Lw++;
// incrementam
// modificm flagurile aferente contorului.
counters[i].flags |= C_ISNEW;
/* se poate renuna la linia de deasupra daca se dorete viteza si mai mare */
}

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 242


}
}

O alt aplicaie interesant const n utilizarea modulelor PWM de la


circuitul 80C167. Acestea permit realizarea unui timer ultrarapid de 25 ns.
Principiul de lucru const n interceptarea valorii registrelor de numrare
PTx la fiecare eveniment extern. Deoarece numrtoarele PTx se pot seta s
numere chiar cu frecvena procesorului (40 MHz), diferena ntre dou valori
indic diferena de timp n incremente de 25 ns.
Atenie! Chiar dac ntreruperile externe rapide sunt eantionate la 25 ns,
arbitrarea i prelucrarea lor este fcut tot 100 ns, de aici rezultnd
o eroare de 04 incremente de 25 ns.

2.10. Sintez de frecven


Una din cele mai des ntlnite aplicaii ale microcontrolerelor este
ntlnit n domeniul receptoarelor radio sau TV. Chiar larga dezvoltare a
domeniului a impus dezvoltarea unor microcontrolere specializate care includ,
pe lng partea de logic i control, i elementele necesare prelucrrii
analogice a semnalului (mixere, AFI, oscilatorul local, divizoare analogice de
frecven etc.). Rolul microcontrolerului este de a controla numeric frecvena
oscilatorului local dintr-un receptor heterodin, principalele avantaje fiind
date de stabilitatea deosebit a acestuia, controlul numeric al frecvenei,
gabaritul redus al montajului etc.
Un microcontroler de uz general poate fi utilizat pentru controlul buclei
unui oscilator PLL numai mpreun cu un divizor analogic de frecven,
parametrii semnalului de radiofrecven (amplitudine, putere, frecven)
fcnd inadecvat utilizarea unor circuite digitale de divizare.
Principial, schema bloc a unui oscilator local cu sintez de frecven este
prezentat n figura 3.13.
Oscilator f 0 60100MHz Mixer,
AFFI
local
Divizor analogic
n=32, 64, 256
f 0 /n
Divizor
programabil (p)
f 0 /(nxp)<1MHz
Taste
Display

T0

PWM

Figura 2.13. Schema unui bloc de sintez de frecven

243 _______________________________________Aplicaii cu microcontrolere de uz general

Alegnd n mod convenabil factorii de divizare ai divizorului analogic (de


exemplu, pentru circuitul Sony MB506 acetia pot fi 32, 64 sau 256,
selectabili prin intermediul unor pini) i ai divizorului digital, se poate stabili
un ecart ntre dou frecvene consecutive chiar i de 0.1 Hz!
O alt posibilitate de realizare a unui tuner cu sintez de frecven
const n utilizarea unui circuit specializat, de exemplu TSA5055, circuit care
se interfaeaz cu microcontrolerul prin intermediul unei magistrale I 2 C.
Aceste circuite sunt utilizate n special pentru tunere TV, controlul
frecvenei fiind asigurat de procesorul receptorului TV. Schema electric de
principiu poate fi gsit n catalogul corespunztor al firmei Philips.
Un program pentru utilizarea circuitului, precum i al tastaturii i
display-ului pentru control, este prezentat n cele ce urmeaz.
/**************************************************************************\
** Descriere:
Rutin comand IIC TSA 5055
**
**
**
** 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:
**
**
putTSA
**
**
getiic
**
**
**
** Ultima modificare la data: 23 nov 1998
**
** Istoric:
**
**
**
** Observatii:
**
**
foloseste rutine LCD
**
\**************************************************************************/
#include <reg552.h> /* SFR 80C552
*/
#include <stdio.h>
/* standard I/O .h-file
*/
#include <ctype.h>
/* standard I/O .h-file
*/
#include <stdlib.h> /* standard functions
*/
#include <string.h> /* string functions
*/
#include <porturi.h> /* porturi I/O .h-file
*/
#include <lcd.h>
/* subrutine LCD .h-file
*/
/*scrie pe I 2 C,n componenta sel, la adresa adr, nr octei, variabila s*/
void putTSA(unsigned char sel,char nr,char *s);
/*citete pe I 2 C,din sel, de la adresa adr, nr octei, n variabila s*/
void getiic(char sel,char adr,char nr,char *s);
void main(void)
{
bit afis;
unsigned char i,tasta;
int divizor;
float frec,afisare;
char asir[10];
SCL = SDA = 1;
S1CON = 0xc1;

/* 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,"
");

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 244


putLCD(1,0,asir);
cmdLCD(0xd4);
cmdLCD(0x0d);
afis = 0;
}
else
{
if(isdigit(tasta=kbds()))
/* setare factor */
{
putLCD(3,0,"
"); asir[0] = tasta;
chrLCD(3,0,tasta); i = 1;
while(i<8)
{
if((isdigit(tasta=kbds()))&&(i<7))
{ asir[i] = tasta; chrLCD(3,i,tasta); i++;}
if((tasta=='A')&&(i<7))
{
asir[i] = '.';
chrLCD(3,i,0x2e);
i++;
}
if(tasta=='#')
{
asir[i] = 0; frec = atof(asir);
if((frec>44.9)&&(frec<860.1))
{
if(frec<170) asir[1]=0x60;
else if(frec<450)
asir[1]=0x50;
else
asir[1]=0x30;
asir[0]=0x8e;
putTSA(1,2,&asir[0]);
divizor= (int)((frec*1000+38900.0)/62.5+0.5);
afisare=((float)((int)((frec*1000)/62.5+0.5))*62.5)/1000;
afis = 1;
break;
}
}
if(tasta=='*')
{
tasta=kbds();
afis = 1;
putLCD(3,0,"
");
break;
}
}
}
if(tasta=='*')
{
putLCD(3,0,"
");
cmdLCD(0xd4);
}
}
}
}
void putTSA(unsigned char sel,char nr,char *s)
{
bit gata = 0;
unsigned char i;
STA = 1; i = 0;
while(!gata)
{
while(!SI);
switch(S1STA)
{
case 0:
gata = 1;
S1CON = 0xd5;
break;
case 0x08:
S1DAT = 0xc0 | (sel << 1);
S1CON = 0xc5;
break;
case 0x18:
S1DAT = *(s+i);
i++;
S1CON = 0xc5;
break;
case 0x28:
if(i<nr)
{
S1DAT = *(s+i);

245 _______________________________________Aplicaii cu microcontrolere de uz general


i++;
S1CON = 0xc5;
}
else
{
gata = 1;
S1CON = 0xd5;
}
break;
}
}
}
void getiic(char sel,char adr,char nr,char *s)
{
bit gata = 0;
STA = 1;
while(!gata)
{
while(!SI);
switch(S1STA)
{
case 0:
gata = 1;
S1CON = 0xd5;
break;
case 0x08:
S1DAT = 0xa0 | (sel << 2);
S1CON = 0xc5;
break;
case 0x10:
S1DAT = 0xa1 | (sel << 2);
S1CON = 0xc5;
break;
case 0x18:
S1DAT = adr;
S1CON = 0xc5;
break;
case 0x28:
S1CON = 0xe5;
break;
case 0x40:
if(nr==1) S1CON = 0xc1;
else
S1CON = 0xc5;
break;
case 0x50:
if(nr>2)
{
nr--;
*(s+nr) = S1DAT;
S1CON = 0xc5;
}
else
{
*(s+1) = S1DAT;
S1CON = 0xc1;
}
break;
case 0x58:
*s = S1DAT;
S1CON = 0xd5;
gata = 1;
break;
}
}
}

2.11. Sisteme pentru controlul poziiei


Determinarea poziiei unui obiect poate fi uneori o problem deosebit de
complicat. Bineneles, fr a avea pretenia construciei unui robot
industrial, vor fi prezentate unele principii i metode practice de determinare
a poziiei utilizabile pentru msurarea unor poziii unghiulare sau liniare.
Echipamentele industriale utilizate pentru msurarea poziiei au cptat
o mare dezvoltare n urma dezvoltrii impetuoase a tehnicii de calcul.

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 246

Msurarea poziiei, unghiular sau liniar, este esenial pentru imprimante,


roboi, automatizri industriale, maini de prelucrat cu comand numeric etc.
Multiplele utilizri au fcut ca traductoarele de poziie, dispozitive care
convertesc poziia ntr-o valoare numeric, s fie deosebit de numeroase.
ntruct scopul lucrrii nu este, de exemplu, prezentarea unui strung cu
comand numeric, vor fi descrise doar dou tipuri de traductoare mai larg
folosite: resolverul i traductorul incremental.
Resolverul este un traductor de poziie unghiular absolut care
funcioneaz pe principiul unui transformator rotativ. Cel mai simplu resolver
este alctuit dintr-un stator cu dou nfurri defazate la 90, alimentat cu
dou tensiuni alternative de excitaie defazate la 90, precum i un rotor care
culege o tensiune alternativ defazat fa de tensiunile de excitaie funcie
de poziia unghiular a rotorului fa de stator.
Precizia de msurare minim asigurat de un resolver este de 12 bii
(2.63), dar folosind scheme de msurare n bucl nchis poate ajunge la 16
bii (9.88) sau chiar la 20 bii (0.62).
Cele dou scheme de msurare, n bucl deschis i nchis, sunt
prezentate n Figura 2.14.
sin t

sin(t+) Formator
TTL

stop
Numrtor
12 bii

cos t

RESOLVER

Formator
TTL

start

a) Msurarea n bucl deschis


sin(t+)

sin

MDAC
cos

sint

cos(t+)

cos

MDAC

sin(-)

VCO

sin
ROM

d
dt

Numrtor
sus/jos 16 bii

b) Msurarea n bucl nchis

Figura 2.14. Principii de msurare a poziiei resolverului

Funcionarea schemei n bucl deschis este relativ simpl, constnd


practic ntr-un cronometru care msoar defazajul ntre un semnal de
referin (n acest caz cos t) i semnalul produs de resolver.

247 _______________________________________Aplicaii cu microcontrolere de uz general

Montajul n bucl nchis este mai complex, funcionarea sa bazndu-se


pe urmrirea unghiului , astfel nct acesta s fie egal cu unghiul . Cu
excepia avantajelor date de stabilitatea i precizia ridicat, acest principiu de
msurare ofer i un semnal direct proporional cu viteza de rotaie a
resolverului, similar cu semnalul produs de un tahogenerator. Bucla care
asigur performanele acestui convertor este format din dou convertoare
numeric/analogice cu multiplicare (MDAC) care produc tensiunile sincos,
respectiv cossin, circuitul de scdere care produce tensiunea sincoscossin=sin(-), oscilatorul comandat n tensiune (VCO), numrtorul
reversibil i memoriile pentru sin i cos. Scopul buclei este de a asigura
egalitatea ntre unghiul fizic i unghiul virtual . ntrzierile produse n
urmrirea de ctre unghiul a unghiului , direct proporionale cu viteza de
rotaie a resolverului, sunt reliefate de frecvena VCO; aceast frecven este
transformat de integrator ntr-un semnal continuu care ofer informaii
despre viteza de rotaie a resolverului.
Dac prima schem este destul de uor de realizat (trebuie proiectate cu
atenie formatoarele TTL care nu trebuie s produc defazri mai mari de 50
ns), a doua schem bloc este mult mai dificil de transpus n practic. Totui,
exist circuite monolitice sau hibride care funcioneaz pe acelai principiu,
de exemplu familia AD 2S8x produs de firma Analog Devices.
n ceea ce privete traductoarele incrementale, cu toate c pot avea o
precizie extrem de mare de pn la 32 de bii (adic 0.0003), fiind de tip
relativ necesit existena unei referine fa de care se msoar aceast
poziie. De fapt, aceast referin poate consta n cazul traductoarelor
unghiulare ntr-un simplu contact acionat de o cam.
Traductoarele incrementale sunt dispozitive profesionale, la fel de greu
de procurat de amatori ca i resolverele. Totui, exist o soluie extrem de
economic aflat la ndemn oricrui amator: mouse-ul. n aceast situaie
singura problem mai dificil rmnnd conectarea mecanic ntre
mecanismul de controlat i mecanismul mouse-ului. Bineneles, semnalele
electrice de la mouse se conecteaz la microcontroler la o interfa serial,
protocolul Microsoft serial mouse fiind prezentat n tabelul 3.25.
Tabelul 2.27
Octet
1
2
3
4

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

Interfaa serial trebuie setat la urmtorii parametri: 1200 bii/secund,


7 bii de date, fr paritate, un bit de stop. Semnificaia biilor din tabel este:

primul bit este folosit pentru sincronizare;

LB = buton stnga BYTE1 and 0x20;


RB = buton dreapta BYTE1 and 0x10;
MB = buton mijloc BYTE4 and 0x20;
deplasare X = (BYTE1 and 0x03) << 6 + BYTE2;

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 248

deplasare Y = (BYTE1 and 0x0c) << 4 + BYTE3.


Pn acum, traductoarele de poziie au fost folosite numai pentru
msurarea unor unghiuri. Deplasrile liniare sunt msurabile prin cuplarea la
axul traductorului unghiular a unui disc. Astfel, deplasarea liniar a discului
este transformat n deplasare unghiular a traductorului.

249 _______________________________________Aplicaii cu microcontrolere de uz general

3. Accesorii pentru sistemele cu microcontrolere


n afar de microcontroler i circuitele sale de suport necesare (memorii
externe, display, tastatur, diferite periferice I 2 C etc.), un produs mai poate
avea nevoie i de alte dispozitive: surse de alimentare, interfee seriale
particularizate, decodificatoare, numrtoare suplimentare etc.

3.1. Surse de alimentare


n general, sursele de alimentare utilizate pentru montajele electronice
cu microcontrolere necesit o tensiune continu de alimentare de 5V / 1W i,
eventual, funcie de prezena unor circuite analogice, a altor tensiuni pentru
alimentarea acestora (de regul 5V, 12V, 15V etc.).
Sursele de alimentare se pot clasifica n dou mari categorii:
surse liniare, la care tensiunea de ieire este obinut din tensiunea de
intrare pe baza unui circuit liniar (filtru, stabilizator cu reacie negativ
etc.);
surse n comutaie, la care tensiunea de ieire este obinut prin
prelucrarea unei tensiuni alternative cu o frecven de pn la cteva sute
de kiloheri, tensiune alternativ obinut din tensiunea de intrare.
Cu toate c sursele n comutaie sunt net superioare surselor liniare din
toate punctele de vedere, acestea din urm se mai folosesc pentru montaje
nepretenioase, mai ales datorit simplitii lor.
3.1.1
Surse liniare
Schema bloc general a unei surse liniare este prezentat n figura 4.1.

VIN

Filtru

Surs
referin

Regulator
Filtru

VOUT

Figura 3.1. Surs liniar de tensiune

Caracteristicile generale ale surselor liniare (stabilizarea n raport cu


variaia tensiunii de intrare sau a curentului de sarcin, factorul de rejecie a
ondulaiei tensiunii de intrare, stabilitatea funcie de temperatur etc.) depind
de elementele schemei i, pentru obinerea unor parametri calitativi, este
necesar o proiectare laborioas. Un alt dezavantaj al surselor liniare este
randamentul sczut, precum i faptul c nu se pot obine dect tensiuni de
aceeai polaritate i mai mici cu tensiunea de intrare.
Din punct de vedere practic, sursele liniare sunt fezabile pentru montaje
nepretenioase, utilizarea surselor liniare monolitice din seria LM78xx, LM3xx
etc. asigurnd o simplitate deosebit.
Cteva montaje pentru obinerea tensiunii de alimentare de 5V sunt
prezentate n figura 4.2.

Accesorii pentru sistemele cu microcontrolere ___________________________________ 250


LM7805
200

BD135
5V
1A

6...10V

LM323

IN OUT
8...10V

IN OUT
5V
1A

GND

8...10V

5V
3A

GND

DZ5V6

Figura 3.2. Surse liniare de 5V.

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

Figura 3.3. Surse de alimentare n comutaie

O alt problem care poate fi dificil de rezolvat n situaia dispozitivelor


staionare (alimentate la reeaua 220V/50Hz) care au impus un gabarit redus
l constituie transformatorul cobortor, de la 220V la 810V. Este posibil
utilizarea unor divizoare rezistive sau capacitive care, bineneles, nu mai
ofer sigurana oferit de separarea de reea prin intermediul
transformatorului.
O astfel de surs, construit n jurul circuitului MAX610, este prezentat
n figura 4.4.

251 _______________________________________Aplicaii cu microcontrolere de uz general


R1
110220V
5060Hz

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

Figura 3.4. Surs liniar la 220V/50Hz

Componentele pasive C1, C2, R1 i R2 se determin conform cu relaiile


urmtoare:
I OUT
C1 =
;
4 2 (VIN VOUT ) fIN
Pentru descrcarea C1 se recomand montarea n paralel a unei
rezistene de 1M.
C2=47 F;
R1=100 (pentru protecia C2);
P d (R1)[mW]=2.7 C1 2 [ F] R1[ ];

R2 =

0.6
ILIMIT

3.2. Interfee seriale


Interfaa serial este o metod, aproape universal, utilizat pentru
schimbul de date i informaii ntre microcalculatoare. Chiar dac rata de
transmisie a datelor nu este impresionant, simplitatea componentelor
hardware i software necesare, au fcut totui din interfaa serial procedura
de baz pentru interconectare. Astzi, antica RS-232 a fost ameliorat n
sensul vitezei de transmisie, detectrii i corectrii erorilor, creterea distanei
de transmisie, majorarea numrului de circuite care sunt conectate la aceeai
linie de transmisie etc.
3.2.1
Detectarea automat a vitezei de transmisie seriale
Pentru detectarea automat a vitezei de comunicaie seriala se folosete
primul caracter recepionat. Algoritmul prezentat n AN447 (Philips) msoar
timpul necesar transmiterii unui caracter n format 8bii, fr paritate, 1 bit
de stop. Deoarece caracterele ASCII normale au bitul 7 zero i deoarece
transmisia seriala ncepe cu bitul 0 i se termin cu bitul 7, se poate
determina nceputul bitului de stop.
Algoritmul de mai jos ateapt bitul de start (un front cztor) pe pinul
de recepie serial i pornete timerul T0. La fiecare front cresctor se citete
valoarea timerului T0 i se memoreaz. Cnd apare ntreruperea de depire

Accesorii pentru sistemele cu microcontrolere ___________________________________ 252

(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 =

numrul de bii vizibili este 9 i numrul de bii de recunoscut este 5


pentru 8-N-1.
1
durata unui octet =
numarul de biti vizibili
Viteza de transmitere
frecventa oscilatorului
durata unui ciclu masina =
12
/**************************************************************************\
** Descriere:
Detectarea automat a vitezei de transmisie
**
**
**
** 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:
**
**
**
\**************************************************************************/
$Mod552

253 _______________________________________Aplicaii cu microcontrolere de uz general


RX
CharH
CharL
BRate:
Display

BIT
DATA
DATA
DATA
EQU

P3.0
30h
31h
32h
P4

;
ORG 8000h
START:
MOV
SJMP

Vectori ntreruperi i reset


ACALL
AutoBaud
Display,Brate
START

;Pin recepie.
;Octet superior rezultat timer.
;Octet superior rezultat timer.
;Valoare final vitez de transmisie.
;Port afiare pentru depanare.

;determinare vitez transmisie


;afiare vitez

;
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

;Initializare resultat timer.

AB0:

JB
SETB

RX,AB0
TR0

;Ateptare bit de start.


;Start timer.

AB1:

JB
JNB
MOV
MOV

TF0,AB3
RX,AB1
CharH,TH0
CharL,TL0

;Verificare overflow timer.


;Verificare front cresctor pe RxD.
;Capturare valoare timer.
;

AB2:

JB
JB
SJMP

TF0,AB3
RX,AB2
AB1

;Verificare overflow timer.


;Verificare front descresctor pe RxD.
;Repetare msurare.

AB3:

CLR
CLR

TR0
TF0

;Depire timp maxim de msurare; verificare resultat


;Oprire timer i tergere indicatori.

MOV

BRate,#19

;Setare tabel pointeri.

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

;Tabel comparare pentru valori timer. Ordinea: LSB, MSB.


;Valorile sunt pentru 12 Mhz.
CmpTable:
DB
40h,00h
;0 valoare prea mic.
DB
80h,00h
;1 - 38,400 baud.
DB
00h,01h
;2 - 19,200 baud.
DB
00h,02h
;3 - 9,600 baud.
DB
00h,04h
;4 - 4,800 baud.
DB
00h,08h
;5 - 2,400 baud.
DB
00h,10h
;6 - 1,200 baud.
DB
00h,20h
;7 600 baud.
DB
00h,40h
;8 300 baud.
DB
00h,80h
;9 valoare prea mare.

Accesorii pentru sistemele cu microcontrolere ___________________________________ 254

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 **

255 _______________________________________Aplicaii cu microcontrolere de uz general


** care s-a adugat la sfrit HIGH(CRC) si LOW(CRC) trebuie sa fie zero.
**
** Copyright (C) 1998 PRATCO s.r.l. All rights reserved
**
\*****************************************************************************/
#pragma DEBUG OBJECTEXTEND CODE SYMBOLS
#include <typedef.h>
/* TABEL CRC-CCITT x^16 + x^12 + x^5 + 1 */
code unsigned int crctab[256] =
/*00*/ 0x0000, 0x1021, 0x2042,
/*08*/ 0x8108, 0x9129, 0xA14A,
/*10*/ 0x1231, 0x0210, 0x3273,
/*18*/ 0x9339, 0x8318, 0xB37B,
/*20*/ 0x2462, 0x3443, 0x0420,
/*28*/ 0xA56A, 0xB54B, 0x8528,
/*30*/ 0x3653, 0x2672, 0x1611,
/*38*/ 0xB75B, 0xA77A, 0x9719,
/*40*/ 0x48C4, 0x58E5, 0x6886,
/*48*/ 0xC9CC, 0xD9ED, 0xE98E,
/*50*/ 0x5AF5, 0x4AD4, 0x7AB7,
/*58*/ 0xDBFD, 0xCBDC, 0xFBBF,
/*60*/ 0x6CA6, 0x7C87, 0x4CE4,
/*68*/ 0xEDAE, 0xFD8F, 0xCDEC,
/*70*/ 0x7E97, 0x6EB6, 0x5ED5,
/*78*/ 0xFF9F, 0xEFBE, 0xDFDD,
/*80*/ 0x9188, 0x81A9, 0xB1CA,
/*88*/ 0x1080, 0x00A1, 0x30C2,
/*90*/ 0x83B9, 0x9398, 0xA3FB,
/*98*/ 0x02B1, 0x1290, 0x22F3,
/*A0*/ 0xB5EA, 0xA5CB, 0x95A8,
/*A8*/ 0x34E2, 0x24C3, 0x14A0,
/*B0*/ 0xA7DB, 0xB7FA, 0x8799,
/*B8*/ 0x26D3, 0x36F2, 0x0691,
/*C0*/ 0xD94C, 0xC96D, 0xF90E,
/*C8*/ 0x5844, 0x4865, 0x7806,
/*D0*/ 0xCB7D, 0xDB5C, 0xEB3F,
/*D8*/ 0x4A75, 0x5A54, 0x6A37,
/*E0*/ 0xFD2E, 0xED0F, 0xDD6C,
/*E8*/ 0x7C26, 0x6C07, 0x5C64,
/*F0*/ 0xEF1F, 0xFF3E, 0xCF5D,
/*F8*/ 0x6E17, 0x7E36, 0x4E55,
};

{
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

Accesorii pentru sistemele cu microcontrolere ___________________________________ 256

autocorecia erorilor. Schema electric de principiu construit cu ajutorul a


cte unui circuit CD4046 este prezentat n figura 4.5.
1
2
13

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

Figura 3.5. Interfa pentru transmisie cu cureni purttori

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

Cu excepia acestor tipuri de interfee, devenite deja clasice, n ultimii


ani a aprut un protocol pentru interfee care opereaz n medii cu puternice
perturbaii electrice asigurnd o protecie ridicat mpotriva erorilor, avnd o
arhitectur deschis, un mediu de transmisie cu proprieti definite de
utilizator, ntr-un cuvnt interfaa CAN (Controller Area Network). CAN este
un sistem de magistral serial performant destinat controlului distribuit,
destinat iniial utilizrii pentru autovehicule. Interfaa a fost creat de firma
Robert Bosch GmbH la sfritul anilor 1980.
Dezvoltarea CAN a fost impus de implementarea unui numr din ce n
ce mai mare de dispozitive electronice n autovehiculele moderne, cum ar fi:
sisteme de control ale motorului, suspensii active, ABS, cutii de viteze
automate, controlul luminilor, aer condiionat, air-baguri, nchidere
centralizat etc. Toate acestea semnific nu numai o siguran i un confort

257 _______________________________________Aplicaii cu microcontrolere de uz general

sporit pentru ofer, ci i o reducere a consumului de carburant i a emisiilor


de noxe.
mbuntirea comportamentului autovehiculelor a fcut necesar ca
diferitele sisteme de control, inclusiv senzorii lor, s schimbe informaii.
Schimbul de date era rezolvat prin interconectarea punct la punct a
sistemelor. ntre timp, necesitile au crescut aa de mult astfel nct era
necesar un cablaj electric de mai muli kilometri i o mulime de conectoare.
Toat aceast structur de trasee electrice prin autovehicul a creat probleme
n ceea ce privete productivitatea, costul de producie i nu n ultimul rnd
fiabilitatea sistemului.
Soluia acestei probleme a fost interconectarea sistemelor de control prin
intermediul unei interfee seriale care, bineneles, avea caracteristici
specifice datorit utilizrii ntr-un autovehicul. Simplificarea cablajului electric
impune, totui, adugarea de dispozitive specifice la fiecare sistem din
autovehicul, dispozitive care cunosc regulile i protocolul de transmitere i
recepionare a datelor pe interfaa serial.
Interfaa CAN este larg folosit pentru autovehicule i automatizri
industriale. Alte utilizri comune ale CAN sunt echipamente electronice pentru
trenuri, tehnic medical, automatizri casnice, sisteme de control securitate,
mediu etc. pentru cldiri etc. n anul 1998 erau estimai circa 20 milioane de
utilizatori CAN urmnd ca dup anul 2000 numrul acestora s se ridice la
peste 140 milioane.
Cu excepia interfeei CAN dezvoltat de Bosch i-au dezvoltat propria
interfa i alte companii auto: Volkswagen (A-BUS), Peugeot i Renault (VAN
Vehicle Area Network), Chrysler, General Motors i Ford (J1850) dar, de
departe, dominaia pe piaa european aparine CAN.
CAN este standardizat internaional ISO (International Standardization
Organization) i SAE (Society of Automotive Engineers).
n concluzie, CAN este o magistral multi-master, cu o structur liniar,
deschis, cu noduri egale. Protocolul nu limiteaz numrul de noduri. Numrul
de noduri poate fi schimbat dinamic, fr a deranja funcionarea celorlalte
noduri.
a)

Concepte de baz CAN

Conform cu modelul ISO-OSI, protocolul CAN are mai multe nivele:


Nivel aplicaie.
Nivel obiect:
 filtrare mesaje;
 manipulare mesaje i stri.
Nivel transfer:
 limitare erori;
 detectare i semnalare erori;
 validare mesaje;
 confirmare mesaje;

Accesorii pentru sistemele cu microcontrolere ___________________________________ 258





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

Mesaje informaia este transmis pe magistral ntr-un format fix cu


numr diferit (dar limitat) de bii. Cnd magistrala este liber, orice dispozitiv
conectat la magistral poate iniia transmiterea unui mesaj.
Sincronizare transferul datelor este corect dac tolerana oscilatorului
de serializare a datelor este mai bun de 1.58%.
Traseul informaiilor n sistemele CAN, dispozitivele nu folosesc
informaia referitoare la configuraia sistemului (de exemplu adresele
dispozitivelor). Aceasta are cteva consecine importante:
- Flexibilitatea sistemului reelei CAN i pot fi adugate noi noduri fr a fi
necesare modificri ale programelor sau echipamentelor nodurilor i
nivelului de aplicaie.
- Rutarea informaiilor coninutul unui mesaj este stabilit de un
identificator (Identifier). Acesta nu arat destinaia mesajului, dar descrie
scopul datelor, orice nod din reea fiind apt s decid prin filtrarea
mesajelor (Message Filtering) oricnd informaia i este util sau nu.
- Recepia multipl ca o consecin a filtrrii mesajelor, orice nod din reea
poate recepiona i folosi simultan acelai mesaj.
- Consistena datelor ntr-o reea CAN este asigurat primirea unui mesaj
fie de mai multe noduri, fie de nici unul. Consistena datelor este realizat
de conceptul de recepie multipl i de manipularea erorilor.
- Viteza de transmisie poate fi diferit n sisteme CAN diferite. Totui,
ntr-un sistem aceast vitez este fix.
- Prioriti identificatorul definete o prioritate static a mesajului pe
durata accesului magistralei.
- Cererea de date prin transmiterea unei cereri de date (Remote Frame),
un nod poate cere date (Data Frame) altui nod. Att Data Frame ct i
Remote Frame sunt definite de acelai identificator.
- Multimaster dac magistrala este liber, orice nod poate iniia
transmiterea unui mesaj.
- Arbitrarea - dac exist simultan mai multe cereri de acces la magistral,
arbitrarea este ctigat de mesajul cel mai prioritar pe baza

259 _______________________________________Aplicaii cu microcontrolere de uz general

identificatorului. Mecanismul de arbitrare asigur ca n nici un moment nici


o informaie s nu fie pierdut.
Securitate pentru a permite o siguran extrem a transferului de date,
n fiecare dispozitiv CAN sunt luate msuri deosebite pentru detectarea
semnalarea i autocontrolul erorilor. Detectarea erorilor const n
urmtoarele proceduri: monitorizarea magistralei (emitorul compar bitul
transmis cu bitul detectat pe magistral), coduri CRC, controlul cadrelor de
mesaje i biii de adaus (pentru a garanta transmiterea datelor cu cod
NRZ, dac ntr-un mesaj sunt mai mult de 5 bii identici, se va insera
automat un bit complementar n fluxul de date).
Controlul cu bit de adaus este asigurat pentru cadrele, cmpurile sau biii:
start cadru, arbitrare, control, date i secvena CRC. Celelalte componente
ale mesajului au o form fix i nu suport acest tip de control.
Detectarea erorilor asigur o probabilitate de nedetectare a mesajelor
corupte mai mic de (rata erorilor mesajului) 4.710 -11 ;
Semnalarea erorilor - este realizat de orice nod care le detecteaz.
Mesajul eronat este eliminat i va fi retransmis automat.
Limitarea erorilor este nfptuit de nodurile CAN care pot face diferena
ntre perturbaiile aleatoare i defectele permanente ale liniei sau
circuitelor. Nodurile defecte sunt decuplate automat.
Legturi interfaa serial CAN const ntr-o magistral la care pot fi
conectate un numr nelimitat de dispozitive. Practic, numrul total de
noduri este limitat de ntrzieri i ncrcarea liniei.
Valorile magistralei constau n dou valori logice complementare
denumite dominant i recesiv. Pe durata unor transmisii simultane a
unui bit recesiv i a unuia dominant, starea magistralei va fi dominant.
Confirmarea mesajelor toate receptoarele verific consistena mesajului
confirmnd un mesaj valid i indicnd un mesaj eronat.
Modul inactiv/atenionare pentru reducerea consumului, un dispozitiv
CAN poate intra n mod inactiv deconectnd amplificatoarele de linie.
Modul inactiv este ntrerupt printr-o atenionare: orice activitate pe
magistral sau alte condiii interne ale circuitului.
c)

Tipuri de cadre

Transferul mesajelor este efectuat i controlat de cinci tipuri diferite de


cadre:
Cadru de date (Data Frame) care transport datele de la emitor la
receptor;
Cadru cerere de date (Remote Frame) este transmis de un nod care
solicit transmiterea unui cadru de date cu acelai identificator;
Cadru eroare (Error Frame) este transmis de orice dispozitiv care a
detectat o eroare;
Cadru suprancrcare (Overload Frame) este folosit pentru asigurarea
unei ntrzieri suplimentare ntre cadrele de date sau cerere de date.

Accesorii pentru sistemele cu microcontrolere ___________________________________ 260

Cadrele de date sau cerere de date sunt separate de celelalte cadre


printr-un spaiu inter-cadre (Interframe Space).
Cele cinci tipuri de cadre standard sunt prezentate n figura 4.6.
Semnificaia cmpurilor, biilor i a altor termeni din figur este
urmtoarea:
Start cadru marcheaz nceputul unui cadru de date sau cerere de date.
Este folosit de toate nodurile pentru sincronizare.
Cmpul de arbitrare const n identificator (11 bii, din care biii 104 nu
trebuie s fie toi regresivi) i bitul RTR (este dominant pentru cadrele de
date, respectiv recesiv pentru cadrele cerere de date). Pentru a fi pstrat
compatibilitatea cu standardul CAN standard, standardul CAN extins 29 bii
are identificatorul mprit n dou: identificator de baz i identificator
extins ntre care se insereaz biii SRR (un bit recesiv care este pe poziia
RTR; este folosit pentru a prevala cadrul standard n faa unui cadru extins
n cazul unei coliziuni) i IDE (folosit pentru deosebirea dintre un cadru
extins i un cadru standard, situaie n care este suprapus cu bitul r1

rezervat al cmpului de control).


Cmpul de control este format din 6 bii: r1 i r0 sunt rezervai i sunt
transmii dominani (n cazul cadrului extins, r1 devine IDE i este
transmis recesiv) i un cmp de 4 bii DLC0DLC3 care definesc numrul
de octei al mesajului din cmpul de date (Data Field). Considernd DLC0

ca cel mai puin semnificativ bit i identificnd bitul recesiv ca 0 LOGIC ,


numrul de octei ai Data Field se determin prin convertirea n zecimal a
cmpului. Valoarea maxim a cmpului este opt.
Cmpul de date conine cei pn la opt octei de informaie.
Cmpul CRC conine o secven CRC i un delimitator. Secvena CRC este
determinat pentru secvena de bii ncepnd cu bitul de start.
Delimitatorul const ntr-un bit recesiv.
Cmpul de confirmare este format din 2 bii: ACK SLOT i un delimitator.
Toate dispozitivele care au recepionat o secven CRC corect marcheaz
aceasta prin nlocuirea bitului recesiv ACK SLOT trimis de emitor

printr-un bit dominant.


Cadrele de date sau cerere de date sunt terminate cu un cmp sfrit
cadru care conine 7 bii recesivi.
Indicatorul eroare poate fi de dou tipuri: activ (format din 6 bii
dominani) sau pasiv (format din 6 bii recesivi numai dac vreun bit nu a
fost suprascris de un alt nod). Indicatorul de eroare activ contrazice regula
de adugare a biilor (maxim 6 bii consecutivi de acelai fel), regul
aplicat de la start cadru pn la delimitatorul CRC sau stric structura
cmpurilor ACK sau sfrit. n consecin, toate nodurile detecteaz
eroarea i fiecare n parte transmite un cadru corespunztor. Astfel,
secvena de bii dominani poate fi afectat prin suprapunerea mai multor

261 _______________________________________Aplicaii cu microcontrolere de uz general

indicatori de eroare transmii de nodurile individuale. Un nod pasiv care


detecteaz o eroare va transmite un indicator pasiv de eroare. Nodul pasiv
ateapt 6 bii consecutivi de aceeai polaritate ncepnd cu startul
indicatorului de eroare. Delimitatorul de eroare const ntr-o secven de 8
bii recesivi. Dup transmiterea unui indicator de eroare, fiecare nod emite
bii recesivi i monitorizeaz linia pn cnd detecteaz un bit recesiv.
Dup aceasta mai emite 7 bii recesivi.
Spaiu
intermediar

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

SPAIU INTER-CADRE RECEPTOR

Pauz

Cadru

Magistral
inactiv

SPAIU INTER-CADRE EMITOR

Pauz

Cadru

Suspendare
transmisie

Cadru

Magistral
inactiv

Figura 3.6. Tipurile de cadre de mesaje ale CAN

Indicatorul suprancrcare este transmis n cteva cazuri particulare:


- receptoare care necesit o ntrziere a noului cadru de date sau cerere
de date;
- detectarea unui bit dominant pe prima sau a doua poziie a unei pauze;

Accesorii pentru sistemele cu microcontrolere ___________________________________ 262

detectarea unui bit dominant pe ultima poziie a unui delimitator de


eroare sau suprancrcare.
Indicatorul este format din 6 bii dominani. Prezena sa distruge forma
cmpului pauz toate nodurile detectnd o condiie de suprancrcare i
iniiind o transmisie a indicatorului suprancrcare. Dac n cmpul pauz
este detectat un bit dominant pe poziia a treia, acesta este considerat ca
start cadru.
Delimitatorul de suprancrcare este format din opt bii, ca delimitatorul de
eroare. Dup transmiterea indicatorului, nodurile monitorizeaz magistrala
pn cnd este detectat o trecere la dominantrecesiv. Dup aceasta,
fiecare nod iniiaz transmiterea simultan a 7 bii recesivi suplimentari.
Spaiile inter-cadre sunt folosite pentru separarea cadrelor de date i
cerere de date de cadrele urmtoare. Acest cmp de bii este format din
cmpurile pauz i magistral inactiv ntre care se intercaleaz, n situaia
unui nod pasiv la erori care a fost emitor, cmpul suspendare transmisie.
Cmpul pauz const n 3 bii recesivi. Cmpul magistral inactiv poate
avea o lungime arbitrar deoarece n aceast stare magistrala este
considerat liber, situaie care va dura pn cnd un nod va produce un
bit dominant start cadru.
Dup ce un nod pasiv la erori a transmis un mesaj, el emite opt bii
recesivi dup cmpul pauz nainte de a transmite un nou mesaj sau a
elibera magistrala.
-

d)

Prelucrarea erorilor

Magistrala CAN admite cinci tipuri de erori:


Eroarea de bit este produs atunci cnd un nod nu recepioneaz de pe
linie acelai bit transmis. n anumite cazuri particulare nu este generat
aceast eroare.
Eroarea de bit de adaus se genereaz dac exist 6 bii egali n cmpurile
start cadru, arbitrare, control, date i secvena CRC.
Eroarea CRC este semnalat dac restul polinomului CRC calculat nu este
identic cu codul recepionat.
Eroarea de form este detectat dac ntr-un cmp de form fix sunt
detectai unul sau mai muli bii incoreci.
Eroarea de confirmare este generat de un emitor care nu monitorizeaz
un bit dominant pe poziia ACK SLOT.
e)

Limitarea erorilor

Pentru a reduce numrul erorilor produse de un dispozitiv eventual


defect, standardul CAN oblig un nod s fie n una din cele trei stri care
urmeaz:
eroare activ nodul ia parte la comunicaia pe linie trimind un indicator
de eroare atunci cnd eroarea a fost detectat;

263 _______________________________________Aplicaii cu microcontrolere de uz general

eroare pasiv nodul ia parte la comunicaia pe linie trimind un


indicator de eroare pasiv atunci cnd eroarea a fost detectat; astfel,
dup o emisie, un nod pasiv va atepta nainte de iniia transmisia
urmtoare;
nelegat la magistral nodul nu are nici o influen asupra liniei de
comunicaie.
Pentru limitarea erorilor, n fiecare dispozitiv sunt implementate dou
numrtoare: unul pentru erorile de transmisie, respectiv recepie. Aceste
numrtoare sunt incrementate respectnd urmtoarele reguli:
a) cnd un receptor detecteaz o eroare, este incrementat contorul de erori
la recepie, cu excepia cazului cnd a fost detectat o eroare de bit n
timpul transmiterii unui indicator de eroare activ sau indicator de
suprancrcare;
b) n situaia n care un receptor, dup transmiterea unui indicator de eroare,
detecteaz primul bit ca bit dominant, contorul de erori la recepie este
mrit cu 8;
c) cnd un emitor trimite un indicator de eroare, contorul de erori la
transmisie este mrit cu 8; ca excepii la aceast regul, cnd nu se
modific contorul, trebuie menionate eroarea de confirmare a unui
emitor pasiv i eroarea de bit de adaus survenit pe timpul arbitrrii;
d) dac un emitor detecteaz o eroare de bit n timpul transmiterii unui
indicator de eroare activ sau indicator de suprancrcare, contorul de
erori de transmisie este mrit cu 8;
e) dac un receptor detecteaz o eroare de bit n timpul transmiterii unui
indicator de eroare activ sau indicator de suprancrcare, contorul de
erori de recepie este mrit cu 8;
f) orice nod tolereaz pn la 7 bii consecutivi dominani dup transmiterea
unui indicator de eroare activ sau indicator de suprancrcare. Dup
detectarea a 14 bii dominani consecutivi sau dup detectarea a 8 bii
dominani consecutivi care urmeaz unui indicator de eroare pasiv,
precum i dup fiecare secven adiional de 8 bii consecutivi dominani,
fiecare contor de transmisie i recepie sunt mrite cu 8;
g) dup transmiterea reuit a unui mesaj, contorul de erori la transmisie
este decrementat (dar fr a cpta valori negative);
h) dup recepia reuit a unui mesaj contorul de erori la recepie este
decrementat (dac a fost ntre 1 i 127), rmne nemodificat (dac a fost
0) ori primete o valoare n domeniul 119127 (dac a fost mai mare de
127);
i) un nod este pasiv la erori n situaia n care contoarele de erori la
transmisie sau recepie au valori mai mari de 128;
j) un nod pasiv devine activ dac numrtoarele de erori la transmisie sau
recepie au valori mai mici de 127;

Accesorii pentru sistemele cu microcontrolere ___________________________________ 264

k) un nod este deconectat atunci cnd contorul de erori la transmisie este


mai mare de 256;
l) unui nod deconectat i este permis s redevin activ (cu ambele contoare
terse) dup 128 de cazuri n care 11 bii recesivi consecutivi au fost
monitorizai pe magistral.
Dac la iniializare este conectat la linie un singur nod, n situaia n care
acest nod va transmite mesaje nu va primi nici o confirmare, detectnd o
eroare care provoac repetarea mesajului. El poate s devin pasiv la erori
dar nu va fi deconectat.
f)

Module CAN din microcontrolere

Marile firme europene au introdus n familiile lor de microcontrolere i


module pentru interfee CAN, att pentru circuitele de 16 bii ct i pentru
cele de 8 bii (C167CR i C164CI realizat ca periferic X-BUS, respectiv
C515C i C505C de la firma Siemens, C592 i C598 de la firma Philips etc.),
circuite pentru conversie la standard CAN (PCA82C250), sau controlere pentru
interfa CAN (SJA1000 etc.).
Circuitul 80C592
Microcontrolerul Philips 8xC592 este asemntor cu circuitul descris n
capitolul 1, 8xC552, numai c la acesta, n locul interfeei seriale I 2 C (SIO1)
este prezent o interfa CAN. Ca suport al modulului CAN, n acest circuit este
prezent i un modul DMA (direct memory acces) necesar pentru creterea
vitezei de transfer ale datelor ntre nucleul microcontrolerului i interfaa CAN.
Protocolul adoptat pentru acest circuit este CAN 2.0A (identificatori pe
11 bii care asigur 2032 identificatori diferii).
Circuitul 8xC592 conine toate circuitele necesare pentru logica de
comunicare n reeaua CAN. n exterior este necesar doar un transceiver, de
exemplu PCA82C250.
Interfaa ntre unitatea central i CAN este fcut prin intermediul a
patru registre speciale:
CANADR:
indic adresa unui registru din modulul CAN;

CANDAT:

registru de date;

CANCON:

registru de control funcionare i ntreruperi;

CANSTA:

registru de stare i indicatori DMA.

Zonele de adrese ale modului CAN constau n segmentul de control i


bufferele de date. Segmentul de control este programat pe durata iniializrii
pentru a fi configurai parametrii de comunicare. Unitatea central poate
modifica ulterior parametrii de comunicare pe baza acestui segment (este
contraindicat modificarea registrelor Cod acceptare ACR, Masc
acceptare AMR, Sincronizare 0 i 1 BTR0 i BTR1, Control ieire
OCR). Mesajele de transmis sunt scrise n bufferul de emisie, n timp ce
mesajele recepionate corect pot fi citite din bufferul de recepie.

265 _______________________________________Aplicaii cu microcontrolere de uz general

Structura segmentului de control i a bufferelor de emisie/recepie sunt


prezentate n figura 4.7.
Adres
00h
01h
02h
03h
04h
05h
06h
07h
08h
09h

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

Figura 3.7. Adresele interne ale modulului CAN din 8xC592

Registrul de control (CR)


Coninutul registrului CR este folosit pentru schimbarea caracteristicilor
modului CAN.
Structura registrului CR este prezentat n tabelul 4.2.

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 .

Accesorii pentru sistemele cu microcontrolere ___________________________________ 266


OIE
Validare ntrerupere depire.
0: nu sunt generate ntreruperi la depirile de date;
1: dac bitul depire date este setat, este generat o ntrerupere.
EIE
Validare ntreruperi erori magistral.
0: nu sunt generate ntreruperi pentru erorile de magistral;
1: dac bitul eroare magistral este setat, este generat o ntrerupere.
TIE
Validare ntrerupere transmisie.
0: nu sunt generate ntreruperi la terminarea unei transmisii de date;
1: este generat o ntrerupere dup ce un mesaj a fost transmis i bufferul de
emisie este disponibil.
RIE
Validare ntrerupere recepie.
0: nu sunt generate ntreruperi recepie;
1: este generat o ntrerupere dup ce un mesaj a fost recepionat fr erori.
RR
Cerere iniializare. Pe durata unei iniializri externe sau cnd bitul de stare a
magistralei este setat, logica de control a interfeei (IML) seteaz acest bit. Dup
ce bitul este ters, modulul CAN ateapt:

a)

un semnal magistral liber (11 bii recesivi), dac iniializarea


precedent a fost generat de o iniializare extern sau un reset unitate
central;
b)
128 de semnale magistral liber, dac iniializarea precedent a fost
generat de modulul CAN;
c)
dac RR este setat din orice motiv, biii control, stare i ntrerupere sunt
afectai (conform tabelului 4.3). Registrele de la adresele 48 sunt
accesibile numai dac RR este setat.
0: tranziia 10 a RR are ca efect funcionarea normal a modului CAN;
1: modulul CAN elimin mesajul curent intrnd n starea de iniializare sincron
cu ceasul sistem.

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

Registrul de comand (CMR)


Structura i funciunile biilor registrului de comand sunt descrise n
tabelul 4.4.

267 _______________________________________Aplicaii cu microcontrolere de uz general


Tabelul 3.4
RX0A
RX1A
WUM
SLP
COS
RRB
AT
TR
CMR (1)
RX0A
Reflect starea indicatorilor respectivi (figura 4.8). Se recomand s fie
RX1A
schimbai numai pe durata strii de iniializare (RR=1 LOGIC )
Control
RX0
RX1
RX0A
RX1A
1
1
CRX0
CRX1
1
0
CRX0
AV DD
0
1
AV DD
CRX1
0
0
Inactiv
WUM
Mod atenionare. Se seteaz concomitent cu bitul SLP.
0: diferenele dintre semnalele RX sunt folosite pentru atenionare;
1: pentru atenionare sunt folosite diferenele dintre semnalele RX i AV DD .
Recomandat pentru medii de transmisie cu interferene mari.
SLP
Inactiv. Modulul CAN intr n modul inactiv (adormit) dac bitul SLP este setat,
nu exist nici o activitate pe magistral i nu exist nici o ntrerupere. Dup
aceasta, modulul CAN este atenionat dac exist activitate pe magistral sau
bitul SLP este ters. La atenionare este generat o ntrerupere specific. Dup
activare, dispozitivul CAN nu este capabil s recepioneze un mesaj pn cnd
nu detecteaz un semnal magistral liber.
0: controlerul funcioneaz normal;
1: controlerul CAN este inactiv.
COS
tergere stare depire. Acest bit este folosit pentru confirmarea depirii
semnalate de bitul depire date. Comanda este executat numai dup
eliberarea ambelor registre de recepie. Bitul trebuie setat simultan cu RRB.
RRB
Eliberare buffere recepie. Dup citirea registrelor recepie (RBF0 sau RBF1)
unitatea central elibereaz bufferul prin setarea acestui bit. Aceasta are ca
rezultat posibilitatea ca un nou mesaj s devin imediat disponibil. Pentru a
asigura executarea unei singure comenzi RRB, timpul minim ntre dou astfel de
comenzi este de 3 ceasuri sistem.
AT
Suprimare transmisie. AT este folosit pentru ntreruperea imediat a unei
transmisii solicitate anterior, de exemplu, pentru a transmite un mesaj urgent.
O transmisie aflat n curs nu este ntrerupt. Pentru a determina dac mesajul
iniial a fost transmis, trebuie verificat bitul TCS.
TR
Cerere transmisie. Dac bitul TR a fost setat de o comand anterioar, cererea
nu poate fi eliminat prin tergerea bitului TR. Anularea cererii se poate face
numai prin setarea bitului AT.
R X 0 ac tiv
R X 1 ac tiv
R e ferin a ctiv
REF

AV D D
M od atenion a re

Semnal
a ten ion a re
CRX0

RX0
C o m p arare

CRX1

RX1

Figura 3.8. Configurarea receptorului CAN

Accesorii pentru sistemele cu microcontrolere ___________________________________ 268

Registrul de stare (SR)


Registrul de stare reflect situaia modului CAN i este descris n tabelul
4.5.
BS

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.

Registrul de ntreruperi (IR)


Registrul de ntreruperi permite identificarea sursei unei ntreruperi.
Dac unul sau mai muli bii ai acestui registru sun setai, este generat o
ntrerupere SIO1. Toi biii sunt teri de controlerul CAN dup citirea
registrului. Registrul IR este descris n tabelul 4.6.

Tabelul 3.6

269 _______________________________________Aplicaii cu microcontrolere de uz general


WUI
OI
EI
TI
RI

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.

Registrul cod de acceptare (ACR)


Registrul ACR este o component a filtrului de acceptare a mesajelor a
modulului CAN. Acest registru poate fi accesat dac indicatorul RR este setat.
Dac un mesaj recepionat trece testul de acceptare i este disponibil un
buffer de recepie, cmpurile control i date sunt memorate n buffer; dac
nu exist buffer liber este setat indicatorul Depire date.
Pe durata transmisiei unui mesaj care a trecut testul de acceptare,
mesajul este scris i n propriul buffer de recepie deoarece nu se poate ti
dac modulul va pierde arbitrarea i va deveni receptor al mesajului. Dac nu
exist buffer de recepie liber este setat indicatorul Depire date.
Structura registrului cod de acceptare este prezentat n tabelul 4.7.
Tabelul 3.7
AC7
AC6
AC5
AC4
AC3
AC2
AC1
AC0
ACR (4)
AC7-AC0 Cod acceptare. Biii AC7AC0 primii opt bii mai semnificativi ai
identificatorului (ID10ID3) trebuie s fie egali cu acei bii de poziie care
sunt marcai relevanii de Registrul masc de acceptare (AMR).
Mesajul este acceptat dac este satisfcut urmtoarea ecuaie:
(ID10ID3)=[(AC7AC0)+(AM7AM0)]=1111 1111 B

Registrul masc de acceptare (AMR)


Registrul AMR este o parte a filtrului de acceptare a modulului CAN.
Acest registru poate fi accesat dac indicatorul RR este setat. Registrul AMR
determin care din biii ACR sunt relevani pentru filtrare. Structura registrului
este prezentat n tabelul 4.8.
AM7
AM6
AM5
AM4
AM3
AM2
AMR (5)
AM7-AM0 Masc de acceptare.
0: biii din aceast poziie sunt relevani pentru filtrare;
1: biii din aceast poziie nu au importan pentru filtrare.

Tabelul 3.8
AM1
AM0

Registrul 0 de sincronizare a magistralei (BTR0)

Accesorii pentru sistemele cu microcontrolere ___________________________________ 270

Coninutul registrului BTR0 definete valorile prescalerului pentru ratele


de transmisie (BRP), precum i limea salturilor de sincronizare (SJV). Acest
registru poate fi accesat dac indicatorul RR este setat. Structura registrului
BTR0 este prezentat n tabelul 4.9.
Tabelul 3.9
SJW1
SJW0
BRP5
BRP4
BRP3
BRP2
BRP1
BRP0
BTR0 (6)
SJW
Pentru a compensa diferenele de faz ntre diferitele oscilatoare de pe
magistral, fiecare controler de magistral trebuie s se resincronizeze cu orice
semnal relevant al mesajului curent. SJW definete numrul maxim de tacte cu
care o perioad de bit poate fi scurtat sau lungit la resincronizare:
t SJW =t SCL ( 2SJW1+SJW0+1)
BRP
Perioada ceasului de serializare este programabil i se poate determina cu
relaia:
t SCL =2t CLK (32BRP5+16BRP4+8BRP3+4BRP2+2BRP1+BRP0+1);
t CLK = perioada microcontrolerului.

Registrul 1 de sincronizare a magistralei (BTR1)


Coninutul registrului BTR1 definete mrimea perioadei unui bit,
poziionarea punctelor de eantionare i numrul de eantioane din fiecare
punct. Acest registru poate fi accesat dac indicatorul RR este setat. Structura
registrului BTR1 este prezentat n tabelul 4.10.
Tabelul 3.10
SAM TSEG2.2 TSEG2.1 TSEG2.0 TSEG1.3 TSEG1.2 TSEG1.1 TSEG1.0
BTR1 (7)
SAM
Numrul de eantioane:
0: 1 eantion; recomandat pentru magistralele rapide;
1: 3 eantioane; recomandat pentru magistrale mai lente, unde pot fi prezente
interferene puternice.
TSEG2
Determin numrul de cicluri pe perioada de bit i poziia punctului de
TSEG1
eantionare. Poziionarea corect a punctului de eantionare este esenial
pentru funcionarea corect a transmisiei. Trebuie avute n considerare
urmtoarele:
Start cadru implic o sincronizare hardware pe prima tranziie
recesiv-dominant. Pe durata arbitrrii, unele controlere CAN pot emite
simultan; acest motiv poate implica luarea n calcul a unui timp de
propagare dublu.
Pentru a evita eantionarea pe o poziie incorect, este necesar
introducerea unor buffere de sincronizare de ambele pri ale punctului de
eantionare.
TSEG1 asigur compensarea propagrii ntrzierilor i sincronizarea nainte de
punctul de eantionare. Se determin cu relaia:
t TSEG1 =t SCL (8TSEG1.3+4TSEG1.2+2TSEG1.1+TSEG1.0+1)
TSEG2 asigur ntrzieri suplimentare necesare calculului urmtoarelor nivele
ale biilor, precum i sincronizarea dup punctul de eantionare. Se determin
cu relaia:
t TSEG2 =t SCL (4TSEG2.2+2TSEG2.1+TSEG2.0+1)

Registrul de control a ieirii (OCR)


Registrul OCR permite, sub controlul programului, setarea unor configuraii de ieire variate. Acest registru poate fi accesat dac indicatorul RR este
setat. Dac modulul este inactiv (sleep), pe pinii CTX0 i CTX1 este scos un
nivel

recesiv.

Dac

modulul

este

stare

de

iniializare

amplificatoarele de ieire sunt flotante.


Structura registrului OCR este prezentat n tabelul 4.11.

(RR=1),

271 _______________________________________Aplicaii cu microcontrolere de uz general


Tabelul 3.11
OCTP1 OCTN1 OCPOL1 OCTP0 OCTN0 OCPOL0 OCMODE1 OCMODE0
OCR (8)
OCTP1
Comand tranzistorul de ieire CTX1 legat la V DD .
OCTN1
Comand tranzistorul de ieire CTX1 legat la V SS .
OCPOL1 Comand polaritatea semnalului CTX1.
OCTP0
Comand tranzistorul de ieire CTX0 legat la V DD .
OCTN0
Comand tranzistorul de ieire CTX0 legat la V SS .
OCPOL0 Comand polaritatea semnalului CTX0.
OCTPx
OCTNx
OCPOLx
TXD
CTXx
Amplificator
0
0
0
0
flotant
0
0
0
1
flotant
Flotant
0
0
1
0
flotant
0
0
1
1
flotant
0
1
0
0
dominant (0)
0
1
0
1
flotant
Pull-down
0
1
1
0
flotant
0
1
1
1
dominant (0)
1
0
0
0
flotant
1
0
0
1
recesiv (1)
Pull-up
1
0
1
0
recesiv (1)
1
0
1
1
flotant
1
1
0
0
dominant (0)
1
1
0
1
recesiv (1)
Push/Pull
1
1
1
0
recesiv (1)
1
1
1
1
dominant (0)
OCMODE1 Comand modurile de ieire.
OCMODE0 00: Mod ieire Bi-phase. Spre deosebire de modul normal, reprezentarea biilor
este variabil n timp. Dac modulul este decuplat galvanic de linia de
transmisie, semnalele nu trebuie s conin componente DC. Pe durata
biilor recesivi, toate ieirile sunt flotante; biii dominani sunt trimii
alternativ pe CTX0 i CTX1.
01: Mod test. Pentru pinul CTX0 funcionarea este identic cu modul normal.
Testul este folosit numai la productor pentru a msura timpii de ntrziere.
10: Mod normal. Secvenele de bii (TXD) sunt transmise prin intermediul CTX0
i CTX1. TXD este data care urmeaz s fie transmis. Nivelul tensiunii pe
CTX0 i CTX1 depinde de valorile programate prin OCTPx, OCTNx (flotant,
pull-up, pull-down, push-pull) i OCPOLx.
11: Mod ceas. Pentru pinul CTX0 funcionarea este identic cu modul normal.
Datele pe pinul CTX1 sunt nlocuite de tactul de transmisie serial. Frontul
cresctor al tactului marcheaz nceputul unui bit. Perioada tactului este
t SCL .

Bufferul de transmisie (DSCR1, DSCR0 i cmpurile de


date)
Structura registrelor descriptor i cmpului de date este prezentat n
tabelul 4.12.
Tabelul 3.12
ID10
ID9
ID8
ID7
ID6
ID5
ID4
ID3
DSCR1 (10)
ID2
ID1
ID0
RTR
DLC3
DLC2
DLC1
DLC0
DSCR0 (11)
ID10ID0 Identificatorul. Cei 11 bii sunt trimii pe magistral n timpul procesului de
arbitrare, cea mai mic valoare binar desemnnd prioritatea cea mai mare. De
asemenea, identificatorul servete ca nume al mesajelor fiind folosit la filtrare.
RTR
Cerere de date:
0: va fi transmis un cadru de date;
1: va fi transmis un cadru cerere de date.

Accesorii pentru sistemele cu microcontrolere ___________________________________ 272


Cod lungime mesaj. Numrul de octei din cmpul de date este codificat de
DLC30
acest cmp. La iniierea transmisiei unui cadru cerere de date, DLC nu este luat
n considerare, fiind forat la 0 LOGIC . Cu toate acestea, pentru mesajele
standard, DLC trebuie specificat corect, cu valori de la 0 la 8, conform cu
relaia:
Numr octei=8DLC3+4DLC2+2DLC1+DLC0
DATA7
DATA6 DATA5 DATA4 DATA3 DATA2 DATA1 DATA0
DATE (1219)
DATA70 Reprezint octeii de date care formeaz mesajul (maxim 8 octei).

Bufferul
date)

de

recepie

(DSCR1,

DSCR0

cmpurile

de

Structura i semnificaia octeilor bufferului de recepie este identic cu


a celui de transmisie, cu excepia adresei registrelor interne care este n
domeniul 2029.
Registrele
central

speciale

pentru

interfaare

cu

unitatea

Prin intermediul a patru registre speciale, CANADR, CANDAT, CANCON i


CANSTA, unitatea central are una acces deplin asupra modulului CAN i
DMA. Structura i semnificaia registrelor este prezentat n tabelul 4.13.
Tabelul 3.13
DMA
AutoInc CANA4 CANA3 CANA2 CANA1 CANA0

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.

Conectarea microcontrolerului 8xC592 la magistrala CAN

273 _______________________________________Aplicaii cu microcontrolere de uz general

Interfaarea ntre microcontroler i linia de transmisie se face prin


intermediul unui transceiver. Dispozitivul are urmtoarele funciuni:
convertete semnalele CTX0 i CTX1 n nivele de tensiuni compatibile cu

linia de transmisie;
convertete nivelele de tensiune de pe linie n semnale compatibile cu
intrrile CRX0 i CRX1.

Conectarea fizic ntre controler i linie este specific aplicaiei. Funcie


de cerinele transferului de date, transceiverul poate fi realizat mai simplu sau
mai complicat, cea mai ieftin soluie constnd n cteva rezistene iar cea
mai complex n cteva componente externe i chiar cteva circuite integrate.
Condiiile impuse transceiverului pot fi separate n dou categorii, pentru
emitor i pentru receptor.
Liniile emitorului (CTX0 i CTX1) pot fi programate individual prin
intermediul registrului OCR. Astfel, emitorul este uor de proiectat pentru
orice fel de linie diferenial.
Receptorul const ntr-un comparator diferenial ntre liniile CRX0 i
CRX1. Cu excepia comparrii difereniale ale semnalelor de pe linie, referina
comparatorului poate fi comutat de pe unul din semnale pe tensiunea de
referin a modulului V REF .
O schem complet de transceiver, cu izolare galvanic ntre modulul
CAN i linia de transmisie, este prezentat n figura 4.9.

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

Figura 3.9. Interfaarea CAN cu linia de transmisie

124

Accesorii pentru sistemele cu microcontrolere ___________________________________ 274

275 _______________________________________Aplicaii cu microcontrolere de uz general

276 ____________________________________________________________________ Anexe

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

/* watchdog extern ADM691 */

/* 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

277 _______________________________________Aplicaii cu microcontrolere de uz general


/* ADRESE I2C ========================================================= */
#define EEPROM
0xa0
/* adreaa EEPROM */
#define REL1
0x40
/* Bank 0 de relee - iesire */
#define REL2
0x42
/* Bank 1 de relee - iesire */
#define REL3
0x44
/* Bank 2 de relee - iesire */
#define REL4
0x46
/* Bank 3 de relee - iesire */
#define REL5
0x48
/* Bank 4 de relee - iesire */
#define REL6
0x4a
/* Bank 5 de relee - iesire */
#define REL7
0x4c
/* Bank 6 de relee - iesire */
#define REL8
0x4e
/* Bank 7 de relee - iesire */
/* EEPROM ============================================================= */
#define _E2P_MAX
512
/* capacitatea EEPROM-ului in octeti */
#define _E2P_BUF
512
/* CONTROLERUL DE INTRERUPERI ========================================= */
#define INTX_CTR
0x3000 /* Adresa controlerului de intrerupere */
#define INTX_LINE
(XBYTE[INTX_CTR] & 0xf) /* lina care a generat intr. */
/* IESIRI DIGITALE (CU LATCH) ========================================= */
#define DO1
0x0800
#define DO2
0x1000
/* INTRARI/IESIRI DIGITALE (FARA LATCH) =============================== */
#define IO1
0x1800
#define IO2
0x2000
#define ODE
0x3800
/* TASTAURA =========================================================== */
#define KBRD_BUFF_SIZE 4
#define KLOCK
((P5 & 0x20) ? 0 : 1)
#endif

Definiiile unor tipuri de date des utilizate n programele prezentate n


fiierul TYPEDEF.H.
/**************************************************************************\
** Titlu:
TYPEDEF.H
**
** Descriere:
Declaratiile variabile byte, word, lword
**
**
**
** 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:
**
**
**
** Ultima modificare la data: 23 nov 1998
**
** Observatii:
**
**
**
\**************************************************************************/
#ifndef _TYPEDEF_H
#define _TYPEDEF_H
1
#define byte unsigned char
#define word unsigned int
#define lword unsigned long
// citirea partii high si low a unei varibile pe 16 biti
#define HIGH(X)
((byte)(*( (byte*)(&(X)) )))
#define LOW(X)
((byte)(*(((byte*)(&(X))) + 1)))
// adresare partii high
// returneaza adresa la
#define ptrHIGH(X)
#define ptrLOW(X)

si low a unei varibile pe 16 biti


partea low si high
( (byte*)(&(X))
)
(((byte*)(&(X))) + 1)

// definirea unei variabile pe 32biti care poate fi adresata ca 2 word sau 4


byte

278 ____________________________________________________________________ Anexe


typedef union {lword Lw; word w[2]; byte By[4];} blword;
#endif

279 ______________________________________ Aplicaii cu microcontrolere de uz general

Bibliografie
***

PCB83C552 Microcontroller User Manual, Philips, 1992.

***

C51 COMPILER Users Guide 11.93, Keil Elektronik GmbH, 1993.

***

A51 ASSEMBLER Users Guide 10.91, Keil Elektronik GmbH, 1993.

***

DScope 51 Users Guide 10.91, Keil Elektronik GmbH, 1991.

***

8051 Utilities Users Guide 10.91, Keil Elektronik GmbH, 1991.

***

C167 16-Bit CMOS Single-Chip Microcontroller Data Sheet 06.94


Preliminary, Siemens, 1994.

***

C167 16-Bit Single-Chip Microcontroler Users Manual 08.94,


Siemens, 1994.

***

C166 COMPILER Users Guide 4.92, Keil Elektronik GmbH, 1993.

***

A166 ASSEMBLER Users Guide 5.92, Keil Elektronik GmbH, 1992.

***

DScope 166 Users Guide 4.93, Keil Elektronik GmbH, 1993.

***

80C166 Utilities Users Guide 4.93, Keil Elektronik GmbH, 1993.

***

The TTL Data Book for Design Engineers, Texas Instruments,


1976.

***

Design-in Reference Manual, Analog Devices inc., 1992.

***

Circuite integrate CMOS, Manual de utilizare,


Ed. Tehnic Bucureti 1986.

***

MCB167, Prototype board with SIEMENS C167 CPU, Users Guide


3.94, Keil Software GmbH, 1994

***

Sistem de dezvoltare 80C552 Abacus SRL

***

CAN Specification, Version 2.0, Robert Bosch GmbH, 1991

***

CANPRES Version 2.0, Siemens Microelectronics, 1998

***

PCA82C250 CAN controller interface, Preliminary specification,


Philips, 1997

***

P8xC592 8-bit microcontroller


specification, Philips, 1996

***

SJA1000 Stand-alone CAN controller, Preliminary specification,


Philips, 1997

with

on-chip

Microelectronica,

CAN,

Product

P.Buehring .a.

Application of the P8xC592 microcontroller with CANinterface, HKI/AN 91014, Hamburg, 1992.

H.C. Reuss

Extended Frame Format - A New Option of the CAN


Protocol (CAN Protocol Specification Vers. 2.0 A+B),
HAI/AN 92 002, Hamburg, 1993

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