Documente Academic
Documente Profesional
Documente Cultură
Elemente Specifice Programarii Microcontrolerelor - P1 PDF
Elemente Specifice Programarii Microcontrolerelor - P1 PDF
CE TREBUIE S PROGRAMM
1.1.
Introducere
Ioan P. MIHU
Sistem controlat
Intrri
Sistem cu
microcontroler
Ieiri
Foarte sintetic etapele realizrii unei aplicaii cu microcontroler, sunt cele din figura 1.2.
Idee
/
Comand
Specificaii
tehnice
Alegere
microcontroler
Proiectare scheme
electrice i electronice
Specificaii software
Alegere furnizori
Proiectare
structur program
Proiectare cablaj
PCB
Realizare cablaj
(PCB)
Scriere program n C
Montare piese
Compilare
Fiier .hex
Software
Feedback
- Punere n funciune
- Cerine noi
- Scdere costuri
Programator
Circuit electronic
cu
microcontroler
Hardware
Sistem funcional
cu
microcontroler
TESTE
Embedded system
funcional
i vndut !
Ioan P. MIHU
Ioan P. MIHU
unor compilatoare specifice. Astfel firma Microchip pune la dispoziie mediul MPLAB
IDE. Acest mediu este un set de instrumente dedicate programrii microcontrolerelor de tip
PIC i DSPIC folosite n realizarea de aplicaii de tip embedded systems. MPLAB este
gratis i poate fi uor utilizat de studeni. Exist de asemenea i o bibliotec impresionant
de exemple care ofer numeroase soluii pentru o mare diversitate de aplicaii. Interfaa
MPLAB este cea din figura 1.3.
Breackpoint
a crea un nou proiect cea mai simpl cale este folosirea meniului Project / Project Wizard,
unde sunt indicai toi paii necesari. Un nou proiect se poate crea i astfel:
Ioan P. MIHU
Save Workspace
selectat, ferestrele active, programul debug ales, breackpoint, etc. n acest fel
putem relua lucrul exact acolo unde a fost ntrerupt.
e) Dup crearea proiectului apare fereastra Project.mcw, care ne propune includerea
de fiiere n proiect (figura 1.7). Aceast fereastr este accesibil din View /
project. Primul fiier pe care l vom include este fiierul surs .c care conine
funcia main(). n prealabil fiierul se creeaz cu editorul MPLAB din meniul File
/ New i se salveaz n directorul proiectului.
f) Includerea fiierului .c n proiect se face cu click dreapta pe Source File din
fereastra Projec.mcwt. Din acest moment, fiierul face parte din proiect.
10
Ioan P. MIHU
11
Meniul Project ofer i alte faciliti dintre care o parte vor fi prezentate n
urmtoarele capitole ale acestei lucrri. Pentru detalii i pentru exploatarea
resurselor oferite de MPLAB, consultai informaiile oferite n Help, sau n paginile
de Internet aferente.
c) View. Permite alegerea ferestrelor pe care le dorim vizibile. Ferestrele permit
interfaa propriu-zis cu programul. Cele mai importante ferestre sunt View /
Project i View / Output care sunt vizibile implicit. O alt fereastra important
este fereastra Editor, cea n care se editeaz fiierele surs. Se deschide cu dublu
click n fereastra Project.mcw, pe numele fiierului dorit. Celelalte ferestre sunt
utile n procesul de depanare i de testare a programului. n ideea de a nu ncrca
ecranul cu prea mult informaie, este bine s nchidem ferestrele pe care nu le
utilizm.
1.2.3. Controlul i depanarea programului
a) Debuger. Permite selectarea modului de depanare a programului. Este o fereastr
foarte mult utilizat de programatori, fiindc dezvoltarea unui proiect
(programarea) presupune un volum mare de lucru pentru depanare, testare i
punere la punct a programului. Din submeniul Debuger / Select Tool, se poate
alege soluia dorit. Recomandate sunt:
MPLAB SIM (figura 1.11). Acesta este simulatorul de baz al mediului
MPLAB. El permite testarea i depanarea programului fr ca acesta s fie
introdus n memoria microcontrolerului. Practic se simuleaz funcionarea
microcontrolerului pe PC-ul pe care avem instalat MPLAB. Dac programul
folosete i porturi de intrare atunci este posibil generarea unor semnale
virtuale de intrare. Acestea se creeaz n fereastra Debuger / Stimulus;
12
Ioan P. MIHU
Breackpoints
Reset
Oprete Vizualizarea tuturor
punctelor de oprire
rularea
linie cu
liniede simulare
Figura 1.12. Controlul fluxului programului, n regim
Run
Ruleaz pn la
primul breackpoint
Animate
Ruleaz lent,
linie cu linie
Step
Ruleaz linie cu linie
la click stnga pe icon
13
d) Disassembly Listing, File Registers, Program Memory, sunt alte ferestre care
permit urmrirea (spionarea) evoluiei variabilelor pe parcursul pailor din
program.
e) Output window. Aici sunt afiate informaii importante n urma procesului de
compilare. Dac nu avem greeli n program i compilarea este reuit, atunci aici
vor fi afiate informaii sintetice legate de resursele de memorie utilizate de
program. Dac compilarea este nereuit, atunci aici sunt afiate informaii legate
de locul i tipul greelii din program.
1.2.4. Programarea microcontrolerului
a) Dup compilare, programul executabil rezultat (fiierul .hex) trebuie transferat n
memoria microcontrolerului aflat pe placa aplicaiei proiectate. Pentru aceasta
trebuie selectat aparatul cu care vom face transferul. Acesta se numete
programator. Selecia programatorului se face din fereastra Programmer. Dup
selecie n meniul principal apar iconiele din figura 1.13.
b) Cele mai utilizate programatoare sunt: ICD2, ICD3, PICkit 1, PICkit 2, PICkit 3,
PICSTART Plus.
c) nainte de selectarea programatorului, trebuie:
S conectm fizic programatorul ntre PC i placa cu microcontroler.
S precizm dac placa are propria surs de alimentare sau este alimentat
doar de programator, alimentat la rndul su la +5V prin USB de la calculator.
S fie corect conectarea la placa cu microcontroler. Selectai 'Alt tensiune'
n meniul de dialog, atunci cnd microcontrolerul este alimentat la 3,3V (alta
dect 5V), deoarece tensiunea de la plac ajunge la programator i invers.
d) Dup programare, pentru ca aplicaia s ruleze exist dou soluii: fie se apas
butonul 'Relese from reset', fie se deconecteaz placa de la programator.
e) Programatoarele menionate permit i depanarea n circuit a programului, dup ce
acesta a fost ncrcat n microcontroler. Pentru aceasta, se urmeaz procedura
descris la 1.2.3, doar c se va selecta programatorul folosit.
Reset and
Conect
to ICD2
Write flash
Transfer .hex n
flash memory
Read flash
ncarc .hex din
flash memory
Verify program
Programarea
este OK ?
Erase
flash
memory
Verify
erase flash
memory.
Release from
reset
Ruleaz !
Hold in Reset
Oprete rularea
14
Ioan P. MIHU
15
16
Ioan P. MIHU
17
n fiecare din bank-urile 2 i 3, exist cte 16 octei care pot fi accesai numai prin
pointeri.
Dac avem variabile de tip tablou, dimensiunea maxim a acestora nu poate depi
dimensiunea permis a bank-ului n care o declarm. Spre exemplu am putea crea
un program n care s avem patru variabile tablou, ale cror dimensiuni maxime
vor putea fi:
unsigned char x[96];
unsigned bank1 char y[80];
unsigned bank2 char z[96];
unsigned bank3 char w[96];
Atunci cnd crem un program, trebuie s gestionm cu mare atenie dimensiunea
i locul n care plasm variabilele.
Pe parcursul scrierii programului, variabilele se apeleaz numai prin numele lor
fr a mai preciza i bank-ul i adresa la care se afl. Acest lucru este un mare
avantaj fa de programele scrise n limbaj de asamblare unde trebuie s fim foarte
ateni ca de fiecare dat cnd utilizm o variabil s precizm n ce bank se gsete.
Nu scpm ns de problema accesului la variabile din bank-uri diferite atunci cnd
acestea sunt apelate prin pointeri. Pentru a apela prin adres o variabil din bank0
sau bank1 avem nevoie de un singur octet, fiindc aa cum se observ din figura
2.2, aceste dou bank-uri ocup zona de la 00h, pn la FFh adic 256 locaii. n
schimb, pentru a apela prin adres variabile din bank2 sau bank3, un singur octet
nu ajunge. Probabil c soluia pe care o sugerai imediat este aceea ca orice
variabil de tip pointer s aib rezervai doi octei. Nu s-a fcut aa, probabil din
motive ce in de istoria dezvoltrii microcontrolerelor, la primele fiind suficient un
octet, deoarece nu aveau dect un singur bank de RAM.
Pentru rezolvarea problemei exist dou soluii.
Folosirea pointerilor de tip 'const'. Acetia au alocai doi octei i pot
accesa orice bank. Dezavantajul este c nu pot fi folosii dect pentru a
citi variabile aflate la adresele pe care le pointeaz.
Folosirea pointerilor de tip 'far'. Acetia pot accesa adrese din orice bank,
i pot fi folosii att pentru a citi ct i pentru a scrie la adresa respectiv.
Dac la compilarea programului apar mesaje de eroare sau de atenionare trebuie
citit cu atenie documentaia de programare a microcontrolerului cu care se
lucreaz.
18
Ioan P. MIHU
Aa cum am mai precizat, gestiunea variabilelor alocate prin program i care se gsesc n
memoria RAM, este foarte uoar: att pentru citire ct i pentru scriere, variabilele se
apeleaz numai prin numele lor fr a mai preciza i adresa la care se afl.
Nu acelai lucru se ntmpl cu datele pe care le vom scrie i citi din memoria EEPROM a
microcontrolerului. Pentru citire trebuie folosii urmtorii regitri:
EEADR Registrul n care trebuie specificat adresa de la care vom citi data
EEPGD
Registrul care specific adresa de nceput a zonei EEPROM
EEDATA Registrul n care se citete valoarea
RD
Bit care la setare va iniia ciclul de citire
Iat un exemplu de funcie care returneaz un octet de la o adres EEPROM specificat
unsigned char ReadByteFromEEPROM(const unsigned char address)
{
unsigned char read_value; // Variabil pentru a reine valoarea citita
EEADR = address;
// Citete de la adresa aceasta
EEPGD = 0;
// Pointeaz la nceputul EEPROM memory
RD
= 1;
// Iniiaz un ciclu de citire
read_value = EEDATA;
// Preia octetul din registrul de date
return read_value;
// Returneaz octetul read byte
}
Scrierea unui octet este i mai laborioas. Iat regitri i biii folosii la scriere:
EEADR Registrul n care trebuie specificat adresa la care vom scrie data;
EEPGD
Registrul care specific adresa de nceput a zonei EEPROM;
EEDATA Registrul n care se depune octetul ce se va nscrie apoi n EEPROM;
WREN
Bit pentru validarea scrierii n EEPROM;
WR
Bit care la setare va iniia ciclul de scriere n EEPROM;
EECON2 Registru de control al scrierii n EEPROM
EEIF
Bit care semnalizeaz terminarea unui ciclu de scriere.
Pe durata scrierii:
trebuie blocate alte ntreruperi pentru a nu fi perturbat procesul de scriere;
trebuie ateptat pn la terminarea complet a procesului de scriere.
Iat un exemplu de funcie care scrie un octet la o adres EEPROM specificat
void WriteByteToEEPROM(unsigned char data, const unsigned char address)
{
EEADR = address;
// Adresa la care se scrie
EEDATA = data;
// Data care se scrie
WREN = 1;
// Valideaz scrierea n EEPROM
GIE = 0;
// Invalideaz ntreruperile pe durata scrierii
EECON2 = 0x55;
// Configureaz EECON2 pentru scriere
EECON2 = 0xAA;
// Configureaz EECON2 pentru scriere
WR = 1;
// Iniiaz ciclul de scriere
while(!EEIF);
// Ateapt pn se termina scrierea
WREN = 0;
// tergere soft a bitului WREN (validare scriere)
EEIF = 0;
// tergere soft a bitului EEIF (terminare scriere)
}
n concluzie:
19
20
Ioan P. MIHU
cu memorie de tip EEPROM. Acestea pot fi reprogramate de mai multe ori, fiind
indicate pentru experimente sau dezvoltri de aplicaii. n aceast categorie sunt
incluse microcontrolerele care conin litera 'F' n denumire, ca de exemplu:
PIC16F84, PIC16F877, etc. La acestea se folosete termenul de memorie FLASH
pentru memoria program.
21
22
Ioan P. MIHU
Sistem controlat
Senzor
Plac electronic
Tens. Analogic
In
Tens. Discret
In
Out
Out
PA3
Portul A
PA4
PA5
Analogic
Intrare
PA6
Digital
PA7
23
+5V
+5V
+5V
R3
+Vcc
Btn1
PA2
I~0
I~0
RIN
PA0
RIN
R1
Btn2
LED
Gnd
+5V
R4
+Vcc
LED4
K1
PA1
K2
R2
Gnd
LED2
24
Ioan P. MIHU
curent, dup cum este nchis comutatorul K1 sau K2 i dup cum sarcina este conectat la
mas sau la potenialul Vcc.
+5
V
+5V
R3
+Vcc
+5
V
Btn1
PA2
PA1
PA0
Btn2
R2
R1
LED
Gnd
pinul PA0 trebuie setat ca intrare digital deoarece el trebuie s citeasc una din
cele dou stri ale butonului Btn2 (apsat /eliberat),
pinul PA1 trebuie setat ca i ieire deoarece la el se gsete conectat o diod LED,
care va trebui s poat fi aprins / stins.
pinul PA2 trebuie setat ca i intrare digital fiindc el trebuie s citeasc una din
cele dou stri ale butonului Btn1 (apsat /eliberat),.
25
+5V
R3
+5V
Btn1
PA2
PA1
PA0
Btn2
x x x x x 0 Y 1
x x x x x 1 0 1
PORTA
TRISA
R2
R1
LED
Nu este obligatoriu ca scriind '0' la un pin de ieire LED-ul s fie stins, iar dac
scriem '1' LED-ul s fie aprins. Ceea ce trebuie reinut este c dac scriem '1' atunci
pinul respectiv va ajunge conectat la potenialul +Vcc, iar dac scriem '0' atunci
pinul respectiv va ajunge conectat la potenial nul (la mas) aa cum rezult din
figura 2.7. innd cont de aceste precizri vom stabili apoi care este starea LEDului, n funcie de configuraia circuitului electric n care se afl.
26
Ioan P. MIHU
Dac pinul este intrare digital atunci n bitul corespunztor din registrul PORTA
se va gsi '0' sau '1' n funcie de tensiunea ce ajunge la pin, prin circuitul electric
exterior microcontrolerului. Dac avem de citit stri ale unor butoane, atunci
valoarea citit depinde de configuraia circuitului n care este inclus butonul.
Pentru circuitul din figura 2.9, vom avea:
TRISA = xxxxx1x1b; // PA0 i PA2 au devenit intrri
Bit Xbtn;
// declarm o variabil Xbtn de un bit.
Xbtn = RA0; // Citim primul bit al portului PORTA. Variabila Xbtn devine:
//
'0' dac butonul Btn2 este apsat, sau
//
'1' dac butonul Btn2 este eliberat.
Xbtn = RA2; // Citim al treilea bit al portului PORTA. Variabila Xbtn devine:
//
'1' dac butonul Btn1 este apsat, sau
//
'0' dac butonul Btn1 este eliberat.
Citirea valorii dintr-un port n linia ce urmeaz imediat dup setarea acestuia, poate
fi afectat de impedana conectat ca sarcin la pinul aferent portului.
Char Var1;
// declarm o variabil Var1 de un octet.
TRISA = xxxxx1x1b; // Setm pinii RA0 i RA2 ca intrri
Var1 = PORTA;
// poate citi portul A cu erori
Char Var1;
// declarm o variabil Var1 de un octet.
TRISA = xxxxx1x1b; // Setm pinii RA0 i RA2 ca intrri
nop;
// comanda 'nop' ntrzie derularea programului,
// cu un ciclu, ceea ce face ca statutul pinilor
// declarai intrri s se stabilizeze
Var1 = PORTA;
// se va citi corect
Aa cum am menionat anterior, un pin declarat ca intrare poate fi setat fie intrare
digital, fie intrare analogic. Un exemplu detaliat al folosirii intrrilor analogice
este prezentat n capitolul 12.
27
28
Ioan P. MIHU
Magistrala Lungime
Familie /
Performanele
Date Instruciune Tip reprezentativ
familiei
PIC12 /
0,064k RAM, 1 kB Flash; 20 MHz; 6 I/O pin; 2 Timers;
12 bit
PIC12F675 7 Interrupt sources;10 bit ADC/4 ch; 32 Base Instructions
PIC16
0,368k RAM, 8 kB Flash; 20 MHz;
14 bit
/
14 Interrupt sources; 3 Timers; 2 PWM channels;
8 bit
PIC16F877 1 USART; 10 bit ADC/8 ch; 35 Base Instructions,
PIC18
1,6k RAM, 32 kB Flash; 40 MHz; 2 PWM channels;
16 bit
/
18 Interrupt sources; 4 Timers;1 USART; 10 bit ADC/8 ch;
PIC18F452 75 Base Instructions, 8x8 hardware multiplier;
PIC24
16k RAM, 256 kB Flash; 40 MIPS; 35 I/O pin; 2 UART;
/
2 SPI; 2 I2C; 10 bit ADC/13 ch; 5 PWM channels;
PIC24FJ128- 43 Interrupt sources; 5 Timers; 76 Base Instructions, 17x17
GA006
hardware multiplier;
16k RAM, 256 kB Flash3 30 MIPS; 35 I/O pin;
dsPIC30
2 UART; 2 SPI; 2 I2C; 10 bit ADC/13 ch; CAN bus;
16 bit
24 bit
/
45 Interrupt sources; 5 Timers; 8 PWM channels; 76 Base
dsPIC30F4012
Instructions, 17x17 single cycle fractional/ integer multiplier;
dsPIC33
30k RAM, 256 kB Flash; 40 MIPS; 85 I/O pin;
/
2 UART; 2 SPI; 2 I2C; 10 bit 2ADC/32 ch; CAN bus;
dsPIC33FJ256- 117 Interrupt sources; 5 Timers; 8 PWM channels; 83 Base
GP506
Instructions, 16x16 single cycle fractional/ integer multiplier;
128k RAM; 512 kB Flash; 80 MHz / 1,65MIPS/MHz
PIC32
O instruciune / ciclu; Cache memory
/
32 bit
128 bit
16ch DMA; Ethernet; 2CAN buss; Full speed USB;
PIC32MX360Multitasking embedded control;
F512L
Free MPLAB XC Compiler
29
30
Ioan P. MIHU
S continum analiza datelor din tabelul 2.2 cu operaia de adunare. Familia PIC18 este
prima care are nglobat un multiplicator hardware de 8x8 bit. Aceasta nseamn c
efectueaz nmulirea ntr-un singur ciclu instruciune (exist instruciunea MUL, n setul
de instruciuni). Familiile PIC24 i dsPIC30, PIC32 au multiplicatoare hardware 17x17,
care le permit nmulirea a dou numere de 16 bii ntr-un singur ciclu instruciune.
31
Din cele dou ferestre menionate putem afla numrul de instruciuni al unor rutine. Nu este
corect s judecm viteza de calcul dup numrul de instruciuni pe care la are o rutin de
multiplicare, deoarece ea cuprinde i bucle care se repet, durata de execuie a rutinei fiind
dependent de numerele cu care se opereaz. Cel mai bun mod de a judeca lucrurile este
analiza timpului de calcul a codului executabil rezultat, cu ajutorul simulatorului MPLAB
SIM n fereastra Simulator Trace, ca n figura 2.15. Acesta are avantajul c aici sunt
contorizai cu exactitate numrul de cicli instruciune.
Numrul de cicluri instruciune menionat n tabel poate varia fiindc este dependent de
valorile operanzilor (mai ales cnd acestea sunt valori particulare precum 0, 1, NaN, etc.),
precum i de tipul compilatorului. O alt msur a performanelor compilatorului de a
opera cu numere n virgul flotant este numrul de cicli instruciune n care se calculeaz
valoarea unor funcii matematice precum: sin(x), tg(x), ln(x), etc, chiar dac acestea nu sunt
folosite n algoritmii n timp real.
n concluzie, revenind la imaginea de ansamblu oferit de tabelul 2.2, observm c aici sunt
menionate operaii efectuate pe diverse tipuri de date: 8 bii, 16 bii sau float, care pot fi
efectuate ntr-un singur ciclu instruciune sau n foarte multe. Devine clar, c trebuie
32
Ioan P. MIHU