vineri, 17 februarie 2012

Microntrollere PIC Microchip pentru incepatori - programarea microcontrollerului

Pana acum am scris cateva linii de cod si am simulat un program pentru microcontrollerul Microchip PIC18F4550 care se presupune ca va aprinde si stinge un LED conectat la microcontroller. Oare chiar asa sa fie? Pentru a sterge orice urma de nesiguranta, trebuie sa programam microcontrollerul si sa avem legat LEDul la el.

Pentru programarea microcontrolerelor Microchip, am avut la inceput un programator pe portul serial (JDM programmer), apoi unul pe portul paralel (AN589), ambele realizate de mine personal, acestea insa nu se mai pot folosi la laptop caci nu am port serial ori paralel. Asa ca am o clona de Microchip ICD2 (In Circuit Debugger - Sivava este firma) care este recunoscut de catre mediul de dezvoltare oferit gratuit de Microchip (MPLAB IDE); de aceea voi utiliza la programare mediul de dezvoltare MPLAB IDE de la Microchip (se gaseste pe site la Microchip aici).

Practic voi lua fisierul HelloWorld.hex generat in mikroC si il voi scrie in microcontroler folosind clona de ICD2 si MPLAB IDE.

Conectez ICD2 prin USB la PC (am instalat driverele de USB inainte), deschid MPLAB. Pasii urmatori din capturile de ecran descriu modul de programare:

Selectia tipului de dispozitiv cu care dorim sa lucram (target device) - fara aceasta selectie, MPLAB IDE nu stie unde sa scrie datele in microcontroler -  meniul "Configure -> Select device":


Selectam PIC18F4550 din lista de dispozitive cu care vrem sa lucram


Selectarea tipului programatorului - MPLAB ICD2


In meniul "Programmer -> Settings" mergem in tab-ul Power si bifam "Power target circuit from MPLAB ICD2" daca dorim sa programam un microcontroler intr-un soclu. In acest caz avem nevoie de un alimentator de 12 Vdc sa fie conectat la ICD2 (chiar daca acolo scrie 9Vdc - mai jos este rezultatul experimentelor mele)



Conectarea MPLAB la programator - Connect

Mesajul ca suntem conectati

Incarcarea fisierului .hex in programator - Import

Selectie fisier HelloWorld.hex

Fisierul este pregatit pt scriere

Selectie optiunea de programare - Program

Mesaj ca programarea a decurs fara incidente


Dupa ce am programat microcontrollerul PIC18F4550, realimentam placa si LEDul se stinge si se aprinde cate o secunda:

Legat de realizarea partii de hardware - a placii electronice, exista o metoda care nu necesita lipituri, se pot cumpara direct fire si o placa de incercari (breadboard - la Vitacom e ceva de la Pro's Kit la vreo 30 de lei), aici gasiti cateva sugestii:

fire pt breadboard
fire mama pt breadboard
fire mama pt breadboard - panglica

Breadboard sau placa electronica fara lipituri - toate gaurile de pe coloane sunt conectate electric intre ele, pe mijloc este un canal care separa electric coloanele pentru a putea utiliza circuite integrate, vezi imaginea urmatoare

Componente electronice si fire de legatura - de observat ca pentru a utiliza o astfel de placa avem nevoie de componente cu picioruse

Inserarea unui circuit integrat in breadboard

Inserarea unui fir in breadboard

Cum arata circuitul la sfarsit - putin cam dezordonat, insa e un mod rapid si facil de a incerca ceva


Cum am mai spus placa mea de dezvoltare e facuta acasa, cu unelte normale, este o placa de incercari cu multe optiuni legata la o clona de ICD2:

Placa de dezvoltare conectata cu ICD2

Detaliu ICD2

Detaliu placa de dezvoltare. Dupa cum se vede, ICD2 se conecteaza la placa printr-un cablu. si un conector aflat pe placa.

Din experienta avuta cu aceasta clona de ICD2, am invatat ca e obligatoriu ca /MCLR sa fie direct conectat la ICD2 in timpul programarii, chiar daca in indicatiile lor arata ca e ok daca e un pull-up acolo, pur si simplu nu functioneaza corect, nu se poate programa. Asadar conectati /MCLR direct, apoi cand vreti sa vedeti cum functioneaza ceea ce ati programat, conectati /MCLR la pull-up si apoi alimentati microcontrollerul.

Alta observatie este legata de alimentarea externa a clonei de ICD2: pe cutie scrie 9Vdc, daca alimentam cu 9Vdc, microcontrolerul va fi alimentat cu 2Vdc, deci nu se poate programa, daca in loc de 9Vdc aplicam 12Vdc la ICD2, microcontrolerul primeste 5Vdc si este programabil.

Portul serial (interfata RS232) realizat cu MAX232 si portul USB

Butoane, rotary encoder si LEDuri

Partea de alimentare cu 5Vcc - realizata clasic cu un 7805. Are si o dioda anti prost :). Asadar placa accepta tensiuni de intrare de la 6-7Vcc in sus, 7805 va avea grija sa alimenteze corect microcontrollerul Microchip PIC18F4550

Partea de oscilator - cristal de cuart de 20MHz si condensatorii de 22 pF


Astfel, primii pasi in programarea unui microcontroler Microchip au fost parcursi. Ca si strategie, orice aplicatie necesita o schema logica - este ghidul dupa care scrii codul. Apoi trebuie consultata documentatia microcontrolerului pentru a intelege cum trebuie sa setam microcontrolerul. Dupa aceasta urmeaza sa vedem cum au procedat altii pentru a rezolva aplicatii asemanatoare :), caci nu exista problema pe lumea asta care sa fie noua pt un individ, sa nu intre nimeni in panica, nu va inventa roata si nu il va coplesi actul creational.

Dupa ce toate aceste etape au fost parcurse (e un fel de documentare), urmeaza partea de hardware, conexiuni, lipituri etc. Abia dupa aceasta vine partea in care se scrie codul propriu zis, se verifica aplicatia reala. Si in tot acest timp se invata lucruri noi, creierul gandeste, ceea ce e mare lucru in ziua de azi.

Succes!

PS: urmeaza cateva aplicatii simple care vor utiliza butoane, LEDuri, rotary encoder, LCD 2 x 16, PWM, motor pas cu pas (stepper motor), ADC, apoi urmeaza aplicatii ceva mai complicate cu SPI, I2C, port serial, USB, Ethernet. Asa ca tineti aproape, va astept sa veniti cu idei, sa veniti cu imbunatatiri!

joi, 16 februarie 2012

Microntrollere PIC Microchip pentru incepatori - debugger

In episoadele trecute am avut o introducere la microncontrolere si am scris primul program in mikroC pentru un microcontroler Microchip PIC18F4550. Acest program a fost compilat corect, adica l-am scris corect. Urmeaza sa simulam functionarea sa.


Codul si schema logica pentru aprinderea unui LED conectat la pinul RD0

In viata reala, programarea presupune erori, probleme. Acestea se numesc bug-uri (de la gandaci). Procesul prin care se corecteaza erorile de numeste "debug" (depanare). Pentru a putea depana programele in mikroC, avem la dispozitie un debugger in mikroC. Acesta se dechide din meniul Run -> Start Debugger (tasta F9).


Deschiderea "Debugger"-ului din meniul principal

In program sunt variabile ce pot lua diferite valori, spre exemplu RD0_bit; aceste variabile pot fi urmarite in debugger, le adaugam din lista din dreapta. In meniul Run, sunt mai multe optiuni, alegem "Step Over" (sau tasta F8) - adica executam fiecare linie de cod una dupa alta. Astfel incepem sa executam fiecare linie din program pas cu pas. In dreapta vedem cum valoarea RD0_bit se schimba, devine 1, devine 0. Tot acolo, mai jos in dreapta apare valoarea in timp in micro secunde, astfel putem estima cat timp dureaza calculele pe care le face microcontrolerul.


Posibilitatile de executare a codului: pas cu pas, sa execute functiile dar sa nu intre in ele (step over), sa intre in functii etc


Fereastra "Watch" - aici poti urmari evolutia diverselor variabile, le poti chiar modifica valoarea

Programul intra in bucla do while, reseteaza pe RD0 (pune 0 logic), apoi asteapta 1000 de milisecunde (adica 1 secunda), apoi seteaza pe RD0 (il pune pe 1 logic), apoi asteapta 1s, ajunge in while si verifica daca conditia este 1; cum conditia va fi 1 intotdeauna, va fi o bucla infinita. Pentru ca avem conditia 1, se ajunge din nou la linia unde RD0 devine 0 si o ia de la capat. Din cauza ca la o parcurgere s-a asteptat 1000 + 1000 milisecunde, durata totala este de 2000 milisecunde, ceea ce indica si debuggerul in dreapta jos.

Asadar debuggerul este simulatorul care ne scapa de bataile de cap generate de o logica nepotrivita la programare ori poate de o paranteza pusa aiurea prin cod. Insa un debugger nu poate inlocui functionarea reala, asadar avem nevoie de o placa electronica cu microcontroler.

Legat de mikroC, acesta are si un convertor zecimal - hexazecimal - binar, foarte util:


Convertorul zecimal - binar - hexazecimal din mikroC

Pe langa acest convertor si debugger, mikroC mai are o gramada de unelte (tools) care sunt de mare ajutor cand dezvoltam aplicatii: un tabel cu caracterele ASCII, un editor pentru EEPROM, un creator de caractere pt LCD, terminal USART (pt conexiuni pe portul serial), mikroBootloader si altele, acestea se pot gasi in meniul Tools.


Meniul Tools ofera o multime de unelte utile, surprize placute

In incheiere cateva cuvinte despre mikroBootloader: un bootloader e o unealta extrem de utila; se programeaza microcontrolerul cu un firmware mai special, adica cu acest bootloader. Apoi microcontrolerul se conecteaza la PC prin interfata seriala sau pe USB (exista booloadere pt serial sau pt USB). Cand avem cod nou creat, cu tool-ul mikroBootloader putem sa il trimitem catre microcontroler. Dam un reset la microcontroler si trimitem imediat acel cod catre microcontroler. Dupa reset, microcontrolerul asteapta 5 secunde si daca nu primeste nimic pe serial / USB, incepe sa execute codul cu care a fost programat ultima data. Daca primeste ceva pe serial/USB in mai putin de 5 secunde, intra intr-un mod special si receptioneaza noul cod, il rescrie si apoi il executa.

Practic nu mai trebuie programat microcontrolerul utilizand un programator. Asadar daca aveti un cunoscut si acesta are programator, il puteti ruga sa va programeze microcontrolerul cu un bootloader de la Mikroelektronika si apoi nu mai aveti nevoie de un programator.

Asadar acum suntem in punctul in care avem cod compilat si simulat si care pare ca face ceea ce dorim, anume aprinde si stinge un LED. Nu mai trebuie decat sa vedem daca si pe placa reala va face acelasi lucru. Cu alte cuvinte urmeaza sa programam in microcontrollerul Microchip PIC18F4550 fisierul HelloWorld.hex

Pentru mai multe detalii despre programarea in mikroC a diverselor aplicatii, aici e o documentatie cu exemple foarte buna de la Mikroelektronika: exemple programare in mikroC. Daca vei parcurge aceasta documentatie, vei intelege si cate ceva despre partea de hardware, dar vei descoperi cat este de usor sa automatizezi tot felul de lucruri, sa faci diverse aplicatii, pentru ca mikroC are definite multe functii care faciliteaza programarea unui microcontroler.

Daca cineva doreste sa lase comentarii de genul "limbajul de asamblare e de baza, compilatorul nu e transparent si nu vei sti ce se petrece de fapt acolo, nu poti optimiza prea mult etc etc" - vreau sa reamintesc ca aici este vorba de a convinge cat mai multi oameni ca e fain sa programezi microcontrolere, e relativ usor, fineturile le las celor avansati (cu trecerea timpului, inveti sa lucrezi optimizat).

Si e bine ca te ajuta sa gandesti, caci ceea ce nu utilizam din corpul nostru, se atrofiaza! Te-ai gandit azi?!

Pasul urmator: programarea microcontrollerului PIC18F4550

marți, 14 februarie 2012

Microntrollere PIC Microchip pentru incepatori - scrierea codului

In episodul precedent (vezi aici) am explicat cate ceva despre microcontrolere. Asadar suntem in punctul in care avem un PC cu Windows, cu port USB, am instalat mikroC (de la Mikroelektronika) si Microchip MPLAB IDE (de la Microhip), avem un programator pe USB si o placa de dezvoltare. Ne mai lipseste prima aplicatie - sa scriem primul program, sa scriem cod pentru microcontroler.

In cele ce urmeaza nu vei gasi un ghid detaliat care sa te invete sa faci aplicatii sau care sa iti bage in cap tot ceea ce nu sti (mai ales despre hardware), scopul rindurilor ce urmeaza este doar sa iti ofere un punct de pornire pentru a invata programarea microcontrolerelor Microchip folosind limbajul de programare C din mediul oferit de Mikroelektronika - adica in mikroC. Restul este invatare proprie, studiu, efort personal. Oricum, nimic in viata nu vine de-a gata, insa ne bucuram cand suntem ajutati sa incepem ceva nou, ceva care ne usureaza startul.

Cum traditia in programare cere ca primul program sa fie clasicul "Hello World!", aici vom face un Hello World in care microcontrolerul ne va saluta aprinzand si stingand un LED legat la unul dintre pinii sai.

Detalii despre LEDuri, conectarea acestora la microcontroler si alte lucruri care sunt de baza gasiti la Mikroelektronika pe site aici

Pe placa mea am un LED legat la portul D, bitul 0. Fizic este legat la pinul 19 al microcontrolerului. Aceste porturi sunt de fapt pinii microcontrolerului. Ei pot accepta semnale electrice din exterior, adica pot fi intrari sau pot ei sa genereze semnale electrice in exterior, adica pot fi iesiri. Deci trebuie sa fie setat bitul 0 al portului D (pinul 19) ca iesire si sa ne aprinda si sa ne stinga LEDul. Cum anodul LEDului este in exterior la +5Vcc si catodul este la microntroler, va trebui sa punem pinul sa dea un 0 logic astfel incat LEDul sa se aprinda.

Aici intervine documentatia microcontrolerului PIC18F4550 (aici gasiti documentatia: PIC18F4550): la pagina 4 a documentului gasim diagrama pinilor, acolo vedem ca RD0 corespunde pinului 19 (bitul 0 al portului D se numeste si RD0). Urmatorul pas in documentatie este sa citim despre portul D - pagina 122 - "10.4 PORTD, TRISD and LATD Registers".

Acolo scrie ca:
PORTD is an 8-bit wide, bidirectional port. The corresponding data direction register is TRISD. Setting a TRISD bit (= 1) will make the corresponding PORTD pin an input (i.e., put the corresponding output driver in a high-impedance mode). Clearing a TRISD bit (= 0) will make the corresponding PORTD pin an output (i.e., put the contents of the output latch on the selected pin).


Deci cum noi vrem sa aprindem un LED, trebuie sa setam pinul ca iesire, adica sa punem bitul corespunzator din registrul TRISD pe 0, deci TRISD0 = 0 pt ca RD0 sa fie iesire.

Cateva cuvinte despre registri: registrul se refera la o locatie din memoria microcontrolerului, unde biti pot fi pusi pe 1 sau pe 0 (adica setati sau resetati). In functie de valoarea unui registru, un microcontroler se comporta intr-un anumit fel. Spre exemplu daca se efectueaza o instructiune de adunare si exista depasire (spre exemplu 9+1=10, adica scriu 0, iar 1 e depasirea), atunci bitul 3 din registrul STATUS (bitul OV = overflow) va fi setat si devine 1.

Programarea unui microcontroler (si programarea in general) necesita o schema logica astfel incat sa stim ce avem de facut, in acest fel vom rezolva pas cu pas cerintele aplicatiei. Schema logica in acest caz este urmatoarea:


Schema logica pentru aprinderea unui LED conectat la pinul RD0

Bazat pe schema logica, se va scrie codul de programat microcontrolerul. Acum mai multi ani, aici era p>asul unde cautam instructiunile in documentatia microcontrolerului - pagina 309 "26.0 INSTRUCTION SET SUMMARY" (aici e documentatia: PIC18F4550). Aici gasim cum sa ii vorbim microcontrolerului pe limba lui. Cum spuneam, nu e simplu. Dar suntem salvati de mikroC: scriem cod in C pentru microcontroler si putem sa citim acest cod si chiar sa intelegem ce se petrece.

Acum vine partea cu mikroC: aici lucrurile sunt organizate pe proiecte, asadar facem un proiect nou (meniul Project -> New Project), apoi intram intr-un "wizard" care ne ajuta sa facem setarile necesare i.f.d. microcontroler, frecventa de ceas, numele proiectului, locatia pe harddisk etc. Eu am folosit un PIC18F4550 cu un cuart de 20MHz si un LED legat pe RD0, schema e mai jos:



Urmeaza imaginile de mai jos pentru a realiza un nou proiect:


Odata facuti acesti pasi, ajungem la locul unde se poate incepe scrierea programului urmand schema logica. O paranteza: aplicatiile de inceput in mod nu vor revolutiona lumea, fiind aplicatii clasice, iar cum la inceput e nevoie de ajutor, vom cauta proiecte date de exemplu; in mod cert e bine sa tragem cu ochiul la ceea ce au facut altii.

Sursa arata ca mai jos. Comparatia intre sursa si schema logica face clar ceea ce se petrece in codul scris. Toate elementele scrise sunt explicate pe larg in sectiunea "Help" a mikroC (apasa tasta F1).

void main() {

TRISD0_bit = 0; // set direction to be output for pin RD0 - page 122

/*
PORTD is an 8-bit wide, bidirectional port.
The corresponding data direction register is TRISD.
Setting a TRISD bit (= 1) will make the corresponding PORTD
pin an input (i.e., put the corresponding output driver in
a high-impedance mode).
Clearing a TRISD bit (= 0) will make the corresponding PORTD
pin an output (i.e., put the contents of the output latch on
the selected pin).
*/


do {
RD0_bit = 0; // Turn OFF LED on PORTD, pin RD0 - page 124
Delay_ms(1000); // 1 second delay
RD0_bit = 1; // Turn ON LEDs on PORTD
Delay_ms(1000); // 1 second delay
} while(1); // Endless loop
}


Pentru a introduce comentarii plasam "//" la inceput de rind, iar daca avem un bloc de comentarii, plasam comentariile intre "/*" si "*/".

Dupa ce am scris codul, urmeaza sa il compilam. Adica se verifica sintaxa si daca este corecta, atunci se genereaza un fisier, anume HelloWorld.hex. Un lucru important trebuie remarcat: un cod compilat cu succes nu este un cod care face neaparat ceea ce dorim noi in aplicatie. Am vazut multe confuzii de tipul: nu inteleg de ce nu merge ca doar a fost compilat fara erori! Erorile de fapt sunt in logica cu care am facut codul, nu in sintaxa, e ca si cum ai vorbi corect, dar fara sens (ca in parlament spre exemplu). Compilatorul ne spune doar ca avem cod corect dpdv sintactic, dar nicidecum ca aplicatia noastra e corecta!

Astfel meniul "Build" -> Build va verifica codul si va produce fiserul HelloWorld.hex, jos pe ecran se vede ca a fost compilat cu succes. Asadar am creat primul program pt microcontroler.


Compilare folsind meniul Build


Compilare folsind scurtatura la meniul Build


Rezultatul compilarii - un succes total :) (de obicei la primul program se mai uita o virgul, o paranteza si nu iese, e frustrant, dar ce nu te omoara te face mai puternic :) )


Cateva cuvinte despre fisierele pe care le genereaza moikroC:

HelloWorld.c - contine codul in C pe care l-am scris

HelloWorld.mcppi - este fisierul care contine setarile proiectului, daca vrem sa deschidem intreg proiectul, acesta este fisierul corect.

HelloWorld.hex - fisierul binar care contine codul cu care trebuie programat microcontrolerul.

Dupa ce am vazut ca sintactic programul este corect, urmeaza sa simulam functionarea lui in simulatorul software (in debugger).

Pasul urmator: simularea codului in debuggerul mikroC

duminică, 12 februarie 2012

Microntrollere PIC Microchip pentru incepatori - intro

Suntem inconjurati de electronica intr-o masura foarte mare. Operatiile simple din viata noastra sunt ajutate de electronica: suntem treziti dimineata de dispozitive electronice, comunicam intre noi cu ajutorul unor dispozitive electronice, sanatatea ne este verificata tot cu ajutorul unor dispozitive electronice, conducerea automobilului este mai placuta datorita acestor dispozitive electronice, timpul il aflam de la dispozitive electronice, ne orientam cu dispozitive electronice, daca ai un caine il poti convinge sa nu mai latre aiurea cu un dispozitiv electronic :) samd.

Electronica a revolutionat lumea de azi, insa la inceput electronica era simpla, era analogica. S-a pus problema ca anumite operatii simple, repetitive sa fie automatizate si realizate de masini in locul oamenilor. La inceput s-a facut cu sisteme analogice, care erau masive si inflexibile, astfel ca o schimbare minora trebuia implementata cu schimbarea majora a sistemului. Intre timp s-a ajuns ca electronica sa fie si digitala, adica acei 0 si 1, biti. Simplu: trimiti siruri de 0 si de 1, masina ii interpreteaza si face o actiune. Asa a aparut necesitatea de a programa o masina sa faca ceva, nu se putea scrie un sir de 0 si 1 de catre om, era necesar ca programarea sa se faca intr-o forma accesibila si inteleasa mai usor de om. Asa au aparut limbajele de programare. Cand a aparut si computerul intr-o forma apropiata de cea de azi (adica un dispozitiv ce putea fi carat de maxim 2 oameni), atunci lucrurile au prins avant si au devenit accesibile pt toata lumea.

La ceea la ce s-a ajuns azi suntem cu totii martori, termeni ca si programare, program, software, hardware, Java, C, C++, asamblare etc sunt termeni comuni, chiar daca nu esti din domeniu si nu stii exact despre ce e vorba, ai cel putin o vaga ideea ca acesti termeni au o legatura cu ITul, electronica, computerele.

Astazi sunt programatori si scoli de programare, sunt diverse limbaje de programare, sunt teorii intregi. In general programarea este asociata cu realizarea unui program de calculator, software, care va fi folosit pe un computer. De aceea in general programatorii nu sunt buni prieteni cu partea de hardware (poate si viceversa e valabila, nu stiu), insa e ca si cum faci prajitura, dar nu te intereseaza cum functioneaza cuptorul in care o coci, nu vrei sa afli cum se produce energia care ajuta la coacere, cum functioneaza praful de copt samd.

Anumite operatii / aplicatii simple se pot automatiza usor folosind programarea si calculatorul. Totusi, nu cred ca e util sa avem un filtru de cafea automatizat cu un calculator langa el: arata ridicol si costa mult. Totusi cum se face?

Se poate face cu un dispozitiv mic numit microcontroler. Acest microcontroler este un circuit integrat electronic digital. Poate fi aproximat ca fiind un calculator in miniatura, insa la o scara mult mai redusa si cu limitarile de rigoare. Aceste microcontrolere sunt programabile, se poate scrie software pentru ele, softul pentru microcontrolere se cheama firmware (unii vor spune: aha, atunci cand am facut upgrade la ruterul WiFi de acasa sau la nu stiu ce dispozitiv electronic digital, tot firmware se chema).

Limbajul de programare pt microcontroler este un limbaj relativ simplist, insa asta il face si greu de inteles din punct de vedere uman, comunicarea umana are o sintaxa, foloseste cuvinte, nu comunicam la nivel de litera. Din fericire suntem in postura de a avea la dispozitie medii de programare asemanatoare celor pt calculatoare, spre exemplu programam in C, Basic, Pascal diverse microcontrolere. Asta face acest domeniul mult mai abordabil de catre novici.

Alta problema era pretul ridicat al microcontrolerui si al uneltelor de programare. Astazi exista kituri, exista placi de dezvoltare gata facute, exista programatoare, toate la un pret accesibil unui constructor amator. Pe de alta parte, cine se incumeta, poate realiza singur o placa de dezvoltare, poate sa isi faca singur programatorul.

Pe piata sunt numeroase medii de programare gratuite, sunt aplicatii oferite cu tot cu sursele lor. Cu alte cuvinte sunt baze pentru a incepe studiul acestui domeniu interesant chiar la tine acasa.

Mai ai nevoie de un calculator (PC), cu Windows (ca e mai simplu, Linux e ceva mai complicat, dar nu foarte) si cateva unelte: o unealta de lipit (gen letcon, pistolul de lipit are putere prea mare si poate distruge componentele electronice), clesti mici, surubelnite mici, un aparat de masurat marimi electrice etc. Dar pt inceput PCul, placa si programatorul sunt necesare, se pot cumpara si in secunda 2 se poate incepe lucrul.

Pasii necesari pentru a realiza o aplicatie cu microcontroler sunt enumerati mai jos:


1. Definirea cerintelor aplicatiei
Pentru a avea succes in ceea ce facem, trebuie sa avem un scop, o motivatie. In cazul microcontrolerului motivatia se cheama aplicatie. Asadar trebuie sa alegem o aplicatie pe care sa incercam sa o rezolvam cu un microcontroler (de exemplu un aparat care sa aibe grija de un acvariu, un aparat care sa iti trimita un SMS daca ai inundatie sau s-a deschis o usa etc). Asadar aplicatia trebuie sa fie clar definita: avem nevoie de 3 butoane, avem nevoie de un ecran de afisare, avem nevoie de un LED samd. Toate acestea vor trebui conectate la microcontroler cumva.

2. Dezvoltarea algoritmului care rezolva aplicatia
Microcontrolerul executa instructiuni una cate una si are puncte in care ia decizii: daca este apasat butonul 2, atunci aprinde LEDul 1, altfel treci mai departe. Aceste instructiuni si deciziile trebuie puse intr-o schema logica, un flow. Este bine sa facem acest flow pe hartie, sa il parcurgem, sa vedem ca e functional.

3. Scrierea codului pentru implementarea algoritmului
Codul se scrie intr-un asa-numit mediu de programare. Mediul de programare depinde de ce microcontroler vei folosi. Pentru ca internetul abunda de informatii despre Atmel si Microchip, pentru ca acesti 2 producatori ofera medii de programare pentru microcontrolerele lor, e bine sa optezi la inceput pentru asa ceva. Eu am optat pt Microchip, am avut sprijin la inceput de la cineva care stia sa programeze microcontrolere de la Microchip.

Microcontrolerul Microchip PIC16F84
Microcontrolerul Microchip PIC18F4550
Cam cat de mari sunt microcontrolerele - in raport cu o moneda de 50 de bani

Revenind la cod si la mediul de programare, am optat pentru mikroC creeat de Mikroelektronika - o firma din Serbia care face lucruri foarte faine - au de vanzare si placi de dezvoltare, au multe optiuni, au documentatie si exemple care ajuta mult sa dezvolti aplicati in timp scurt, te ajuta sa inveti repede cu alte cuvinte. mikroC este limitat la 2kb de cod, daca vrei mai mult trebuie sa cumperi licenta pentru mikroC.
E foarte fain ca in timp ce inveti sa programezi microcontrolere, inveti si programare in C.

4. Simularea functionarii codului in debugger (simulare software)
Mediul de programare ofera posibilitatea urmaririi functionarii codului, ce se petrece cu variabilele, cum se comporta registrii. Adica poti depana codul (to debug = a depana), depanarea se face in acest depanator (debugger). Pentru a putea depana codul, trebuie executata operatia de compilare, adica mediul de dezvoltare verifica sintaxa, ca ai definit toate variabilele, ca ai virgulele si punctele puse unde trebuie. In urma compialrii obtii un fiier cu extensia hex. Cand consideri ca ai scris cod care face ceea ce cere aplicatia, poti trece la pasul urmator.

5. Programarea microcontrolerului cu codul scris la pasul anterior
Intre microcontroler si cod trebuie sa existe ceva, acel ceva se numeste programator. Este vorba de un dispozitiv care ia codul compilat (fisierul hex) si il scrie in memoria nevolatila a microcontrolerului. Atunci cand alimentam cu energie electrica microcontrolerul, acesta va citi codul din memorie si va face ceva, ideal sa faca ceea ce vrem noi, sa ne rezolve aplicatia. Programarea microcontrolerului ne lasa cu o componenta cu un program in memoria ei. Totusi programarea se poate realiza si cand avem componenta pusa pe o placa electronica.

Programator de microcontrolere Microchip pentru portul paralel - AN586 - construit acasa

6. Realizarea prototipului hardware pentru testarea codului in mod real
Acum despre partea de hardware, de obicei asta e partea care sperie sau indeparteaza potentialii amatori de microcontrolere. Exista placi electronice cu butoane, LEDuri, conectori samd astfel incat sa inveti sau sa dezvolti aplicatii cu microcontrolere - se numesc placi de dezvoltare. Pe asa ceva poti testa aplicatia si codul inainte de a face o placa electronica dedicata aplicatiei. Aici ai doua optiuni: fie investesti intr-o placa gata facuta (cum spuneam Mikroelektronika are oferta buna in acest sens) sau investesti in scule de lipit si materiale / componente si faci singur placa (asa investesti de fapt in educatia ta, caci la sfarsit vei invata sa faci ceva nou). Eu am facut singur placa respectiva pentru dezvoltare / invatare, am pus pe ea butoane, LEDuri, un rotary encoder (nu stiu daca termenul de comutator rotativ explica bine acest dispozitiv), un ecran LCD 2 rinduri x 16 caractere, am pus conectori pt USB, RS232 (interfata seriala), partea de alimentare de 5Vcc, partea de conectare la programator si componente auxiliare ce fac microcontrolerul sa functioneze corect.
Cand faceti propria placa de dezvoltare (placa de invatare), tineti cont de cum legati pinii microcontrolerului, caci anumiti pini au mai multe functii. Asta se afla din documentatia microcontrolerului, se poate afla din schemele altora. Schema "placii de dezvoltare" (la cum arata, poate e prea mult spus) este urmatoarea:

Schema placii de dezvoltare - intr-o continua schimbare si ea :)

Placa in realitate

Dupa ce avem partea hardware si microcontrolerul programat cu codul pe placa, trecem la urmatorul pas

7. Testarea codului in mod real
Daca la apasarea unui buton nu se aprinde un LED, atunci revizuim codul, reprogramam microcontrolerul si verificam din nou ce se petrece. Cand se intampla ceea ce trebuie, trecem la pasul urmator.

8. Realizarea partii de hardware finale care rezolva aplicatia
Aici vorbim de o placa de circuit imprimat, de o cutie in care sa punem placa electronica, cu butoane, conectori samd. Acest lucru se poate realiza cu diverse programe: Eagle PCB pt realizarea de scheme electronice si placi electronice, Google sketch pt patea de modelare mecanica samd. Tot aici este bine sa avem si o minima documentatie legata de aplicatie si de ceea ce am facut.

9. Testarea combinatiei hardware / cod
Dupa ce avem partea hardware finalizata, urmeaza sa testam codul si sa vedem daca rezolva aplicatia, aici mai facem ajustari, detalii etc. Acum niste ani am aflat despre microcontrolerul PIC16F84 (Microhip a denumit microcontrolerele PIC, de aici vine numele de PICuri - "Programmable Intelligent Computer" sau "Peripheral Interface Controller"). Un simplu circuit integrat digital, dar care programat cum trebuie, facea lucruri minunate. A fost un microcontroler care oferea multe la un pret decent, un microcontroler pe care il puteai programa folosind programatoare facute in casa in regim de constructor amator cu componente uzuale (ICSP - in circuit serial programmer), avea memorie flash, adica putea fi reprogramat de nenumarate ori. A fost un adevarat hit in lumea microcontrolerelor si pe aceasta directie s-au dezvoltat lucrurile pana azi.
Astazi se poate cumpara cu 20 de dolari un microcontroler Microchip ce are interfata USB, ce are 3-4 porturi, poate genera diverse semnale (de exemplu PWM), are interfete de comunicare SPI, I2C, are memorie pentru aplicatii complexe si cel mai important - este in capsula cu picioruse, caci astazi componentele electronice sunt pe cale sa devina tot mai mici si fara picioruse. Eu am optat pentru microcontrolerul de la Microchip numit PIC18F4550 - varianta cu picioruse, capsula cu 40 de pini.

Initial programatorul l-am realizat dupa o schema de la Microchip - documentul AN589 descrie acest programator, vezi aici: an589. Pt acest programator am folosit un soft gratuit numit ICProg. Mai sus este o imagine cu programatorul AN589 realizat de mine acum niste ani, e functional, insa nu am unde sa il folosesc la laptop, nu am port paralel (si solutia cu unul emulat pe USB nu are suport in ICProg, oricum USBul este peste tot).

Problema este ca programatorul AN589 este pe portul paralel, din pacate acest port nu mai este prezent la laptop, asa ca am fost nevoit sa renunt la el si sa caut ceva mai potrivit. Acum folosesc un programator tip ICD2 (e o copie / clona a originalului de la Microchip). Deci cautati un programator care sa fie pe USB (Mikroelektronika sau ebay sunt o sursa buna de asa ceva, cautati "microchip PIC programmer USB").

Pentru ca intentia mea nu este sa fac un ghid foarte detaliat despre microcontrolele, ci doar sa fac un ghid spre punctele importante de la inceput si sa ofer un start usor in programarea microcontrolerelor, recomand un material foarte bun de la MikroElektronika: despre microcontrolere in general. Este in engleza, dar cred ca fara engleza azi nu poti face mare lucru, e ca si cum ai fi un mut international. In materialul indicat vei afla ce sunt registrii, vei afla ce contine un microcontroler, ce poate sa faca el samd, este util si interesant, are grafica buna, citeste-l!

Asadar avem un PC cu Windows, cu port USB, am instalat mikroC si Microchip IDE, avem un programator pe USB si o placa de dezvoltare. Ne mai lipseste prima aplicatie. Aici este pasul urmator: scrierea primului program

Pasul urmator: scrierea codului pentru un microcontroller Microchip PIC18F4550