Sunteți pe pagina 1din 12

Curs microcontrolere PIC Atentie, un site foarte complet al unuia dintre cei mei seriosi autori de carti din

domeniul microcontrolerelor si a electronicii(in franceza).Documentatie buna pentru realizarea unui programator foarte bun: http://tavernier-c.com/programmateur_de_pic.htm

-Microcontrolerele sunt componente electronice care inglobeaza in ele majoritatea componentelor dintr-un calculator PC, bineinteles toate de mai mici dimensiuni.Astfel acestea au: unitate centrala, porturi, memorii, convertoare analog numerice(o parte din ele), etc. Ele pot fi programate simplu(vezi mai departe) iar numarul de instructiuni ce pot fi utilizate intr-un program este destul de mare pentru aplicatii obisnuite.Spre exemplu, PIC16F84 are o memorie de program de 1024 de locatii ceea ce, foarte multi nu vor folosi niciodata. Pentru incepatori in ale pic-urilor dar nu si in electronica va recomand cursul in romana despre PIC16F84 cu ceva generalitati despre microcontrolere si cu suficiente elemente despre arhitectura microcontrolerului si despre utilizarea lui in aplicatii simple, inclusiv simularea cu MPLAB din http://www.mikroelektronika.co.yu/romanian/product/books/PICbo ok/picbook.htm .Mult mai didactic, dar din pacate pentru cei care nu stiu franceza, doar in franceza, mi se par cursurile pentru acelasi PIC16F84 dar si pentru PIC16F876 din site-ul www.bigonoff.org. Intentia mea este de a aduce ceva completari didactice cursului in romana mai sus amintit pornind de la cursurile bigonoff dar si rezultate in urma experientei capatate de autorul site-ului.

-In primul rand voi prezenta foarte clar ce anume este nevoie sa stii ca sa poti lucra cu microcontrolere PIC: 1.Sunt componente ieftine(~6euro) cu ajutorul carora se poate inlocui vechea si greoaia logica cablata in proiectarea digitala, cu logica programata. 2.Pentru profesionisti, este bine sa se studieze structura interna a acestuia(vezi documentatia in engleza pe site-ul www.microchip.com sau in romana in cursul amintit mai sus), mai ales cele doua porturi(interfata cu lumea exterioara PIC-ului dar si partea de tact si metode de obtinere corecta a resetului). De asemeni este necesara cunoasterea: -registrilor speciali, -a setului de instructiuni, -a simularii cu MPLAB(voi prezenta in curand cum functioneaza si aplicatii), -modului in care se realizeaza "varsarea" programului in microcontroler utilizand un programator profesional sau artizanal(eu folosesc pe cel prezentat in site-ul www.tavernierc.com ) si softul de programare(eu folosesc ic-prog din site-ul www.ic-prog.com ).(Voi prezenta in curand modul de utilizare a acestuia). 3.Pentru amatori voi da in curand strictul necesar pentru a putea realiza proiecte proprii de mici dimensiuni, dar si pentru realizarea proiectelor din revistele pentru amatori(ex.Electronique pratique) care presupun cunostinte de "varsare" a programului free, dat de autorii articolelor, cu ajutorul programatorului, in PIC. 4.Pentru cei care cunosc Basic sau C++, exista programe cu ajutorul carora pot fi programate microcontrolerele PIC fara a cunoaste limbajul de asamblare.In plus, unul din autorii de

cursuri PIC, Vasile Surducan are scoasa o carte(poate fi comandata prin internet) +CD in care exista unelte, cursuri si aplicatii pentru programarea microcontrolerelor printr-un limbaj evoluat, special conceput, numit Jall.Cartea are si multe aplicatii si este scrisa evident de un profesionist in electronica (pe linga programe, schemele propuse sunt clare si exacte).Adresa site: http://surducan.netfirms.com 5.Pentru cei mai lenesi, mai exista programe care transforma o schema logica(organigrama) in cod sursa (limbaj asamblare).Vezi link.(tutorial in franceza).De asemeni exista si un program excelent(documentatie in engleza), de realizare grafica a programarii microcontrolerelor PIC si nu numai.Vezi link. -Dotare necesara pentru aplicatii cu microcontrolere PIC: 1.Programator pentru PIC: a.Se pot cumpara de la: www.adelaida.ro (mai ieftine dar si cu posibilitati mai reduse), www.elnec.com, si www.aftehnica.ro (programatoare profesionale cu avantajul ca suporta foarte multe microcontrolere). 2.Programul MPLAB(free pentru microcontrolerele pana la PIC18...).Daca aveti o buna legatura internet puteti sa-l downloadati de la Microchip(www.microchip.com). 3.Programul ic-prog (sau altul similar).Este free in site-ul www.icprog.com 4.Nu in ultimul rand, microcontrolerul de programat, conform aplicatiei.Microcontrolere la preturi bune gasiti la magazinele virtuale prezentate aici. -Diferente intre diferitele tipuri de microcontrolere. Arhitectura Harvard contra Von Neuman. Majoritatea microprocesoarelor si microcontrolerelor actuale utilizeaza arhitectura Von Neuman.Memoria de program(care

este de fapt, in acest caz si memorie de date) contine atat instructiunile cat si datele iar pentru a le vehicula este folosit un singur bus(cu o lungime in functie de tipul microprocesorului sau microcontrolerului).Deci, este nevoie ca mai intai sa vehiculezi instructiunile, apoi datele s.a.m.d.Asta poate insemna o reducere de viteza. Rupand o traditie de multi ani (arhitectura Von Neuman este utilizata si in calculatoarele PC), Microchip utilizeaza o arhitectura Harvard in care instructiunile si datele au memorii diferite, sunt vehiculate inspre si dinspre unitatea de calcul pe doua bus-uri diferite iar executarea unei instructiuni nu are nevoie de mai multe cicluri masina pentru ca, gratie celor doua bus-uri, intr-un singur ciclu masina se poate manipula atat codul instructiunii de executat cat si datele utilizate. Asta inseamna ca majoritatea instructiunilor(mai sunt cateva care au nevoie de 2 cicluri masina: instructiunile de salt(go to, call etc.)) pot fi prelucrate intr-un singur ciclu masina.Astfel se poate mari viteza de lucru a microcontrolerului. Va veti intreba totusi, pe buna dreptate, de ce microcontrolere clasice cu arhitectura Von Neuman si mai ales PC-urile, care au aceeasi arhitectura au viteze mai mari, totusi. Raspunsul este simplu: microcontrolerele clasice si PC-urile sunt mai complexe si mai scumpe.PIC-urile reprezinta un compromis rezonabil intre performante si pret.Pentru extrem de multe aplicatii acestea sunt mai mult decat suficiente iar pretul si faptul ca au dimensiuni foarte mici le fac extrem de utilizate in ultimii ani. In plus, acestea au un set de instructiuni extrem de redus (max. 35), mai usor de utilizat si de invatat pe de rost. -Minimul necesar de stiut din sisteme de numeratie, coduri specifice electronicii digitale, operatii aritmetice etc.

Din pacate electronica digitala are la baza un sistem de numeratie diferit de cel zecimal(care ulilizeaza o numeratie cu 10 cifre) utilizat in mod obisnuit, sistemul binar(care utilizeaza doar doua cifre-0si1-). In toate sistemele de numeratie pozitia cifrelor in scrierea numerelor are o mare importanta.Astfel, cu cat pozitia cifrei este mai la stanga intr-un numar, cu atat importanta acesteia este mai mare(are rang mai mare). Sa luam ca exemplu numarul zecimal 632.In fapt acesta are valoarea: 632=2x100 +3x101+6x102 In sistemul binar lucrurile sunt exact la fel doar ca cifra care se ridica la puterile 0,1,2... este 2(binar). Astfel numarul binar 110101 este in zecimal 1x20+0x21+1x22+0x23+1x24+1x25 =53 Invers: 53:2=21 rest 1 21:2=10 rest 1 10:2=5 rest 5:2=2 rest 2:2=1 rest 0 1 0

Numarul binar va fi format din cifrele rosii pornind de la ultimul rezultat al impartirii (1) continuind cu resturile de jos in sus . Ce ati vazut mai sus este doar un exemplu.Majoritatea microcontrolerelor, deci si PIC-urile lucreaza cu 8 cifre binare.Numerele de 8 cifre binare se numesc octeti sau bytes(in engleza).Cifrele binare 0 sau 1 se numesc bit.

Pentru ca lucrurile sa fie clare, in lucrul cu numere binare sau zecimale exista conventia ca numerele binare sa se noteze astfel: B'11011011' iar numerele zecimale astfel: D'125' Sistemul hexazecimal. Datorita simplitatii in scrierea numerelor binare s-a decis impartirea octetului in doua quartete(4 cifre binare) si fiecare qurtet este reprezentat de cate o cifra hexazecimala. Iata tabelul de conversie a unui quartet in cifre hexazecimale si zecimale: Binar B'0000' B'0001' B'0010' B'0011' B'0100' B'0101' B'0110' B'0111' B'1000' B'1001' B'1010' Hexazecimal 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xA Zecimal 0 1 2 3 4 5 6 7 8 9 10

B'1011' B'1100' B'1101' B'1110' B'1111'

0xB 0xC 0xD 0xE 0xF

11 12 13 14 15

Deci, cum in binar, cea mai mare cifra utilizata in scrierea numerelor este 1(<2), in zecimal este 9(<10), in hexazecimal este F(<16). Astfel, un octet poate fi scris in mai putine cifre daca se utilizeaza sistemul hexazecimal.Nu va speriati, de fapt nu trebuie sa faceti alte transformari decat schimbarea fiecarui quartet di octet in corespondentul hexazecimal din tabelul de mai sus. Exemplu: B'10110110'<=>0xB6 (0x-reprezinta conventia de scriere a numerelor hexazecimale, B-este quartetul cel mai semnificativ(1011) iar 6 reprezinta quartetul cel mai putin semnificativ(0110)).A se vedea si tabelul de mai sus. Deci, sistemul hexazecimal este utilizat de programatorul PICului(spre exemplu) pentru a nu fi nevoit sa scrie atat de multi de 1 si 0.In fapt, microcontrolerul, microprocesorul lucreaza tot cu cifre binare. Daca doriti sa transformati direct din hexazecimal in zecimal procedati astfel: 0xFF<=> 15x160+15x161=255(cel mai mare numar zecimal care poate fi scris cu ajutorul unui octet binar sau cu doua cifre hexazecimale). Observati ca nu utilizam F ci echivalentul lui zecimal, 15(conform tabel).

Operatii cu microcontrolere. Operatii aritmetice. Operatii booleene. Operatii aritmetice. Din pacate, din punct de vedere tehnologic, cu circuitele logice cunoscute nu se poate realiza decat adunarea a doua numere binare.Restul operatiilor se realizeaza tot cu ajutorul adunarii (scaderea) sau, cu ajutorul adunarii si al schimbarii pozitiei cifrelor unui numar binar(rotire), in cazul inmultirii si a impartirii. Adunarea. Este simplu, asa ca voi da doar un exemplu: B'1011'+ B'1110' -------------B'11001 Se aduna cifrele cele mai din dreapta(ca in zecimal) 1+0=1.Se scrie 1 sub ele. Se aduna 1+1.Rezulta 10(2 nu exista in binar).Se scrie 0 sub cele doua cifre si se pastreaza 1(ca in zecimal). Se aduna 1+0si cu 1 pastrat dinainte.Rezulta 10.Se scrie 0 sub cele doua cifre si se pastreaza 1. Se aduna 1+1 si cu 1 pastrat mai inainte.Rezulta 11.Deci numarul binar obtinut este 11001. In cazul microcontrolerelor PIC se face adunarea a doua numere binare lungi de 8 biti(un octet sau byte).In cazul in care, in urma

adunarii vom obtine un numar de 9biti, bitul al noualea va schimba starea unui bit din registrul de stare(un registru special numit Status)al microcontrolerului, astfel ca, in registrul in care s-a obtinut rezultatul vom avea doar 8 biti. Ex.: B'10110011+ B'10001100 ----------------------B'100111111 Deci, in registrul de lucru w va ramane 00111111(8 biti), iar 1 cel mai semnificativ(din stanga) va schimba starea bitului carry din registrul de stare al microcontrolerului Status. Scaderea. Ei, aici voi incerca sa va fac sa intelegeti ceva destul de simplu, dar facut complicat in majoritatea cartilor de specialitate.Din pacate. In cazul scaderii vom avea neaparata nevoie si de semn.In primul rand pentru ca, asa cum v-am mai spus, datorita faptului ca nu putem face o scadere ca pe hartie trebuie sa facem adunarea a doua numere dintre care unul este negativ. Asadar, trebuie sa renuntam la un bit(la cel mai semnificativ) dintre cei 8 ai octetului si sa-l transformam in semn.Prin conventie 1 reprezinta minus si 0 reprezinta plus. Totusi, pentru a realiza scaderi nu este suficient sa scriem numerele in binar cu bitul de semn pus. Fara sa va fac demonstratia matematica a procedeului ( nu mi se pare absolut necesar pentru intelegere)va declar ca, un numar

pozitiv poate fi transformat in numar negativ prin realizarea a doua operatii usor de realizat intr-un microcontroler: 1.Complement fata de 1.(In fapt se inverseaza toti bitii numarului). 2.Obtinerea numarului negativ, in fapt, complementul fata de 2, prin adunarea la numarul de mai sus(complement fata de 1) a numarului 1. Exemplu: 5-3(in zecimal) 1. +3<=>B'00000011', -3<=>B'11111100'+1=11111101(s-au inversat toti bitii(complement fata de 1) si s-a adaugat 1(complement fata de 2)). 2. 5+(-3)<=>B'00000101'(5)+ B'11111101'(-3) ------------------------B'100000010(2) De fapt, vedeti ca, avand 9 biti numarul zecimal este:1x21 + 1x28 =258, nu 2.In cazul in speta insa, sa stiti ca, avand in vedere ca registrii de lucru din microcontroler sunt de 8 biti, nu de 9, bitul al noualea dispare intr-un bit special despre care vom discuta mai tarziu. Deci, in registrul de lucru, in urma scaderii de mai sus, ramane B'00000010' adica 2(zecimal), cctd. Va veti intreba de unde stim daca avem un numar de 8 biti fara semn sau un numar de 7 biti cu semn.Ei bine, asta o stabileste programatorul microcontrolerului.

De fapt, in cazul microcontrolerului PIC exista doua instructiuni de scadere, astfel ca nu vom fi nevoiti sa procedam ca mai sus, microcontrolerul realizand el singur operatia. Doar in cazul in care se scade un numar mai mare dintr-un numar mai mic trebuie sa folosim ce am invatat mai sus. Astfel: C b7 b6 b5 b4 b3 b2 b1 b0 1 0 -0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 (2) (3)

-------------------------------------------------------0 1 1. 1 1 1 1 1 1 1 (-1)

1 din 10(2) este1

2 1 din 10( imprumutam ca in zecimal si ajungem pana la 1 din C(carry din registrul special Status) Deci, in locul zerourilor de la descazut(bitii de la b2 pana la b7) vom gasi 1 asa cum gasim 9 atunci cand imprumutam in zecimal( 40002- ) ( 21151) ( --------------)

( 18851 ) 3. Toti bitii pana la b7 rezulta coborand 1 rezultati in urma imprumutului. Dar, B'11111111' este 255 (FF) sau -1 ? E simplu.Vom sti ca rezultatul operatiei este un numar negativ deoarece C este zero.

Pentru a vedea ce numar este, trebuie sa determinam complementul fata de 2 a numarului obtinut.Astfel: B'11111111'<=>B'00000000'(complement fata de1); B'00000000'+1=B'00000001'(1 zecimal), deci, cu informatia ca C(Status) este 0 putem preciza ca este vorba de -1. In cazul scaderii unui numar mai mic dintr-unul mai mare nu avem astfel de probleme: rezultatul este cel obtinut in registrul in care s-a dorit (w sau f), ca atare, fara nici un calcul.In cazul scaderii unui numar mai mare dintr-unul mai mic, trebuie facute calculele de mai sus pentru obtinerea rezultatului. Nu-i prea simplu, dar asta e.Altfel nu se poate. Inmultirea si impartirea numerelor. Din fericire pentru cei care nu vor sa-si bata capul, exista rutine realizate de diversi programatori, care rezolva problema inmultirii si a impartirii.Nu va ramane decat sa intercalati in programul dvs. sursa(asamblare), rutina si totul se rezolva.

va urma...

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