You are on page 1of 289

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

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

2.1.

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

3.2.

3.3.

3.4.

3.5.

3.6. 3.7.

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


XTAL1 XTAL2 EA PSEN ALE PWM0 PWM1 AV SS AV DD AV REF+ AV REFFuncii alternative ADC0 ADC1 ADC2 ADC3 ADC4 ADC5 ADC6 ADC7 CMSR0 CMSR1 CMSR2 CMSR3 CMSR4 CMSR5 CMT0 CMT1 STADC 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 RST EW 35 34 49 47 48 4 5 60 61 59 58 3 1 68 67 66 65 64 63 62 7 8 9 10 11 12 13 14 15 6 57 56 55 54 53 52 51 50 16 17 18 19 20 21 22 23 39 40 41 42 43 44 45 46 24 25 26 27 28 29 30 31 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 AD0 AD1 AD2 Magistral AD3 date i AD4 adrese AD5 AD6 AD7 CT0I CT1I CT2I CT3I T2 RT2 SCL SCA A8 A9 A10 Magistral A11 date i A12 adrese A13 A14 A15 RXD/DATA TXD/CLOCK INT0 INT1 T0 T1 WR RD

Port 0

Port 1

Port 5

Port 2

Port 6

Port 3

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

Memorie Modulator date n 2568 impulsuri Magistral intern 16 16 Timer T2

Convertor Interfa analog serial numeric sincron

Nucleu 8051

Porturi I/ O P0-P3

Interfa serial asincron

Porturi I/ O P4-P5

5 registre captur

3 registre comparare

Timer T3 Watchdog

P0 P3

T2 RT2 CMSR0-CMSR5 RST CMT0,CMT1 Figura 1.2. Structura intern a microcontrolerului 83C552

TX

RX

P5 P4

CT0I-CT3I

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

RS1 RS0

OV 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 RXD P3 INT1 INT0 TXD 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

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)

Timere/Numrtoare

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

Logic captur i comparare

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 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. POP transfer octetul desemnat n operandul surs de la locaia adresat de SP i apoi decrementeaz registrul SP. Operaiile specifice acumulatorului sunt: XCH schimb operandul surs cu acumulatorul. XCHD MOVX MOVC schimb 4 bii ai operandul surs cu 4 bii ai acumulatorului. realizeaz transferul unui octet ntre memoria extern i acumulator. Adresa extern este specificat de R0 i R1 sau DPTR. realizeaz transferul unui octet ntre memoria program i 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.

PUSH

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 RL RR RLC RRC SWAP ANL ORL XRL

complementeaz (n complement fa de 1) acumulatorul sau orice bit adresabil direct. rotete la stnga coninutul acumulatorului. Este echivalent cu o nmulire cu 2. rotete la dreapta coninutul acumulatorului. Este echivalent cu o mprire cu 2. rotete la stnga coninutul acumulatorului prin intermediul bitului C care devine egal cu ultimul bit deplasat. rotete la dreapta coninutul acumulatorului prin intermediul bitului C care devine egal cu ultimul bit deplasat. rotete la stnga de 4 ori coninutul acumulatorului. Este echivalent cu o schimbare a biilor 0-3 cu 4-7. execut o operaie I ntre doi operanzi. Rezultatul este returnat n primul operand. execut o operaie SAU ntre doi operanzi. Rezultatul este returnat n primul operand. execut o operaie SAU exclusiv ntre doi operanzi. Rezultatul este returnat n primul operand. Controlul programului.

d)

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

execut un salt relativ la coninutul registrului DPTR, ca

deplasament folosind valoarea din acumulator. RET transfer controlul adresei de salt salvate n stiv de o 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 Adres/Date Control V DD Citire V DD

Bus

Scriere

D Q Registru P0.X CK Q

Pin P0.X

Bus

MUX

Scriere

D Q Registru P1.X CK Q

Pin P1.X

Pin citire Citire Funcie alternativ Bus

Pin citire Funcie alternativ Citire

Control V DD Adres

Scriere

D Q Registru P1.X CK Q

X=6;7

Pin P1.X

Bus

Scriere

D Q Registru P2.X CK Q

MUX

Pin P2.X

Pin citire Funcie alternativ Citire V DD Funcie alternativ Bus

Pin citire Citire Setat de funcia alternativ V DD

Scriere

D Q Registru P3.X CK Q

Bus Pin P3.X Scriere

D Q Registru P4.X CK Q

Pin P4.X

Pin citire Funcie alternativ Bus Pin citire

Pin citire Pin P5.X

ters de funcia alternativ

Spre ADC

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 P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7 P4.0 P4.1 P4.2 P4.3 P4.4 P4.5 P4.6 P4.7 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 A9 A9 A10 A11 A12 A13 A14 A15 CMSR0 CMSR1 CMSR2 CMSR3 CMSR4 CMSR5 CMT0 CMT1 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 CT0I CT1I CT2I CT3I T2 RT2 SCL SDA 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

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 P5.0 P5.1 i P5.2 P5.3 P5.4 P5.5 i P5.6 P5.7

Comparare cu timer setri/resetri ieiri

T2

Comparare cu comutri ieiri

timer

T2

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.
PWM0 Magistral intern Comparator 1/2 f OSC Prescaler Numrtor Comparator PWM1 PWM0

>>

>>

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 STADC V REF+ V REF AVDD AVSS

0 1 2 3 4 5 6 7 ADCON

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 Pin Tn TRn GATEn ntrerupere Pin INTn a),b) Modul 0 i 1 THn (8 bii) OSC M12 Pin T0 TR0 GATE0 Pin INT0 TR1 TH0 (8 bii) TF1 ntrerupere Rencrcare c) Modul 2 TL0 (8 bii) TF0 ntrerupere TFn TLn (8 bii) C/T=1 C/T=0 C/T=0 C/T=1 TLn (5/8 bii) THn (8 bii) TFn ntrerupere Pin INTn GATEn TRn Pin Tn

M12 OSC

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 CT0 = CM0(s) Stop f OSC M12 T2 RT2 T2ER Int Int CT2I Int CTI1 CT1 = CM1(r) Int CTI2 CT2 = CM2(k) Int Int Int CT3I Int CTI3 CT3

Prescaler

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 Divizor 11 bii tergere

f OSC /12

Timer T3 ncrcare Reset

Bufer

RST

Scriere tergere WLE EW Oprit PCON ncrcare

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 REN TB8 RB8 T1 Tabelul 1.8 R1

SM0 SM1 Mod SM0 SM1 Selectare mod lucru:

Descriere

Vitez de transmisie

SM2 REN TB8 RB8 TI RI

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

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 TXD

STOP START M2 SMOD=1 M16 SMOD=0 CL TI

SHIFT DATA SEND ntrerupere S0 LOAD S0BUF

Control emisie

Detector 10

CL START

RI

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

1, 3

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 Bus I 2 C SDA SCL 8XC552 Periferic I2C SDA SCL

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 X 1 0 0 0 X X X

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

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. S-au emis datele. ACK s-a recepionat. datele. s-a

28

S-au emis nu 30 ACK recepionat.

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 Urmtoarea transmisie iniiat cu STAR T R Nu s-a recepionat Ack dup adres slave Nu s-a recepionat Ack dup octetul de date S-a pierdut arbitrarea 38 Ack Ack Ack 68 78 80 Ack Stop 20 Ack Stop 30 Ack Ack 38 Continu alte mastere S 08 SLA W Ack Date Ack Stop 18 28 S 10 R Mod recepie SLA W

Arbitrarea pierdut i trece n slave

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
2

S1DAT ncarc SLA+R ncarc SLA+R ncarc SLA+W

STA STO SI AA X X X 0 1 0 0 0 0 0 0 0 0 1 1 0 X 0 X 0 X 0 X 0 X 0 0 0 1

08 S-a emis START. 10 S-a emis START R. S-a 38 arbitrarea sau ACK.

pierdut SLA+R Nici o S1DAT

aciune

40

S-a emis SLA+W. Nici o ACK s-a recepionat. S1DAT

aciune

0 1

S-a emis SLA+W. Nici o 48 ACK nu s-a S1DAT recepionat.

aciune

1 0 1

0 X 0 X 0 X

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 Urmtorul transfer iniiat cu START R Nu s-a primit confirmare dup adres slave S-a pierdut arbitrarea Arbitrarea pierdut i trece n slave 38 Ack Stop 48 Ack Ack Ack 68 78 80 Alte stri slave Ack 38 S SLA 08 R Ack 40 Date Ack Date Ack Stop 50 58 S 10 W Mod emisie Continu alte mastere SLA R

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. 1 0 S-a recepionat STOP sau START R A0 Citete datele cnd era adresat n modurile c) sau d) 0 0 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.

0 0

0 1

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 Ultimul octet primit nu este confirmat Arbitrarea este pierdut ca master i devine slave Recepionare apel general i octei Datele pierdute nu sunt confirmate Arbitrarea pierdut i trece n slave Ack 78 Apel gen. Ack 68 Ack 70 Date Ack Date Ack Stop sau S 90 90 98 A0 S SLA W Ack 60 Date Ack Date Ack Stop sau S 80 80 A0

Ack Stop sau S 88

Ack Stop sau S

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 fi

va fi recepionat

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 n timpul ultimului octet emis trece n mod slave neadresat S SLA R Ack A8 Ack B0 Ack 11 Stp/S C8 Date Ack Date Ack Stop sau S B8 C0

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.
Cod 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 0 1 0 X eliberat i SIO1 trece n modul S1DAT slave neadresat.

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

Familia de microcontrolere 80C16x _____________________________________________ 42


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 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 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 P4.0/A16 P4.1/A17 P4.2/A18 P4.3/A19 P4.4/A20 P4.5/A21 P4.6/A22 P4.7/A23 100 101 102 103 104 105 106 107 108 111 112 113 114 115 116 117 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 85 86 87 88 89 90 91 92 65 66 67 68 69 70 73 74 75 76 77 78 79 80 81 27 28 29 30 31 32 33 34 35 36 39 40 41 42 43 44 1 2 3 4 5 6 7 8 19 20 21 22 23 24 25 26 9 10 11 12 13 14 15 16 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 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 P6.0/CS0 P6.1/CS1 P6.2/CS2 P6.3/CS3 P6.4/CS4 P6.5/HOLD P6.6/HLDA P6.7/BREQ P7.0/POUT0 P7.1/POUT1 P7.2/POUT2 P7.3/POUT3 P7.4/CC28IO P7.5/CC29IO P7.6/CC30IO P7.7/CC31IO P8.0/CC16IO P8.1/CC17IO P8.2/CC18IO P8.3/CC19IO P8.4/CC20IO P8.5/CC21IO P8.6/CC22IO P8.7/CC23IO

Figura 1.15. Microcontrolerul 80C167

RD WR/WRL READY ALE EA XTAL2 XTAL1 RSTIN RSTOUT NMI

95 96 97 98 99 137 138 140 141 142

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

ROM intern

32

Unitate central
16

16

RAM intern

16 PEC Controler ntreruperi Watchdog

16

Osc

CAPCOM2

Port 0

Controler magistral extern

Convertor A/N 10 bii

16

GPT1 T2 T3 T4 GPT2 T5 T6

ASC0

SSC

PWM

CAPCOM1

Port 1

16

Port 4

T7 T8 BRG BRG

T0 T1

Port 6 8

Port 5 16

Port 3 15

Port 7 8

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.

Port 8

16

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 Segment 254
FE0000 030000 FFFFFF Pagina date 1023 FF0000 Pagina date 3 00C000 Pagina date 2 008000 Pagina date 1

Z ona RA M/ SFR

00FFFF 00F000

Memorie extern

Segment 2 Segment 1 Segment 0

020000

010000 Pagina date 3 Pagina date 0 000000

Memorie R OM intern

004000 Pagina date 0 000000

Spaiu adresare

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 00F000 Pagina date 3 00C000 00FFFF

Z ona SFR
00FE00

Memorie extern

Pagina date 2 008000

RA M intern

00F600 Pagina date 1

Memorie R OM intern

004000 Pagina date 0

R ezervat
00F200

Z ona E SFR
000000 00F000

Segment sistem

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

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

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: mod segmentat pe 4 bii: mod segmentat pe 8 bii: 256 kB cu A17A16 pe P4 i A15A0 pe P1 sau P0; 1 MB cu A19A16 pe P4 i A15A0 pe P1 sau P0; 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. ROM PSW SYSCON BUSCON0 BUSCON1 BUSCON2 BUSCON3 BUSCON4 DPP0 DPP1 DPP2 DPP3 MDH MDL Mul/div Mascare

Unitate aritmetic Reg.depls.

R15 Registre uz general R0

Indic. context CP ADDRSEL1 ADDRSEL2 ADDRSEL3 ADDRSEL4 CSP

RAM 2 kB

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 IP,CSP DPP0DPP3 CP stare i control unitate central; acces coduri; control paginare date; control acces registre uz general;

Familia de microcontrolere 80C16x _____________________________________________ 54

SP,STKUN,STKOV MDL,MDH,MDC ZEROS,ONES

control stiv sistem; registre pentru nmulire i mprire; 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.
EXECUTE

(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

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 SCXT CP,#0FC00h MOV R0,#data ;selectarea unui nou context ;instruciuni de protecie ;instruciuni care folosesc noul context.

b)

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

c)

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 ;selecteaz vrful stivei ;instruciuni de protecie ;ncarc registrul general R0 cu valoarea aflat ;n vrful stivei.

d)

Controlul ntreruperilor Modificrile prin program (implicite sau explicite ale registrului PSW) sunt

realizate n ciclul main 3 (execuie). Pstrarea unei viteze ridicate de tratare a ntreruperilor a condus la necesitatea adoptrii unei timp scurt de reacie a acestui sistem, astfel nct o cerere de ntrerupere poate fi acceptat n timpul sau dup instruciunea imediat urmtoare blocrii sistemului de ntreruperi, ca n exemplul urmtor scris n assembler:
In I n+1 I n+2 BCLR IEN ;inactivare general ntreruperi ;instruciune intreruptibil ;instruciune neinteruptibil

Familia de microcontrolere 80C16x _____________________________________________ 56


I n+k I n+k+1 I n+k+2 BSET IEN ;revalidare ntreruperi ;instruciune neinteruptibil ;instruciune intreruptibil

e)

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

Corect:
In In+1 In+2 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

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.

Familia de microcontrolere 80C16x _____________________________________________ 58 Tabelul 1.17 VISIBLE C SGTDIS BYTDIS SYSCON (FF12h) STKSZ STKSZ XPER-SHARE N ROMS1 ROMEN CLKEN WRCFG

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 .

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.
Tabelul 1.18 HLDEN PSW (FF10h) ILVL MULIP USR0 IEN E Z V

ILVL

IEN HLDEN USR0 MULIP 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 CSP (FE08h) SEGNR IP Specific adresa curent din interiorul segmentului 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

1 0 1 0 0 0 0 h 0 0 0 0 0 0 0 h

A d re s fizic p e 2 4 /2 0 /1 8 b ii

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 1023 1022 A dres date 16 bii 15 14 13 0

3 2 1 0

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 1 1 1 1 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.).
CP Adres GPR (4 bii) x2 + Acces octet Acces cuvnt GPR

RAM intern

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, n cazul n 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 s

Familia de microcontrolere 80C16x _____________________________________________ 66 Ciclu magistral


Segment (P4) A LE Bus (P0) RD A drese D ate/instr A drese

Bus (P0) WR

A drese

D ate

a. Magistral multiplexat Ciclu magistral A dres (P1) Segment (P4) A LE Bus (P0) RD D ate/instr

Bus (P0) WR

D ate

b. Magistral demultiplexat D emultiplexat A dres (P1) Segment (P4) A LE Bus (P0) RD Date/In Adr. Date/In] Inactiv Multiplexat

Bus (P0) WR

D ate

A dr

D ate

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 i 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 Rat transfer (8/16/32 bii) 1.5/3/6 1/2/4 1.5/1.5/3 1/1/2 Necesiti sistem Registru, buffer 8 bii Buffer 8 bii Registru, buffer 16 bii Linii IO libere P1 P0H P1

e)

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.
Tabelul 1.24 Spaiu memorie direct adresabil 1 MB 64 kB (minim) 16 MB (maxim)

SALSEL 00 01 10

Linii adres segment A19A16 A23A16

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

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

0 0 1 1

0 1 0 1

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; a) 1 15 stri de ateptare; intervalul n care perifericele sunt n nalt impedan; timpul de ntrziere a semnalelor de citire/scriere; controlul semnalului READY. 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 Segment (P4) A LE Bus (P0) RD A dr. Date/In Adr. Date/In Ciclu prelungit

Bus (P0) WR

A dr.

D ate

A dr.

D ate

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) RD A dr. Date/Instr

Bus (P0) WR

A dr.

D ate

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) RD Ciclu ateptare A dr. Date/Instr

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) RD Bus (P0) WR Date/Instr

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.
Tabelul 1.27 BUSACT4 BUSACT3 BUSACT2 BUSACT1 BUSACT0 ALECTL4 ALECTL3 ALECTL2 ALECTL1 ALECTL0 RDYEN0 MTTC0 BUSCON0 (FF0Ch) RWDC0 R R BTYP MCTC0

CSWEN1

CSREN1

RDYEN1

MTTC1

BUSCON1 (FF14h)

RWDC1

BTYP

MCTC1

CSWEN2

CSREN2

RDYEN2

MTTC2

BUSCON2 (FF16h)

RWDC2

BTYP

MCTC2

CSWEN3

CSREN3

RDYEN3

MTTC3

BUSCON3 (FF18h)

RWDC3

BTYP

MCTC3

CSWEN4

CSREN4

RDYEN4

MTTC4

BUSCON4 (FF1Ah) CSWEN CSREN RDYEN BUSACT ALECTL BTYP MTTC RWDC MCTC ADDRSEL1 (FE18h) ADDRSEL2 (FE1Ah) ADDRSEL3 (FE1Ch) ADDRSEL4 (FE1Eh) RGSAD RGSZ

RWDC4

BTYP

MCTC4

0h: semnalul CS este independent de semnalele de scriere (WR,WRL,WRH); 1h: semnalul CS este generat pe durata semnalului de scriere. 0h: semnalul CS este independent de semnalul de citire (RD); 1h: semnalul CS este generat pe durata semnalului de citire. Validare intrare READY. Descris la 1.15.2.e) 0h: magistrala extern dezactivat; 1h: magistrala extern n domeniul ADDRSEL corespunztor este activat. Control lungime semnal ALE. Descris la 1.15.2.a) Configurare magistral extern. Descris la 1.15.1. Configurare timp ntrziere. Descris la 1.15.2.c) Control ntrziere semnale RD/WR. Descris la 1.15.2.d) Numr cicluri ateptare. Descris la 1.15.2.b)

RGSAD

RGSZ

Setare adres de start fereastr. Selectare mrime fereastr.

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 X X X 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
LOGIC ; LOGIC .

RD/WR sunt n 1

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

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)

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.

Tip B

Tip A

RESET

1.16.2

Tabelul 1.32 PECC0 PECC1 PECC2 PECC3 PECC4 PECC5 PECC6 PECC7 FEC0h FEC2h FEC4h FEC6h FEC8h FECAh FECCh FECEh 00: 01: 10: 11: 0: 1:

BWT

INC

COUNT

INC BWT

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.
Tabelul 1.35 UNDOPC PRTFLT ILLOPA ILLINA TFR (FFACh) NMI ILLBUS STKOF STKUF NMI

STKOF

STKUF

UNDOPC

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

ODP2, ODP3, ODP6, ODP7, ODP8

registre control ieiri.

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.
Tabelul 1.36 DP0L.7 P0H.7 P0L.7 DP0L.6 P0H.6 P0L.6 DP0L.5 P0H.5 P0L.5 DP0L.4 P0H.4 P0L.4 DP0L.3 P0H.3 P0L.3 DP0L.2 P0H.2 P0L.2 DP0L.1 P0H.1 P0L.1 P0L (FF00h) P0H (FF02h) DP0L (F100h) DP0L.0 P0H.0 P0L.0

89 ________________________________________Aplicaii cu microcontrolere de uz general DP0H.7 DP0H.6 DP0H.5 DP0H.4 DP0H.3 DP0H.2 DP0H.1 DP0H (F102h) P0X.y DP0X.y DP0H.0

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.

Tabelul 1.37 DP1H.7 DP1L.7 P1H.7 P1L.7 DP1H.6 DP1L.6 P1H.6 P1L.6 DP1H.5 DP1L.5 P1H.5 P1L.5 DP1H.4 DP1L.4 P1H.4 P1L.4 DP1H.3 DP1L.3 P1H.3 P1L.3 DP1H.2 DP1L.2 P1H.2 P1L.2 DP1H.1 DP1L.1 P1H.1 P1L.1 P1L (FF04h) P1H (FF06h) DP1L (F104h) DP1H (F106h) P1X.y DP1X.y DP1H.0 DP1L.0 P1H.0 P1L.0

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.
Tabelul 1.38 ODP2.15 DP2.15 P2.15 ODP2.14 DP2.14 P2.14 ODP2.13 DP2.13 P2.13 ODP2.12 DP2.12 P2.12 ODP2.11 DP2.11 P2.11 ODP2.10 DP2.10 P2.10 P2.9 P2.8 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 DP2.1 ODP2.1 P2 (FFC0h) DP2 (FFC2h) P2.0 ODP2.0 DP2.0

DP2.9

DP2.8

DP2.7

DP2.6

DP2.5

DP2.4

DP2.3 ODP2.3

ODP2.9

ODP2.8

ODP2.7

ODP2.6

ODP2.5

ODP2.4

ODP2 (F1C2h) 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

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

ODP2.2

DP2.2

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.

93 ________________________________________Aplicaii cu microcontrolere de uz general Tabelul 1.39 DP3.15 P3.15 ODP3.13 DP3.13 P3.13 DP3.12 P3.12 ODP3.11 DP3.11 P3.11 ODP3.10 DP3.10 P3.10 ODP3.9 DP3.9 P3.9 ODP3.8 DP3.8 P3.8 ODP3.7 DP3.7 P3.7 ODP3.6 DP3.6 P3.6 ODP3.5 DP3.5 P3.5 ODP3.4 DP3.4 P3.4 ODP3.3 DP3.3 P3.3 ODP3.2 DP3.2 P3.2 ODP3.1 DP3.1 P3.1 P3 (FFC4h) DP3 (FFC6h) ODP3 (F1C6h) P3.y DP3.y ODP3.y ODP3.0 DP3.0 P3.0

Registrul de date 0h: linia P3.y 1h: linia P3.y 0h: linia P3.y 1h: linia P3.y

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 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 CLKOUT 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.
Tabelul 1.40 DP3.7 P4.7 DP3.6 P4.6 DP3.5 P4.5 DP3.4 P4.4 DP3.3 P4.3 DP3.2 P4.2 DP3.1 P4.1 P4 (FFC8h) DP4 (FFCAh) P4.y DP4.y DP3.0 P4.0

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 A23 A22 A21 A20 A19 A18 A17 A16 Memorie 4 M

A17 A16 Memorie 256 k

A19 A18 A17 A16 Memorie 1 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.
Tabelul 1.41 P4.7 P4.6 P4.5 P4.4 P4.3 P4.2 P4.1 ODP6.1 DP6.1 P6.1 P5 (FFA2h) P5.y P4.0 ODP6.0 DP6.0 P6.0

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

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.
Tabelul 1.42 ODP6.7 DP6.7 P6.7 ODP6.6 DP6.6 P6.6 ODP6.5 DP6.5 P6.5 ODP6.4 DP6.4 P6.4 ODP6.3 DP6.3 P6.3 P6 (FFCCh) DP6 (FFCEh) ODP6 (F1CEh) P6.y DP6.y ODP6.2 DP6.2 P6.2

Registrul de date al portului P6 bitul y. 0h: linia P6.y este intrare; 1h: linia P6.y este ieire.

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.
Tabelul 1.43 ODP7.7 DP7.7 P7.7 ODP7.6 DP7.6 P7.6 ODP7.5 DP7.5 P7.5 ODP7.4 DP7.4 P7.4 ODP7.3 DP7.3 P7.3 ODP7.2 DP7.2 P7.2 ODP7.1 DP7.1 P7.1 P7 (FFD0h) DP7 (FFD2h) ODP7 (F1D2h) P7.y DP7.y ODP7.y ODP7.0 DP7.0 P7.0

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

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.
Tabelul 1.44 ODP8.7 DP8.7 P8.7 ODP8.6 DP8.6 P8.6 ODP8.5 DP8.5 P8.5 ODP8.4 DP8.4 P8.4 ODP8.3 DP8.3 P8.3 ODP8.2 DP8.2 P8.2 ODP8.1 DP8.1 P8.1 P8 (FFD4h) DP8 (FFD6h) ODP8 (F1D6h) P7.y DP8.y ODP8.y ODP8.0 DP8.0 P8.0

Registrul de date 0h: linia P8.y 1h: linia P8.y 0h: linia P8.y 1h: linia P8.y

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 Clock2 Comparator Bistabil POUTx Control scriere Registru durat PWx Control ieire Numrtor sus/jos PTx Control tergere numrtor

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

cnd valoarea PTx

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 va declana oprirea numrtorului. Modul de funcionare este ilustrat n figura 2.25.d.

101 _______________________________________Aplicaii cu microcontrolere de uz general PPx=7


PTx
100% 87.5% 75% 50% 25% 12.5% 0% 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 PP0 PT0 PWM0 PP1 PT1 POUT1 POUT0 c) Modul 2

b) Modul 1 PPx=7 PTx PWxPTx PTRx=1 PWx=4 d) Modul 3 PWxPTx

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

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

b)

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.
PWM0 F030h F038h FE30h PWM1 F032h F03Ah FE32h PWM2 F034h F03Ch FE34h Tabelul 1.46 PWM3 F036h F03Eh FE36h

PT0 PP0 PW0

PT1 PP1 PW1

PT2 PP2 PW2

PT3 PP3 PW3

d)

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.
PB01 PM3 PM2 PM1 PM0 PEN3 PEN2 PEN1 PEN0

PS3 PS2

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

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 Control conversie Eantionare Convertor 10 bii V A REF V A GND MUX ntreruperi: ADCIR, ADEIR Rezultate: ADAT, ADAT2

AN0

AN15

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.
Tabelul 1.48 ADCRQ ADCIN ADBSY ADWR ADCON (FFA0h) ADCTC ADSTC ADCRQ ADCIN ADWR ADBSY ADST ADM ADCH ADAT (FEA0h) CHNR ADRES ADAT2 (F0A0h) CHNR ADRES ADCTC ADSTC ADST 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 a) Modul continuu Conversie canal Scrie ADDAT ADDAT plin Registru temp. Generare IRQ Citire ADDAT b) Modul ateptare citire rezultat Conversie canal Scrie ADDAT ADDAT plin Citire ADDAT Inserare canal ADDAT2 plin Citete ADDAT2 ntrerupere ADEINT c) Modul inserare canal x AN3 3 AN2 2 AN1 0 AN0 3 AN3 x AN3 3 AN2 2 AN1 ateapt 0 AN0 3 AN3 x 3 2 1 0 3

Rezultat pierdut

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
310

sus/jos Timer T2 Control Timer T2 ncrcare captur sus/jos Timer T3 ntrerupere

T2IN T3EUD f C PU /2 310 T3IN T4IN f C PU /2 310 T4EUD

Control Timer T3

T3OTL

T3OUT ntrerupere

Control Timer T4

ncrcare captur Timer T4 sus/jos ntrerupere

Figura 1.42. Timerele GPT1 Tabelul 1.50

T3OTL

T3UDE

T3OE

T3UD

T3CON (FF42h)

T3R

T3M

T3I

T3OTL T3OE

T3UDE T3UD

T3R 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
LOGIC ;

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

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

sau 1

LOGIC

cel puin o perioad 8t CPU .

b)

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.

111 _______________________________________Aplicaii cu microcontrolere de uz general Tabelul 1.53 T4UDE T2UDE T2CON (FF40h) T4CON (FF44h) TxUDE TxUD TxR T4UD T2UD T2R T2M T2I

T4R

T4M

T4I

TxM

TxI

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
29

sus/jos Timer T5 Control Timer T5 tergere ntrerupere captur

T2IN CAPIN

ntrerupere CAPREL ncrcare CAPCOM ntrerupere Timer T6 sus/jos T6OTL T6OUT

T6IN f C PU /2 29 T6EUD

Control Timer T6

Figura 1.43. Timerele GPT2

a)

Timerul T6 Timerul T6 este configurat i controlat de registrul T6CON, descris n

tabelul 2.41.
Tabelul 1.54 T6OTL T6UDE T6OE T6CON (FF42h) T6SR T6OTL T6OE T6SR T6UD T6R T6M T6I

T6UDE T6UD

T6R

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 . LOGIC ;

dac este 1h, timerul este validat dac

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

sau 1

LOGIC

cel puin o perioad 4t CPU .

b)

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.
Tabelul 1.57 T5CLR T5UDE T5CON (FF46h) T5SC T5CLR CI T5SC T5UD CI T5R T5M T5I

T5UDE T5UD T5R 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 D epire timer T6 CcxIO Control Timer Tx Timer Tx Registru TxREL 16 registre CA PCOM Registru TyREL Timer Ty ntrerupere ntrerupere ntrerupere ntrerupere

Control (16 semnale) CA PCOM CCzIO D epire timer T6 f CPU/2


310

Control Timer Ty

Figura 1.44. Schema bloc a modulelor CAPCOM Tabelul 1.58 T01CON (FF50h) T78CON (FF20h) TxR TxM T1R T8R T1M T8M T1I T8I T0R T7R T0M T7M T0I T7I

TxI

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 ACC7 ACC11 ACC15 ACC19 ACC23 ACC27 ACC31

CCMOD3 CCMOD7 CCMOD11 CCMOD15 CCMOD19 CCMOD23 CCMOD27 CCMOD31

ACC2 ACC6
ACC10 ACC14 ACC18 ACC22 ACC26 ACC30

CCMOD2 CCMOD6 CCMOD10 CCMOD14 CCMOD18 CCMOD22 CCMOD26 CCMOD30

ACC1 ACC5
ACC9 ACC13 ACC17 ACC21 ACC25 ACC29

CCMOD1 CCMOD5 CCMOD9 CCMOD13 CCMOD17 CCMOD21 CCMOD25 CCMOD29

ACC0 ACC4
ACC8 ACC12 ACC16 ACC20 ACC24 ACC28

CCMOD0 CCMOD4 CCMOD8 CCMOD12 CCMOD16 CCMOD20 CCMOD24 CCMOD28

Familia de microcontrolere 80C16x ____________________________________________ 120 ACCx 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.

CCMODx

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.
MUX f CPU :2 WDTL WDTH WDTR RSTOUT WDTIN Control WDTREL Reset :128

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.
Tabelul 1.60 WDTCON (FFAEh) WDTREL WDTR WDTIN WDTREL WDTIN WDTR

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.
Tabelul 1.61 S0OEN S0FEN S0PEN S0REN S0BRS S0ODD S0CON (FFB0h) S0R S0LB S0BRS S0ODD S0STP S0OE S0FE S0LB S0PE S0R S0M

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

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 f C PU S0M :2 Timer baud S0PE S0OE Ceas Control ASC0 Tact deplasare :16

S0STP S0FE

S0REN S0FEN S0PEN S0OEN S0LB RXD0 MUX Eantionare

S0RIR S0TIR S0EIR TXD0

Registru deplasare RX S0RBUF

Registru deplasare TX S0TBUF

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 start D0 D1 D1 D2 D2 D3 D3 D4 D4 D5 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 f C PU S0M :2 Timer baud S0OE Ceas Control ASC0 Tact deplasare :4

S0REN S0OEN RXD0 S0LB MUX Eantionare

S0RIR S0TIR S0EIR

Registru deplasare RX S0RBUF

Registru deplasare TX 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 f CPU Control SSC SSCTIR SSCRIC SSCEIC MTSR Control pin MRST Control tact SCLK

Control

Stare

Registru deplasare 16 bii SSCTB

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).
Tabelul 1.63 SSCAREN SSCBEN SSCPEN SSCREN SSCCON (FFB0h) SSCEN=0 SSCEN SSCMS SSCAREN SSCBEN SSCPEN SSCREN SSCTEN SSCPO SSCTEN SSCEN SSCMS SSCPO SSCPH SSCHB SSCBM

SSCPH

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 SSCHB SSCBM SSCCON SSCEN=1 SSCEN SSCMS SSCBSY SSCBE SSCPE SSCRE SSCTE SSCBM 0h: transmite/recepioneaz primul bitul mai puin semnificativ; 1h: transmite/recepioneaz primul bitul cel mai semnificativ. Lungime mesaj: 1+SSCBM. 0h: rezervat. SSCBSY SSCEN SSCMS SSCBE SSCPE SSCRE SSCTE 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 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

Funcie Intrare Intrare Ieire

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 validare interfa SSC DP3.13=1h; 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 MRST SCLK Circuit secundar 1 Reg.depls. MTSR MRST 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 STKOV FA0Ch; Registru S0CON 8011h; TXD0 (P3.10 i DP3.10) 1h. Registru STKUN FA40h; Registru SYSCON FA40h; Registru S0BG funcie de vitez;

Registru BUSCON0 funcie de configuraia de iniializare;

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

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

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 Adunarea cu transport a dou cuvinte sau octei Scderea a dou cuvinte sau octei Scderea cu transport a dou cuvinte sau octei nmulire 1616 bii cu sau fr semn mprire 1616 bii cu sau fr semn mprire 3216 bii cu sau fr semn Complement fa de 1 pentru cuvnt sau octet Complement fa de 2 pentru cuvnt sau octet Instruciuni logice
I - LOGIC

ADD ADDC SUB SUBC MUL DIV DIVL CPL NEG

ADDB ADDCB SUBB SUBCB MULU DIVU DIVLU CPLB NEGB

ntre dou cuvinte sau octei ntre dou cuvinte sau octei ntre dou cuvinte sau octei

AND OR XOR

ANDB ORB XORB

SAU - LOGIC

SAU - EXCLUSIV

Comparri i control bucle Comparare ntre dou cuvinte sau octei Comparare ntre dou cuvinte cu postincrementare cu 1 sau 2 Comparare ntre dou cuvinte cu postdecrementare cu 1 sau 2 Instruciuni booleene bii Manipulare cmp de bii n octet superior sau inferior BFLDH Setare bit BSET BFLDL CMP CMPI1 CMPD1 CMPB CMPI2 CMPD2

139 _______________________________________Aplicaii cu microcontrolere de uz general

tergere bit Mutare bit Mutare bit negat


I - LOGIC

BCLR BMOV BMOVN BAND BOR BXOR BCMP

ntre doi bii ntre doi bii ntre doi bii

SAU - LOGIC

SAU - EXCLUSIV

Comparare ntre doi bii Instruciuni deplasare i rotire

Deplasare dreapta cuvnt Deplasare stnga cuvnt Rotire dreapta cuvnt Rotire stnga cuvnt Deplasare aritmetic dreapta cuvnt Instruciuni normalizare

SHR SHL ROR ROL ASHR

Determinare numr deplasri normalizare cuvnt Instruciuni mutare date

PRIOR

Mutare standard cuvnt sau octet Mutare octet la o locaie de cuvnt cu extensie de semn sau de zero Instruciuni stiva sistem

MOV MOVBS

MOVB MOVBZ

Introducerea unui cuvnt n stiv Extragerea unui cuvnt din stiv Schimbarea contextului registrelor GPR Instruciuni salt

PUSH POP SCXT

Salt condiionat la o adres absolut, indirect sau relativ n segmentul curent Salt necondiionat la adres n orice segment Salt condiionat la o adres relativ n segmentul curent funcie de starea unui bit Salt condiionat la o adres relativ n segmentul curent funcie de starea unui bit cu inversarea bitului n caz de salt Instruciuni apel subrutine

JMPA JMPS JB

JMPI JMPR

JNB

JBC

JNBS

Apel condiionat la adres absolut, indirect sau relativ n segmentul curent Apel necondiionat la adres n orice segment Apel condiionat la o adres absolut n segmentul

CALLA CALLI CALLR CALLS

Familia de microcontrolere 80C16x ____________________________________________ 140

curent i salvarea n stiv a unui registru selectabil Apel necondiionat de ntrerupere sau excepie Instruciuni rentoarcere subrutine Rentoarcere din segmentul curent Rentoarcere din orice segment Rentoarcere din segmentul curent i aducerea din stiv a unui registru selectabil Rentoarcere din rutin ntrerupere Instruciuni control sistem Iniializare software Intrare mod inactiv Intrare mod oprit Servire timer WDT Invalidare timer WDT Terminare rutin iniializare Instruciuni diverse Nici o aciune Definirea unor instruciuni neintreruptibile Comutare moduri adresare reg, bitoff i bittadr pentru zona ESFR Suprapunere pagini date folosind o pagin special de date n locul DPP i opional comutare n zona ESFR

PCALL TRAP

RET RETS RETP RETI

SRST IDLE PWRDN SRVWDT DISWDT EINIT

NOP ATOMIC EXTR

EXTP

EXTPR EXTSR

Suprapunere pagini date folosind un segment specific n locul DPP i opional comutare n zona ESFR EXTS

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 1 bit 1 octet 1 octet Domeniu de valori 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 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 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

idata bdata sdata far

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 DPP1 DPP2 DPP3 pointeri huge i far pointeri near grupul NCONST pointeri near grupul NDATA 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:
Registru VAL este setat pentru a indica o masc valid. ACC CY PSW B MSB VAL 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 MDX R12 R11 R10 R9 R8 R7 R6 R5 R4 R3 R2 R1 LSB 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 R4, R5, R6, R7 R4, R5, R6, R7 pointer generic 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 _RWDC _MTTC _RDYEN _CLKEN _BYTDIS _SGTDIS _STKSZ EXT_RAM WATCHDOG INIT_VARS seteaz registrul BUSCON.0BUSCON.3; definete numrul de cicluri de ateptare la accesul memoriei; seteaz registrul BUSCON.4; definete ntrzierea semnalelor RD/WR; seteaz registrul BUSCON.5; programeaz intervalul de nalt impedan; seteaz registrul BUSCON.12; valideaz utilizarea semnalului READY pentru terminarea ciclului de memorie; seteaz registrul SYSCON.8; valideaz producerea semnalului CLKOUT pe pinul P3.15; seteaz registrul SYSCON.9; valideaz producerea semnalului BHE pe pinul P3.12; seteaz registrul SYSCON.11; invalideaz segmentarea (pentru modelul de memorie TINY); seteaz registrul SYSCON.13SYSCON.15; definete mrimea stivei ntre 32 i 1024 cuvinte; valideaz semnalul WR pe pinul P3.13; dezactiveaz timerul de iniializare; valideaz iniializarea variabilelor declarate explicit.

CLR_MEMORY valideaz tergerea memoriei RAM la iniializare;

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 caractere. Fiierul respectiv folosete interfaa ASC a microcontrolerului pentru comunicare cu un terminal cu protocol XON/XOFF. conine cteva rutine utilizate pentru recepionarea de carac-

GETKEY.C

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 expr13

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).
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) i 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: _simbol. nume_seciune (inclusiv SYSTEM), nume_grup, nume_variabil sau

rezervare resurse (REGDEF, REGBANK, SSKDEF, PECDEF, DEFR/DEFA/DEFB):


nume_banc_registre REGBANK [domeniu] [,]

PROC/ENDP,

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 nesegmentat (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 comand

reprezint LIB51 sau LIB166, funcie de familia de microcontrolere utilizat; 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 (valaore) utilizat), INT14 (comunicaia serial se face folosind ntreruperea BIOS 14h), NOINT (comunicaia este fcut fr ntreruperi hardware) sau baudrate (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 RTS 4 CTS 5 DSR 6 8 CD DTR 20 PC-AT 3 RxD 2 TxD 7 GND 4 RTS 5 CTS 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 9

Adresa
8 7

Exemplu 010xh 012xh 014xh 016xh 018xh 01axh 01cxh 01exh

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

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

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.
Y1 10MHz C1 33p U3 35 34 C3 33p EA PS EN A LE PW M0 PW M1 A vss A vd d V re f+ V re f S TA DC P 5.0 P 5.1 P 5.2 P 5.3 P 5.4 P 5.5 P 5.6 P 5.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 49 47 48 4 5 60 61 59 58 3 1 68 67 66 65 64 63 62 7 8 9 10 11 12 13 14 X TA L1 X TA L 2 EA PS EN A LE PW M0 PW M1 AVS AV D AV+ AV S TA DC P 5.0 P 5.1 P 5.2 P 5.3 P 5.4 P 5.5 P 5.6 P 5.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 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 P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 RST EW 15 6 57 56 55 54 53 52 51 50 16 17 18 19 20 21 22 23 39 40 41 42 43 44 45 46 24 25 26 27 28 29 30 31 EW 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 S1 RESET R1 8k2 C2 10u A D0 A D1 A D2 A D3 A D4 A D5 A D6 A D7 3 4 7 8 13 14 17 18 1 11 U1 D0 D1 D2 D3 D4 D5 D6 D7 OC CLK 7 4 H C T3 7 4 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 1 11 D0 D1 D2 D3 D4 D5 D6 D7 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 1 11 D0 D1 D2 D3 D4 D5 D6 D7 OC CLK 7 4 H C T3 7 4 O0 O1 O2 O3 O4 O5 O6 O7 11 12 13 15 16 17 18 19 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 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 7 4 H C T2 4 4 U2A 74LS14 A 15 1 2 SRAM C4 3u3 C5 3u3 C7 3u3 RD PS EN U4A 3 2 7 4 H C T0 8 1 OR A M 1 6 2 7 3 8 4 9 5 P1 R S 2 32 U8 2 V+ 1 C1+ 3 C14 C2+ 5 C211 IN 1 1 0 IN 2 12 OU T1 9 OU T2 TX D C6 3u3 2 4 6 8 11 13 15 17 1 19 IO0 IO1 IO2 IO3 IO4 IO5 IO6 IO7 S3 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 2 5 6 9 12 15 16 19 A0 A1 A2 A3 A4 A5 A6 A7 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 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 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 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

F un c ii a lte rn a t ive

Vcc

S1 Vcc R2 220

S2

A LE

80C552 U11 A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A 10 A 11 A 12 A 13 A 14 S RAM O R AM WR 10 9 8 7 6 5 4 3 25 24 21 23 2 26 1 20 22 27 A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 CE OE WR 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 A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A 10 A 11 A 12 A 13 A 14 S R OM A 15 V CC 10 9 8 7 6 5 4 3 25 24 21 23 2 26 27 20 22 1 U10 A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 CE OE VPP 27C256

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

V-

14 7 TX D 1 TX D 2 13 8 R XD 1 R XD 2

U5 4 WR U4B 6 5 7 4 H C T0 8 A 15 A8 5 4 6 G2 B G2 A G1 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 7 9 10 11 12 13 14 15 S7 S6 S5 S4 S3 S2 S1 S0

RXD J11 1 2 D1 5V6 POW ER

MAX232 VCC

A7 A6 A5

3 2 1

C B A

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 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 J2 1 2 3 4 5 6 7 8 P1 P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7 J3 1 2 3 4 5 6 7 8 P2 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 J4 1 2 3 4 5 6 7 8 P3 P4.0 P4.1 P4.2 P4.3 P4.4 P4.5 P4.6 P4.7 J5 1 2 3 4 5 6 7 8 P4 P5.0 P5.1 P5.2 P5.3 P5.4 P5.5 P5.6 P5.7 J6 1 2 3 4 5 6 7 8 P5 S0 S1 S2 S3 S4 S5 S6 S7 J7 1 2 3 4 5 6 7 8 S el IO0 IO1 IO2 IO3 IO4 IO5 IO6 IO7 J8 1 2 3 4 5 6 7 8 IO OU T0 OU T1 OU T2 OU T3 OU T4 OU T5 OU T6 OU T7 J9 1 2 3 4 5 6 7 8 OU TA OU T8 OU T9 OU T1 0 OU T1 1 OU T1 2 OU T1 3 OU T1 4 OU T1 5 J10 1 2 3 4 5 6 7 8

OU TB

Figura 2.2. Sistem de dezvoltare cu 80C552

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

S2 RESET

C2 27p C3 27p 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 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 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 100 101 102 103 104 105 106 107 108 111 112 113 114 115 116 117 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

C1 10u 97 READY RD WR ALE EA Y1 40MHz X TA L 2 137 X TA L 1 138 142 RD 95 W R/W RL 96

R S TO U T R S TIN 140 R S TO U T 141 99

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

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

65 66 67 68 69 70 73 74 75 76 77 78 79 80 81 85 86 87 88 89 90 91 92 27 28 29 30 31 32 33 34 35 36 39 40 41 42 43 44 1 2 3 4 5 6 7 8

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 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 P6.0 P6.1 P6.2 P6.3 P6.4 P6.5 P6.6 P6.7

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

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

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

Funcii alternative
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 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

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

READY

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

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

NMI

98 ALE

EA

R A M LO W 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 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

RAM HIGH 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

U1

80C167

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 P6.0 P6.1 P6.2 P6.3 P6.4 P6.5 P6.6 P6.7 VPP

29 W RL 24 RD 22 CS1

29 W RH 24 RD 22 CS1

U2 R A M L

U3 R A M H

R A M LO W 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 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 U6 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 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 A9 A10 A11 A12 A13 A14 A15 A16 VCC OC G H C T3 7 3 13 14 15 17 18 19 20 21 29 24 22 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 L1 RD CS0 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

RAM HIGH 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 U7 A D1 A D2 A D3 A D4 A D5 A D6 A D7 A D8 3 4 7 8 13 14 17 18 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 A1 A2 A3 A4 A5 A6 A7 A8 13 14 15 17 18 19 20 21 29 24 22 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 L2 RD CS0

19 20 21 22 23 24 25 26

9 10 11 12 13 14 15 16

37 38 V A RE F V A G ND L2 W RH

VAREF VA GND

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

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

C5 3u3

C4 3u3 A15 L1 W RL L3 A16 A16 L4 A19

JP1 1 3 4 5 IN 1 11 IN 2 10 13 R XD 1 O U T1 12 8 R XD 2 O U T2 9

ROM /RA M ROM/RA M ROM /RA M ROM/RAM C1+ C1C2+ C2-

VPP

34

MAX232

VCC L5 A18 JP6 JP7 1M 2/4M L6 A19

JP5

U8

14 TX D 1 7 TX D 2

V+

1M 2/4M

A LE P0.1 P0.4 P0.6 P0.7

A LE

OC G H C T3 7 3

C6 3u3

V-

C7 3u3 R 2 1 5k 1 2 3 4 5 6 7 8

JP8 JP9 JP10 16 15 14 13 12 11 10 9 JP11

P0.9 P0.10 P0.11 P0.12 JP12 JP13 JP14 JP15 8V...12V VCC 7805

P1 RS232

1 6 2 7 3 4 9 5

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

X Z

OK

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: mov mov mov mov movc jz inc push push mov clr subb mov mul add mov mov adc mov mov mov mov nextlin: movc mov nextpixel: RRC mov jnc call endpixel: inc mov djnz inc inc djnz mov pop POP jmp ret mov movx mov movx nop nop nop p2,#1 r0,#20h r1,#40h DPTR,#txt A,@DPTR gata DPTR DPL DPH DPTR,#gen_c C A,#20h B,#8 AB A,DPL DPL,A B,A A,DPH DPH,A r2,#7 r3,#7 ch_v,vert A,@DPTR ch_o,oriz A B,A endpixel afis ch_o A,B r3,nextpixel ch_v DPTR r2,nextlin oriz,ch_o DPH DPL nextchr ;acesam porturile cu adresele ;0x0120 (DAC orizontal) si ;0x0140 (DAC vertical) ; citim textul de afisat ; citim un caracter ; este 0 -> gata ; ptr. caracter urmator ; salvam ptr caracter

nextchr:

; ptr. generattor caractere ; stergem CY pt. subb ; scadem offset tabel pt. ASCII ; ; ; ; ; ; 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

; contor randuri ; contor coloane ; initializare DAC vertical ; ; ; ; ; ; ; ; ; 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

; DAC la urmatorul rand ; ptr. la urmatorul rand ; salt la urmatoarea linie ; setare poz. inceput caracter urm. ; refacere DPTR cu ptr. caracter urm. ; desenam urmatorul caracter

gata: afis:

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

;afisare pixeli

;ateptare 1 us

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 170


nop nop clr nop nop nop nop nop setb ret txt: 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 db p4.2 ;set z ;ateptare 1 us

p4.2

;reset z

Un text, 0 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: mov mov mov sub_r: mov mov add mov movx mov movx mov nop djnz acall mov inc acall djnz mov mov add mov movx mov movx mov nop djnz acall mov inc acall djnz ret afis: mov movx mov movx nop nop nop nop nop clr a,ch_o @r0,a a,ch_v @r1,a ;afisare pixeli p2,#1 r0,#20h r1,#40h a,oriz ch_v,vert a,#7 ch_o,a @r0,a a,ch_v @r1,a r7,#50h r7,wait1 afis r7,#0eh ch_v afis r7,ret0 ch_o,oriz a,vert a,#7 ch_v,a @r1,a a,ch_o @r0,a r7,#20h r7,wait2 afis r7,#0eh ch_o afis r7,ret1 ;deseneam linia orizontlala ;acesam porturile cu adresele ;0x0120 (DAC orizontal) si ;0x0140 (DAC vertical) ;afisare reticul ;valoare DAC veritical

;comandam DAC-ul orizontal ;comandam DAC-ul vertical ;asteptam un timp pt. desenare ;ateptare ;afisam un pixel ;desenam linia veritcala ;ne deplasam pe verticala ;desenam un pixel la (ch_o, ch_v)

wait1:

ret0:

wait2:

ret1:

;ateptare 1 us

p4.2

;set z

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 4 5 6 7 8 9 10 Simbol V SS V DD V0 RS R/W E DB0 DB1 DB2 DB3 Nivel ----H/L H/L H, H H/L H/L H/L H/L Tabelul 2.12 Funcie 0V 5V5% 0V(max)5V H: Data input Selectare registru L: Instruction code input Citire/Scriere H: Citire, L: Scriere L Selecie afiaj (Enable) --mod 8 bii Bitul 0 de date Bitul 1 de date Bitul 2 de date Bitul 3 de date 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 Tabelul 2.13 Timpul de execuie f OSC =250kHz 1.64ms

Codul RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Instruciunea 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). Scrie date n CG RAM sau DD RAM. Citete date din CG RAM sau DD RAM.

Display Clear 0 0 0 0 0 0 0 0 0 1

Display/ 0 0 0 0 0 0 0 0 1 * Cursor Home

1.64ms

Entry set

0 0 0 0 0 0 0 1

I/D

mode

40s

Display ON/OFF Display/ Cursor Shift

0 0 0 0 0 0 1 D C B

40s

S/C R/L

0 0 0 0 0 1

* *

40s

DL

Function Set 0 0 0 0 1

N 0 * *

40s

CG RAM Address Set

0 0 0 1

ACG

40s

DD RAM Address Set

0 0 1

ADD

40s

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 BF

40s

40s

40s

/**************************************************************************\ ** Titlu: LCD.H ** ** Descriere: Declaratiile functiilor pentru lucru cu LCD-ul ** ** ** ** Versiune: 2.0 ** ** Inceut la: August 97 ** ** Autor: Stefan Suceveanu, Pratco s.r.l. Bucuresti, Romania ** ** Compilator C: C51 V2.27, Franklin Software, Inc. ** ** ** ** Acest modul contine urmatoarele functii: ** ** declaratii de coduri si macrouri **

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 1 /* validare lucru bufferat */ 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

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); LCDcmd(0x0E) LCDcmd(0x0C) LCDcmd(0x0D) LCDcmd(0x0C) LCDcmd(0x0D) LCDcmd(0x0E)

CursorON() CursorOFF() BlinkON() BlinkOFF() BonCoff() BoffCon()

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

bit CursorRight(void); bit CursorLeft(void); byte LCDgetpoz(void); void LCDsetpoz(byte poz);

#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. Pasul 3. Pasul 4. Pasul 5. Se citesc coloanele (P4.4P4.7); Se emite pe colane ce s-a citit i se seteaz rndurile ca intrri (P4.0P4.3) 1111; Se citete i complementeaz valoarea portului P4.

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 /* 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 # 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 #endif // _KBRDCODE_H_

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

/**************************************************************************\ ** 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); #endif void KBRD_init(void); byte KBRD_read(void); // iniializeaz tastatura // extrage un caracter din bufferul de tastatur // 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

\************************************************************************* 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; if(!t) to = 0; if((t == to) || (!(t & 0xf0))) return 0; to = t; KBHIT = 1; // s-a apsat o tasta // // // // se se se se scot pe coloane 1111 citesc rndurile scot pe rnduri citesc i se complementeaz

#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

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

2.4.2

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; P2 &= 0xf7ff; P2 |= 0x0400; P2 &= 0xfdff; /* set port 2 out (LCDcmd) /* set port 8 in (date) /* Dezactivare LCD (P2.11) /* R/W = 1 (P2.10) /* RS = 0 (P2.9) */ */ */ */ */

183 _______________________________________Aplicaii cu microcontrolere de uz general


P2 |= 0x0800; p = P8; while((p & 0x80) == 0x80) p = P8; P2 &= 0xf7ff; return(p & 0x7f); } void cmdLCD(char c) { waitLCD(); DP8 = 0xff; _nop_(); P8 = c; P2 &= 0xf1ff; P2 |= 0x0800; P2 &= 0xf7ff; } char readLCD(void) { char p; waitLCD(); P2 |= 0x0e00; p = P8; P2 &= 0xf7ff; return(p); } void dataLCD(char c) { waitLCD(); DP8 = 0xff; _nop_(); P8 = c; P2 |= 0x0200; P2 &= 0xfbff; P2 |= 0x0800; P2 &= 0xf7ff; } void initLCD(void) { cmdLCD(0x38); cmdLCD(0x06); cmdLCD(0x0c); cmdLCD(0x01); } /* set port 8 out */ /* set port 8 out */ /* Validare LCD */ /* Validare LCD */

/* depune cmd la LCD */ /* dezactivare LCD,R/W = 0,RS = 0 */ /* validare LCD /* dezactivare LCD */ */

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

*/ */

/* depune data la LCD /* RS = 1 /* R/W = 0 /* validare LCD /* dezactivare LCD

*/ */ */ */ */

/* /* /* /*

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; DP2 = 0x000f; ODP2 = 0x00ff; _nop_(); P2 = 0; DP2 = 0x0e0f; _nop_(); t = P2 & 0x00f0; DP2 = 0x0ef0; _nop_(); P2 = t; t |= (P2 & 0x000f); 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 */ */ */ */ */ */ */ */ */ */ */ */ */ */ */ */ */ /* Tastatura 4*4 */

/* P2.0-3 set OUT /* P2.0-7 set OPEN DRAIN /* OUT /* P2.4-7 set IN /* P2.9-B pentru LCD /* IN /* P2.4-7 set OUT /* P2.0-3 set IN /* OUT value /* IN or value

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

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; #define Nsir 5 xdata char l[Nsir+1]; // starea citirii tastaturii // substarea citirii tastaturii // 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: 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

!ATENTIE! !ATENTIE!

*/ int edittext(char* msg, char* txt, char maxlen) { static data char t,poz,s; data byte c; if(!kbsstate) { poz = s = 0; LCDstr(0, 0, msg); LCDstr(1, 0, txt); LCDstr(1, 0, "\0"); kbsstate++; CursorON(); } else { t = KBRD_read(); if(!t) return GI_WAIT; switch(t) { case Kb4: if(poz) //deplaseaz cursor la stnga, scroll poz--; if(poz < s) { s = poz; LCDclr(1); LCDstr(1, 0, &txt[s]); LCDstr(1, 0, "\0"); } else CursorLeft(); break; case Kb6: poz++; //deplaseaz cursor la dreapta, scroll if(poz > strlen(txt))

187 _______________________________________Aplicaii cu microcontrolere de uz general


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

// case Kb2:

de sub cursor

case Kb8:

de sub cursor

case Kb5:

case Kb0:

= 0

case Kb1:

= A

case Kb3:

= Z

case Kb7:

= a

case Kb9:

= z

case KbC:

case Kbo:

case Kbd:

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; // semn doar n prima poziie

case KbC:

if(!first) // tergem ultimul caracter { k--; if(l[k] == '.') // dac tergem virgula virgula = 0; // marcm c nu avem virgul l[k] = ' '; if(txt) LCDstr(row, col + strlen(txt), l); else LCDstr(row, col, l); l[k] = 0; if(!k) first = 1; refresh = 1; } break; // ESC

case Kbo: // c = '*'; k = 0; first = 1; fput = 1;

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; // // // // // // } if(refresh) { refresh = 0; l[k] = 0; if(txt) { LCDstr(row, col, txt); LCDstr(row, col + strlen(txt), l); } else LCDstr(row, col, l); } 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(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

54h 34h

h_b:

clr mov mov mov mov anl jz mov movc mov

a r_0,a r_1,a r_2,a a,hex0 a,#0fh etc3 dptr,#tab_00-1 a,@a+dptr r_0,a 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 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

;iniializare registre lucru

;formare semioctet 1

;conversie uniti

etc3:

mov anl jz swap mov mov movc add da mov mov mov movc addc da mov mov anl jz mov mov movc add da mov mov mov

;formare semioctet 2 ;conversie zeci

;formare z+u ;valoarea unui octet este ;zecimal intre 0 si 256 ;acum determinam sutele ;adunam cu carry

etc4:

;formare semioctet 3

;conversie zeci, unitati

;formare z+u

;conversie mii, sute

Dezvoltarea sistemelor cu microcontrolere ______________________________________ 192


movc addc da mov etc5: mov anl jz swap mov mov add da mov mov mov movc addc da mov mov mov movc addc da mov a,@a+dptr a,r_1 a r_1,a 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 ;formare m+s

;formare semioctet 4

;conversie zeci, unitati ;formare z+u

movc

a,@a+dptr

;conversie mii, sute

;formare m+s

;conversie zm

;formatare zm

etc6: mov mov mov etc7: mov and swap add @r0,a inc mov and add mov inc dec dec jpnz mov ret db db db db db db db db db db db db db db r2,#3 r1,r_2 r0,#char0 a,@r1 a,#0f0h a a,#40h r0 a,@r1 a,#0fh a,#40h @r0,a r0 r1 r2 etc7 @r0,#00h

;conversie ASCII

mov

tab_00: tab_10: tab_11: tab_20: tab_21: tab_30: tab_31: tab_32:

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

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

2.5.2

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 low_16: ;ntoarce octeii 0+1 (LSB) ai operandului mov r6,op_1 mov r7,op_0 ret mid_16: ; ntoarce octeii 1+2 ai operandului mov r6,op_2 mov r7,op_1 ret high_16: ; ntoarce octeii 2+3 (MSB) ai operandului mov r6,op_3 mov r7,op_2 ret add_16: ;adaug clr mov addc mov mov addc mov mov addc mov mov addc mov ret add_32: ; adaug patru octei furnizai clr c mov a,op_0 addc a,?add_32?byte + 3 mov op_0,a mov a,op_1 addc a,?add_32?byte + 2 mov op_1,a mov a,op_2 addc a,?add_32?byte + 1 mov op_2,a mov a,op_3 addc a,?add_32?byte mov op_3,a ret 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 de program la operand 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 op_3,?load_32?byte op_2,?load_32?byte + 1 op_1,?load_32?byte + 2 op_0,?load_32?byte + 3

;octet 0 (lsb)

;octet 1 + carry

;octet 2 + carry

;octet 3 (msb) + carry

195 _______________________________________Aplicaii cu microcontrolere de uz general


mov mov subb mov mov subb mov ret 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 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

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 inc mov inc movc mov clr mov subb mov subb mov mul add mov mov adc mov ret sin_tab: DW

A,@DPTR R6,A DPTR A,@DPTR R7,A DPTR R4,A DPTR A,@DPTR R5,A c A,R5 A,R7 A,R4 A,R6 B,?sinus?byte + 1 AB A,R7 ?sinus?byte,A A,B A,R6 ?sinus?byte+1,A

; HIGH sin(HIGH(i))

; LOW sin(HIGH(i))

; HIGH sin(HIGH(i+1))

; LOW sin(HIGH(i+1)) ; sin(HIGH(i+1) sin(HIGH(i))

; panta ; ; panta * LOW(i) ; sin(HIGH(i)) + panta * LOW(i)

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 3 SEEE EEEE Nr.(1.176E-383.40E+38)

S: E: M:

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

|H| [dB]-25
-30 -35 -40 -45 -50 46 47 48 49 50 f [Hz] 51 52 53 54

-20

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

valoarea

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.
maxim a 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 // ADC START extern // ADC START soft

ADCON |= 0x20; // ADCON |= 0x08 // B U C L A while(1) if(fadc) { fadc = 0;

P R I N C I P A L A // // daca avem date de la convertorul ADC // stergem indicatorul sfarsit conversie

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 HOLD redevine 0 Dac CS1 = 0
LOGIC LOGIC

RTC-ul trebuie s incrementeze

registrul de secunde S1, acesta va fi incrementat la o secund dup ce bitul (HOLD trebuie s fie setat mai puin de o secund).
LOGIC . LOGIC ,

atunci HOLD = 0

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

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

i atunci cnd t0 i t1 i

Cnd IRQ =1 atunci este cerut o MASK mpreun cu

microcontrolerului.

Bitul

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 0 0 1 1 t0 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 POWER ON TEST REST 24/12 STOP 0 1 x 1 Setare alarm Citire registru D 0

IRQ 1 Ateapt 125 s IRQ 0

SETAREA CEASULUI SETAREA REGISTRULUI E 30 SEC IRQ HOLD TEST REST 24/12 STOP 0 0 0 0 0 x 0

Citete H10 i H1 Nu Execut altceva

AM09:00 Da 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; // // // // 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 Flag Flag Flag Flag

#define GetTic() tic #define TicDiff(otic)

((tic >= otic) ? (tic-otic) : (0xffff-otic+tic))

213 _______________________________________Aplicaii cu microcontrolere de uz general


extern extern extern extern extern extern extern extern extern extern extern #endif /**************************************************************************\ ** Titlu: RTC.C ** ** Descriere: Implementarea functiilor pt. manipularea RTC-72421 ** ** ** ** Acest modul contine urmatoarele: ** ** Functii pentru citirea si setarea RTC-ului ** ** Definirea unui sir de caractere ASCII cu data ora ... ** \**************************************************************************/ #pragma DEBUG OBJECTEXTEND CODE SYMBOLS #include <reg552.h> #include <string.h> #include <typedef.h> #include <absacc.h> #include "i2c.h" #include "qcount.h" #include "..\main\system.h" xdata char RTC_DATA[22]; // dd/mm/yy hh:mm:ss ww code char days[8][3] = {"Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sa", "??"}; bit fRTC; bit fTIC; bit fF1; bit fF2; //bit onTicRTC; idata word tic; idata word secF1=0; idata word secF2=0; bit RTC_busy(void); void RTC_init(void); void RTC_clr(void); void RTC_read(void); // // // // // // // // // // // // 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 citire bit BUSY initializare RTC stergere date din RTC citire RTC // folosit pentru verificarea functinarii RTC-ului bit RTC_busy(void); void RTC_init(void); void RTC_clr(void); void RTC_read(void); void void void void void void void setRTCday(byte val); setRTCmon(byte val); setRTCyear(byte val); setRTCweek(byte val); setRTChour(byte val); setRTCmin(byte val); setRTCsec(byte val); // // // // // // // // // // // citire bit BUSY initializare RTC sterger date RTC citire date RTC setare setare setare setare setare setare setare zi luna an zi din saptamana ora minute secunde

extern idata byte RTC_ck;

\************************************************************************* Tratarea intreruperilor de la RTC *************************************************************************/ void int_rtc(void) interrupt 2 using 1 { tic++; // contor ticuri fTIC = 1; // TIC la fiecare 1/64sec // contor de intarziere 1 if(secF1) if(!(--secF1)) // decrementam timer 1 pana la 0 fF1 = 1; // a ajuns la zero -> setam flagul fF1 // contor de intarziere 2 if(secF2) if(!(--secF2)) // decrementam timer 2 pana la 0 fF2 = 1; // a ajuns la zero -> setam flagul fF2 if(!(tic && 0x3f)) // echivalent cu if(!(tic % 64)) fRTC = 1; // flag 1 sec RTC_ck = 2; } \************************************************************************* Citim datele din RTC si le formatam sub forma unui sir ASCIIZ cu urmatoarea structra: dd/mm/yy hh:mm:ss ww. ^ ^ | +-- se inscrie \0 +-------- din secunda in secunda se va inlocui cu *************************************************************************/ // supraveghere functionare RTC cu timer 0

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 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) 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) // d10 // d1 // m10 // m1 // y10 // y1 // h10 // h1

// m10 // m1 // s10 // s1

// // //

0x00; // = 0x04; // = 0x08; // = 0x0c; // 0x00; // 0x04; //

// // // }

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; XBYTE[regF_RTC] = 0x07; // INT1 on falling edge // Enable extarnal interrupt 1 (RTC) // 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 INT 7 SCL 6 SDA 5 IRQ

32.768kHz 2 OSCO
3 A0

330 330

SCL 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 D3 D5 liber liber liber Timer T1 T0 D0 D2 D4 01h 02h 03h 04h 05h 06h 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: citirea de la adresele 05h i 06h se va face nemascat; 3 0 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: contorizare; 6 0 1 memorarea i meninerea ultimelor valori ale contorilor. Indicator STOP: contorizare; 7 0 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 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) 6

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

1 = setare 1 = setare 1 = setare 1 = setare 1 = setare 1 = setare 1 = setare rezervat.

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 A Word Address A D ate
n octei

R/ W a) Scriere n RTC

autoincrementare adres

Confirmare de la slave S Slave Address 0 A Word Address A S Slave Address 1 A D ate


n octei

R/ W

Neconfirmare de la slave D ate NA P

R/ W

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 A D ate
n octei

D ate

R/ W

autoincrementare adres

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 0 0 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 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 AIN1 AIN2 AIN3 00: 4 intrri AIN2 AIN3 + channel 2 channel 0 channel 1 channel 2 channel 3 AIN1 AIN0 + + channel 0

2 3

channel 1

4,5

01: 3 intrri difereniale AIN0 AIN1 AIN2 AIN3 + channel 0 channel 1 channel 2 AIN0 AIN1 AIN2 AIN3 + channel 0

channel 1

6 7

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

b7 1

Adresa slave b6 b5 0 1

b4 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 b2 0 = Protecie validat b1 x b0 x

Atenie!

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 a 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 START R/W a) Scriere octet ACKL DEV SEL START BYTE ADDR ACKL DATA IN 1 ACKL DATA IN N-1 DATA IN N STOP b) Scriere paginat i multioctet ACKL NACKL ACKL DATA IN 2 ACKL BYTE ADDR DATA IN STOP

R/W

DEV SEL START R/W

DATA OUT STOP

c) Citire de la adres curent a unuia sau mai muli octei ACKL ACKL ACKL NACKL

DEV SEL START R/W

BYTE ADDR

DEV SEL START R/W

DATA OUT STOP

d) Citirea de la o adres oarecare a unuia sau mai muli octei ACKL ACKL ACKL

ACKL

DEV SEL START R/W

BYTE ADDR

DEV SEL START R/W ACKL

DATA OUT 1 STOP NACKL

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 0 1 1 0 1 0 1 A2 A2 A1 A1 A0 A0 LSB R/W R/W

PCF8574A 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


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

IICNextByte:

; ; ; ; IICNVM_Delay1: IICNVM_Delay2: ; IICSkipDelay:

;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 Segment Code Unit Rseg IICIntCode

;Vector intrerupere SIO1 ;selectare RegisterBank 1

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

; ; ; ; ; ; ; ; ; ;

; ; ; ; ; ; ; ; State20:

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


; ; * 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 1 ;Decrementare contor date ;Slavare date rec. ;Actualizare pointer date ;2 + 1 + 2 + 1 + 1 + 1

; ; ; ; ; ; ; ; ; FetchData:

; ; ; ; ; ; ; ; ; ; ;

********************************************************* * 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 4 ;2 + 2 + 4

; ; ; ; ; ; ; ;

; ; ; ; ; ; ; State60: ; ; ; ; ; ; ; ; ; ; State68:

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


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

; ; ; ; ; ; ; ; State80:

; ; ; ; ; ; ; ; State88:

; ; ; ; ; ; ; ; ; SetupBlock2:

; ; ; ; ; ; ; ;

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


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

; ; ; ; ; ; ; SendStart:

; ; ; ; ; ; ; ; SendStop:

; ; ; ; ; ; ; ; ; ; ; SendData:

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

; ProceedSend:

; SendAccExit: ClrSiExit: SIO1Exit:

; ; ; Init_Slave: ; ; ; ; ; ; ; ; ; ; ; ; Receive_Slave:

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 8 /* 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; 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 // identificam fronturile cresctoare */ // identificam fronturile descresctoare */

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

PWM

T0

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 Formator TTL start

cos t

RESOLVER

a) Msurarea n bucl deschis sin(t+) sin

MDAC cos sin(-)

sint

cos(t+)

cos

MDAC sin ROM

VCO

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 6...10V DZ5V6 BD135 5V 1A 8...10V IN OUT GND 5V 1A 8...10V LM323 IN OUT GND 5V 3A

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
2 IN

V IN =1060V

MAX777

VIN

V SW

V OUT =5V/5A
50H 2K8

10H

LT1074
1V TO3
C

1 I LI M 7 ON/OFF PGND 4

LX 5 OUT AGND 3 6

FB 4 2K2

V OUT =5V 240mA

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 1 AC2 V OU T 6 V SE N SE 5 R2 5V

MAX610
4 V SET OUV 3 Reset C

V2

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 ; ORG 8000h START: MOV SJMP BIT DATA DATA DATA EQU P3.0 30h 31h 32h P4 ;Pin recepie. ;Octet superior rezultat timer. ;Octet superior rezultat timer. ;Valoare final vitez de transmisie. ;Port afiare pentru depanare.

Vectori ntreruperi i reset ACALL AutoBaud Display,Brate START ;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 AB0: JB SETB JB JNB MOV MOV JB JB SJMP CLR CLR MOV CmpLoop: MOV MOV MOVC DEC CJNE SJMP JC DJNZ SJMP MOV MOVC CJNE SETB JC DJNZ MOV CLR RRC MOV RET CharH,#0 CharL,#0 RX,AB0 TR0 TF0,AB3 RX,AB1 CharH,TH0 CharL,TL0 TF0,AB3 RX,AB2 AB1 TR0 TF0 BRate,#19 ;Initializare resultat timer.

;Ateptare bit de start. ;Start timer. ;Verificare overflow timer. ;Verificare front cresctor pe RxD. ;Capturare valoare timer. ; ;Verificare overflow timer. ;Verificare front descresctor pe RxD. ;Repetare msurare. ;Depire timp maxim de msurare; verificare resultat ;Oprire timer i tergere indicatori. ;Setare tabel pointeri.

AB1:

AB2:

AB3:

Cmp1:

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 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. A,BRate C A BRate,A ;Comparare complet

CmpLow:

Cmp2: CmpMatch:

;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 PP P1 P2 CIN VCOUT SIN CX CX INH R1 R2 3 4 14 6 470p 7 5 11 12 100K 470p 7 5 11 12 100K C Tr

Linie 220V
Tr C

3 4 14 6

CIN VCOUT SIN CX CX INH R1 R2

PP P1 P2

1 2 13 100K 100n 9 10 OUT 15

4046
IN 9
10 15 VCOIN DEMO ZEN

4046
VCOIN DEMO ZEN

fP=10kHz vitez=300 baud

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 interfa RS 232 RS 422 RS 485 Distan legtur 7 m 1200 m 1200 m Numr Numr emitoare receptoare pe un canal pe un canal 1 1 32 1 32 32 Semnal tensiune tensiune 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 Sfrit cadru Spaiu intermediar sau cadru suprancrcare

Start cadru Spaiu intermediar CADRU CERERE DE DATE Cmp arbitrare Cmp control Cmp CRC Sfrit cadru

Cmp confirmare Spaiu intermediar sau cadru suprancrcare

Start cadru Cadru date CADRU EROARE Indicator eroare Suprapunere indicatori eroare Sfrit cadru sau delimitator eroare ori suprancrcare

Cmp confirmare Spaiu intermediar sau cadru suprancrcare

Delimitator

CADRU SUPRANCRCARE Indicator suprancrcare Suprapunere indicatori suprancrcare Delimitator

Spaiu intermediar sau cadru suprancrcare

Cadru

SPAIU INTER-CADRE RECEPTOR

Cadru

Pauz

Magistral inactiv

Cadru

SPAIU INTER-CADRE EMITOR

Cadru

Pauz

Suspendare transmisie

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: CANCON: CANSTA: registru de date; registru de control funcionare i ntreruperi; 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 0Ah 0Bh 0Ch 0Dh 0Eh 0Fh 10h 11h 12h 13h 14h 15h 16h 17h 18h 19h 1Ah 1Bh 1Ch 1Dh 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

Identificator (DSCR0) Bit RTR. Cod lungime mesaj (DSCR1) Octet 1 Octet 2 Octet 3 Octet 4 Octet 5 Octet 6 Octet 7 Octet 8 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.
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 .

TM

RA

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

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

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.
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. BS ES TS RS TCS TBS DO Tabelul 3.5 RBS

BS

ES

TS

RS

TCS

TBS

DO

RBS

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 n stare de iniializare (RR=1), amplificatoarele de ieire sunt flotante. Structura registrului OCR este prezentat n tabelul 4.11.

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 390 6N137 0V 390 +5V TxD RxD V ref RS 100n +5V CTX1 +5V 390 CRX0 6k8 CRX1 3k6 100n V SS 6N137 390

PCA82C250 Transceiver CAN


124 CANH CANL 124

Figura 3.9. Interfaarea CAN cu linia de transmisie

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 /* LCCD #define #define #define #define #define #define #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

=============================================================== */ 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. Microelectronica,

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 with on-chip CAN, Product

SJA1000 Stand-alone CAN controller, Preliminary specification, Philips, 1997 Application of the P8xC592 microcontroller with CANinterface, HKI/AN 91014, Hamburg, 1992. Extended Frame Format - A New Option of the CAN Protocol (CAN Protocol Specification Vers. 2.0 A+B), HAI/AN 92 002, Hamburg, 1993

P.Buehring .a. H.C. Reuss

You might also like