Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Lucrare de absolvire Microcontrolere

Informatica


Universitatea "Lucian Blaga" din Sibiu



Colegiu Universitar

Lucrare de absolvire

Sibiu2005

Cuprins

Introducere

Cap.1 Partea teoretica

1.1Introducere in microcontrolere

1.2Bobina:parametrii,caracteristici

1.3Metode de masura a parametrilor bobimelor

1.4Erori de masuara a bobinelor

1.5Afisarea LCD.Principii de functionare

1.6Metode de programare a Pic-ului

Cap.2Proiect tehnic

2.1 scheme bloc

2.2blocul1(oscillator cu bobina:LM,Fet)

2.3blocul2(microcontrolerul)

2.4Programul limbajului de asamblare

2.4.1.Organigrama

2.4.2Sursa de alimentare

ANEXE :A.1.Schema electronica

A.2Cablaje

A.3Lista componenete

A.4Listarea programului si limbajului de asamblare

BIBLIOGRAFIE

Dispozitive si circuite electronice,vol I-Mihu P.Ioan

Exploatarea paralelismului in

microprocesoarele avansate, -Lucian Vintan

Pic'n up the pace -David Benson

www.microchip.com

www.electronica.ro

www.elektronikladen.de

Cap.1 Introducere în Microcontrolere

1.1 Istoria microcontrolelor

Este anul 1969, si o echipa de ingineri japonezi de la compania BUSICOM sosesc în Statele Unite cu cererea ca unele circuite integrate pentru calculatoare sa fie facute folosind proiectele lor. Propunerea a fost facuta catre INTEL, iar Marcian Hoff a fost desemnat responsabil cu acest proiect. Pentru ca el era cel ce avea experienta în lucrul cu un calculator ( PC) PDP8, i-a venit sa sugereze o solutie diferita fundamental în locul constructiei propuse. Aceasta solutie presupunea ca functionarea circuitului integrat este determinata de un program memorat în el. Aceasta a însemnat ca configuratia ar fi fost mult mai simpla, dar aceasta ar fi cerut  mult mai multa memorie decât ar fi cerut proiectul propus de inginerii japonezi. Dupa un timp, cu toate ca inginerii au cautat sa caute o solutie mai simpla, ideea lui Marcian a câstigat, si aluat nastere primul microcontroler. În transformarea unei idei într-un produs finit, Frederico Faggin a fost de un ajutor major pentru INTEL. El s-a transferat la INTEL, si doar în 9 luni a reusit sa scoata un produs din prima sa conceptie. INTEL a obtinut drepturile de a vinde acest bloc integral în 1971. În primul rând ei au cumparat licenta de la compania BUSICOM care nu au avut idee ce comoara avusesera. În timpul acelui an a aparut pe piata un microprocesor numit 4004. Acela a fost primul microprocesor de 4 biti cu viteza 6000 operatii pe secunda. Nu mult dupa aceea, compania americana CTC a cerut de la INTEL si de la Texas Instruments sa faca un microprocesor pe 8 biti pentru folosinta în terminale. Cu toate ca CTC a renuntat la aceasta idee pâna la sfârsit, INTEL si Texas Instruments au continuat sa lucreze la microprocesor si în aprilie 1972 a aparut pe piata primul microprocesor de 8 biti sub numele de 8008. Putea sa adreseze 64Kb de memorie si avea 45 de instructiuni si viteza de 300.000 de operatii pe secunda. Acel microprocesor a fost predecesorul tuturor microprocesoarelor de astazi. INEL au continuat dezvoltarile lor pâna în aprilie 1974 si au lansat pe piata microprocesorul de 8 biti sub numele de 8080 ce putea adresa 64Kb de memorie si avea 75 de instructiuni, iar pretul începuse de la 360$.

Într-o alta companie americana Motorola, si-au dat seama repede ce se întâmpla, asa ca au lansat pe piata un microprocesor de 8 biti 6800. Costructor sef era Chuck Peddle si pe lânga microprocesorul  propriu-zis, Motorola a fost prima companie care sa faca alte periferice ca 6820 si 6850. La acel timp multe companii au recunoscut marea importanta a microprocesoarelor  si au început propriile lor dezvoltari. Chuck Peddle paraseste Motorola pentru a se muta la MOS Technology si continua sa lucreze intensiv la dezvoltarea microprocesoarelor.

La expozitia WESCON din Statele Unite din 1975 a avut loc un eveniment critic în istoria microprocesoarelor. MOS Technology a anuntat ca produce microprocesoarele 6501 si 6502 la 25$ bucata pe care cumparatorii le puteau cumpara imediat. Aceasta a fost atât de senzational încât au crezut ca este un fel de înselaciune, gândind ca competitorii vindeau 8080 si 6800 la 179$. Ca un raspuns la competitorii lor atât INTEL cât si Motorola au scazut preturile lor în prima zi a expozitiei pâna la 69.95$ pe microprocesor. Motorola intenteaza repede proces contra lui MOS Technology si contra lui Chuck Peddle pentru copierea protejatului 6800. MOS Technology înceteaza de a mai produce 6501 dar continua sa produca 6502. 6502 este un microcontroler pe 8 biti cu 56 de instructiuni si o capabilitate de adresare directa de 64Kb de memorie. Datorita costului scazut, 6502 devine foarte popular, asa ca este instalat în computere   ca :KIM-1, Apple I, Apple II, Atari, Comodore, Acorn, Oric, Galeb, Orao, Ultra si multe altele. Curând apar câtiva producatori de 6502 (Rockwell, Sznertek, GTE, NCR, Ricoh si Comodore preiau MOS Technology) ce era în momentul prosperitatii sale vândut la o rata de 15 milioane de microprocesoare pe an!

Altii totusi nu au cedat. Federico Faggin paraseste INTEL, si îsi porneste propria sa companie Zilog Inc.

În 1976 Zilog anunta Z80. În timpul crearii acestui microprocesor, Faggin face o decizie cruciala. stiind ca un mare numar de programe fusesera dezvoltate pentru 8080, Faggin îsi da seama ca multi vor ramâne fideli acelui microprocesor din cauza marii cheltuieli care ar rezula în urma refacerii tuturor programelor. Astfel el decide ca un nou microprocesor trebuie sa fie compatibil cu 8080, sau ca trebuie sa fie capabil sa execute toate programele care deja fusese scrise pentru 8080. Înafara acestor caracteristici, multe altele noi au fost adaugate, asa ca Z80 a fost un microprocesor foarte puternic la vremea lui. Se putea adresa direct la 64Kb de memorie, avea 176 instructiuni, o singura sursa,mult mai mare viteza de lucru etc. Z80 a fost un succes mare si toata lumea a facut conversia de 8080 la Z80. Se poate spune ca Z80 a fost fara nici o îndoiala comercial, cel mai de succes microcontroler de 8 biti a acelui timp. Înafara de Zilog, alti noi producatori apar de asemenea ca :Mostek, NEC, SHARP si SGS. Z80 a fost inima a multor computere ca :Spectrum, Partner, TRS703, Z-3 si Galaxi aici acasa.

În 1976, INTEL iese pe piata cu o versiune îmbunatatita de microprocesor pe 8 biti numit 8085. Totusi, Z80 era cu mult mai bun încât INTEL a apierdut batalia. Chiar daca înca câteva microprocesoare au aparut pe piata (6809,2650,SC/MP etc.), totul fusese de fapt deja hotarât. Nu mai erau de facut îmbunatatiri importante ca sa-i faca pe producatori sa se converteasca spre ceva nou, asa ca 6502 si Z80 împreuna cu 6800 au ramas ca cei mai reprezentativi ai microprocesoarelor de 8 biti a acelui timp.

1.2 Deosebirea dintre Microprocesoare si

Microcontrolere

Microcontrolerul difera de un microprocesor în multe feluri. În primul rând si cel mai important este functionalitatea sa. Pentru a fi folosit, unui microprocesor trebuie sa i se adauge alte componente ca memorie, sau componente pentru primirea si trimiterea de date. Pe scurt, aceasta înseamna ca microprocesorul este inima computerului. Pe de alta parte, microcontrolerul este proiectat sa fie toate acestea într-unul singur. Nu sunt necesare alte componente externe pentru aplicarea sa pentru ca toate perifericele necesare sunt deja incluse în el.

Astfel, economisim timpul si spatiul necesare pentru construirea de aparate.   Un microcontroler este un "calculator 414o147e pe un chip". Cuvantul "micro" sugereaza marimea redusa a dispozitivului iar "controler" ne spune ca dispozitivul poate fi folosit pentru a controla obicte, procese sau evenimente.
         Microcontrolerele pot fi gasite in componenta oricarui tip de aparat. Orice aparat care masoara, stocheaza, comanda, calculeaza sau afiseaza informatii este o potentiala gazda pentru un microcontroler.De exemplu orice automobil fabricat astazi este echipat cu cel putin un microcontroler care comanda motorul masinii si adesea chiar cu mai multe pentru comanda sistemelor aditionale din automobil. In calculatoare de birou (PC) se pot gasii microcontrolere in tastatura, modemuri, imprimante si alte periferice. In echipamentele de testare fac posibila adaugarea unor facilitati ca de exemplu memorarea rezultatelor masurarii, afisarea mesajelor si formelor de unda. Produsele de larg consum care includ microcontrolere sunt camerele video, video recorderele, compact-disk (CD) playere si altele. Un microcontroler este similar unui microprocesor. Ambele contin o unitate centrala de prelucrare sau UCP (cenral processing unit). CPU executa instructiuni care indeplinesc operatiile de baza logice, matematice si de curgere a informatiei.
          Pentru a construi un calculator complet, microprocesorul necesita memorie pentru pastrarea datelor si programelor, interfete de intrare-iesire (I/O) pentru conectarea dispozitivelor externe cum ar fi tastatura sau monitorul. Spre diferenta de microprocesor, microcontrolerul este un calculator pe un chip deorece el contine si memorie si interfete de intrare-iesire pe langa CPU. Deoarece memoria si interfetele care incap pe un chip sunt limitate, microcontrolerele tind sa fie utilizate in sisteme mai mici care necesita doar un microcontroler si cateva elemente aditionale

1.3 Blocurile de baza a microcontrolerului

1.3.1Unitatea de memorie

Memoria este o parte a microcontrolerului a carei functie este de a înmagazina date.

Cel mai usor mod de a explica este de a-l descrie ca un dulap mare cu multe sertare. Daca presupunem ca am marcat sertarele într-un asemenea fel încât sa nu fie confundate, oricare din continuturile lor vor fi atunci usor accesibile. Este suficient sa se stie desemnarea sertarului si astfel continuturile lui ne vor fi cunoscute în mod sigur.

Componentele de memorie sunt exact asa. Pentru o anumita intrare obtinem continuturile unei anumite locatii de memorie adresate si aceasta este totul. Doua noi concepte ne sunt aduse :adresarea si locatia de memorie. Memoria consta din toate locatiile de memorie, si adresarea nu este altceva decât selectarea uneia din ele. Aceasta înseamna ca noi trebuie sa selectam locatia de memorie la un capat, si la celalalt capat trebuie sa asteptam continuturile acelei locatii. În afara de citirea dintr-o locatie de memorie, memoria trebuie de asemenea sa permita scrierea în ea. Aceasta se face asigurarea unei linii aditionale numita linie de control. Vom desemna aceasta linie ca R/W (citeste /scrie). Linia de control este folosita în urmatorul fel : daca r/w=1, se face citirea, si daca opusul este adevarat atunci se face scrierea în locatia de memorie. Memoria este primul element, dar avem nevoie si de altele pentru ca microcontrolerul nostru sa functioneze.

1.3.2 Unitatea centrala de procesare

Sa adaugam alte 3 locatii de memorie pentru un bloc specific ce va avea o capabilitate incorporata de înmultire, împartire, extragere si sa-i mutam continuturile dintr-o locatie de memorie în alta. Partea pe care tocmai am adaugat-o este numita "unitatea de procesare centrala" (CPU). Locatiile ei de memorie sunt numite registri.

Registrii sunt deci locatii de memorie a caror rol este de a ajuta prin executarea a variate operatii matematice sau a altor operatii cu date oriunde se vor fi gasit datele. Sa privim la situtia curenta. Avem doua entitati independente (memoria si CPU)  ce sunt interconectate, sI astfel orice schimb de informatii este ascuns, ca si functionalitatea sa. Daca, de exemplu, dorim sa adaugam continuturile a doua locatii de memorie si   întoarcem rezultatul înapoi în memorie, vom avea nevoie de o conexiune între menmorie si CPU. Mai simplu formulat, trebuie sa avem o anumita "cale" prin care datele circula de la un bloc la altul.

1.3.3Bus-ul de date

Calea este numita "bus"-magistrala. Fizic, el reprezinta un grup de 8, 16, sau mai multe fire. Sunt doua tipuri de bus-uri : bus de adresa si bus de date. Primul consta din atâtea linii cât este cantitatea de memorie ce dorim sa o adresam, iar celalalt este atât de lat cât sunt datele, în cazul nostru 8 biti sau linia de conectare. Primul serveste la transmiterea adreselor de la CPU la memorie, iar cel de al doilea la conectarea tuturor blocurilor din interiorul microcontrolerului.

În ceea ce priveste functionalitatea, situatia s-a îmbunatatit, dar o noua problema a aparut de asemenea: avem o unitate ce este capabila sa lucreze singura, dar ce nu are nici un contact cu lumea de afara, sau cu noi ! Pentru a înlatura aceasta deficienta, sa adaugam un bloc ce contine câteva locatii de memorie a caror singur capat este conectat la busul de date, iar celalat are conexiune cu liniile de iesire la microcontroler ce pot fi vazute cu ochiul liber ca pini la componenta electronica.

1.3.4Unitatea de intrare-iesire

Aceste locatii ce tocmai le-am adaugat sunt numite "porti".Sunt diferite tipuri de porti :intrare, iesire sau porti pe doua-cai. Când se lucreaza cu porti, mai întâi de toate este necesar sa se aleaga cu ce pot urmeaza sa se lucreze, si apoi sa se trimita date la, sau sa se ia date de la port.

Când se lucreaza cu el portul se comporta ca o locatie de memorie. Ceva este pur si simplu scris în sau citit din el, si este posibil de a remarca usor aceasta la pinii microcontrolerului.

1.3.5 Comutatia seriala

Cu aceasta am adaugat la unitatea deja existenta posibilitatea comunicarii cu lumea de afara. Totusi, acest mod de comunicare are neajunsurile lui. Unul din neajunsurile de baza este numarul de linii ce trebuie sa fie folosite pentru a transfera datele. Ce s-ar întâmpla daca acestea ar trebui transferate la distanta de câtiva kilometri? Numarul de linii si numarul de kilometri nu promite costuri eficiente pentru proiect. Nu ne ramâne decât sa reducem numarul de linii     într-un asa fel încât sa nu afectam functionalitatea. Sa presupunem ca lucram doar cu 3 linii, si ca o linie este folosita pentru trimiterea de date, alta pentru receptie si a treia este folosita ca o linie de referinta  atât pentru partea de intrare cât si pentru partea de iesire. Pentru ca aceasta sa functioneze, trebuie sa stabilim regulile de schimb ale datelor. Aceste reguli sunt numite protocol. Protocolul este de aceea definit în avans ca sa nu fie nici o neîtelegere între partile ce comunica una cu alta. De exemplu, daca un om vorbeste în franceza, si altul vorbeste în engleza, este putin probabil ca ei se vor întelege repede si eficient unul cu altul. Sa presupunem ca avem urmatorul protocol. Unitatea logica "1" este setata pe linia de transmisie pâna ce incepe transferul. Odata ce începe transferul, coborâm linia de transmisie la "0" logic pentru o perioada de timp (pe care o vom desemna ca T), asa ca partea receptoare va sti ca sunt date de primit, asa ca va activa mecanismul ei de receptie. Sa ne întoarcem acum la partea de transmisie si sa începem sa punem zero-uri si unu-uri pe linia de transmisie în ordinea de la un bit a celei mai de jos valori la un bit a celei mai de sus valori. Sa lasam ca fiecare bit sa ramâna pe linie pentru o perioada de timp egala cu T, si la sfârst, sau dupa al 8-lea bit, sa aducem unitatea logica  "1" înapoi pe linie ce va marca  sfârsitul transmisiei unei date. Protocolul ce tocmai l-am descris este numit în literatura profesionala NRZ (Non-Return to Zero).

Pentru ca aven linii separate de receptie si de transmitere, este posibil sa receptionam si sa transmitem date (informatii) în acelasi timp. Blocul ce permite acest mod de comunicare este numit blocul de comunicare seriala. Spre deosebire de transmisia paralela, datele sunt mutate aici bit cu bit, sau într-o serie de biti, de unde vine si numele de comunicatie seriala. Dupa receptia de date trebuie sa le citim din locatia de transmisie si sa le înmagazinam în memorie în mod opus transmiterii unde procesul este invers. Datele circula din memorie prin bus catre locatia de trimitere, si de acolo catre unitatea de receptie conform protocolului.

1.3.6 Unitatea de timer

Acum ca avem comunicatia seriala, putem receptiona, trimite si procesa date.

1.3.7 Watchdog-ul

Înca un lucru ce necesita atentia noastra este functionarea fara defecte a microcontrolerului în timpul functionarii. Sa presupunem ca urmare  a unei anumite interferente (ce adesea se întâmpla în industrie) microcontrolerul nostru se opreste din executarea programului, sau si mai rau, începe sa functioneze incorect.

Bineânteles, când aceasta se întâmpla cu un computer, îl resetam pur si simplu si va continua sa lucreze. Totusi, nu exista buton de resetare pe care sa apasam în cazul microcontrolerului care sa rezolve astfel problema noastra. Pentru a depasi acest obstacol, avem nevoie de a introduce înca un bloc numit watchdog-câinele de paza. Acest bloc este de fapt un alt contor liber unde programul nostru are nevoie sa scrie un zero ori de câte ori se executa corect. În caz ca programul se "întepeneste", nu se va mai scrie zero, iar contorul se va reseta singur pâna la obtinerea valorii sale maxime. Aceasta va duce la rularea programului din nou, si corect de aceasta data pe toata durata. Acesta este un element important al fiecarui program ce trebuie sa fie fiabil fara supravegherea omului.

1.3.8 Convertorul Analog-Digital

Pentru ca semnalele de la periferice sunt substantial diferite de cele pe care le poate întelege (zero si unu), ele trebuie convertite într-un mod care sa fie înteles de microcontroler. Aceasta sarcina este îndeplinita de un bloc pentru conversia analog-digitala sau de un convertor AD. Acest bloc este responsabil pentru convertirea unei informatii despre o anumita valoare analoga într-un numar binar si pentru a o urmari pe tot parcursul la un bloc CPU asa ca blocul CPU sa o poata procesa.

Astfel microcontrolerul este acum terminat, si tot ce mai ramâne de facut este de a-l pune într-o componenta electronica unde va accesa blocurile interioare prin pinii acestei componente. Imaginea de mai jos arata cum arata un microcontroler în interior.

Cofiguratia fizica a interiorului unui microcontroler

Liniile subtiri ce merg din interior catre partile microcontrlerului reprezinta fire conectând blocurile interioare cu pinii capsulei microcontrolerului. Schema urmatoare reprezinta sectiunea centrala a microcontrolerului.

Pentru o aplicatie reala, un microcontroler singur nu este de ajuns. Înafara de microcontroler, avem nevoie de un program pe care sa-l execute, si alte câteva elemente ce constituie o interfata logica catre elementele de stabilizare (ce se va discuta în capitolele urmatoare).

1.3.9 Programul

Scrierea programului este un domeniu special de lucru al microcontolerului si este denumit "programare". Sa încercam sa scriem un mic program ce îl vom crea singuri si pe care oricine va fi în stare sa-l înteleaga.

START
REGISTER1=MEMORY LOCATION_A
REGISTER2=MEMORY LOCATION_B
PORTA=REGISTER1 + REGISTER2

END

Programul adauga continuturile a doua locatii de memorie, si vede totalul lor la portul A. Prima linie a programului este pentru mutarea continuturilor locatiei de memorie "A" într-unul din registri unitatii centrale de procesare. Pentru ca avem nevoie si de celelalte date de asemenea, le vom muta de asemenea în celalalt registru al unitatii centrale de procesare. Urmatoarea instructiune instruieste unitatea centrala de procesare sa adauge continuturile celor doi registri sa sa trimita un rezultat obtinut la portul A, încât suma acestei adaugari sa fie vizibila pentru toata lumea de afara. Pentru o problema mai complexa, programul care sa lucreaze la rezolvarea ei va fi mai mare.

Programarea poate fi facuta în câtava limbaje ca Assembler, C si Basic care sunt cele mai folosite limbaje. Assembler apartine limbajelor de nivel scazut ce sunt programate lent, dar folosesc cel mai mic spatiu în memorie si da cele mai bune rezultate când viteza de executie a programului se are în vedere. Pentru ca este cel mai folosit limbaj în programarea microcontrolerelor va fi discutat într-un capitol ulterior. Programele în limbajul C sunt mai usor de scris, mai usor de înteles, dar sunt mai lente în executare decât programele în Assembler. Basic este cel mai utor de învatat, si instructiunile sale sunt cele mai aproape de modul de gândire a omului, dar ca si limbajul de programare C este de asemenea mai lent decât Assembler-ul. În orice caz, înainte de a va hotarî în privinta unuia din aceste limbaje trebuie sa studiati cu atentie cerintele privind viteza de executie, marimea memoriei si timpul disponibil pentru asamblarea sa.

Dupa ce este scris programul, trebuie sa instalam microcontrolerul într-un aparat si sa-l lasam sa lucreze. Pentru a face aceasta  trebuie sa adaugam câteva componente externe necesare pentru functionarea sa. Mai întâi trebuie sa dam viata microcontrolerului prin conectarea sa la o sursa (tensiune necesara pentru operarea tuturor instrumentelor electronice) si un oscilator a carui rol este similar inimii din corpul uman. Bazat pe ceasul sau microcontrolerul executa instructiunile programului. Îndata ce este alimentat microcontrolerul va executa un scurt control asupra sa, se va uita la începutul programului si va începe sa-l execute. Cum va lucra aparatul depinde de multi parametri, cel mai important fiind priceperea dezvoltatorului de hardware, si de expertiza programatorului în obtinerea maximului din aparat cu programul sau.

Microcontrolerul PIC16F84

PIC16F84 apartine unei clase de microcontrolere de 8 biti cu arhitectura RISC. Structura lui generala este aratata în schita urmatoare reprezentând blocurile de baza.

Memoria program (FLASH)-pentru înmagazinarea unui program scris. Pentru ca memoria ce este facuta în tehnologia FLASH poate fi programata si stearsa mai mult decât odata, aceasta face microcontrolerul potrivit pentru dezvoltarea de componenta.

EEPROM-memorie de date ce trebuie sa fie salvate când nu mai este alimentare. Este în mod uzual folosita pentru înmagazinarea de date importante ce nu trebuie pierdute daca sursa de alimentare se întrerupe dintr-o data. De exemplu, o astfel de data este o temperatura prestabilita în regulatoarele de temperatura.  Daca în timpul întreruperii alimentarii aceasta data se pierde, va trebui sa facem ajustarea înca o data la revenirea alimentarii. Asfel componenta noastra pierde în privinta auto-mentinerii.

RAM-memorie de date folosita de un program în timpul executarii sale. În RAM sunt înmagazinate toate rezultatele intermediare sau datele temporare ce nu sunt cruciale la întreruperea sursei de alimentare.

PORTUL A si PORTUL B sunt conexiuni fizice între microcontroler sin lumea de afara. Portul A are 5 pini, iar portul B are 8 pini.

TIMER-ul LIBER este un registru de 8 biti în interiorul microcontrolerului ce lucreaza independent de program. La fiecare al patrulea impuls de ceas al oscilatorului îsi încrementeaza valoarea lui pâna ce atinge maximul (255), si apoi începe 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 CENTRALĂ are rolul unui elemnet de conectivitate între 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  în literatura despre computere, si are nevoie sa fie explicat aici mai în detaliu. Arhitectura Harvard este un concept mai nou decât von-Neumann`s.   S-a nascut din nevoia de marire a vitezei microcontrolerului. În arhitectura Harvard, bus-ul de date bus-ul de adrese sunt separate. Astfel un mare debit de date este posibil prin unitatea de procesare centrala, si bineînteles, o viteza mai mare de lucru. Separând  un program 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 de un cuvânt. Este de asemenea tipic pentru arhitectura Harvard sa aiba mai putine instructiuni decât von-Newmann si sa aiba instructiuni executate uzual intr-un ciclu.

Microcontrolerele cu arhitectura Harvard sunt de asemenea numite "microcontrolere RISC". RISC înseamna Reduced Instruction Set Computer. Microcontrolerele cu arhitectura von-Newmann sunt numite "microcontrolere CISC". Titlul CISC înseamna Complex Instruction Set Computer.

Pentru ca PIC16F84 este un microcontroler RISC, aceasta înseamna 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 într-un ciclu cu exceptia instructiunilor jump si branch. Conform cu ceea ce spune constructorul, PIC16F84 ajunge la rezultate de 2:1 în compresia cod si 4:1 în viteza în comparatie cu alte microcontrolere de 8 biti din clasa sa.

Aplicatii :

PIC16F84 se potriveste perfect în multe folosinte, de la industriile auto si aplicatiile de control casnice la instrumentele industriale, senzori la distanta, mânere 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.

Pic16F84, un microcontroller de 8 biti cu un set restrins de vre-o 34 de instructiuni, cu arhitectura de tip RISC (una, maxim  doua instructiuni pe tact ) impreuna cu un programator si un compilator ( si un simulator ) devine o jucarie extrem de interesanta pentru un electronist obisnuit cu proiectarea CMOS sau TTL. Fiind de tip flash permite reprogramarea de un numar in(finit) de ori  (pina la un moment dat cind il alimentezi pe dos...), nu necesita scule de dezvoltare inafara unui protoboard de calitate si multa rabdare la elaborarea programului. Cu 13 pini disponibili pentru interfatare care pot fi in mod secvential intrari sau iesiri, din care una de tip open drain, 1K de spatiu program si 64 octeti de eeprom, 8 bit timer , 8 bit prescaler asignat la timer sau la watchdog, intreruperi si cu mai bine de 1000 de site-uri in care se prezinta programe pentru acest procesor (de la roboti, muzicute, frecventmetre, capacimetre, compilatoare de C sau basic,  la cum sa-ti faci propria cartela de telefon reinscriptibila...) este o scula care pe mine m-a entuziasmat ca in prima tinerete. Memoria EEPROM face mai usoara aplicarea microcontrolerelor la aparate unde se cere înmagazinarea permanenta a diferitor parametri (coduri pentru transmitatoare, viteza motorului, frecventele receptorului, etc.). Costul scazut , consumul scazut, mânuirea usoara si flexibilitatea fac PIC16F84 aplicabil chiar si în domenii unde microcontrolerele nu au fost prevazute înainte (exemple:functii de timer, înlocuirea interfetei în sistemele mari, aplicatiile coprocesor, etc.) Programabilitatea sistemului acestui cip (împreuna cu folosirea a doar doi pini în 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 înmagazina date de calibrare disponibile doar dupa testarea finala, sau poate fi folosit pentru a îmbunatati programele la produse finite.

Ciclul de clock / 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. În 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 întoarce ceasul poate fi comparata cu o sursa electrica.

Clock-ul de la oscilator intra într-un microcontroler prin pinul OSC1 unde circuitul intern al unui microcontroler divide clock-ul în 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) în timpul careia o instructiune este executata.

Executarea instructiunii începe prin apelarea unei instructiuni care este urmatoarea în linie. Instructiunea este apelata din memoria program la fiecare Q1 si este scrisa în registrul de instructiuni la Q4. Decodarea si executarea instructiunii sunt facute între urmatoarele cicluri Q1 si Q4. În 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 de instructiuni consta din ciclurile Q1, Q2, Q3 si Q4. Ciclurile de instructiuni de apelare si executare sunt conectate într-un asa fel încât pentru a face o apelare, este necesar un ciclu cu o instructiune, si este nevoie de înca una pentru decodare si executare. Totusi, datorita pipeline-ului sau liniei directe, fiecare instructiune este efectiv executata într-un singur ciclu. Daca instructiunea cauzeaza o schimbare în contorul programului, si PC-ul nu directioneaza spre urmatoarea ci spre alte adrese (poate fi cazul cu subprogramele jumps sau de apelare), 2 cicluri sunt necesare pentru executarea unei instructiuni. Aceasta este pentru ca instructiunea trebuie procesata din nou, dar de data aceasta din partea adresei corecte. Ciclul începe cu clock-ul Q1, prin scrierea într-un registru (IR). Decodarea si executarea începe cu clock-urile Q2, Q3 si Q4.

TYCO citeste instructiunea MOVLW 55h (nu are importanta pentru noi ce instructiune a fost executata, ce explica de ce nu este un dreptunghi în partea de jos).
TCYI executa instructiunea MOVLW 55h si citeste MOVWF PORTB.
TCY2 executa MOVWF PORT si citeste CALL SUB_1.
TCY3 executa o apelare a unui subprogram 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 unui subprogram SUB_1 a carui executie este urmatoarea în ordine, instructiunea trebuie citita din nou. Acesta este un bun exemplu a unei instructiuni având nevoie de mai mult de un ciclu.
TCY4 ciclul instructiunii este total folosit pentru citirea primei instructiuni dintr-un subprogram la adresa SUB_1.
TCY5 executa prima instructiune dintr-un subprogram SUB_1 si citeste urmatoarea.

Semnificatia pinilor

PIC16F84 are un numar total de 18 pini. Cel mai adesea se gaseste într-o capsula de tip DIP18 dar se poate gasi de asemenea si într-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 sugerând ca gaurile pentru pini unde sa intre acestia , nu sunt necesare în lipirea acestui tip de componenta.

Pinii microcontrolerului PIC16F84 au urmatoarea semnificatie:

Pin nr.1 RA1 Al doilea pin la portul A. Nu are functie aditionala.
Pin nr.2 RA2 Al treilea pin la portul A. Nu are functi aditionala.
Pin nr.3 RA3 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 RBO Pin de zero la portul B. Intrarea întrerupta 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' în mod programare.
Pin nr.13 RB7 Al saptelea pin la portul B. Linia 'Data' în 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.

Blocurile de baza din pic 16f84

Generator-oscilator de ceas

Circuitul oscilator este folosit pentru a da microcontrolerului un ceas. Ceasul este necesar pentru ca microcontrolerul sa execute programul sau instructiunile din program.

Tipuri de oscilatoare PIC16F84 poate lucra cu patru configuratii diferite de oscilator. Pentru ca configuratiile cu oscilator cu cristal si rezistor-condensator (RC) sunt cele utilizate cel mai frecvent, doar pe ele le vom mentiona aici. Tipul de microcontroler cu oscilator cu cristal este desemnat ca XT, iar microcontrolerul cu perechea rezistor-condensator are desemnarea RC. Aceasta este important pentru ca trebuie sa numiti tipul de oscilator când cumparati un microcontroler.  

Oscilatorul XT

Oscilatorul cu cristal se afla intr-o carcasa metalica cu doi pini pe care este înscrisa frecventa la care cristalul oscileaza. Mai este necesar câte un condensator ceramic de 30pF cu celalalt capat la masa de a fi conectati la fiecare pin.

Oscilatorul si condensatorii pot fi încapsulati împreuna într-o carcasa cu trei pini. Un asemenea element se numeste rezonator ceramic si este reprezentat în scheme ca cel de mai jos. Pinii centrali ai elementului sunt masa, iar pinii terminali sunt conectati la pinii OSC1 si OSC2 ai microcontrolerului. Când se proiecteaza un aparat, regula este sa plasati oscilatorul cât mai aproape de microcontroler, pentru a elimina orice interferenta pe liniile pe care microcontrolerul primeste tactul de ceas.

Oscilatorul RC

În aplicatiile unde nu este nevoie de o mare precizie de timp, oscilatorul RC permite economii aditionale la cumparare. Fecventa de rezonanta a oscilatorului RC depinde de valoarea tensiunii de alimentare, rezistorul R, condensatorul C si temperatura de lucru. Trebuie de mentionat ca frecventa de rezonanta este de asemenea influentata de variatiile normale ale parametrilor de proces, de toleranta externa a componentelor R si C, etc.

Diagrama de mai sus arata cum este conectat oscilatorul RC la PIC16F84. La valoarea rezistorului mai mica 2.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 între 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 începe sa oscileze. Oscilatia la început 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 în 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

Resetul

Este folosit pentru a pune microcontrolerul într-o conditie 'cunoscuta'. Aceasta înseamna practic ca microcontrolerul poate sa se comporte incorect în unele conditii nedorite. Pentru a continua sa functioneze corect trebuie resetat, însemnând ca toti registrii vor fi pusi într-o stare de start. Resetul nu este folosit numai când microcontrolerul nu se comporta cum vrem noi, dar poate de asemenea sa fie folosit când se încearca un montaj, ca o întrerupere într-un program de executie sau când se pregateste un microcontroler de a citi un program.

Microcontrolerul PIC16F84 are câteva surse de reset:

a) Reset la alimentare, POR (Power-On Reset)
b) Reset în timpul lucrului obisnuit prin aducerea unui zero logic la pinul MCLR al microcontrolerului.
c) Reset în timpul regimului SLEEP
d) Reset la depasirea timerului watchdog (WDT)
e) Reset în timpul depasirii WDT în timpul regimului SLEEP.

Cele mai importante resurse de reset sunt a) si b). Prima are loc de fiecare data când este alimentat microcontrolerul si serveste la aducerea toturor registrilor la starea initiala a pozitiei de start. A doua este pentru a aduce un zero logic la pinul MCLR în timpul operatiei normale a microcontrolerului. Este des folosita în dezvoltarea de programe. 

În timpul unui reset, locatiile de memorie RAM nu sunt resetate. Ele sunt necunoscute la alimentare si nu sunt schimbate la nici un reset. Spre deosebire de acestea, registrii SFR sunt resetati la o stare initiala a pozitiei de start. Unul din din cele mai importante efecte ale resetului este setarea unui contor de program (PC) la zero (0000h), ceea ce permite programului sa înceapa executarea de la prima instructiune scrisa. 

Resetul la scaderea tensiunii de alimentare dincolo de limita permisibila (Brown-out Reset) Impulsul pentru resetare în timpul cresterii tensiunii este generat de microcontrolerul însusi când detecteaza o crestere în tensiunea Vdd (într-un domeniu de la 1.2V la 1.8V). Acest impuls dureaza 72 ms ceea ce este un timp suficient pentru oscilator ca sa se stabilizeze. Aceste 72 ms sunt asigurate de un timer intern PWRT care are oscilatorul lui RC. Microcontrolerul este în modul reset cât timp PWRT este activ. Totusi, când montajul functioneaza, probleme apar când sursa nu scade la zero ci când scade mai jos de limita ce garanteaza functionarea corecta a microcontrolerului. Acesta este un caz real din practica, în special în mediile industriale unde perturbatiile si instabilitatile sursei de alimentare sunt ceva foarte curent. Pentru a rezolva aceasta problema trebuie sa ne asiguram ca microcontrolerul este într-o stare de reset de fiecare data când tensiunea sursei scade sub limita admisa. 

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. În afara de aceasta functie, ele pot functiona pentru supravegherea tensiunii de alimentare. Daca tensiunea scade mai jos de nivelul specifcat, un zero logic va apare la pinul MCLR ce tine microcontrolerul în starea de reset pâna ce tensiunea nu este în limitele ce garanteaza functionarea corecta.

Unitatea de Procesare Centrala

Unitatea de procesare centrala (CPU) este creierul microcontrolerului. Aceasta parte este responsabila cu gasirea si aducerea instructiunii corecte ce trebuie executata, cu decodarea acelei instructiuni, si în final cu executarea ei.

Unitatea de procesare centrala conecteaza toate partile microcontrolerului într-un întreg. Desigur, functia ei cea mai importanta este sa decodeze instructiunile de program. Când programatorul scrie un program, instructiunile au o forma clara ca MOVLW 0x20. Totusi, pentru ca microcontrolerul sa înteleaga aceasta, aceasta forma de 'scrisoare' a unei instructiuni trebuie tradusa într-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 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 în ele asignari ce cer diferite transferuri de date dintr-o memorie în 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 stânga sau la dreapta într-un registru) si de operatiile logice. Mutarea datelor într-un registru se mai numeste 'shifting'- transferare. PIC16F84 contine o unitate logica aritmetica de 8 biti si registri de lucru de 8 biti.

În instructiunile cu doi operanzi, în mod obisnuit un operand este în registrul de lucru (registrul W), iar celalalt este unul din registri sau o constanta. Prin operand întelegem continutul asupra caruia se fac unele oparatii, 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 Functii Speciale. În instructiunile cu un operand, un operand este fie registrul W fie unul din registri. Pe lânga operatiile aritmetice si logice, ALU controleaza bitii de stare (biti gasiti în registrul STATUS). Efectuarea unor instructiuni afecteaza bitii de stare, de care depinde rezultatul însusi. Depinzând de ce instructiune este executata, ALU poate afecta valorile bitilor Carry (C), Digit Carry (DC), si Zero (Z) în registrul STATUS.

Registru STATUS

. Daca registrul STATUS este o destinatie pentru instructiunile ce afecteaza bitii Z, DC or C, atunci scrierea în acesti trei biti nu este posibila.

bit C (Carry) Transfer
Bit care este afectat de operatiile de adunare, scadere si transfer.  
1= transferul produs din bitul rezultat cel mai înalt  
0= transferul nu s-a produs
Bitul C este afectat de instructiunile ADDWF, ADDLW, SUBLW, SUBWF.

bit 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 când se întâmpla un transport de la bitul 3 la bitul 4, sau de scadere când se întâmpla împrumut de la bitul 4 la bitul 3, sau de transfer în ambele directii.  
1= transfer produs la al patrulea bit conform cu ordinea 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 când rezultatul unei operatii aritmetice sau logice executate este zero. 
1= rezultatul egaleaza zero
0= rezultatul nu egaleaza zero

bit 3 PD (Power-down bit)
Bit ce este setat când microcontrolerul este alimentat atunci când începe sa functioneze, dupa fiecare reset obisnuit si dupa executarea instructiunii CLRWDT. Instructiunea SLEEP îl reseteaza când microcontrolerul intra în 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, schimbare la portul RB, terminarea scrierii datelor interne la EEPROM, si printr-un watchdog de asemenea.
1= dupa ce sursa a fost pornita
0= executarea instructiunii SLEEP

bit 4 TO Time-out ; depasirea watchdog-ului.
Bitul este setat dupa pornirea sursei si executarea instructiunilor CLRWDT si SLEEP. Bitul este resetat când watchdog-ul ajunge la sfârsit semnalând ca ceva nu este în ordine.
1= depasirea nu s-a produs
0= depasirea s-a produs

bit5,6 RP1:RP0 (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 înca un bit pentru a adresa cei 256 bytes adica câti 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 (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). Considerând ca selectia bancului de memorie este controlata prin acest registru, el trebuie sa fie prezent în fiecare banc. Bancul de memorie se va discuta mai în detaliu în capitolul Organizarea memoriei. Registrul STATUS poate fi o destinatie pentru orice instructiune, cu oricare alt registru
Registrul OPTION

bit PS0, PS1, PS2 (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 în sectiunea depre TMRO.

bit PSA (Bit de Asignare Prescaler)
Bit ce asigneaza prescalerul între TMRO si watchdog.
1= prescalerul este signat watchdogului
0= prescalerul este asignat unui timer free-run (functioneaza-liber) TMRO

bit 4 T0SE (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 descresterea sau la cresterea frontului unui semnal.
1= front crescator
0= front descrescator

bit 5 TOCS (Bit Selectie Sursa Ceas TMR0
Acest pin permite timerului 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 (Bit de Selectie a Frontului
Daca întreruperea este activata este posibil ca acest bit sa determine frontul la care o întrerupere va fi activata la pinul RB0/INT.
1= front crescator
0= front descrescator

bit 7 RBPU (Bit Enable-Activare Pull-up PORTB) 
Acest bit porneste si opreste rezistorii interni 'pull-up' la portul B.
1= Rezistori oprire "pull-up"
0= Rezistori pornire "pull-up"

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 unde putem citi o stare existenta. Fizic, portul este un registru în 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 PA4/TOCKI de exemplu, care este simultan al patrulea bit la portul A si o intrare externa pentru contorul free-run. Selectia uneia din aceste doua functii ale pinului se face în unul din registrii configurationali. O ilustratie a acesteia este al cincilea bit T0CS în registrul OPTION. Selectând una din functii cealalta este dezactivata.

Toti pinii portului pot fi definti ca intrare sau iesire, conform cu nevoile unui montaj ce este în 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 în registrul TRIS. Daca în locul potrivit este scris "1" logic în 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.

PORT B

PORTB are 8 pini legati la el. Registrul adecvat pentru directia datelor este TRISB la adresa 86h. Setarea unui bit în registrul TRISB defineste pinul portului corespunzator ca pin de intrare, si stergerea unui bit în registrul TRISB, defineste pinul portului corespunzator ca pin de iesire. Fiecare pin la PORTB are un rezistor slab intern pull-up (tragere) (rezistor care defineste o linie la unu logic) care poate fi activat prin resetarea celui de-al saptelea bit RBPU în registrul OPTION. Acesti registri 'pull-up' se închid automat cînd pinul portului este configurat ca o iesire. Când porneste microcontrolerul, 'pull-up'-urile sunt dezactivate.

Patru pini ai portului PORTB, RB7:RB4 pot cauza o întrerupere care se întâmpla când starea lor se schimba de la unu logic la zero logic si invers. Numai pinii configurati ca intrare pot cauza aceasta întrerupere sa se întâmple (daca fiecare pin RB7:RB4 este configurat ca o iesire, nu va fi generata o întrerupere la schimbarea starii). Aceasta optiune de întrerupere cu rezistorii pull-up fac mai usoara rezolvarea problemelor din practica ca de exemplu o tastatura matriciala. Daca rândurile tastaturii sunt conectate la acesti pini, fiecare apasare a unei clape va cauza o întrerupere. Un microcontroler va determina care clapa este apasata în timp ce se proceseaza o întrerupere. Nu se recomanda sa apelati la portul B în timp ce se proceseaza întreruperea.


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 în registrul TRISA defineste de asemenea pinul portului corespunzator ca un pin de intrare, si stergerea unui bit în registrul TRISA defineste pinul portului corespuzator ca o iesire.
Al cincilea pin al portului A are functie duala. La acel pin se afla de asemenea o intrare externa pentru timerul 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 timerului 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

2.5 Organizatia memoriei

PIC16F84 are doua blocuri separate de memorie, unul pentru date si celalalt pentru programe. Memoria EEPROM si registrii GPR în memoria RAM constituie un bloc, si memoria FLASH constituie un bloc de programe Memoria program Memoria program a fost realizata în tehnologia FLASH ceea ce face posibil de a programa un microcontroler de mai multe ori înainte de a fi instalat într-un montaj, si chiar dupa instalarea sa daca se întâmpla unele schimbari în program sau parametri de proces. Marimea memoriei program este de 1024 locatii cu latime de 14 biti unde locatiile zero si patru sunt rezervate pentru reset si pentru vectorul întrerupere.
Memoria de date Memoria de date consta din memoriile EEPROM si RAM. Memoria EEPROM consta din 64 de locatii de opt biti a caror continut nu este pierdut în timpul opririi sursei de alimentare. EEPROM-ul ne este direct adresabil, dar este accesat indirect prin registrii EEADR si EEDATA. Pentru ca memoria EEPROM este folosita curent la înmagazinarea unor parametri importanti (de exemplu, o temperatura data în regulatoarele de temperatura), exista o procedura stricta de scriere în EEPROM ce trebuie urmata pentru a preveni scrierea accidentala. Memoria RAM pentru date ocupa un spatiu într-o harta a memoriei de la locatia 0x00 la 0x4F ceea ce înseamna 68 de locatii. Locatiile memoriei RAM sunt de asemenea denumite registri GPR care este o abreviere General Purpose Registers-Registri cu Scop General. Registrii GPR pot fi accesati indiferent de ce banc este selectat la un moment.  
Registri SFR Registri ce ocupa primele 12 locatii în bancurile 0 si 1 sunt ai functiei specializate asignata cu unele blocuri ale microcontrolerului. Acestia sunt numiti Special Function Registers-Registri ai Functiei Speciale.

Bancuri de Memorie

Înafara de aceasta diviziune în 'lungime' a registrilor SFR si GPR, harta memoriei este de asemenea împartita în 'latime' (vezi harta precedenta) în doua zone numite 'bancuri. Selectarea unuia din bancuri se face de bitii RPO si RP1 în registrul STATUS-stare.

Exemplu
bcf STATUS, RP0

Instructiunea BCF sterge bitul RPO (RP0=0) în registrul STATUS si astfel seteaza bancul 0.

bsf STATUS, RP0

Instructiunea BSF seteaza bitul RPO (RP0=1) în registrul STATUS si astfel seteaza bancul1.

 

Uzual, grupurile de instructiuni care sunt adesea în uz, sunt conectate într-o singura unitate ce poate fi usor apelata într-un program, si a carei nume are o semnificatie clara, asa-numitul Macros. Cu ajutorul lor, selectia dintre doua bancuri devine mai clara si programul mult mai elegibil.

BANK0 macro
      Bcf STATUS, RP0   ;Select memory bank 0
      Endm

BANK1 macro
      Bsf STATUS, RP0   ;Select memory bank 1

Contorul de Program Contorul de program (PC) este un registru de 13 biti ce contine adresa instructiunii ce se executa. Prin incrementarea sau schimbarea sa (ex. în caz de salturi) microcontrolerul executa instructiunile de program pas-cu-pas

Stiva PIC16F84 are o stiva de 13 biti cu 8 nivele, sau cu alte cuvinte, un grup de 8 locatii de memorie de 13 biti latime cu functii speciale. Rolul sau de baza este de a pastra valoarea contorului de program dupa un salt din programul principal la o adresa a unui subprogram. Pentru ca un program sa stie cum sa se întoarca la punctul de unde a pornit, trebuie sa înapoieze valoarea contorului programului din stiva. Când se muta dintr-un program într-un subprogram, contorul programului este împins în stiva (un exemplu de acesta este instructiunea CALL). Când se executa instructiuni ca RETURN, RETLW sau RETFIE ce au fost executate la sfârsitul unui subprogram, contorul programului a fost luat dintr-o stiva asa ca programul sa poata continua de unde a fost oprit înainte de a fi întrerupt. Aceste operatii de plasare într-o si luare dintr-o stiva de contor de program sunt numite PUSH si POP, si sunt numite conform cu instructiunile similare ale unor microcontrolere mai mari. Programarea În Sistem Pentrtu a programa o memorie de program, microcontrolerul trebuie sa fie setat pentru un mod de lucru special prin aducerea lui pinului MCLR la 13.5V, iar sursa de tensiune Vdd trebuie sa fie stabilizata între 4.5V si 5.5V. Memoria program poate fi programata serial folosind doi pini 'data/clock' ce trebuie sa fie mai întâi separati de liniile montajului, asa ca sa nu apara erori în timpul programarii.
Moduri de adresare Locatiile de memorie RAM pot fi accesate direct sau indirect.

Direct Addressing Adresarea Directa se face printr-o adresa de 9 biti. Aceasta adresa este obtinuta prin conectarea celui de-al saptelea bit a adresei directe a unei instructiuni cu doi biti (RP1, RP0) din registrul STATUS dupa cum se arata în figura urmatoarea. Orice acces la registrii SFR pot fi un exemplu de adresare directa.

Bsf STATUS, RP0 ;Bankl
movlw 0xFF      ;w=0xFF
movwf TRISA     ;address of TRISA register is taken from
        ;instruction movwf

Adresarea Directa

Adresarea Indirecta
Adresarea indirecta spre deosebire de cea directa nu ia o adresa dintr-o instructiune ci o creeaza cu ajutorul bitului IRP a registrilor STATUS si FSR.
Locatia adresata este accesata prin registrul INDF care de fapt tine o adresa indicata de un FSR. Cu alte cuvinte, orice instructiune care foloseste INDF ca registrul ei în realitate acceseaza datele indicate de un registru FSR. Sa spunem, de exemplu, ca un registru cu scop general (GPR) la adresa 0Fh contine o valoarea 20. Prin scrierea unei valori 0Fh în registrul FSR vom obtine un registru indicator la adresa 0Fh, iar prin citirea din registrul INDF, vom obtine valoarea 20, ceea ce înseamna ca am citit din primul registru valoarea lui fara accesarea lui directa (dar prin FSR si INDF). Se pare ca acest tip de adresare nu are nici un avantaj fata de adresarea directa, dar exista unele nevoi timpul programarii ce se pot rezolva mai simplu doar prin adresarea indirecta.

Un asemenea exemplu poate trimite un set de date prin comunicatia seriala, lucrând cu bufere si indicatoare (ce vor fi discutate în continuare într-un capitol cu exemple), sau sa stearga o parte a memoriei RAM (16 locatii) ca în urmatorul exemplu.

Citind datele din registrul INDF când continutul registrului FSR este egal cu zero întoarce valoarea zero, si scrie în el rezultatul în operatia NOP (no operation-fara operatie).

Intreruperi

Întreruperele sunt un mecanism a unui microcontroler ce îi permit sa raspunda la unele evenimente la momentul când se întâmpla, indiferent de ce face atunci microcontrolerul. Aceasta este o parte foarte importanta, pentru ca permite conexiunea microcontrolerului cu lumea de afara. În general, fiecare întrerupere schimba debitul programului, îl întrerupe si dupa executarea unui subprogram (rutine de întrerupere) continua din acelasi punct.

Registrul de control a unei întreruperi se numeste INTCON si se gaseste la adresa 0Bh. Rolul lui este de a permite sau interzice cererile de întreruperi, si în caz ca nu sunt permise, înregistreaza cererile de întrerupere singulare prin bitii lui.

Registru INTCON

bit 0 RBIF (RB Port Change Interrupt Flag bit-bit Stegulet de Întrerupere a Schimbarii Portului RB) Bit ce informeaza despre schimbarile de la pinii 4, 5, 6 si 7 ai portului B.
1=cel putin un pin si-a schimbat starea
0=nu s-a întâmplat nici o schimbare la vreun pin

bit 1 INTF (INT External Interrupt Flag bit-bit Stegulet de Întrerupere Externa INT) A avut loc o întrerupere externa.
1=a avut loc o întrerupere
0=nu a avut loc o întrerupere
Daca s-a detectat un front crescator sau descrescator la pinul RB0/INT, (ce este definit cu bitul INTEDG în registrul OPTION), bitul INTF este setat. Bitul trebuie sa fie sters în subprogramul întrerupere pentru a detecta urmatoarea întrerupere.

bit 2 T0IF (TMR0 Overflow Interrupt Flag bit-bit Stegulet Depasire Întrerupere TMRO) Depasirea contorului TMRO.
1=contorul si-a schimbat starea de la FFh la 00h.
0=depasirea nu a avut loc
Bitul trebuie sa fie sters în program pentru ca o întrerupere sa fie detectata.

bit 3 RBIE (RB port change Interrupt Enable bit-bit Permite Întreruperea schimbarii portului RB) Permite sa aiba loc întreruperi la schimbarea starii pinilor 4, 5, 6, si 7 ai portului B. 
1=permite întreruperi la schimbarea starii
0=întreruperi interzise la schimbarea starii
Daca RBIE si RBIF au fost simultan setate, va avea loc o întrerupere.

bit 4 INTE (INT External Interrupt Enable bit-bit Permite Întrerupere externa INT) Bit ce permite întreruperea externa de la pinul RB0/INT.
1=întrerupere externa permisa
0=întrerupere externa interzisa
Daca INTE si INTF au fost setate simultan, va avea loc o întrerupere.

bit 5 T0IE (TMR0 Overflow Interrupt Enable bit-bit Permite Depasire Întrerupere TMRO) Bit ce permite întreruperile în timpul depasirii contorului TMRO.
1=întrerupere permisa
0=întrerupere interzisa
Daca T0IE si T0IF au fost simultan setate, va avea loc întreruperea.

Bit 6 EEIE (EEPROM Write Complete Interrupt Enable bit-bit Permite Întrerupere Completa a Scrierii EEPROM) Bit ce permite o întrerupere la sfârsitul unei rutine de scriere în EEPROM
1= întrerupere permisa
0= întrerupere interzisa
Daca EEIE si EEIF (ce este în registrul EECON1) au fost simulatan setate, va avea loc o întrerupere.

Bit 7 GIE (Global Interrupt Enable bit-bit Permite Întrerupere Globala) Bit ce permite sau interzice toate întreruperile.
1=toate întreruperile sunt permise
0=toate întreruperile sunt interzise


PIC16F84are patru surse de întrerupere:

1. Terminarea scrierii datelor în EEPROM
2. Întrerupere TMR0 cauzata de depasirea timerului
3. Întrerupere în timpul schimbarii la pinii RB4, RB5, RB6 si RB7 ai portului B.
4. Întrerupere Externa de la pinul RB0/INT al microcontrolerului

În general, fiecare sursa de întrerupere are doi biti legati la ea. Unul permite întreruperea, iar celalalt detecteaza când au loc întreruperi. Exista un bit comun numit GIE ce poate fi folosit pentru a interzice sau permite toate întreruperile simultan. Acest bit este foarte folositor când se scrie un program pentru ca permite ca toate întreruperile sa fie interzise pentru o perioada de timp, asa ca executia unei parti importante a programului sa nu fie întrerupta. Când instructiunea ce reseteaza bitul GIE a fost executata (GIE=0, toate întreruperile interzise), fiecare întrerupere ce ramâne nerezolvata trebuie ignorata. Întreruperile ce ramân nerezolvate si ce au fost ignorate, sunt procesate când bitul GIE (GIE=1, toate întreruperile sunt permise) va fi sters. Când i s-a raspuns întreruperii, bitul GIE a fost sters asa ca orice întreruperi aditionale vor fi interzise, adresa de întoarcere a fost trimisa în stiva iar adresa 0004h a fost scrisa în contorul programului - numai dupa aceasta începe raspunsul la o întrerupere! Dupa ce este procesata întreruperea, bitul a carui setare a cauzat o întrerupere trebuie sters, sau rutina de întrerupere va fi procesata automat tot mereu în timpul întoarcerii la programul principal.
Pastrând continutul registrilor importanti Doar valoarea de întoarcere a contorului programului este înmagazinata într-o stiva în timpul unei întreruperi (prin valoare de întoarcere a contorului programului întelegem adresa instructiunii ce trebuie executata, dar nu a fost executata pentru ca a avut loc întreruperea). Pastrând doar valoarea contorului programului adesea nu este suficient. Unii registri ce sunt în uz în programul principal pot fi de asemenea în uz în rutina de întrerupere. Daca ei nu sunt retinuti, programul principal va obtine valori complet diferite în acei registri în timpul întoarcerii dintr-o rutina de întrerupere, ceea ce va cauza erori în program. Un exemplu de asemenea caz este continutul registrului de lucru W. Daca presupunem ca programul principal a folosit registrul de lucru W pentru unele din operatiile sale, si ca a pastrat în el o valoare ce este importanta pentru urmatoarea instructiune, atunci o întrerupere ce se va întâmpla înainte de acea instructiune va schimba valoarea registrului de lucru W ce va influenta direct programul principal.

Procedura de înregistrare de registri importanti înainte de a merge la o rutina de întrerupere se numeste PUSH, în timp ce procedura ce aduce valorile înregistrate înapoi, se numeste POP. PUSH si POP sunt instructiuni ale altor microcontrolere (Intel), dar sunt atât de larg acceptate ca o întreaga operatie este numita dupa ele.
PIC16F84 nu are instructiuni ca PUSH si POP, si ele trebuie sa fie programate.

Datorita simplitatii si flosirii frecvente, aceste parti ale programului pot fi facute ca macro-uri. Conceptul unui Macro este explicat în "Limbaj de asamblare program". În urmatorul exemplu, continutul registrilor W si STATUS sunt memorati în variabilele W_TEMP si STATUS_TEMP înainte de rutina de întrerupere. La începutul rutinei PUSH trebuie sa verificam bancul selectat în prezent pentru ca W_TEMP and STATUS_TEMP nu se gasesc în bancul 0. Pentru schimbul de date între acesti registri, instructiunea SWAPF se foloseste în loc de MOVF pentru ca nu afecteaza starea bitilor de stare STATUS.


Exemplul este un program asamblor pentru urmatorii pasi :
1. Testarea bancului curent
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.
Restaureaza registrul STATUS
6.
Restaureaza registrul W

Daca
mai sunt si alte variabile sau registri ce trebuie stocati, ele trebuie atunci sa fie pastrati dupa stocarea registrului STATUS (pasul 3), si adusi înapoi înainte ca registrul STATUS sa fie restaurat (pasul 5).

Acelasi exemplu se poate realiza utilizând macro-uri, facând astfel progamul mai eligibil. Maco-urile ce sunt deja definite pot fi folosite pentru scrierea de noi macro-uri. Macro-urile BANK1 si BANK0 ce sunt explicate în capitolul "Organizarea memoriei" sunt folosite cu macro-urile 'push' si 'pop'.

Întrerupere externa la pinul RB0/INT al microcontrolerului
Întreruperea externa la pinul RB0/INT este triggerata de frontul crescator (daca bitul INTEDG=1 în registrul OPTION<6>), sau de frontul descrescator (daca INTEDG=0). Când apare semnalul corect la pinul INT, bitul INTF este setat la registrul INTCON. Bitul INTF (INTCON<1>) trebuie resetat în rutina de întrerupere, asa ca întreruperea sa nu aiba loc din nou în timpul întoarcerii la programul principal. Acesta este un pas important al programului pe care programatorul nu trebuie sa-l uite, sau programul va merge constant în rutina de întrerupere. Întreruperea poate fi închisa prin resetarea bitului de control INTE (INTCON<4>).
Intreruperea în timpul depasirii contorului TMRO Depasirea contorului TMRO (de la FFh la 00h) va seta bitul T0IF (INTCON<2>). Aceasta este o întrerupere foarte importanta pentru ca multe probleme reale se por rezolva folosind aceasta întrerupere. Unul din exemple este masurarea timpului. Daca stim cât timp are nevoie contorul pentru a completa un ciclu de la 00h to FFh, atunci numarul de întreruperi înmultit cu acea durata de timp va da timpul total scurs. În rutina de întrerupere unele variabile vor fi incrementate în memoria RAM, valoarea acelei variabile înmultite cu timpul de care are nevoie contorul pentru a contoriza într-un ciclu întreg, va da timpul total scurs. Întreruperea poate fi pornita/oprita prin setarea/resetarea bitului T0IE (INTCON<5>).

Întrerupere pe timpul unei schimbari la pinii 4, 5, 6 si 7 ai portului B
Schimbarea semnalului de intrare la PORTB <7:4> seteaza bitul RBIF (INTCON<0>). Patru pini RB7, RB6, RB5 si RB4 ai portului B, pot triggera o întrerupere ce are loc când starea la ei se schimba de la unu la zero logic, sau viceversa. Pentru ca pinii sa fie sensibili la aceasta schimbare, trebuie definiti ca intrare. Daca oricare din ei este definit ca iesire, întreruperea nu va fi generata la schimbarea starii. Daca ei sunt definiti ca intrare, starea lor curenta este comparata cu vechea valoare ce a fost stocata la ultima citire de la portul B. Întreruperea poate fi pornita/oprita prin setarea/resetarea bitului RBIE în registrul INTCON.
Întreruperea la terminarea subrutinei write în EEPROM Aceasta întrerupere este doar de natura practica. Petru ca scrierea într-o locatie EEPROM dureaza cam 10ms (care este o durata lunga în termenii microcontrolerului), nu este rentabil de a astepta pâna la capat scrierea. Astfel mecanismul de întrerupere este adaugat ceea ce permite microcontrolerului sa continue executarea programului principal, în timp ce scrierea în EEPROM este facuta în plan secundar. Când scrierea este terminata, întreruperea informeaza microcontrolerul ca scrierea s-a terminat. Bitul EEIF, prin care se face aceasta informare, se gaseste în registrul EECON1. Producerea unei întreruperi poate fi interzisa prin resetarea bitului EEIE în registrul INTCON Initializarea întreruperii Pentru a folosi un mecanism de întrerupere a unui microcontroler, trebuie facute unele sarcini pregatitoare. Aceste proceduri sunt pe scurt numite "initializare". Prin initializare definim la ce va raspunde microcontrolerul, si ce va ignora. Daca nu setam bitul ce permite o anumita întrerupere, programul nu va executa un subprogram întrerupere. Prin aceasta putem obtine controlul asupra producerii întreruperii, ceea ce este foarte folositor.

Exemplul de mai sus arata initializarea unei întreruperi externe la pinul R80 a microcontrolerului. Unde se vede un setata, înseamna ca întreruperea este permisa. Producerea altor întreruperi nu este permisa, si toate întreruperile împreuna sunt interzise pâna ce bitul GIE este tinut în unu.

Urmatorul exemplu arata o cale tipica de a dirija întreruperile.
PIC16F84 are are doar o locatie unde adresa unui subprogram întrerupere este memorat. Aceasta înseamna ca mai întâi trebuie sa detectam ce întrerupere este la îndemâna (daca mai mult de o sursa de întreruperi este disponibila), si apoi putem executa acea parte a programului ce se refera la acea întrerupere.

2.7 Timer-ul liber

Timerele-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 între o dimensiune reala ca "timp" si o variabila ce reprezinta starea timer-ului într-un microcontroler. Fizic, timer-ul este un registru a carui valoare creste continuu pâna la 255, si apoi porneste de la capat: 0, 1, 2, 3, 4...255....0,1, 2, 3......etc.

Aceasta incrementare se face în planul secundar la 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 cât timp are nevoie timer-ul sa faca o runda completa, atunci înmultind valoarea variabilei cu acel timp obtinem timpul total scurs. 

PIC16F84 are un timer de 8 biti. Numarul de biti determina pâna la ce valoare contorizeaza timer-ul începând sa contorizeze de la zero din nou. În cazul unui timer de 8 biti, acel numar este 256. O schema simplificata a relatiei dintre un timer si un prescaler-divizor este reprezentata în diagrama anterioara. Prescalerul este numele acelei parti din microcontroler ce divide ceasul oscilatorului înainte de a ajunge la logica ce creste starea timer-ului. Numarul ce divide un ceas este definit prin trei biti în registrul OPTION. Cel mai mare divizor este 256. Aceasta înseamna de fapt ca doar la al fiecare 256-lea ceas, valoarea timer-ului va creste cu unu. Aceasta ne da posibilitatea de a masura perioade de timp mai lungi.

Dupa fiecare numaratoare pâna la 255, timer-ul îsi reseteaza valoarea la zero si începe cu un nou ciclu de contorizare pâna la 255. în timpul fiecarei tranzitii de la 255 la zero, bitul TOIF în registrul INTCOM este setat. Daca se permit întreruperi, de aceasta se poate profita în generarea si în procesarea rutinei de întrerupere. Depinde de programator sa reseteze bitul TOIF în rutine de întrerupere, asa ca noua întrerupere, sau noua depasire sa fie detectate. Înafara 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 în 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.

În practica, unul din exemplele practice ce este rezolvat prin ceas extern si unde timer-ul contorizeaza rotatiile complete ale unui ax a 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 cazator de fiecare data când capul surubului este paralel cu capul senzorului. Fiecare semnal va reprezenta o patrime dintr-o rotatie, si suma tuturor rotatiilor se va gasi în timer-ul TMRO. Programul poate usor citi aceste date din timer printr-un bus de date. 

Urmatorul exemplu ilustreaza cum sa se initializeze timer-ul la fronturile descrescatoare ale semnalului din sursa externa cu un prescaler 1:4.
Timer-ul lucreaza în mod "polig-împingere".


Acelasi exemplu poate fi realizat printr-o întrerupere în modul urmator:

Prescalerul poate fi asignat fie de timer-ul TMRO fie de watchdog. Watchdogul este un mecanism pe care microcontrolerul îl foloseste sa se apere împotriva blocarii programelor. Ca orice alt circuit electric, la fel si cu microcontrolerul se pot întâmpla defectari, sau unele stricaciuni. Din nefericire microcontrolerul are de asemenea un program unde se pot întâmpla probleme. Când se întâmpla aceasta, microcontrolerul se va opri din functionare si va ramâne în acea stare pâna ce cineva îl 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: dac[ se întâmpla depasirea timer-ului, microcontrolerul este resetat, si începe executarea programului mereu din nou. Astfel, se va întâmpla un reset atât în cazul unei functionari corecte cât si incorecte. Urmatorul pas este prevenirea resetului în cazul unei functionari corecte, ce se face prin scrierea unui zero în registrul WDT (instructiunea CLRWDT) de fiecare data când se apropie de depasire. Astfel programul va preveni un reset cât timp este executat corect. Deîndata ce s-a blocat, nu se va scrie zero, va avea loc depasirea timer-ului WDT si un reset ce va duce microcontrolerul înapoi la functionarea corecta din nou. 

Prescalerul este acordat cu timer-ul TMRO, sau cu timer-ul watchdogului prin bitul PSA în registrul OPTION. stergând bitul PSA, prescalerul va fi acordat cu timer-ul TMRO. Când prescalerul este acordat cu timer-ul TMRO, toate instructiunile de scriere în registrul TMRO (CLRF TMR0, MOVWF TMR0, BSF TMR0,...) vor sterge prescalerul. Când prescalerul este asignat unui timer watchdog, numai instructiunea CLRWDT va sterge prescalerul si timer-ul watchdog în acelasi timp. Schimbarea prescalerului este completa sub controlul programatorului, si poate fi schimbat în timp ce se ruleaza programul.

Registrul control OPTION

Bit 0..2 PS0, PS1, PS2 (Prescaler Rate Select bit-bit Selectare Rata Prescaler) 
Subiectul prescaler, si cum afecteaza acesti biti lucrul unui microcontroler va fi abordat în sectiunea despre TMRO.

bit PSA (Prescaler Assignment bit-bit Asignare Prescaler)
Bit ce asigneaza prescalerul între TMRO si timer-ul watchdog).
1=prescalerul este asignat la timer-ul watchdog
0=prescalerul este asignat la timerul free-liber

bit 4 T0SE (TMR0 Source Edge Select bit-bit Selectare Front Sursa TMRO)

Daca triggerul TMRO a fost activat cu impulsuri de la pinul RA4/T0CKI, acest bit va determina daca va fi la frontul crescator sau descrescator al semnalului.  
1=front descrescator
0=front crescator

bit 5 T0CS (TMR0 Clock Source Select bit-bit Selectare Sursa Ceas TMRO)
Acest pin permite unui timer free-run sa-si incrementeze valoarea fie de la oscilatorul intern, de exemplu Ľ din ceasul oscilatorului, sau prin impulsuri externe la pinul RA4/T0CKI.
1=impulsuri externe external impulses
0=1/4 ceas intern

bit 6 INTEDG (Interrupt Edge Select bit-bit Selectare Front Întreruperi)
Daca a fost permisa producerea de întreruperi, acest bit va determina la ce front va avea loc întreruperea la pinul RB0/INT.
1=front crescator
0=front descrescator

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' deschisi
0=rezistorii 'pull-up' închisi

Memorie 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 în timpul închideri sursei de alimentare. Aceasta înseamna practic ca ceea ce a fost scris în ea va ramâne chiar si când microcontrolerul este închis. Datele pot fi retinute în EEPROM fara sursa de alimentare pâna la 40 de ani. (dupa cum declara producatorul lui PICD16F84), si se pot executa 10000 de cicluri de scriere. 

În practica, memoria EEPROM este folosita pentru stocarea unor date importante sau a unor parametri de proces.
Un asemenea parametru este o temperatura data, asignata când se seteaza un regulator de temperatura la un proces. Daca nu s-a retinut, va fi nevoie sa se ajusteze temperatura data dupa fiecare întrerupere a alimentarii. Pentru ca aceasta este foarte nepractic (chiar periculos), producatorii de microntrolere au început sa instaleze un tip mai mic de memorie EEPROM.

Memoria EEPROM este plasata într-un loc special al memoriei si poate fi accesata prin registri speciali. Acesti registri sunt:

. EEDATA la adresa 08h, care retine datele de citit sau cele de scris.
. EEADR la adresa 09h, ce contine o adresa a locatiei EEPROM ce este accesata.
. EECON1 la adresa 88h, ce contine biti de control.
. EECON2 la adresa 89h. Acest registru nu exista fizic si serveste la protejarea EEPROM-ului de scrieri accidentale.

Registrul EECON1 la adresa 88h este un registru de control cu 5 biti implementati.
Bitii 5, 6 si 7 nu sunt folositi, si prin citire sunt totdeauna zero.
Interpretarea bitilor registrului EECON1 urmeaza.

Registrul EECON1

bit 0 RD (Read Control bit-bit Control Citire) 
Setarea acestui bit initializeaza transferul de date definit în EEADR la registrul EEDATA. Pentru ca timpul nu este esential în citirea datelor ca la scriere, datele din EEDATA pot fi deja folosite în urmatoarea instructiune.
1=initializeaza citirea
0=nu initializeaza citirea

bit 1 WR (Write Control bit-bit Control Scriere) 
Setarea acestui bit initializeaza scrierea datelor din registrul EEDATA la adresa specifcata prin registrul EEADR. 
1=initializeaza scrierea
0=nu initializeaza scrierea

bit 2 WREN (EEPROM Write Enable bit-bit Permite Scrierea EEPROM) Permite scrierea în EEPROM
Daca acest bit nu a fost setat, microcontrolerul nu va permite scrierea în EEPROM.
1=scriere permisa
0=scriere interzisa

bit 3 WRERR (Write EEPROM Error Flag-Stegulet Eroare Scriere EEPROM ) Eroare în timpul scrierii în EEPROM
Acest bit a fost setat doar în caz ca scrierea în EEPROM a fost intrerupta de un semnal sau prin terminarea timpului din timer-ul watchdog (daca este activat).
1=a avut loc eroare
0=nu a avut loc eroare

bit 4 EEIF (EEPROM Write Operation Interrupt Flag bit-bit Stegulet Întrerupere Operatie Scriere EEPROM) Bit folosit pentru a informa ca scrierea datelor s-a terminat.
Când s-a terminat scrierea, acest bit va fi setat automat. Programtorul trebuie sa stearga bitul EEIF în programul sau pentru a detecta noua terminare a scrierii. 
1=scrierea terminata
0=scrierea înca neterminata, sau înca nu a început

Citirea din memoria EEPROM Setarea bitului RD initializeaza transferul de date de la adresa gasita în EEADR la registrul EEDATA. Ca si la citirea datelor nu avem nevoie de atât de mult timp ca la scriere, datele luate din registrul EEDATA pot deja fi folosite mai departe în urmatoarea instructiune. 

O mostra a partii programului ce citeste datele în EEPROM, ar putea arata ca mai jos:

Dupa ultima instructiune de program, continutul de la o adresa EEPROM zero poate fi gasit în registrul w.
Scrierea în memoria EEPROM Pentru a scrie datele în locatia EEPROM, programatorul trebuie mai întâi sa scrie adresa în registrul EEADR si datele în registrul EEDATA. Numai atunci este folositor de a seta bitul WR ce pune totul în miscare. Bitul WR va fi resetat, si bitul EEIF setat urmând o scriere ce poate fi folosita în procesarea întreruperilor. Valorile 55h si AAh sunt prima si a doua cheie care interzic ca scrierea accidentala în EEPROM sa se întâmple. Aceste doua valori sunt scrise în EECON2 care serveste doar pentru acel scop, de a primi aceste doua valori si de a preveni orice scriere accidentala în memoria EEPROM. Liniile de program marcate ca 1, 2, 3 si 4 trebuie sa fie executate în acea ordine în intervale egale de timp. De aceea este foarte important, sa închideti întreruperile ce ar putea schimba timpul necesar pentru executare instructiunilor. Dupa scriere, întreruperile, pot fi permise din nou.


Exemplu unei parti a programului ce scrie datele 0xEE în prima locatie în memoria EEPROM ar putea arata ca mai jos:


Document Info


Accesari: 7725
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )