sâmbătă, 14 decembrie 2013

LEDURI, BUTOANE, SI XC8 (Partea I)



DACA LEDURI SI BUTOANE NU "E" NIMIC NU "E"......


     Ledul si butonul ... totul incepe cu unul din ele sau,  de ce nu, cu amandoua. Ma gandesc ca daca peste vreo 50 de ani s-ar inventa cine stie ce bazadaganie cu care vom putea controla diverse lucruri cu ajutorul mintii in perioada de training cu singuranta vom apasa butoane si vom aprinde leduri.

     Treaba cu butoanele este atat de bine infipta in mentalul colectiv ca pana si la telefoanele mobile sau la tabletele cu "touch screen" cand apasam pe ecran in diverse aplicatii spunem ca apasam butoane, ce-i drept virtuale. Vedeti ? Nimic nu se pierde - totul se transforma.

    Dupa ce in postarea trecuta am prezentat dev-boardul de Aptinex m-am gandit ca ar fi momentul sa incep sa o pun la treaba, prezentand ceva programele facute pentru PIC 16F877A. In mare voi incerca ca in fiecare postare sa prezint cate un modul cu ajutorul caruia sa controlez cate un periferic (sau mai multe) aflate pe placa.
   Cum toata lumea incepe cu un led sau un buton am zis ca nici eu sa nu fac rabat de le regula, doar ca fiind mai cu mot, eu voi lucra in postul de azi cu 16 butoane si 8 leduri. Laser frate!
    Ca si compilator voi folosi pentru programele expuse aici XC8 de la Microchip. In varianta pentru uC din seria de 8 biti nu vine cu nici un fel de librarie pentru modulele interne ale pic-urilor din seria 16, lucru destul de aiurea pentru cei care sunt obisnuti cu compilatoare "siliconate" cu tot felul de functii. Partea buna este ca utilizand acest compilator reusiti sa deventi destul de intimi cu structura interna a uC,  lucru esential pentru cineva care doreste sa treaca de la hobby la partea profesionala.

   Compilatorul necesita IDE-ul de la Microchip (Mplab X IDE) care este gratis si se decarca de aici. XC8-ul se decarca si el la randul lui de aici. Urmati pasii din instalare iar pentru a crea un proiect nou se procedeaza in modul urmator:

    Se da click pe "new project" iar in prima fereastra se alege "Microchip Embedded" si "Standalone Project".

New Project

     Mai departe, in urmatoarea fereastra, se alege familia de microntrollere si uC pe care doriti sa il utilizati. In cazul de fata se va alege PIC 16F877A.


Alegere Microcontroller

     In urmatoarea fereastra sunt prezenate optiunile pentru debugging, eu am ales ca mod de debugg simulatorul inclus in Mplab X.

Alegerea modului de debugg

     In fine, dati un nume proiectului si ati terminat cu partea de creare a unui proiect nou. Pentru a adauga fisierul "main.c" in proiect dati click-dreapta pe "Source Files" si alegeti  "C Main File". La "File Name"
scrieti "main" (fara ghilimele). Mplab -ul il va salva implicit acolo unde ati creat proiectul.

Crearea fisierului "main.c"




     Inca putin si e gata. In aceasta faza trebuie setati bitii de configurare. Pentru a ne usura munca Mplab-ul ne da posibilitatea sa ii setam usor, astfel: Click "Window", "PIC Memory Views", "Configuration Bits".
     In partea de jos a programului se va deschide un meniu in care putem alege configuratia dorita.


Deschidere "Configuration Bits"


     Dupa ce i-ati setat (ceea ce modificati va aparea cu rosu) click pe butonul magic "Generate Source Code to Output" si acum ii puteti copia in fisierul main.

Generate Source Code to Output

   Gata cu setarile. Acum sa vorbim putin despre proiectul in sine.  Ceea ce vreau sa fac este sa folosesc toate cele 16 butoane pe care placa mi le pune la dispozitie, impreuna cu 8 leduri. Ideea este ca, numerotand butoanele de la 1 la 16, ori de cate ori se apasa un buton ledurile se aprind afisand practic in binar numarul butonului. Cele 16 butoane sunt legate la PORTD (4 pini sunt stati ca input RD0-RD3 si 4 ca output RD4-RD7) iar ledurile la PORTB. La prima vedere nu pare mare lucru, cum de fapt nici nu este. Singura problema este cum sa controlez 16 butoane cu doar 8 pini.  
    Dupa cum am spus 4 din pinii PORTD sunt setati ca input si 4 ca output. Cei de output isi schimba starea logica  (0 sau 1) la un interval regulat de timp setat printr-un timer. Cei de input sunt legati prin intermediul unei rezistente la masa. Cand este apasat un buton datorita faptului ca, indiferent cat de rapid l-am apasa, o perioda de timp contactul lui din interior ramane inchis si, daca, schimbarea starii pinilor de output se face suficient de rapid, la un moment dat pinul de input primeste 5V de la cel de output. Din combinatia celor doi pini se poate deduce butonul care a fost apasat. Si, dupa cum spun mereu, cum o poza face cat 1000 de cuvinte sa privim urmatoarea diagrama:

MATRICE DE BUTOANE
     Asadar RD0-RD3 sunt pinii de intrare care, daca butoanele nu sunt apsate sunt pusi la masa prin intermediul rezistentelor de "pull down". Daca, sa zicem, se inchide contactul butonului 1si in acel moment starea logica a lui RD4 este "1" atunci si RD0  va capata aceasta stare si, implicit tot portul D va avea o anumita valoare (vom vedea in cod). Ati prins ideea? Daca da atunci incercati sa va imaginati o alta combinatie.


Niciun comentariu:

Trimiteți un comentariu