Microcontrolerul PIC16F84
Introducere
CISC, RISC
Aplicatii
Clock-ul/instructiune
Pipelining
Semnificatia pinilor
1 Generator-oscilator de ceas
2 Reset
3 Unitatea de procesare centrala
4 Porturi
5 Organizarea memoriei
6 Intreruperi
7 Timer-ul liber TMRO
8 Memoria de date EEPROM
Introducere
PIC16F84 apartine unei clase de microcontrolere de 8 biti cu arhitectura RISC. Structura lui generala este aratata in schita urmatoare reprezentand blocurile de baza.
Memoria program
(FLASH)-pentru memorarea unui program scris.
Pentru ca memoria ce este facuta in tehnologia FLASH poate fi
programata si stearsa mai mult decat odata, aceasta
face microcontrolerul potrivit pentru dezvoltarea de componenta.
EEPROM-memorie
de date ce trebuie sa fie salvate cand nu mai este alimentare.
Este in mod uzual folosita pentru memorarea de date importante ce nu
trebuie pierdute daca sursa de alimentare se intrerupe dintr-o data.
De exemplu, o astfel de data este o temperatura prestabilita in
regulatoarele de temperatura. Daca in timpul intreruperii
alimentarii aceasta data se pierde, va trebui sa facem
ajustarea inca o data la revenirea alimentarii. Astfel
componenta noastra pierde in privinta auto-mentinerii.
RAM-memorie
de date folosita de un program in timpul executarii sale.
In RAM sunt memorate toate rezultatele intermediare sau
datele temporare ce nu sunt cruciale la intreruperea sursei de alimentare.
PORTUL A si PORTUL B sunt conexiuni fizice intre microcontroler si lumea de afara. Portul A are 5 pini, iar portul B are 8 pini.
TIMER-UL LIBER (FREE-RUN) este un registru de 8 biti in interiorul microcontrolerului ce lucreaza independent de program. La fiecare al patrulea impuls de ceas al oscilatorului isi incrementeaza valoarea lui pana ce atinge maximul (255), si apoi incepe sa numere tot din nou de la zero. Dupa cum stim timpul exact dintre fiecare doua incrementari ale continutului timer-ului, poate fi folosit pentru masurarea timpului ce este foarte util la unele componente.
UNITATEA DE PROCESARE CENTRALA are rolul unui element de conectivitate intre celelalte blocuri ale microcontrolerului. Coordoneaza lucrul altor blocuri si executa programul utilizatorului.
CISC, RISC
S-a spus deja ca PIC1684 are o arhitectura RISC. Acest termen este adeseori gasit in literatura despre calculatoare, si are nevoie sa fie explicat aici mai in detaliu. Arhitectura Harvard este un concept mai nou decat von-Neumann. S-a nascut din nevoia de marire a vitezei microcontrolerului. In arhitectura Harvard, bus-ul de date si bus-ul de adrese sunt separate. Astfel este posibil un mare debit de date prin unitatea de procesare centrala, si bineinteles, o viteza mai mare de lucru. Separarea programului de memoria de date face posibil ca mai departe instructiunile sa nu trebuiasca sa fie cuvinte de 8 biti. PIC16F84 foloseste 14 biti pentru instructiuni ceea ce permite ca toate instructiunile sa fie instructiuni dintr-un singur cuvant. Este de asemenea tipic pentru arhitectura Harvard sa aiba mai putine instructiuni decat von-Newmann si sa aiba instructiuni executate uzual intr-un ciclu.
Pentru ca PIC16F84 este un microcontroler RISC, aceasta inseamna ca are un set redus de instructiuni, mai precis 35 de instructiuni (de ex. microcontrolerele INTEL si Motorola au peste 100 de instructiuni). Toate aceste instructiuni sunt executate intr-un ciclu cu exceptia instructiunilor jump si branch. Conform cu ceea ce spune constructorul, PIC16F84 ajunge la rezultate de 2:1 in compresia cod si 4:1 in viteza in comparatie cu alte microcontrolere de 8 biti din clasa sa.
Aplicatii
PIC16F84 se potriveste perfect in multe folosinte, de la industriile auto si aplicatiile de control casnice la instrumentele industriale, senzori la distanta, manere electrice de usi si dispozitivele de securitate. Este de asemenea ideal pentru cardurile smart ca si pentru aparatele alimentate de baterie din cauza consumului lui mic.
Memoria EEPROM face mai usoara
aplicarea microcontrolerelor la aparate unde se cere memorarea permanenta
a diferitor parametri (coduri pentru transmitatoare, viteza
motorului, frecventele receptorului, etc.). Costul scazut, consumul scazut,
manuirea usoara si flexibilitatea fac PIC16F84 aplicabil chiar
si in domenii unde microcontrolerele nu au fost prevazute inainte
(exemple: functii de timer, inlocuirea interfetei in sistemele mari,
aplicatiile coprocesor, etc.).
Programabilitatea sistemului acestui cip (impreuna cu folosirea a doar doi
pini in transferul de date) face posibila flexibilitatea produsului,
dupa ce asamblarea si testarea au fost terminate. Aceasta
capabilitate poate fi folosita pentru a crea productie pe linie de
asamblare, de a inmagazina date de calibrare disponibile doar dupa
testarea finala, sau poate fi folosit pentru a imbunatati
programele la produsele finite.
Clock-ul /ciclul instructiune
Clock-ul sau ceasul este starter-ul principal al microcontrolerului, si este obtinut dintr-o componenta de memorie externa numita 'oscilator'. Daca ar fi sa comparam un microcontroler cu un ceas de timp, 'clock-ul' nostru ar fi un ticait pe care l-am auzi de la ceasul de timp. In acest caz, oscilatorul ar putea fi comparat cu arcul ce este rasucit astfel ca ceasul de timp sa mearga. De asemenea, forta folosita pentru a intoarce ceasul poate fi comparata cu o sursa electrica.
Clock-ul de la oscilator intra intr-un microcontroler prin pinul OSC1 unde circuitul intern al microcontrolerului divide clock-ul in 4 clock-uri egale Q1, Q2, Q3 si Q4 ce nu se suprapun. Aceste 4 clock-uri constituie un ciclu de o singura instructiune (numit de asemenea ciclu masina) in timpul careia instructiunea este executata.
Executarea instructiunii incepe prin apelarea unei instructiuni care este urmatoarea in linie. Instructiunea este apelata din memoria program la fiecare Q1 si este scrisa in registrul de instructiuni la Q4. Decodarea si executarea instructiunii sunt facute intre urmatoarele cicluri Q1 si Q4. In urmatoarea diagrama putem vedea relatia dintre ciclul instructiunii si clock-ul oscilatorului (OSC1) ca si aceea a clock-urilor interne Q1-Q4. Contorul de program (PC) retine informatia despre adresa urmatoarei instructiuni.
Pipelining
Ciclul instructiune consta din ciclurile Q1, Q2, Q3 si Q4. Ciclurile de instructiuni de apelare si executare sunt conectate intr-un asa fel incat pentru a face o apelare, este necesar un ciclu cu o instructiune, si mai este nevoie de inca unul pentru decodare si executare. Totusi, datorita pipelining-ului (folosirea unei pipeline-conducta, si este aducerea unei instructiuni din memorie in timp ce se executa alta), fiecare instructiune este executata efectiv intr-un singur ciclu. Daca instructiunea cauzeaza o schimbare in contorul programului, si PC-ul nu directioneaza spre urmatoarea ci spre alte adrese (poate fi cazul cu subprogramele jumps sau calling), 2 cicluri sunt necesare pentru executarea unei instructiuni. Aceasta este pentru ca instructiunea trebuie procesata din nou, dar de data aceasta de la adresa corecta. Ciclul incepe cu clock-ul Q1, prin scrierea in registrul instruction register (IR). Decodarea si executarea incepe cu clock-urile Q2, Q3 si Q4.
TYC0 citeste
instructiunea MOVLW 55h (nu are importanta
pentru noi ce instructiune a fost executata, ce explica de ce nu
este un dreptunghi desenat in partea de jos).
TCYI executa instructiunea MOVLW 55h si citeste
MOVWF PORTB.
TCY2 executa MOVWF PORTB si citeste CALL SUB_1.
TCY3 executa o apelare a subprogramului CALL SUB_1, si
citeste instructiunea BSF PORTA, BIT3. Pentru ca
instructiunea aceasta nu este aceea de care avem nevoie, sau nu este prima
instructiune a subprogramului SUB_1 a carei executie este
urmatoarea in ordine, instructiunea trebuie citita din nou. Acesta este un bun exemplu a unei instructiuni avand nevoie de mai
mult de un ciclu. TCY4 ciclul instructiunii este
total folosit pentru citirea primei instructiuni din subprogram la adresa
SUB_1.
TCY5 executa prima instructiune din subprogram SUB_1 si
citeste urmatoarea.
Semnificatia pinilor
PIC16F84 are un numar total de 18 pini. Cel mai adesea se gaseste intr-o capsula de tip DIP18 dar se poate gasi de asemenea si intr-o capsula SMD care este mai mica ca cea DIP. DIP este prescurtarea de la Dual In Package. SMD este prescurtarea de la Surface Mount Devices sugerand ca gaurile pentru pini unde sa intre acestia, nu sunt necesare in lipirea acestui tip de componenta.
Pinii microcontrolerului PIC16F84 au urmatoarea semnificatie:
Pin nr.1 RA2 Al doilea
pin la portul A. Nu are functie aditionala.
Pin nr.2 RA3 Al treilea pin la portul A. Nu are functie
aditionala.
Pin nr.3 RA4 Al patrulea pin la portul A. TOCK1 care
functioneaza ca timer se gaseste de asemenea la acest pin.
Pin nr.4 MCLR Reseteaza intrarea si tensiunea de programare
Vpp a microcontrolerului.
Pin nr.5 VSS Alimentare, masa. Pin nr.6 RB0 Pin de zero la portul B. Intrarea Intrerupere este o functie aditionala. Pin nr.7 RB1 Primul pin la portul B. Nu are
functie aditionala. Pin nr.8 RB2 Al doilea pin la portul B. Nu are
functie aditionala. Pin nr.9 RB3 Al treilea pin la portul B. Nu are
functie aditionala. Pin nr.10 RB4 Al patrulea pin la portul B. Nu are
functie aditionala.
Pin nr.11 RB5 Al cincilea pin la portul B. Nu are functie
aditionala.
Pin nr.12 RB6 Al saselea pin la portul B. Linia de 'Clock' in mod
programare.
Pin nr.13 RB7 Al saptelea pin la portul B. Linia 'Data' in mod
programare.
Pin nr.14 Vdd Polul pozitiv al sursei.
Pin nr.15 OSC2 Pin desemnat pentru conectarea la un oscilator.
Pin nr.16 OSC1 Pin desemnat pentru conectarea la un oscilator.
Pin nr.17 RA2 Al doilea pin la portul A. Nu are functie
aditionala.
Pin nr.18 RA1 Primul pin la portul A. Nu are
functie aditionala.
1 Generator de ceas - oscilator Circuitul oscilator este folosit pentru a da microcontrolerului un ceas-clock. Ceasul este necesar pentru ca microcontrolerul sa execute programul sau instructiunile din program. Tipuri de
oscilatoare
Oscilatorul
RC
Diagrama de mai sus arata cum este conectat oscilatorul RC la PIC16F84. La valoarea rezistorului mai mica 2k, oscilatorul poate deveni instabil, sau oscilatia se poate chiar opri. La valori mari a lui R (ex.1M) oscilatorul devine foarte sensibil la zgomot si umezeala. Se recomanda ca valoarea rezistorului R sa fie intre 3 si 100k. Chiar daca oscilatorul va lucra fara un condensator extern (C=0pF), trebuie totusi folosit un condensator de peste 20pF pentru zgomot si stabilitate. Indiferent de ce oscilator este folosit, pentru a obtine un ceas la care sa functioneze microcontrolerul, ceasul trebuie divizat la 4. Un ceas al oscilatorului divizat cu 4 se poate obtine la pinul OSC2/CLKOUT, si poate fi folosit pentru testarea sau sincronizarea altor circuite logice.
Dupa alimentare, oscilatorul incepe sa oscileze. Oscilatia la inceput are o perioada si o amplitudine instabile, dar dupa un timp devin stabilizate.
Pentru a preveni ca un asemenea ceas inexact sa influenteze performantele microcontrolerului, trebuie sa tinem microcontrolerul in starea reset pe durata stabilizarii ceasului oscilatorului. Diagrama de mai sus arata o forma tipica de semnal pe care microcontrolerul o primeste de la oscilatorul cu cuart dupa alimentare. |
2 Reset-ul Resetul este folosit pentru a pune microcontrolerul intr-o conditie 'cunoscuta'. Aceasta inseamna practic ca microcontrolerul poate sa se comporte incorect in unele conditii nedorite. Pentru a continua sa functioneze corect trebuie resetat, insemnand ca toti registrii vor fi pusi intr-o stare de start. Resetul nu este folosit numai cand microcontrolerul nu se comporta cum vrem noi, dar poate de asemenea sa fie folosit cand se incearca un montaj ca o intrerupere intr-un program de executie sau cand se pregateste un microcontroler de a citi un program.
Microcontrolerul PIC16F84 are
cateva surse de reset: Resetul la scaderea tensiunii
de alimentare dincolo de limita permisibila (Brown-out Reset)
Daca, conform cu specificatiile electrice, circuitul intern de resetare a microcontrolerului nu poate satisface aceste cerinte, se pot folosi componente electronice speciale ce sunt capabile sa genereze semnalul de reset dorit. In afara de aceasta functie, ele pot functiona pentru supravegherea tensiunii de alimentare. Daca tensiunea scade mai jos de nivelul specificat, un zero logic va apare la pinul MCLR ce tine microcontrolerul in starea de reset pana ce tensiunea nu este in limitele ce garanteaza functionarea corecta. |
3 Unitatea de Procesare Centrala
Unitatea de procesare centrala (CPU) este creierul microcontrolerului. Aceasta parte este responsabila cu gasirea si aducerea (citirea din memorie)-fetching instructiunii corecte ce trebuie executata, cu decodarea acelei instructiuni, si in final cu executarea ei.
Unitatea de procesare centrala conecteaza toate partile microcontrolerului intr-un intreg. Desigur, functia sa cea mai importanta este sa decodeze instructiunile de program. Cand programatorul scrie un program, instructiunile au o forma clara ca MOVLW 0x20. Totusi, pentru ca microcontrolerul sa inteleaga aceasta, aceasta forma de 'scrisoare' a unei instructiuni trebuie tradusa intr-o serie de zero-uri si unu-uri ce se numeste 'opcode'. Aceasta tranzitie de la o scrisoare la o forma binara este facuta de translatori ca translatorul assembler (cunoscut ca si assembler sau asamblor). Instructiunea astfel adusa-fetched din memoria programului trebuie sa fie decodata de unitatea de procesare centrala. Putem apoi selecta din tabela tuturor instructiunilor un set de actiuni ce executa o sarcina desemnata definita de instructiune. Pentru ca instructiunile pot sa contina in ele asignari ce cer diferite transferuri de date dintr-o memorie in alta, din memorie la porturi, sau alte calcule, CPU trebuie sa fie conectata cu toate partile microcontrolerului. Aceasta este posibil printr-un bus de date si un bus de adrese.
Unitatea de Logica
Aritmetica (ALU)
Unitatea de logica aritmetica este responsabila de executarea
operatiilor ca adunarea, scaderea, mutarea (la stanga sau la dreapta
intr-un registru) si de operatiile logice. Mutarea datelor intr-un
registru se mai numeste 'shifting'- transferare. PIC16F84 contine o
unitate logica aritmetica de 8 biti si registri de
lucru de 8 biti.
In instructiunile cu doi operanzi, in mod obisnuit un operand este in registrul de lucru (registrul W), iar celalalt este unul din registri sau o constanta. Prin operand intelegem continutul asupra caruia se fac unele operatii, iar un registru este oricare din registrii GPR sau SFR. GPR este o prescurtare de la 'General Purposes Registers'-Registri cu Scopuri Generale, iar SFR de la 'Special Function Registers'-Registri cu Functie Speciala. In instructiunile cu un operand, un operand este fie registrul W fie unul din registri. Pe langa operatiile aritmetice si logice, ALU controleaza bitii de stare (biti gasiti in registrul STATUS). Executarea unor instructiuni afecteaza bitii de stare, de care depinde rezultatul insusi. Depinzand de ce instructiune este executata, ALU poate afecta valorile bitilor Carry (C), Digit Carry (DC), si Zero (Z) in registrul STATUS.
Registru STATUS
bit 0 C
(Carry) Transfer
Bit care este afectat de operatiile de adunare, scadere si
transfer.
1= transferul produs din bitul cel mai inalt al rezultatului
0= transferul nu s-a produs
Bitul C este afectat de instructiunile ADDWF, ADDLW, SUBLW, SUBWF.
bit 1 DC (Digit Carry) DC Transfer
Bit afectat de operatiile de adunare, scadere si transfer. Spre
deosebire de bitul C, acest bit reprezinta transferul din al patrulea loc
rezultat. Este setat de adunare cand se intampla un transport de la bitul
3 la bitul 4, sau de scadere cand se intampla imprumut de la bitul 4
la bitul 3, sau de transfer in ambele directii.
1= transfer produs la al patrulea bit conform cu ordinea, al rezultatului.
0= transferul nu s-a produs
Bitul DC este afectat de instructiunile ADDWF, ADDLW, SUBLW, SUBWF.
bit 2 Z (Zero bit) Indicarea unui rezultat zero.
Acest bit este setat cand rezultatul unei operatii 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 cand microcontrolerul este alimentat atunci cand incepe
sa functioneze, dupa fiecare reset obisnuit si
dupa executarea instructiunii CLRWDT. Instructiunea SLEEP il
reseteaza cand microcontrolerul intra in regimul consum/uzaj redus.
Setarea lui repetata este posibila prin reset sau prin pornirea sau
oprirea sursei. Starea poate fi triggerata de asemenea de un semnal la
pinul RB0/INT, de o schimbare la portul RB, de terminarea scrierii in EEPROM-ul
de date intern, si de watchdog de asemenea.
1= dupa ce sursa a fost pornita
0= executarea instructiunii SLEEP
bit 4 TO Time-out ; depasirea-overflow watchdog-ului.
Bitul este setat dupa pornirea sursei si executarea
instructiunilor CLRWDT si SLEEP. Bitul este resetat cand
watchdog-ul ajunge la sfarsit semnaland ca ceva nu este in ordine.
1= depasirea-oveflow nu s-a produs
0= depasirea-overflow s-a produs
bit6:5 RP1:RP0 (Register Bank Select bits-Biti de Selectare
a Bancului de Registri)
Acesti doi biti sunt partea superioara a adresei la adresarea
directa. Pentru ca instructiunile ce adreseaza memoria
direct au doar sapte biti, ei au nevoie doar de inca un bit
pentru a adresa cei 256 bytes adica cati are PIC16F84. Bitul
RP1 nu este folosit, dar este lasat 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 Registri)
Bit al carui rol este de a fi al optulea bit la adresarea indirecta a
RAM-ului intern.
1= bancul 2 si 3
0= bancul 0 si 1 (de la 00h la FFh)
Registrul STATUS contine starea aritmetica ALU (C, DC, Z),
starea RESET (TO, PD) si bitii pentru selectarea bancului de memorie
(IRP, RP1, RP0). Considerand ca selectia bancului de memorie
este controlata prin acest registru, el trebuie sa fie prezent in
fiecare banc. Bancul de memorie se va discuta mai in detaliu in capitolul
Organizarea memoriei. Registrul STATUS poate fi o destinatie pentru orice
instructiune, cu oricare alt registru. Daca registrul STATUS este o
destinatie pentru instructiunile ce afecteaza bitii Z, DC
or C, atunci scrierea in acesti trei biti nu este
posibila.
Registrul OPTION
bit 0:2 PS0,
PS1, PS2 (Prescaler Rate Select bit-Bit Selectie Rata Prescaler)
Acesti trei biti definesc bitul de selectie a ratei
prescalerului. Ce este un prescaler si cum pot afecta acesti
biti functionarea unui microcontroler va fi explicat in
sectiunea depre TMRO.
bit 3 PSA
(Prescaler Assignment bit-Bit de Asignare Prescaler)
Bit ce asigneaza prescalerul intre TMRO si 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 Selectie a
Frontului Sursei TMR0)
Daca este permis de a se triggera TMRO prin impulsurile de la pinul
RA4/T0CKI, acest bit determina daca aceasta va fi la frontul
descrescator sau crescator al unui semnal.
1= front crescator
0= front descrescator
bit 5 TOCS (TMR0 Clock Source Select bit-Bit Selectie
Sursa Ceas TMR0)
Acest pin permite timerului liber (free-run) sa 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 1/4
bit 6 INTEDG (Interrupt Edge Select bit-Bit de Selectie a
Frontului Intrerupere)
Daca intreruperea este activata este posibil ca acest bit sa
determine frontul la care o intrerupere va fi activata la pinul RB0/INT.
1= front crescator
0= front descrescator
bit 7 RBPU (PORTB Pull-up Enable bit-Bit Enable-Activare Pull-up
PORTB)
Acest bit porneste si opreste rezistorii interni
'pull-up'-scoatere la portul B.
1= Rezistori oprire 'pull-up'
0= Rezistori pornire 'pull-up'
4 Porturi
Portul se refera la un grup de pini ai unui microcontroler ce pot fi accesati simultan, sau la care putem seta combinatia dorita de zero-uri si unu-uri, sau de la care putem citi o stare existenta. Fizic, portul este un registru in interiorul unui microcontroler ce este conectat cu fire la pinii microcontrolerului. Porturile reprezinta conexiunea fizica a Unitatii de Procesare Centrala cu lumea exterioara. Microcontrolerul le foloseste pentru a monitoriza sau controla alte componente sau aparate. Datorita functionalitatii, unii pini au rol dublu ca RA4/TOCKI de exemplu, care este simultan al patrulea bit la portul A si o intrare externa pentru contorul liber (free-run). Selectia uneia din aceste doua functii ale pinului se face in unul din registrii configurationali. O ilustratie a acesteia este al cincilea bit T0CS in registrul OPTION. Selectand una din functii cealalta este dezactivata.
Toti pinii portului pot fi
definiti ca intrare sau iesire, conform cu nevoile unui montaj ce
este in dezvoltare. Pentru a defini un pin ca pin de intrare sau ca pin de
iesire, trebuie scrisa combinatia corecta de zero-uri
si unu-uri in registrul TRIS. Daca in locul potrivit este scris
'1' logic in registrul TRIS, acel pin este pin de intrare, iar
daca este valabil contrariul, este un pin de iesire. 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 legati la el. Registrul adecvat pentru directia
datelor este TRISB la adresa 86h. Setarea unui bit in registrul TRISB
defineste pinul portului corespunzator ca pin de intrare, si
resetarea unui bit in registrul TRISB, defineste pinul portului
corespunzator ca pin de iesire. Fiecare pin la PORTB are un rezistor
slab intern pull-up (scoatere) (rezistor care defineste o linie la unu
logic) care poate fi activat prin resetarea celui de-al saptelea bit RBPU
in registrul OPTION. Acesti rezistori 'pull-up' se inchid automat cand
pinul portului este configurat ca o iesire. Cand porneste
microcontrolerul, 'pull-up'-ii sunt dezactivati.
Patru pini ai portului PORTB, RB7:RB4 pot cauza o intrerupere, care se
intampla cand starea lor se schimba de la unu logic la zero logic
si invers. Numai pinii configurati ca intrare pot cauza aceasta
intrerupere sa se intample (daca fiecare pin RB7:RB4 este configurat ca
o iesire, nu va fi generata o intrerupere la schimbarea starii).
Aceasta optiune de intrerupere cu rezistorii 'pull-up' fac mai
usoara rezolvarea problemelor din practica, ca de exemplu o
tastatura matriceala. Daca randurile tastaturii sunt conectate
la acesti pini, fiecare apasare a unei clape va cauza o intrerupere.
Microcontrolerul va determina care clapa este apasata in timp ce
se proceseaza o intrerupere. Nu se recomanda sa apelati la
portul B in timp ce se proceseaza intreruperea.
Exemplul de mai sus arata cum pinii 0, 1, 2, si
3 sunt declarati ca intrare, si pinii 4, 5, 6 si 7 ca
iesire.
PORTA
PORTA are 5 pini legati la el. Registrul corespunzator pentru
directia datelor este TRISA la adresa 85h. Ca si la portul B,
setarea unui bit in registrul TRISA defineste de asemenea pinul portului
corespunzator ca un pin de intrare, si resetarea unui bit in registrul
TRISA defineste pinul portului corespunzator ca pin de
iesire.
Al cincilea pin al portului A are functie duala. La acel pin se
afla de asemenea o intrare externa pentru timer-ul TMRO. Una din
aceste doua optiuni este aleasa prin setarea sau resetarea
bitului TOCS (TMR0 Clock Source Select bit-bit de Selectie a Sursei
Ceasului TMRO). Acest pin permite timer-ului TMRO sa-si creasca
starea fie de la oscilatorul intern fie prin impulsuri externe la pinul
RA4/T0CKI.
Exemplul arata cum pinii 0, 1, 2, 3, si 4 sunt declarati ca intrare iar 5, 6 si 7 ca pini de iesire.
5 Organizarea memoriei PIC16F84 are doua blocuri
separate de memorie, unul pentru date si celalalt pentru programe.
Memoria EEPROM si registrii GPR in memoria RAM constituie un bloc,
si memoria FLASH constituie un bloc de programe.
Bancuri
de Memorie Uzual, grupurile de instructiuni care sunt adesea in uz, sunt conectate intr-o singura unitate ce poate fi usor apelata intr-un program, si a carei nume are o semnificatie clara, asa-numitul Macros-macrocomanda. Cu ajutorul lor, selectia dintre doua bancuri devine mai clara si programul mult mai elegibil. BANK0 macro
Contorul
de Program Adresarea
Directa Bsf STATUS, RP0 ;Bankl
Adresarea Directa Adresarea
Indirecta
Un asemenea exemplu poate trimite un set de date prin comunicatia seriala, lucrand cu bufere si indicatoare (ce vor fi discutate in continuare intr-un capitol cu exemple), sau sa stearga o parte a memoriei RAM (16 locatii) ca in urmatorul exemplu.
Citind datele din registrul INDF cand continutul registrului FSR este egal cu zero, intoarce valoarea zero, si scrie in el rezultatul in operatia NOP (no operation- nu opereaza). |
6 Intreruperi Intreruperile sunt un mecanism a unui microcontroler ce ii permit sa raspunda la unele evenimente la momentul cand se intampla, indiferent de ce face atunci microcontrolerul. Aceasta este o parte foarte importanta, pentru ca permite conexiunea microcontrolerului cu lumea de afara. In general, fiecare intrerupere schimba debitul programului, il intrerupe si dupa executarea unui subprogram (rutine de intrerupere), continua din acelasi punct.
Registrul de control al unei
intreruperi se numeste INTCON si se gaseste la adresa
0Bh. Rolul lui este de a permite sau interzice cererile de intreruperi,
si in caz ca nu sunt permise, inregistreaza cererile de intrerupere
singulare prin bitii lui.
bit 0 RBIF
(RB Port Change Interrupt Flag bit-bit Stegulet de Intrerupere a
Schimbarii Portului RB) Bit ce informeaza despre schimbarile
de la pinii 4, 5, 6 si 7 ai portului B.
Intreruperile ce raman
nerezolvate si ce au fost ignorate, sunt procesate cand bitul GIE
(GIE=1, toate intreruperile sunt permise) va fi sters. Cand i s-a
raspuns intreruperii, bitul GIE a fost sters, asa ca
orice intreruperi aditionale vor fi interzise, adresa de intoarcere a
fost trimisa in stiva, iar adresa 0004h a fost scrisa in
contorul programului - numai dupa aceasta incepe raspunsul la o
intrerupere! Dupa ce este procesata intreruperea, bitul a
carui setare a cauzat o intrerupere trebuie sters, sau rutina de
intrerupere va fi procesata automat tot mereu in timpul intoarcerii la
programul principal.
Datorita simplitatii
si folosirii frecvente, aceste parti ale programului pot fi
facute ca macro-uri. Conceptul unui Macro este explicat in 'Limbaj
de asamblare program'. In urmatorul exemplu, continuturile
registrilor W si STATUS sunt memorate in variabilele W_TEMP si
STATUS_TEMP inainte de rutina de intrerupere. La inceputul rutinei PUSH
trebuie sa verificam bancul selectat in prezent pentru ca
W_TEMP and STATUS_TEMP nu se gasesc in bancul 0. Pentru schimbul de date
intre acesti registri, instructiunea SWAPF se foloseste
in loc de MOVF pentru ca nu afecteaza starea bitilor registrului
STATUS.
Acelasi exemplu se poate realiza utilizand macro-uri, facand astfel programul mai eligibil. Macro-urile ce sunt deja definite, pot fi folosite pentru scrierea de noi macro-uri. Macro-urile BANK1 si BANK0 ce sunt explicate in capitolul 'Organizarea memoriei' sunt folosite cu macro-urile 'push' si 'pop'.
Intrerupere
externa la pinul RB0/INT al microcontrolerului
Exemplul de mai sus arata
initializarea unei intreruperi externe la pinul RB0 al
microcontrolerului. Unde se vede unu setat, inseamna ca
intreruperea este permisa. Producerea altor intreruperi nu este
permisa, si toate intreruperile impreuna sunt interzise
pana ce bitul GIE este tinut in unu.
|
7 Timer-ul liber TMR0 Timer-ele (temporizatoarele) sunt de obicei cele mai complicate parti ale unui microcontroler, asa ca este necesar sa rezervam mai mult timp pentru a le explica. Odata cu aplicarea lor este posibil sa se creeze relatii intre o dimensiune reala ca 'timp' si o variabila ce reprezinta starea timer-ului intr-un microcontroler. Fizic, timer-ul este un registru a carui valoare creste continuu pana la 255, si apoi porneste de la capat: 0, 1, 2, 3, 4255.0,1, 2, 3etc.
Aceasta incrementare se face
in fundalul a tot ceea ce face un microcontroler. Depinde de programator
'sa gaseasca o cale' de cum sa profite de
aceasta caracteristica pentru nevoile lui. Una din cai este
sa creasca o variabila la fiecare depasire a
timer-ului. Daca stim cat timp are nevoie timer-ul sa
faca o runda completa, atunci inmultind valoarea
variabilei cu acel timp obtinem timpul total scurs.
Dupa fiecare numaratoare pana la 255, timer-ul isi reseteaza valoarea la zero si incepe cu un nou ciclu de contorizare pana la 255. In timpul fiecarei tranzitii de la 255 la zero, bitul TOIF in registrul INTCON este setat. Daca se permit intreruperi, de aceasta se poate profita in generarea si in procesarea rutinei de intrerupere. Depinde de programator sa reseteze bitul TOIF in rutina de intrerupere, asa ca noua intrerupere, sau noua depasire sa fie detectate. In afara de ceasul oscilator intern, starea timer-ului poate de asemenea sa creasca prin ceasul extern la pinul RA4/TOCKI. Alegerea uneia din aceste doua optiuni se face in registrul OPTION prin bitul TOCS. Daca a fost aleasa aceasta optiune de ceas extern, va fi posibil sa se defineasca frontul unui semnal (crescator sau descrescator), la care timer-ul sa-si creasca valoarea.
In practica, unul din
exemplele tipice ce este rezolvat prin ceas extern si unde timer-ul
contorizeaza rotatiile complete ale unui ax al unei masini de
productie, ca bobinatorul de transformator de exemplu. Sa rotim
patru suruburi de metal pe axul unui bobinator. Aceste patru
suruburi vor reprezenta convexitatea metalica. Sa plasam
acum un senzor inductiv la o distanta de 5 mm de capatul unui
surub. Senzorul inductiv va genera semnalul descrescator de fiecare
data cand capul surubului este paralel cu capul senzorului. Fiecare
semnal va reprezenta o patrime dintr-o rotatie, si suma
tuturor rotatiilor se va gasi in timer-ul TMRO. Programul poate
usor citi aceste date din timer printr-un bus de date.
Acelasi exemplu poate fi realizat printr-o intrerupere in modul urmator:
Prescalerul poate fi asignat fie de
timer-ul TMRO fie de watchdog. Watchdogul este un mecanism pe care
microcontrolerul il foloseste sa se apere impotriva blocarii
programelor. Ca orice alt circuit electric, la fel si cu
microcontrolerul se pot intampla defectari, sau unele stricaciuni.
Din nefericire microcontrolerul are de asemenea un program unde se pot
intampla probleme. Cand se intampla aceasta, microcontrolerul se va opri
din functionare si va ramane in acea stare pana ce cineva
il reseteaza. Din cauza aceasta, a fost introdus mecanismul watchdog.
Dupa o anumita perioada de timp, watchdogul reseteaza
microcontrolerul (de fapt microcontrolerul se reseteaza singur).
Watchdogul luceaza pe baza unui principiu simplu: daca se
intampla depasirea timer-ului, microcontrolerul este resetat,
si incepe executarea programului mereu din nou. Astfel, se va intampla
un reset atat in cazul unei functionari corecte cat si incorecte.
Urmatorul pas este prevenirea resetului in cazul unei
functionari corecte, ce se face prin scrierea unui zero in
registrul WDT (instructiunea CLRWDT) de fiecare data cand se
apropie de depasire. Astfel programul va preveni un reset cat timp
este executat corect. De indata ce s-a blocat, nu se va scrie zero, va
avea loc depasirea timer-ului WDT si un reset ce va duce
microcontrolerul inapoi la functionarea corecta din nou.
Registrul control OPTION
Bit 0:2 PS0,
PS1, PS2 (Prescaler Rate Select bit-bit Selectare Rata
Prescaler)
bit 3 PSA
(Prescaler Assignment bit-bit Asignare Prescaler) |
8 Memoria de date EEPROM PIC16F84 are 64 de bytes de
locatii de memorie EEPROM la adresele de la 00h la 63h unde se poate
scrie sau de unde se poate citi. Cea mai importanta caracteristica
a acestei memorii este ca nu pierde continutul in timpul inchideri
sursei de alimentare. Aceasta inseamna practic ca ceea ce a fost
scris in ea va ramane chiar si cand microcontrolerul este inchis.
Datele pot fi retinute in EEPROM fara sursa de alimentare
pana la 40 de ani. (dupa cum declara producatorul lui
PICD16F84), si se pot executa 10000 de cicluri de scriere.
bit 0 RD (Read Control bit-bit Control
Citire)
Dupa ultima instructiune de program,
continutul de la o adresa EEPROM zero poate fi gasit in
registrul w.
|
Politica de confidentialitate |
.com | Copyright ©
2024 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |