Sunteți pe pagina 1din 34

1. INTRODUCERE N MICROCONTROLERE 1.

1 Definiia microcontrolerului Un microcontroler este un circuit realizat pe un singur chip care conine tipic: - unitatea central (CPU); - generatorul de tact (la care trebuie adugat din exterior un cristal de cuar sau n aplicaii mai puin pretenioase, un circuit RC); - memoria volatila (RAM); - memoria nevolatil (ROM /PROM/ EPROM / EEPROM); - dispozitive I/O seriale i paralele; - controler de ntreruperi, controller DMA, numrtoare / temporizatoare (timers), convertoare A/D i D/A, etc.; - periferice. 1.2 Caracteristicile microcontrolerului Caracteristicile unui microcontroler sunt: - memoria program; - memoria de lucru (RAM); - numrul de pini de intrare / ieire; - frecvena (sau viteza) de lucru; - posibilitile de comunicare; - numrul de module de numrare / temporizare i organizarea lopr din punct de vedere al numrului de bii; - memoria de date (EEPROM); - modul de conversie analogic numeric; - numrul de comparatoare analogice; - tipul capsulei; - numrul surselor de ntreruperi; - tensiunea de alimentare; - consumul de putere; - temperatura de lucru. 1.3 Domeniile de aplicaii ale microcontrolerului n general domeniile de aplicaii ale microcontrolerului sunt: - industrie: automatizri, controlul micrii, roboi, supravegherea i controlul mrimilor mecanice, electrice, de mediu, etc.; - industria auto: controlul motorului, ABS (Auto Braking System), transmisie, suspensii, aer condiionat, etc.; - aparatura electro-casnic; - managementul cldirilor; - telecomunicaii; - industria IT: calculatoare i periferice; - industria de jucrii. 1

1.4 Arhitectura unui microcontroler Arhitectura de baz a unui microprocesor poate fi: von-Neuman, Harvard, Harvard modificat. Arhitectura Von Neuman Aceast arhitectur folosete un singur bloc de memorie pentru instruciuni i date i o singur magistral de comunicaie, rezultnd o vitez mic de transfer a informaiilor i o vitez de prelucrare a unitii de calcul reduse (fig. 1).

Fig. 1. Principiul arhitecturii von-Neuman Arhitectura Harvard Aceast arhitectur utilizeaz memorie pentru program i memorie pentru date i respectiv magistrale separate pentru adrese i date (fig. 2). Arhitectura Harvard prevede un bus separat pentru date i instruciuni. Cnd codul instruciunii se afla pe bus-ul de instruciuni, pe bus-ul de date se afla datele instruciunii anterioare. Structura MC este mai complex, dar performanele de viteza sunt mai bune.

Fig. 2. Principiul arhitecturii Harvard 2

Schema bloc a unui microcontroler este prezentat n figura 3.

Fig. 3. Schema bloc a unui microcontroler Unitatea central de procesare Unitatea aritmetic i logic (Arithmetic Logic Unit - ALU) i unitatea de control (Control unit) formeaz unitatea central de procesare Unitatea aritmetic i logic are rolul de a efectua operaiile aritmetice i logice asupra operanzilor ce ii sunt furnizai. Modul de implementare al acestui bloc este transparent utilizatorului. Unitatea de control este responsabil cu decodificarea codului operaiei coninut de codul unei instruciuni. Pe baza decodificrii unitatea de control elaboreaz semnale pentru comanda celorlalte blocuri funcionale pentru a finaliza executarea unei instruciuni. Modul de implementare al acestui bloc este de asemenea transparent utilizatorului. Fiecare MC are un controler de ntreruperi care admite att intrri din exterior ct i de la modulele interne. Unele MC dispun de un controler DMA propriu. Unitatea central de procesare conine un set de registre interne, similare unor locaii de memorie, folosite pentru memorarea unor date des apelate sau pentru programarea unor anumite funcii. Diferitele familii de MC folosesc seturi diferite de registre. Exista ns cteva registre comune: 3

- A (Accumulator) - registrul acumulator - este folosit deseori pentru a stoca un operand i rezultatul operaiei aritmetice sau logice; - PC (Program Counter) - registru numrtor de program - este registrul care stocheaz adresa urmtoarei instruciuni de executat. Dup un RESET (iniializarea MC), registrul PC se ncarc dintr-o locaie de memorie numit vector de reset. Aceast locaie conine adresa primei instruciuni de executat. PC este incrementat automat la execuia unei instruciuni; - SP (Stack Pointer) - registrul indicator de stiv - coninutul acestui registru indic adresa curent a stivei. Stiva reprezint o zon de memorie accesibil rapid n care se depun temporar informaii importante n desfurarea programului. Stiva este definit de obicei n RAM. Implementarea accesului presupune existena unui registru de adresare (SP) i a mecanismului de memorare declanat de instruciuni specifice (instruciunile PUSH/POP). Unitatea central execut instruciunile pe care le primete prin magistrala de date din memoria program. Structura Harvard este posibil i rspndit la MC pentru c de regul instruciunile sunt stocate n memoria ROM, iar datele n cea RAM. Magistrala de date i cea de adrese pot fi separate sau multiplexate. Magistralele pot s nu fie disponibile n exterior (Motorola 6805) sau pot fi disponibile n exterior direct (MCS-51) sau multiplexate (MC pe 16 sau 32 de bii). Un aspect important ce se reflecta n arhitectura unui MC este modul de programare. Prin arhitectur nelegem felul n care sunt dispuse resursele unui MC. Cu cat structura, funcionalitatea i accesul la acestea sunt mai profund standardizate i simetrizate, cu att numrul de instruciuni de care dispune MC este mai redus i viteza de execuie a programelor creste. Conceptul CISC (Complex Instruction Set Computer) pe baza cruia sunt construite majoritatea MC, prevede existena unui numr mare de instruciuni (tipic >80), ceea ce face mai uoar munca programatorului. Multe din instruciuni sunt specializate, adic se pot folosi doar n anumite moduri de adresare sau cu anumite registre. Evoluia MC este spre arhitectura RISC (Reduced Instruction Set Computer), n cadrul creia un MC are un numr mic de instruciuni. Avantajele sunt un chip mai mic, cu un numr de pini mai mic, cu un consum mai redus i cu o vitez mai mare. Instruciunile sunt simetrice, adic pot fi folosite la fel in orice mod de adresare sau cu orice registru, nu au excepii sau restricii. In prezent un MC este cu mai mult dect o arhitectura RISC, el este cu o arhitectura SISC (Specific ISC). Instruciunile sunt specifice pentru a lucra optim cu dispozitivele I/O, permit manipularea la nivel de bit i sunt mai puine instruciuni de uz general, aa cum ntlnim la microprocesoarele 8086, 68000 etc. n general MC cu arhitectura CISC dispun de un numr redus de registre. Acestea au funcii determinate (acumulator, registru index, etc.), iar MC cu arhitectura RISC dispun de un numr mai mare de registre cu un mare grad de ortogonalitate ceea ce nseamn c pot fi folosite simetric n orice mod de adresare (ex. ATMEL AVR are 32 de registre). Registrele interne pot avea diferite dimensiuni, astfel registrele acumulator au dimensiunea egal cu cea a magistralei de date (8, 16 sau 32 bii). Registrul numrtor de program are dimensiunea egal cu cea a magistralei de adrese. Registrul indicator de stiv poate avea dimensiunea mai mic dect a magistralei de adrese permind localizarea stivei ntr-o zon restrnsa a memoriei RAM. Exist i MC cu stiv automat, acestea nu au nevoie de indicator de stiv dar au dezavantajul c nu se pot folosi mai mult de 2-4 nivele de stiv (MC din familia PIC). Memoria microcontrolerului 4

Instruciunile care controleaz funcionarea MC sunt stocate ntr-o memorie nevolatil, unde informaiile se pstreaz i dup oprirea i repornirea sursei de alimentare. Rezultatele intermediare i variabilele pot fi nscrise ntr-o memorie volatil, la aceasta este important s se poat face scrierea /citirea rapid i simplu n timpul funcionarii. Memoria RAM (Random Access Memory) este o memorie volatil care poate fi citit sau scris de unitatea central. Locaiile din RAM sunt accesibile n orice ordine. Pe chip, memoria RAM ocup mult loc i implicit costurile de implementare sunt mari. De aceea un MC include de obicei puin RAM. Memoria RAM static alimentat de la baterie se folosete pentru stocarea nevolatil a cantitilor mari de date, la o vitez de acces mare i cu un numr nelimitat de tergeri i renscrieri. Memoria ROM (Read Only Memory) este cea mai ieftin si cea mai simpl memorie i se folosete la stocarea programelor n faza de fabricaie. Unitatea central poate citi informaiile, dar nu le poate modifica. Memoria PROM (Programmable Read Only Memory) este similar cu memoria ROM, dar ea poate fi programat de ctre utilizator. Dup posibilitile de tergere, aceast memorie poate fi: - EPROM (Erasable PROM) care se poate terge prin expunere la raze ultraviolete. MC cu EPROM au un mic geam de cuar care permite ca chip-ul sa fie expus la radiaia ultraviolet. tergerea este neselectiv, adic se poate terge doar ntreaga informaie i nu numai fragmente. Memoria poate fi tearsa i renscris de un numr finit de ori. Programarea EPROM-ului necesit o procedur special, iar MC cu EPROM au nevoie de regul pentru nscrierea EPROM-ului de o tensiune auxiliar, de 12 V de exemplu. Unele MC au incluse circuite de programare a memoriei EPROM, cu ajutorul crora unitatea central poate programa memoria EPROM. n timpul programrii memoria EPROM nu este conectat la magistrala de date i adrese. Unele MC sunt prevzute cu mod special de lucru, n care sunt vzute din exterior ca nite memorii EPROM obinuite i pot fi astfel programate cu orice programator. - EEPROM (Electrically Erasable Programmable Read Only Memory) poate fi tearsa electric de ctre unitatea central, n timpul funcionarii. tergerea este selectiv, iar pentru renscriere trebuie parcuri mai muli pai. Memoria EEPROM echipeaz multe MC, fiind ieftin. n memoria EEPROM se memoreaz un mic numr de parametri care se schimb din timp n timp. Memoria este lent i numrul de tergeri / scrieri este limitat (tipic 10 000). - FLASH este o memorie asemntoare EPROM i EEPROM n sensul c poate fi tearsa i reprogramat n sistemul n care este folosit (fr a fi necesar un sistem dedicat). Are capacitatea unui EPROM, dar nu necesit fereastr pentru tergere. Ca i EEPROM, memoria FLASH poate fi tearsa i programat electric. Memoria FLASH nu permite tergerea individual de locaii, utilizatorul poate s tearg doar ntregul coninut; - OTP (One Time Programmable), - majoritatea productorilor ofer variante de microcontrolere cu o astfel de memorie care este practic o memorie PROM identic intern cu varianta EPROM, dar fr fereastra de cuar pentru tergere (deci i mai ieftine); aceste variante pot fi utilizate ca o alternativ pentru o producie limitat, pn n momentul testrii i validrii finale a codului, moment n care pot fi comandate variantele (mask) ROM propriu-zise, cele mai economice pentru o producie de mas.

Din punct de vedere al locului i modului de programare a memoriilor de tip PROM exist dou concepte: - ICP (In Circuit Programming) - programarea memoriei cnd MC se afl pe placa de cablaj imprimat a aplicatiei; - ISP (In System Programming) - presupune posibilitatea de reprogramare n funcionare a sistemului. De exemplu la autovehiculele comandate de MC, schimbarea tipului benzinei sau schimbarea unei legi privitoare la poluare pot fi actualizate n programul MC fr ca acesta s fie scos din autovehicul. Tipul de memorie i capacitatea memoriei din echiparea unui MC sunt caracteristici particulare fiecrui tip de circuit. Printre alte diferene, aceti parametri sunt diferii pentru membrii unei aceleiai familii de MC. Pentru a aprecia un MC sub aspectul componentei memorie este necesar sa se considere urmtoarele caracteristici: - varietatea tipurilor de memorie pe chip: RAM, ROM / OTP / EPROM / EEPROM / FLASH; - capacitatea memoriei aflat pe chip; - uurina cu care se poate programa (programare n circuit sau nu, necesitatea unor tensiuni de programare suplimentare). Dispozitive de intrare / ieire (I/O) Dispozitivele I/O realizeaz legtura MC cu exteriorul i sunt vzute de unitatea central ca porturi. Modulele I/O pot fi seriale sau paralele. Fiecare modul transfer date cu exteriorul prin intermediul registrului de date (RD). Modulul este programat (configurat) de unitatea central prin intermediul unui registru de comenzi (RC) i se poate citi starea modulului prin registrul de stare (RS). Prin RS se pot genera ntreruperi ctre unitatea central. Registrele modulelor I/O pot fi vzute de UC ca locaii de memorie (la familia Motorola) sau ca dispozitive de I/O ntr-un spaiu de adresare separat (MCS 51). Sub numele de dispozitiv I/O, ntr-o abordare generalizat, sunt cuprinse principalele interfee ale MC (timer, canal serial UART) i linii I/O grupate n porturi paralele de uz general. Acelai nume generic poate acoperi i interfeele speciale ntlnite n configuraii particulare de MC (convertor A/D, interfaa serial sincron, interfaa LCD, interfaa USB, etc). Alocarea adreselor (mapare) pentru apelarea porturilor de ctre unitatea central se poate face: - fie n spaiul de memorie; - fie ntr-un spaiu propriu. Cele doua metode sunt exemplificate la MC produse de Motorola i la cele produse de Intel. La MC Motorola dispozitivele I/O ocup adrese ntr-un spaiu comun cu memoria, ceea ce atrage dup sine reducerea numrului de locaii de memorie. MC de la Intel folosesc un semnal care indic dac la adresa curent se apeleaz o locaie de memorie sau un dispozitiv I/O. Avantajele maprii n spaii separate: - metoda nu este susceptibil de a provoca erori soft deoarece se folosesc instruciuni diferite pentru a accesa memoria i dispozitivele I/O; - dispozitivele I/O nu ocup spaiu de memorie; - decodificatorul de adrese pentru dispozitivele I/O este mai simplu deoarece spaiul de adresare al dispozitivelor I/O este mai mic.

Dezavantaje ale maprii n spaii separate: - instruciunile I/O sunt mai puin flexibile n comparaie cu instruciunile de lucru cu memoria; - instruciunile I/O nu permit folosirea modurilor de adresare folosite n lucrul cu memoria. Avantajul maprii n spaiu comun: - toate instruciunile de lucru cu memoria i toate modurile de adresare sunt utilizabile i n tratarea dispozitivelor I/O (programarea operaiilor I/O este foarte flexibil). Dezavantajele maprii n acelai spaiu: - este susceptibil la erori software; - spaiul de adresare disponibil pentru memorie este mai mic. Avantajul maprii ntr-un spaiu comun este acela c se poate opera cu porturile la fel ca i cu o locaie de memorie; multe operaii aritmetice i logice folosesc operanzi direct de la port, datele pot fi mutate ntre porturi cu o singur instruciune, coninutul unui port poate fi citit, incrementat i rezultatul scris din nou la port de asemenea cu o singur instruciune. Sistemul de ntreruperi Sistemul de ntreruperi reprezint mecanismul ce asigur sincronizarea funcionarii unitii centrale cu evenimentele. Acest mecanism asigur implementarea unui rspuns prompt i specific al sistemului la orice cerere de ntrerupere. Muli dintre productori au realizat pentru diversele familii de microcontrolere variante constructive care difer uneori substanial unele fa de altele, scopul fiind fie acela al simplificrii sistemului, fie acela al asigurrii unor facilitai ct mai adecvate aplicaiilor pentru care au fost proiectate respectivele microcontrolere. Managementul puterii Pentru aplicaiile n care consumul de energie de la sursa de alimentare este critic sunt implementate sisteme prin care pot fi dezactivate temporar parte din modulele componente. Economia de energie este eseniala n cazul alimentarii de la baterii. Prin intrarea n starea de economie de energie memoria RAM nu-i schimb coninutul i ieirile nu-i schimb valorile logice. Sistemul de economie de energie ofer dou moduri de operare care difer prin numrul componentelor dezactivate. Aceste moduri sunt numite Idle, Power Down la MC Intel i Wait, Stop la MC Motorola. Intrarea n unul din modurile de operare cu economie de energie se face prin comenzi software. MC Motorola dispun de instruciuni care determin intrarea n mod Wait sau Stop. MC Intel intr n mod Idle sau Power Down prin controlul unor bii din registrul PCON (Power Control Register). n ambele moduri de operare este ngheat funcionarea unitii centrale.

2. MICROCONTROLERUL PIC16F84 2.1 Introducere PIC16F84 aparine unei clase de microcontrolere de 8 bii cu arhitectur RISC. Structura lui general este artat n schia urmtoare reprezentnd blocurile de baz. PIC16F84 are un numr total de 18 pini i poate avea o capsul de tip DIP18 (Dual In Package) dar se poate gsi de asemenea i ntr-o capsul SOIC (Small-Outline Integrated Circuit) sau SSOP (Shrink small-outline package) care sunt circuite SMD (Surface Mount Devices).

a.

b.

Fig. 4. Semnificaia pinilor: capsule PDIP i SOIC; b - capsul SSOP Semnificaia pinilor este urmtoarea (fig. 4a): - 1 - RA2 - al treilea pin la portul A; - 2 - RA3 - al patrulea pin la portul A; - 3 - RA4/TOCKI - al patrulea pin la portul A. TOCKI care funcioneaz ca timer se gsete de asemenea la acest pin; - 4 - MCLR - reseteaz intrarea i tensiunea de programare Vpp a microcontrolerului; - 5 - VSS - alimentare, mas; - 6 - RB0/INT - pin de zero la portul B. Intrarea INT (ntrerupere) este o funcie adiional; - 7 - RB1 - primul pin la portul B; - 8 - RB2 - al doilea pin la portul B; - 9 - RB3 - al treilea pin la portul B; - 10 - RB4 - al patrulea pin la portul B; - 11 - RB5 - al cincilea pin la portul B; - 12 - RB6 - al aselea pin la portul B. Linia de 'Clock' n mod programare; - 13 - RB7 - al aptelea pin la portul B. Linia 'Data' n mod programare; - 14 - VDD - polul pozitiv al sursei de alimentare; - 15 - OSC2/CLKOUT - pin desemnat pentru conectarea la un oscilator; - 16 - OSC1/CLKIN - pin desemnat pentru conectarea la un oscilator; - 17 - RA0 - primul pin la portul A; - 18 - RA1 - al doilea pin la portul A. Nu are funcie adiional.
Schema funcional a microcontroler-ului este prezentat n figura 5.

Fig. 5. Schema funcional a microcontroler-ului PIC16F84

2.2 Generatorul de ceas oscilatorul


Circuitul oscilator este folosit pentru a da microcontroller-ului un ceas-clock. Ceasul este necesar pentru ca microcontrolerul s execute programul sau instruciunile din program.

Fig. 6. Conectarea oscilatotului (clock-ului)

2.3 RESET-ul
Resetul este folosit pentru a pune microcontrolerul ntr-o condiie cunoscut. Aceasta nseamn practic c microcontrolerul poate s se comporte incorect n unele condiii nedorite. Pentru a continua s funcioneze corect trebuie resetat, nsemnnd c toi registrii vor fi pui ntr-o stare de start. Resetul nu 9

este folosit numai cnd microcontrolerul nu se comport cum vrem noi, dar poate de asemenea s fie folosit cnd se ncearc un montaj ca o ntrerupere ntr-un program de execuie sau cnd se pregtete un microcontroler de a citi un program.

Fig. 7. Resetarea microcontroler-ului Microcontrolerul PIC16F84 are cteva surse de reset: a) Reset la alimentare, POR (Power-On Reset); b) Reset n timpul lucrului obinuit prin aducerea unui zero logic la pinul MCLR al microcontrolerului; c) Reset n timpul regimului SLEEP; d) Reset la depirea timer-ului watchdog (WDT); e) Reset n timpul depirii WDT n timpul regimului SLEEP. Cele mai importante resurse de reset sunt a) i b). Prima are loc de fiecare dat cnd este alimentat microcontrolerul i servete la aducerea toturor regitrilor la starea iniial a poziiei de start. A doua este pentru a aduce un zero logic la pinul MCLR n timpul operaiei normale a microcontrolerului. Este des folosit n dezvoltarea de programe. n timpul unui reset, locaiile de memorie RAM nu sunt resetate. Ele sunt necunoscute la alimentare i nu sunt schimbate la nici un reset. Spre deosebire de acestea, regitrii SFR sunt resetai la o stare iniial a poziiei de start. Unul din cele mai importante efecte ale resetului este setarea contorului de program (PC) la zero (0000h), ceea ce permite programului s nceap executarea de la prima instruciune scris.

2.4 Unitatea central de procesare


Unitatea de procesare central (CPU) este creierul microcontrolerului. Aceast parte este responsabil cu gsirea i aducerea (citirea din memorie)-fetching instruciunii corecte ce trebuie executat, cu decodarea acelei instruciuni, i n final cu executarea ei. Unitatea de procesare central conecteaz toate prile microcontrolerului ntr-un ntreg. Desigur, funcia sa cea mai important este s decodeze instruciunile de program. Cnd programatorul scrie un program, instruciunile au o form clar ca MOVLW 0x20. Totui, pentru ca microcontrolerul s neleag aceasta, aceast form de 'scrisoare' a unei instruciuni trebuie tradus ntr-o serie de zero-uri i unu-uri ce se numete opcode. Aceast tranziie de la o scrisoare la o form binar este fcut de translatori ca translatorul assembler (cunoscut ca i assembler sau asamblor). Instruciunea astfel adus-fetched din memoria programului trebuie s fie decodat de unitatea de procesare central. Putem apoi selecta din tabela tuturor instruciunilor un set de aciuni ce execut o sarcin desemnat definit de instruciune. Pentru c instruciunile pot s conin n ele asignri ce cer diferite transferuri de date dintr-o memorie n alta, din memorie la porturi, sau alte calcule, CPU trebuie s fie conectat cu toate prile microcontrolerului. Aceasta este posibil printr-un bus de date i un bus de adrese. 10

Fig. 8. Unitatea central de procesare

Unitatea aritmetic i logic


Unitatea de logic aritmetic este responsabil de executarea operaiilor ca adunarea, scderea, mutarea (la stnga sau la dreapta ntr-un registru) i de operaiile logice. Mutarea datelor ntr-un registru se mai numete 'shifting'- transferare. PIC16F84 conine o unitate logic aritmetic de 8 bii i regitri de lucru de 8 bii.

Fig. 9. Extras din schema boc a microcontroler-ului 11

n instruciunile cu doi operanzi, n mod obinuit un operand este n registrul de lucru (registrul W), iar cellalt este unul din regitri sau o constant. Prin operand nelegem coninutul asupra cruia se fac unele operaii, iar un registru este oricare din regitrii GPR sau SFR. GPR este o prescurtare de la 'General Purposes Registers'-Regitri cu Scopuri Generale, iar SFR de la 'Special Function Registers'Regitri cu Funcie Special. n instruciunile cu un operand, un operand este fie registrul W fie unul din regitri. Pe lng operaiile aritmetice i logice, ALU controleaz biii de stare (bii gsii n registrul STATUS). Executarea unor instruciuni afecteaz biii de stare, de care depinde rezultatul nsui. Depinznd de ce instruciune este executat, ALU poate afecta valorile biilor Carry (C), Digit Carry (DC), i Zero (Z) n registrul STATUS. Registru STATUS

bit 0 C (Carry) Transfer Bit care este afectat de operaiile de adunare, scdere i transfer. 1= transferul produs din bitul cel mai nalt al rezultatului 0= transferul nu s-a produs Bitul C este afectat de instruciunile ADDWF, ADDLW, SUBLW, SUBWF. bit 1 DC (Digit Carry) DC Transfer Bit afectat de operaiile de adunare, scdere i transfer. Spre deosebire de bitul C, acest bit reprezint transferul din al patrulea loc rezultat. Este setat de adunare cnd se ntmpl un transport de la bitul 3 la bitul 4, sau de scdere cnd se ntmpl mprumut de la bitul 4 la bitul 3, sau de transfer n ambele direcii. 1= transfer produs la al patrulea bit conform cu ordinea, al rezultatului. 0= transferul nu s-a produs Bitul DC este afectat de instruciunile ADDWF, ADDLW, SUBLW, SUBWF. bit 2 Z (Zero bit) Indicarea unui rezultat zero. Acest bit este setat cnd rezultatul unei operaii aritmetice sau logice executate este zero. 1= rezultatul egal cu zero 0= rezultatul nu este egal cu zero bit 3 PD (Power-down bit) Bit ce este setat cnd microcontrolerul este alimentat atunci cnd ncepe s funcioneze, dup fiecare reset obinuit i dup executarea instruciunii CLRWDT. Instruciunea SLEEP l reseteaz cnd microcontrolerul intr n regimul consum/uzaj redus. Setarea lui repetat este posibil prin reset sau prin pornirea sau oprirea sursei. Starea poate fi triggerat de asemenea de un semnal la pinul RB0/INT, de o schimbare la portul RB, de terminarea scrierii n EEPROM-ul de date intern, i de watchdog de asemenea. 1= dup ce sursa a fost pornit 0= executarea instruciunii SLEEP

12

bit 4 TO Time-out ; depirea-overflow watchdog-ului. Bitul este setat dup pornirea sursei i executarea instruciunilor CLRWDT i SLEEP. Bitul este resetat cnd watchdog-ul ajunge la sfrit semnalnd c ceva nu este n ordine. 1= depirea-oveflow nu s-a produs 0= depirea-overflow s-a produs bit6:5 RP1:RP0 (Register Bank Select bits-Bii de Selectare a Bancului de Regitri) Aceti doi bii sunt partea superioar a adresei la adresarea direct. Pentru c instruciunile ce adreseaz memoria direct au doar apte bii, ei au nevoie doar de nc un bit pentru a adresa cei 256 bytes adic ci are PIC16F84. Bitul RP1 nu este folosit, dar este lsat pentru expansiuni viitoare ale acestui microcntroler. 01= primul banc 00= bancul zero bit 7 IRP (Register Bank Select bit-Bit de Selectare a Bancului de Regitri) Bit al crui rol este de a fi al optulea bit la adresarea indirect a RAM-ului intern. 1= bancul 2 i 3 0= bancul 0 i 1 (de la 00h la FFh).
Registrul STATUS conine starea aritmetic ALU (C, DC, Z), starea RESET (TO, PD) i biii pentru selectarea bancului de memorie (IRP, RP1, RP0). Considernd c selecia bancului de memorie este controlat prin acest registru, el trebuie s fie prezent n fiecare banc. Bancul de memorie se va discuta mai n detaliu n capitolul Organizarea memoriei. Registrul STATUS poate fi o destinaie pentru orice instruciune, cu oricare alt registru. Dac registrul STATUS este o destinaie pentru instruciunile ce afecteaz biii Z, DC or C, atunci scrierea n aceti trei bii nu este posibil.

Registrul OPTION

bit 0:2 PS0, PS1, PS2 (Prescaler Rate Select bit-Bit Selecie Rat Prescaler) Aceti trei bii definesc bitul de selecie a ratei prescalerului. Ce este un prescaler i cum pot afecta aceti bii funcionarea unui microcontroler va fi explicat n seciunea depre TMRO.

13

bit 3 PSA (Prescaler Assignment bit-Bit de Asignare Prescaler) Bit ce asigneaz prescalerul ntre TMRO i watchdog. 1= prescalerul este asignat watchdogului
0= prescalerul este asignat timer-ului liber (ree-run) TMRO

bit 4 T0SE (TMR0 Source Edge Select bit-Bit Selecie a Frontului Sursei TMR0) Dac este permis de a se triggera TMRO prin impulsurile de la pinul RA4/T0CKI, acest bit determin dac aceasta va fi la frontul descresctor sau cresctor al unui semnal. 1= front cresctor 0= front descresctor bit 5 TOCS (TMR0 Clock Source Select bit-Bit Selecie Surs Ceas TMR0) Acest pin permite timerului liber (free-run) s incrementeze starea lui fie de la oscilatorul intern la fiecare a ceasului oscilatorului, fie prin impulsuri externe la pinul RA4/T0CKI. 1= impulsuri externe 0= ceas intern bit 6 INTEDG (Interrupt Edge Select bit-Bit de Selecie a Frontului ntrerupere) Dac ntreruperea este activat este posibil ca acest bit s determine frontul la care o ntrerupere va fi activat la pinul RB0/INT. 1= front cresctor 0= front descresctor bit 7 RBPU (PORTB Pull-up Enable bit-Bit Enable-Activare Pull-up PORTB)
Acest bit pornete i oprete rezistorii interni 'pull-up'-scoatere la portul B. 1= Rezistori oprire "pull-up" 0= Rezistori pornire "pull-up"

2.5 Porturi
Portul se refer la un grup de pini ai unui microcontroler ce pot fi accesai simultan, sau la care putem seta combinaia dorit de zero-uri i unu-uri, sau de la care putem citi o stare existent. Fizic, portul este un registru n interiorul unui microcontroler ce este conectat cu fire la pinii microcontrolerului. Porturile reprezint conexiunea fizic a Unitii Centrale de Procesare cu lumea exterioar. Microcontrolerul le folosete pentru a monitoriza sau controla alte componente sau aparate. Datorit funcionalitii, unii pini au rol dublu ca RA4/TOCKI de exemplu, care este simultan al patrulea bit la portul A i o intrare extern pentru contorul liber (free-run). Selecia uneia din aceste dou funcii ale pinului se face n unul din regitrii configuraionali. O ilustraie a acesteia este al cincilea bit T0CS n registrul OPTION. Selectnd una din funcii cealalt este dezactivat.

14

Fig. 10. Relaia dintre TRISA i registrul PORTA Toi pinii portului pot fi definii ca intrare sau ieire, conform cu nevoile unui montaj ce este n dezvoltare. Pentru a defini un pin ca pin de intrare sau ca pin de ieire, trebuie scris combinaia corect de zero-uri i unu-uri n registrul TRIS. Dac n locul potrivit este scris "1" logic n registrul TRIS, acel pin este pin de intrare, iar dac este valabil contrariul, este un pin de ieire. Fiecare port are registrul lui TRIS. Astfel, portul A are TRISA la adresa 85h, iar portul B are TRISB la adresa 86h. PORTB PORTB are 8 pini legai la el. Registrul adecvat pentru direcia datelor este TRISB la adresa 86h. Setarea unui bit n registrul TRISB definete pinul portului corespunztor ca pin de intrare, i resetarea unui bit n registrul TRISB, definete pinul portului corespunztor ca pin de ieire. Fiecare pin la PORTB are un rezistor slab intern pull-up (scoatere) (rezistor care definete o linie la unu logic) care poate fi activat prin resetarea celui de-al aptelea bit RBPU n registrul OPTION. Aceti rezistori pull-up se nchid automat cnd pinul portului este configurat ca o ieire. Cnd pornete microcontrolerul 'pull-up-ii sunt dezactivai. Patru pini ai portului PORTB, RB7:RB4 pot cauza o ntrerupere, care se ntmpl cnd starea lor se schimb de la unu logic la zero logic i invers. Numai pinii configurai ca intrare pot cauza aceast ntrerupere s se ntmple (dac fiecare pin RB7:RB4 este configurat ca o ieire, nu va fi generat o ntrerupere la schimbarea strii). Aceast opiune de ntrerupere cu rezistorii 'pull-up' fac mai uoar rezolvarea problemelor din practic, ca de exemplu o tastatur matriceal. Dac rndurile tastaturii sunt conectate la aceti pini, fiecare apsare a unei clape va cauza o ntrerupere. Microcontrolerul va determina care clap este apsat n timp ce se proceseaz o ntrerupere. Nu se recomand s apelai la portul B n timp ce se proceseaz ntreruperea.

Exemplul de mai sus arat cum pinii 0, 1, 2, i 3 sunt declarai ca intrare, i pinii 4, 5, 6 i 7 ca ieire. 15

PORTA PORTA are 5 pini legai la el. Registrul corespunztor pentru direcia datelor este TRISA la adresa 85h. Ca i la portul B, setarea unui bit n registrul TRISA definete de asemenea pinul portului corespunztor ca un pin de intrare, i resetarea unui bit n registrul TRISA definete pinul portului corespunztor ca pin de ieire. Al cincilea pin al portului A are funcie dual. La acel pin se afl de asemenea o intrare extern pentru timer-ul TMRO. Una din aceste dou opiuni este aleas prin setarea sau resetarea bitului TOCS (TMR0 Clock Source Select bit-bit de Selecie a Sursei Ceasului TMRO). Acest pin permite timer-ului TMRO sa-i creasc starea fie de la oscilatorul intern fie prin impulsuri externe la pinul RA4/T0CKI.

Exemplul arat cum pinii 0, 1, 2, 3, i 4 sunt declarai ca intrare iar 5, 6 i 7 ca pini de ieire.

2.6 Organizarea memoriei


PIC16F84 are dou blocuri separate de memorie, unul pentru date i cellalt pentru programe. Memoria EEPROM i regitrii GPR n memoria RAM constituie un bloc, i memoria FLASH constituie un bloc de programe.

Memoria program
Memoria program a fost realizat n tehnologia FLASH ceea ce face posibil de a programa un microcontroler de mai multe ori nainte de a fi instalat ntr-un montaj, i chiar dup instalarea sa dac se ntmpl unele schimbri n program sau parametri de proces. Mrimea memoriei program este de 1024 locaii cu lime de 14 bii unde locaiile zero i patru sunt rezervate pentru reset i pentru vectorul ntrerupere.

Memoria de date
Memoria de date const din memoriile EEPROM i RAM. Memoria EEPROM const din 64 de locaii de opt bii a cror coninut nu este pierdut n timpul opririi sursei de alimentare. EEPROM-ul nu este direct adresabil, dar este accesat indirect prin regitrii EEADR i EEDATA. Pentru c memoria EEPROM este folosit curent la memorarea unor parametri importani (de exemplu, o temperatur dat n regulatoarele de temperatur), exist o procedur strict de scriere n EEPROM ce trebuie urmat pentru a preveni scrierea accidental. Memoria RAM pentru date ocup un spaiu ntr-o hart a memoriei de la locaia 0x0C la 0x4F ceea ce nseamn 68 de locaii. Locaiile memoriei RAM sunt de asemenea denumite regitri GPR care este o abreviere General Purpose Registers-Regitri cu Scop General. Regitrii GPR pot fi accesai indiferent de ce banc este selectat la un moment.

16

Regitri SFR
Regitri ce ocup primele 12 locaii n bancurile 0 i 1 i sunt regitri ai funciei specializate asignat cu unele blocuri ale microcontrolerului. Acetia sunt numii Special Function Registers-Regitri ai Funciei Speciale.

Fig. 11. Organizarea memoriei

Bancuri de Memorie
n afar de aceast diviziune n lungime a regitrilor SFR i GPR, harta memoriei este de asemenea mprit n 'lime' (vezi harta precedent) n dou zone numite 'bancuri'. Selectarea unuia din bancuri se face de biii RPO i RP1 n registrul STATUS-stare.

17

Exemplu: bcf STATUS, RP0


Instruciunea BCF terge bitul RPO (RP0=0) n registrul STATUS i astfel seteaz bancul 0. bsf STATUS, RP0 Instruciunea BSF seteaz bitul RPO (RP0=1) n registrul STATUS i astfel seteaz bancul 1. Uzual, grupurile de instruciuni care sunt adesea n uz, sunt conectate ntr-o singur unitate ce poate fi uor apelat ntr-un program, i a crei nume are o semnificaie clar, aa-numitul Macros-macrocomand. Cu ajutorul lor, selecia dintre dou bancuri devine mai clar i programul mult mai elegibil. BANK0 macro Bcf STATUS, RP0 ;Select memory bank 0 Endm BANK1 macro Bsf STATUS, RP0 ;Select memory bank 1 Endm

Contorul de Program
Contorul de program (PC) este un registru de 13 bii ce conine adresa instruciunii ce se execut. Prin incrementarea sau schimbarea sa (ex. n caz de salturi) microcontrolerul execut instruciunile de program pas-cu-pas.

Stiva
PIC16F84 are o stiv de 13 bii cu 8 nivele, sau cu alte cuvinte, un grup de 8 locaii de memorie de 13 bii lime cu funcii speciale. Rolul su de baz este de a pstra valoarea contorului de program dup un salt din programul principal la o adres a unui subprogram. Pentru ca un program s tie cum s se ntoarc la punctul de unde a pornit, trebuie s napoieze valoarea contorului programului din stiv. Cnd se mut dintr-un program ntr-un subprogram, contorul programului este mpins n stiv (un exemplu de acesta este instruciunea CALL). Cnd se execut instruciuni ca RETURN, RETLW sau RETFIE ce au fost executate la sfritul unui subprogram, contorul programului a fost luat dintr-o stiv, aa ca programul s poat continua de unde a fost oprit nainte de a fi ntrerupt. Aceste operaii de plasare ntr-o i luare dintr-o stiv de contor de program sunt numite PUSH i POP, i sunt numite conform cu instruciunile similare ale unor microcontrolere mai mari.

Programarea n Sistem
Pentru a programa o memorie de program, microcontrolerul trebuie s fie setat pentru un mod de lucru special prin aducerea pinului MCLR la 13.5V, iar sursa de tensiune Vdd trebuie s fie stabilizat ntre 4.5V i 5.5V. Memoria program poate fi programat serial folosind doi pini 'data/clock' ce trebuie s fie mai nti separai de liniile montajului, aa ca s nu apar erori n timpul programrii.

18

Moduri de adresare
Locaiile de memorie RAM pot fi accesate direct sau indirect.

Adresarea Direct
Adresarea Direct se face printr-o adres de 9 bii. Aceast adres este obinut prin conectarea celui de-al aptelea bit al adresei directe a unei instruciuni cu doi bii (RP1, RP0) din registrul STATUS dup cum se arat n figura urmtoarea. Orice acces la regitrii SFR poate fi un exemplu de adresare direct. Bsf STATUS, RP0 ;Bankl movlw 0xFF; w=0xFF movwf TRISA; address of TRISA register is taken from instruction movwf

Fig. 12. Adresarea direct

Adresarea Indirect
Adresarea indirect spre deosebire de cea direct nu ia o adres dintr-o instruciune ci o creeaz cu ajutorul bitului IRP a regitrilor STATUS i FSR. Locaia adresat este accesat prin registrul INDF care de fapt ine o adres indicat de un FSR. Cu alte cuvinte, orice instruciune care folosete INDF ca registrul al ei, n realitate acceseaz datele indicate de un registru FSR. S spunem, de exemplu, c un registru cu scop general (GPR) la adresa 0Fh conine o valoarea 20. Prin scrierea unei valori 0Fh n registrul FSR vom obine un registru indicator la adresa 0Fh, iar prin citirea din registrul INDF, vom obine valoarea 20, ceea ce nseamn c am citit din primul registru valoarea lui fr accesarea lui direct (dar prin FSR i INDF). Se pare c acest tip de adresare nu are nici un avantaj fa de adresarea direct, dar exist unele nevoi n timpul programrii ce se pot rezolva mai simplu doar prin adresarea indirect.

19

Fig. 13. Adresarea indirect Un asemenea exemplu poate trimite un set de date prin comunicaia serial, lucrnd cu bufere i indicatoare (ce vor fi discutate n continuare ntr-un capitol cu exemple), sau s tearg o parte a memoriei RAM (16 locaii) ca n urmtorul exemplu.

Citind datele din registrul INDF cnd coninutul registrului FSR este egal cu zero, ntoarce valoarea zero, i scrie n el rezultatul n operaia NOP (no operation- nu opereaz).

2.7 ntreruperi
ntreruperile sunt un mecanism a unui microcontroler ce i permit s rspund la unele evenimente la momentul cnd se ntmpl, indiferent de ce face atunci microcontrolerul. Aceasta este o parte foarte important, pentru c permite conexiunea microcontrolerului cu lumea de afar. n general, fiecare ntrerupere schimb debitul programului, l ntrerupe i dup executarea unui subprogram (rutine de ntrerupere), continu din acelai punct.

20

Fig. 14. O posibil surs de ntreruperi Registrul de control al unei ntreruperi se numete INTCON i se gsete la adresa 0Bh. Rolul lui este de a permite sau interzice cererile de ntreruperi, i n caz c nu sunt permise, nregistreaz cererile de ntrerupere singulare prin biii lui.

Registru INTCON

bit 0 RBIF (RB Port Change Interrupt Flag bit-bit Stegule de ntrerupere a Schimbrii Portului RB) bit ce informeaz despre schimbrile de la pinii 4, 5, 6 i 7 ai portului B. 1=cel puin un pin i-a schimbat starea 0=nu s-a ntmplat nici o schimbare la vreun pin bit 1 INTF (INT External Interrupt Flag bit-bit Stegule de ntrerupere Extern INT) A avut loc o ntrerupere extern. 1=a avut loc o ntrerupere 0=nu a avut loc o ntrerupere Dac s-a detectat un front cresctor sau descresctor la pinul RB0/INT, (ce este definit cu bitul INTEDG n registrul OPTION), bitul INTF este setat. Bitul trebuie s fie ters n subprogramul ntrerupere pentru a detecta urmtoarea ntrerupere.
21

bit 2 T0IF (TMR0 Overflow Interrupt Flag bit-bit Stegule Depire ntrerupere TMRO) Depirea contorului TMRO. 1=contorul i-a schimbat starea de la FFh la 00h. 0=depirea nu a avut loc Bitul trebuie s fie ters n program pentru ca o ntrerupere s fie detectat. bit 3 RBIE (RB port change Interrupt Enable bit-bit Permite ntreruperea schimbrii portului RB) Permite s aib loc ntreruperi la schimbarea strii pinilor 4, 5, 6, i 7 ai portului B. 1=permite ntreruperi la schimbarea strii 0=ntreruperi interzise la schimbarea strii Dac RBIE i RBIF au fost simultan setate, va avea loc o ntrerupere. bit 4 INTE (INT External Interrupt Enable bit-bit Permite ntrerupere extern INT) Bit ce permite ntreruperea extern de la pinul RB0/INT. 1=ntrerupere extern permis 0=ntrerupere extern interzis Dac INTE i INTF au fost setate simultan, va avea loc o ntrerupere. bit 5 T0IE (TMR0 Overflow Interrupt Enable bit-bit Permite Depire ntrerupere TMRO) Bit ce permite ntreruperile n timpul depirii contorului TMRO. 1=ntrerupere permis 0=ntrerupere interzis Dac T0IE i T0IF au fost simultan setate, va avea loc ntreruperea. Bit 6 EEIE (EEPROM Write Complete Interrupt Enable bit-bit Permite ntrerupere Complet a Scrierii EEPROM) Bit ce permite o ntrerupere la sfritul unei rutine de scriere n EEPROM 1= ntrerupere permis 0= ntrerupere interzis Dac EEIE i EEIF (ce este n registrul EECON1) au fost simultan setate, va avea loc o ntrerupere. Bit 7 GIE (Global Interrupt Enable bit-bit Permite ntrerupere Global) Bit ce permite sau interzice toate ntreruperile. 1=toate ntreruperile sunt permise 0=toate ntreruperile sunt interzise
PIC16F84 are patru surse de ntrerupere: 1. Terminarea scrierii datelor n EEPROM 2. ntrerupere TMR0 cauzat de depirea timer-ului 3. ntrerupere n timpul schimbrii la pinii RB4, RB5, RB6 i RB7 ai portului B. 4. ntrerupere Extern de la pinul RB0/INT al microcontrolerului n general, fiecare surs de ntrerupere are doi bii legai la ea. Unul permite ntreruperea, iar cellalt detecteaz cnd au loc ntreruperi. Exist un bit comun numit GIE ce poate fi folosit pentru a interzice sau permite toate ntreruperile simultan. Acest bit este foarte folositor cnd se scrie un program pentru c permite ca toate ntreruperile s fie interzise pentru o perioad de timp, aa ca execuia unei pri importante a programului s nu fie ntrerupt. Cnd instruciunea ce reseteaz bitul GIE a fost executat (GIE=0, toate ntreruperile interzise), fiecare ntrerupere ce rmne nerezolvat trebuie ignorat. 22

Fig. 15. Explicarea ntreruperilor ntreruperile ce rmn nerezolvate i ce au fost ignorate, sunt procesate cnd bitul GIE (GIE=1, toate ntreruperile sunt permise) va fi ters. Cnd i s-a rspuns ntreruperii, bitul GIE a fost ters, aa c orice ntreruperi adiionale vor fi interzise, adresa de ntoarcere a fost trimis n stiv, iar adresa 0004h a fost scris n contorul programului numai dup aceasta ncepe rspunsul la o ntrerupere! Dup ce este procesat ntreruperea, bitul a crui setare a cauzat o ntrerupere trebuie ters, sau rutina de ntrerupere va fi procesat automat tot mereu n timpul ntoarcerii la programul principal.

Pstrarea coninutului regitrilor importani


Doar valoarea de ntoarcere a contorului programului este nmagazinat ntr-o stiv n timpul unei ntreruperi (prin valoare de ntoarcere a contorului programului nelegem adresa instruciunii ce trebuie executat, dar nu a fost executat pentru c a avut loc ntreruperea). Pstrnd doar valoarea contorului programului adesea nu este suficient. Unii regitri ce sunt n uz n programul principal pot fi de asemenea n uz n rutina de ntrerupere. Dac ei nu sunt reinui, programul principal va obine valori complet diferite n acei regitri n timpul ntoarcerii dintr-o rutin de ntrerupere, ceea ce va cauza erori n program. Un exemplu de asemenea caz este coninutul registrului de lucru W. Dac presupunem c programul principal a folosit registrul de lucru W pentru unele din operaiile sale, i c a pstrat n el o valoare ce este important pentru urmtoarea instruciune, atunci o ntrerupere ce se va ntmpla nainte de acea instruciune va schimba valoarea registrului de lucru W, ce va influena direct programul principal. Procedura de nregistrare de regitri importani nainte de a merge la o rutin de ntrerupere se numete PUSH, n timp ce procedura ce aduce valorile nregistrate napoi, se numete POP. PUSH i POP sunt instruciuni ale altor microcontrolere (Intel), dar sunt att de larg acceptate c o ntreag operaie este numit dup ele. PIC16F84 nu are instruciuni ca PUSH i POP, i ele trebuie s fie programate.

23

Fig. 16. Datorit simplitii i folosirii frecvente, aceste pri ale programului pot fi fcute ca macro-uri. Conceptul unui Macro este explicat n "Limbaj de asamblare program". n urmtorul exemplu, coninuturile regitrilor W i STATUS sunt memorate n variabilele W_TEMP i STATUS_TEMP nainte de rutina de ntrerupere. La nceputul rutinei PUSH trebuie s verificm bancul selectat n prezent pentru c W_TEMP and STATUS_TEMP nu se gsesc n bancul 0. Pentru schimbul de date ntre aceti regitri, instruciunea SWAPF se folosete n loc de MOVF pentru c nu afecteaz starea biilor registrului STATUS. Exemplul este un program asamblor pentru urmtorii pai : 1. Testarea bancului current 2. Stocarea registrului W indiferent de bancul curent 3. Stocarea registrul STATUS n bancul 0 4. Executarea rutinei de ntrerupere pentru procesul de ntrerupere (ISR) 5. Restaureaz registrul STATUS 6. Restaureaz registrul W Dac mai sunt i alte variabile sau regitri ce trebuie stocai, atunci ei trebuie s fie pstrai dup stocarea registrului STATUS (pasul 3), i adui napoi nainte ca registrul STATUS s fie restaurat (pasul 5).

24

Acelai exemplu se poate realiza utiliznd macro-uri, fcnd astfel programul mai eligibil. Macrourile ce sunt deja definite, pot fi folosite pentru scrierea de noi macro-uri. Macro-urile BANK1 i BANK0 ce sunt explicate n capitolul "Organizarea memoriei" sunt folosite cu macro-urile 'push' i 'pop'.

ntrerupere extern la pinul RB0/INT al microcontrolerului ntreruperea extern la pinul RB0/INT este triggerat de frontul cresctor (dac bitul INTEDG=1 n registrul OPTION<6>), sau de frontul descresctor (dac INTEDG=0). Cnd apare semnalul corect la 25

pinul INT, bitul INTF este setat la registrul INTCON. Bitul INTF (INTCON<1>) trebuie resetat n rutina de ntrerupere, aa ca ntreruperea s nu aib loc din nou n timpul ntoarcerii la programul principal. Acesta este un pas important al programului pe care programatorul nu trebuie s-l uite, sau programul va merge constant n rutina de ntrerupere. ntreruperea poate fi nchis prin resetarea bitului de control INTE (INTCON<4>).

ntreruperea n timpul depirii contorului TMRO


Depirea contorului TMRO (de la FFh la 00h) va seta bitul T0IF (INTCON<2>). Aceasta este o ntrerupere foarte important pentru c multe probleme reale se por rezolva folosind aceast ntrerupere. Unul din exemple este msurarea timpului. Dac tim ct timp are nevoie contorul pentru a completa un ciclu de la 00h to FFh, atunci numrul de ntreruperi nmulit cu acea durat de timp va da timpul total scurs. n rutina de ntrerupere unele variabile vor fi incrementate n memoria RAM, valoarea acelei variabile nmulite cu timpul de care are nevoie contorul pentru a contoriza ntr-un ciclu ntreg, va da timpul total scurs. ntreruperea poate fi pornit/oprit prin setarea/resetarea bitului T0IE (INTCON<5>).

ntrerupere pe timpul unei schimbri la pinii 4, 5, 6 i 7 ai portului B


Schimbarea semnalului de intrare la PORTB <7:4> seteaz bitul RBIF (INTCON<0>). Patru pini RB7, RB6, RB5 i RB4 ai portului B, pot triggera o ntrerupere ce are loc cnd starea la ei se schimb de la unu la zero logic, sau viceversa. Pentru ca pinii s fie sensibili la aceast schimbare, trebuie definii ca intrare. Dac oricare din ei este definit ca ieire, ntreruperea nu va fi generat la schimbarea strii. Dac ei sunt definii ca intrare, starea lor curent este comparat cu vechea valoare ce a fost stocat la ultima citire de la portul B. ntreruperea poate fi pornit/oprit prin setarea/resetarea bitului RBIE n registrul INTCON.

ntreruperea la terminarea subrutinei write n EEPROM


Aceast ntrerupere este doar de natur practic. Pentru c scrierea ntr-o locaie EEPROM dureaz cam 10ms (care este o durat lung n termenii microcontrolerului), nu este rentabil de a atepta pn la capt scrierea. Este adugat astfel mecanismul de ntrerupere ceea ce permite microcontrolerului s continue executarea programului principal, n timp ce scrierea n EEPROM este fcut n plan secundar. Cnd scrierea este terminat, ntreruperea informeaz microcontrolerul c scrierea s-a terminat. Bitul EEIF, prin care se face aceast informare, se gsete n registrul EECON1. Producerea unei ntreruperi poate fi interzis prin resetarea bitului EEIE n registrul INTCON.

Iniializarea ntreruperii
Pentru a folosi un mecanism de ntrerupere a unui microcontroler, trebuie fcute unele sarcini pregtitoare. Aceste proceduri sunt pe scurt numite "iniializare". Prin iniializare definim la ce va rspunde microcontrolerul, i ce va ignora. Dac nu setm bitul ce permite o anumit ntrerupere, programul nu va executa un subprogram ntrerupere. Prin aceasta putem obine controlul asupra producerii ntreruperii, ceea ce este foarte folositor.

26

Exemplul de mai sus arat iniializarea unei ntreruperi externe la pinul RB0 al microcontrolerului. Unde se vede unu setat, nseamn c ntreruperea este permis. Producerea altor ntreruperi nu este permis, i toate ntreruperile mpreun sunt interzise pn ce bitul GIE este inut n unu. Urmtorul exemplu arat o cale tipic de a dirija ntreruperile. PIC16F84 are doar o locaie unde adresa unui subprogram ntrerupere este memorat. Aceasta nseamn c mai nti trebuie s detectm ce ntrerupere este la ndemn (dac mai mult de o surs de ntreruperi este disponibil), i apoi putem executa acea parte a programului ce se refer la acea ntrerupere.

2.8 Timer-ul liber TMR0


Timer-ele (temporizatoarele) sunt de obicei cele mai complicate pri ale unui microcontroler, aa c este necesar s rezervm mai mult timp pentru a le explica. Odat cu aplicarea lor este posibil s se creeze relaii ntre o dimensiune real ca "timp" i o variabil ce reprezint starea timer-ului ntr-un microcontroler. Fizic, timer-ul este un registru a crui valoare crete continuu pn la 255, i apoi pornete de la capt: 0, 1, 2, 3, 4...255....0,1, 2, 3......etc. 27

Fig. 17. Aceast incrementare se face n fundalul a tot ceea ce face un microcontroler. Depinde de programator "s gseasc o cale" de cum s profite de aceast caracteristic pentru nevoile lui. Una din ci este s creasc o variabil la fiecare depire a timer-ului. Dac tim ct timp are nevoie timer-ul s fac o rund complet, atunci nmulind valoarea variabilei cu acel timp obinem timpul total scurs. PIC16F84 are un timer de 8 bii. Numrul de bii determin pn la ce valoare contorizeaz timerul nainte de a ncepe s contorizeze de la zero din nou. n cazul unui timer de 8 bii, acel numr este 256. O schem simplificat a relaiei dintre un timer i un prescaler-divizor este reprezentat n diagrama anterioar. Prescalerul este numele acelei pri din microcontroler ce divide ceasul oscilatorului nainte de a ajunge la logica ce crete starea timer-ului. Numrul ce divide un ceas este definit prin trei bii n registrul OPTION. Cel mai mare divizor este 256. Aceasta nseamn de fapt c doar la al fiecare 256-lea ceas, valoarea timer-ului va crete cu unu. Aceasta ne d posibilitatea de a msura perioade de timp mai lungi.

Fig. 18. 28

Dup fiecare numrtoare pn la 255, timer-ul i reseteaz valoarea la zero i ncepe cu un nou ciclu de contorizare pn la 255. n timpul fiecrei tranziii de la 255 la zero, bitul TOIF n registrul INTCON este setat. Dac se permit ntreruperi, de aceasta se poate profita n generarea i n procesarea rutinei de ntrerupere. Depinde de programator s reseteze bitul TOIF n rutina de ntrerupere, aa ca noua ntrerupere, sau noua depire s fie detectate. n afar de ceasul oscilator intern, starea timer-ului poate de asemenea s creasc prin ceasul extern la pinul RA4/TOCKI. Alegerea uneia din aceste dou opiuni se face n registrul OPTION prin bitul TOCS. Dac a fost aleas aceast opiune de ceas extern, va fi posibil s se defineasc frontul unui semnal (cresctor sau descresctor), la care timer-ul s-i creasc valoarea.

Fig. 19. n practic, unul din exemplele tipice ce este rezolvat prin ceas extern i unde timer-ul contorizeaz rotaiile complete ale unui ax al unei maini de producie, ca bobinatorul de transformator de exemplu. S rotim patru uruburi de metal pe axul unui bobinator. Aceste patru uruburi vor reprezenta convexitatea metalic. S plasm acum un senzor inductiv la o distan de 5 mm de captul unui urub. Senzorul inductiv va genera semnalul descresctor de fiecare dat cnd capul urubului este paralel cu capul senzorului. Fiecare semnal va reprezenta o ptrime dintr-o rotaie, i suma tuturor rotaiilor se va gsi n timer-ul TMRO. Programul poate uor citi aceste date din timer printr-un bus de date. Urmtorul exemplu ilustreaz cum s se iniializeze timer-ul la fronturile descresctoare ale semnalului din sursa extern cu un prescaler 1:4. Timer-ul lucreaz n mod "polig-mpingere".

29

Acelai exemplu poate fi realizat printr-o ntrerupere n modul urmtor:

Prescalerul poate fi asignat fie de timer-ul TMRO fie de watchdog. Watchdogul este un mecanism pe care microcontrolerul l folosete s se apere mpotriva blocrii programelor. Ca orice alt circuit electric, la fel i cu microcontrolerul se pot ntmpla defectri, sau unele stricciuni. Din nefericire microcontrolerul are de asemenea un program unde se pot ntmpla probleme. Cnd se ntmpl aceasta, microcontrolerul se va opri din funcionare i va rmne n acea stare pn ce cineva l reseteaz. Din cauza aceasta, a fost introdus mecanismul watchdog. Dup o anumit perioad de timp, watchdogul reseteaz microcontrolerul (de fapt microcontrolerul se reseteaz singur). Watchdogul luceaz pe baza unui principiu simplu: dac se ntmpl depirea timer-ului, microcontrolerul este resetat, i ncepe executarea programului mereu din nou. Astfel, se va ntmpla un reset att n cazul unei funcionri corecte ct i incorecte. Urmtorul pas este prevenirea resetului n cazul unei funcionri corecte, ce se face prin scrierea unui zero n registrul WDT (instruciunea CLRWDT) de fiecare dat cnd se apropie de depire. Astfel programul va preveni un reset ct timp este executat corect. De ndat ce s-a blocat, nu se va scrie zero, va avea loc depirea timer-ului WDT i un reset ce va duce microcontrolerul napoi la funcionarea corect din nou. Prescalerul este acordat cu timer-ul TMRO, sau cu timer-ul watchdogului prin bitul PSA n registrul OPTION. tergnd bitul PSA, prescalerul va fi acordat cu timer-ul TMRO. Cnd prescalerul este acordat cu timer-ul TMRO, toate instruciunile de scriere n registrul TMRO (CLRF TMR0, MOVWF TMR0, BSF TMR0,...) vor terge prescalerul. Cnd prescalerul este asignat timerului watchdog, numai 30

instruciunea CLRWDT va terge prescalerul i timer-ul watchdog n acelai timp. Schimbarea prescalerului este complet sub controlul programatorului, i poate fi schimbat n timp ce se ruleaz programul. Registrul control OPTION

Bit 0:2 PS0, PS1, PS2 (Prescaler Rate Select bit-bit Selectare Rat Prescaler) Subiectul prescaler, i cum afecteaz aceti bii lucrul unui microcontroler va fi abordat n seciunea despre TMRO.
Registrul control OPTION

Bit 0:2 PS0, PS1, PS2 (Prescaler Rate Select bit-bit Selectare Rat Prescaler) Subiectul prescaler, i cum afecteaz aceti bii lucrul unui microcontroler va fi abordat n seciunea despre TMRO.

bit 3 PSA (Prescaler Assignment bit-bit Asignare Prescaler) Bit ce asigneaz prescalerul ntre TMRO i timer-ul watchdog). 1=prescalerul este asignat la timer-ul watchdog 0=prescalerul este asignat la timer-ul free-liber bit 4 T0SE (TMR0 Source Edge Select bit-bit Selectare Front Surs TMRO)
Dac triggerul TMRO a fost activat cu impulsuri de la pinul RA4/T0CKI, acest bit va determina dac va fi la frontul cresctor sau descresctor al semnalului. 1=front descresctor 0=front cresctor

31

bit 5 T0CS (TMR0 Clock Source Select bit-bit Selectare Surs Ceas TMRO) Acest bit permite unui timer free-run s-i incrementeze valoarea fie de la oscilatorul intern, de exemplu din ceasul oscilatorului, sau prin impulsuri externe la pinul RA4/T0CKI. 1=impulsuri externe 0=1/4 ceas intern bit 6 INTEDG (Interrupt Edge Select bit-bit Selectare Front ntreruperi) Dac a fost permis producerea de ntreruperi, acest bit va determina la ce front va avea loc ntreruperea la pinul RB0/INT. 1=front cresctor 0=front descresctor bit 7 RBPU (PORTB Pull-up Enable bit-bit Permite Pull-up-tragerea PORTB) Acest bit deschide sau nchide rezistorii interni la portul B. 1=rezistorii 'pull-up' deschii 0=rezistorii 'pull-up' nchii

2.9 Memoria de date EEPROM


PIC16F84 are 64 de bytes de locaii de memorie EEPROM la adresele de la 00h la 63h unde se poate scrie sau de unde se poate citi. Cea mai important caracteristic a acestei memorii este c nu pierde coninutul n timpul nchideri sursei de alimentare. Aceasta nseamn practic c ceea ce a fost scris n ea va rmne chiar i cnd microcontrolerul este nchis. Datele pot fi reinute n EEPROM fr sursa de alimentare pn la 40 de ani. (dup cum declar productorul lui PICD16F84), i se pot executa 10000 de cicluri de scriere. n practic, memoria EEPROM este folosit pentru stocarea unor date importante sau a unor parametri de proces. Un asemenea parametru este o temperatur dat, asignat cnd se seteaz un regulator de temperatur la un proces. Dac nu s-a reinut, va fi nevoie s se ajusteze temperatura dat dup fiecare ntrerupere a alimentrii. Pentru c aceasta este foarte nepractic (chiar periculos), productorii de microntrolere au nceput s instaleze un tip mai mic de memorie EEPROM. Memoria EEPROM este plasat ntr-un loc special al memoriei i poate fi accesat prin regitri speciali. Aceti regitri sunt: -

EEDATA la adresa 08h, care reine datele de citit sau cele de scris. EEADR la adresa 09h, ce conine o adres a locaiei EEPROM ce este accesat. EECON1 la adresa 88h, ce conine bii de control. EECON2 la adresa 89h. Acest registru nu exist fizic i servete la protejarea EEPROM-ului de scrieri accidentale.

Registrul EECON1 la adresa 88h este un registru de control cu 5 bii implementai. Biii 5, 6 i 7 nu sunt folosii, i prin citire sunt totdeauna zero. Interpretarea biilor registrului EECON1 urmeaz. 32

Registrul EECON1

bit 0 RD (Read Control bit-bit Control Citire) Setarea acestui bit iniializeaz transferul de date definit n EEADR la registrul EEDATA. Pentru c timpul nu este esenial n citirea datelor ca la scriere, datele din EEDATA pot fi deja folosite n urmtoarea instruciune. 1=initializeaz citirea 0=nu iniializeaz citirea bit 1 WR (Write Control bit-bit Control Scriere) Setarea acestui bit iniializeaz scrierea datelor din registrul EEDATA la adresa specifcat prin registrul EEADR. 1=initializeaz scrierea 0=nu iniializeaz scrierea bit 2 WREN (EEPROM Write Enable bit-bit Permite Scrierea EEPROM) Permite scrierea n EEPROM Dac acest bit nu a fost setat, microcontrolerul nu va permite scrierea n EEPROM. 1=scriere permis 0=scriere interzis bit 3 WRERR (Write EEPROM Error Flag-Stegule Eroare Scriere EEPROM ) Eroare n timpul scrierii n EEPROM Acest bit a fost setat doar n caz c scrierea n EEPROM a fost intrerupt de un semnal sau prin terminarea timpului din timer-ul watchdog (dac este activat). 1=a avut loc eroare 0=nu a avut loc eroare bit 4 EEIF (EEPROM Write Operation Interrupt Flag bit-bit Stegule ntrerupere Operaie Scriere EEPROM) Bit folosit pentru a informa c scrierea datelor s-a terminat. Cnd s-a terminat scrierea, acest bit va fi setat automat. Programtorul trebuie s tearg bitul EEIF n programul su pentru a detecta noua terminare a scrierii. 1=scrierea terminat 0=scrierea nc neterminat, sau nc nu a nceput Citirea din memoria EEPROM
Setarea bitului RD iniializeaz transferul de date de la adresa gsit n EEADR la registrul EEDATA. Ca i la citirea datelor nu avem nevoie de att de mult timp ca la scriere, datele luate din registrul EEDATA pot deja fi folosite mai departe n urmtoarea instruciune. O mostr a prii programului ce citete datele n EEPROM, ar putea arta ca mai jos: 33

Dup ultima instruciune de program, coninutul de la o adres EEPROM zero poate fi gsit n registrul w.

Scrierea n memoria EEPROM


Pentru a scrie datele n locaia EEPROM, programatorul trebuie mai nti s scrie adresa n registrul EEADR i datele n registrul EEDATA. Numai atunci este folositor de a seta bitul WR ce pune totul n micare. Bitul WR va fi resetat, i bitul EEIF setat urmnd o scriere ce poate fi folosit n procesarea ntreruperilor. Valorile 55h i AAh sunt prima i a doua cheie care interzic ca scrierea accidental n EEPROM s se ntmple. Aceste dou valori sunt scrise n EECON2 care servete doar pentru acel scop, de a primi aceste dou valori i de a preveni orice scriere accidental n memoria EEPROM. Liniile de program marcate ca 1, 2, 3 i 4 trebuie s fie executate n acea ordine n intervale egale de timp. De aceea este foarte important, s nchidei ntreruperile ce ar putea schimba timpul necesar pentru executare instruciunilor. Dup scriere, ntreruperile, pot fi permise din nou. Exemplu unei pri a programului ce scrie datele 0xEE n prima locaie n memoria EEPROM ar putea arta ca mai jos:

34

S-ar putea să vă placă și