Documente Academic
Documente Profesional
Documente Cultură
Lecia nr. 6
PROGRAME APLICATIVE
Scopul acestei lecii este familiarizarea studenilor cu rularea unor aplicaii pe PICkit
1 FLASH Starter Kit i cu modul de utilizare al interfeei de programare.
6.1. INTRODUCERE
Comunicaia cu calculatorul gazd al sistemului PICkit 1 FLASH Starter Kit se face
prin cablu USB iar programul de interfa, care gestioneaz resursele hardware ale kit-ului,
are implementate comenzi care permit urmtoarele faciliti de lucru:
Importul unui fiier executabil, obinut n MPLAB;
Programarea PIC-ului din soclul de evaluare;
Operaii de citire, verificare, tergere a memoriei program;
Vizualizarea coninutului memoriei program (FLASH) i a celei de date
(EEPROM);
Aplicarea unui semnal dreptunghiular de 2,5 KHz pe pinul 3 al circuitului din
soclu (GP4 pentru PIC 12F629/675 sau RA4 pentru PIC 16F630/676);
Afiarea valorilor unor variabile specifice: Configuration Word, OSCCAL,
Bandgap;
Afiarea unor mesaje despre operaia care se execut la un momentul dat.
57
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 6
58
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 6
APLICAIA 1
Prin realizarea acestei aplicaii ne propunem s comutm starea unui LED
aprins/stins cu o frecven de 1 Hz, folosind LED-ul D0 i un program tip bucl de
ntrziere.
Lund n considerare faptul c la 1 Hz perioada este de 1s, nseamn c LED-ul va fi
aprins timp de 500 ms, dup care va fi stins, stare n care va rmne pentru o durat de timp
tot de 500 ms. Cu alte cuvinte, pentru a face LED-ul s clipeasc, trebuie ca bucla de
ntrziere s genereze, repetitiv, temporizri de 500 ms.
1. Elaborarea programului de realizare a aplicaiei
n elaborarea programului trebuie avute n vedere particularitile setului de
instruciuni ale microcontrolerului i ale schemei de cablare a LED-urilor pe kit.
Reamintim c cele 8 LED-uri sunt comandate de 4 pini ai portului de intrare/ieire
(GP1, GP2, GP4,. GP5). Schema de legturi realizat pe plac nu permite comanda
simultan a dou LED-uri, cu alte cuvinte, la un moment dat nu poate fi aprins dect un
singur LED, iar programarea aprinderii, respectiv stingerii lor se va face conform cu tabelul
de comand multiplexat de mai jos:
Pin D0 D1 D2 D3 D4 D5 D6 D7
GP4 HI LOW HI LOW Z Z Z Z
GP5 LOW HI Z Z HI LOW Z Z
GP2 Z Z LOW HI LOW HI HI LOW
GP1 Z Z Z Z Z Z LOW HI
59
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 6
Init
bsf STATUS,RP0 ;Selectare bank 1
movwf OSCCAL ;Actualizare factor de calibrare a oscilatorului - frecvena minim
movlw 0xcf
movwf TRISIO ;Setare GP0, 1, 2, 3 - intrri, GP4, 5 - ieiri
; (Led-ul D0 este conectat intre GP4 si GP5)
clrf ANSEL ;Configurarea intrrilor/ieirilor convertorului A/D ca I/O digitale
bcf STATUS,RP0 ;Selectare bank 0
movlw 0x07
movwf CMCON ;Configurarea biilor de mod de lucru al comparatorului pentru
; comparator off
clrf FLAGS ;Resetarea registrului de stare (stare iniial a Led-urilor: stinse)
Bucla
call ToggleLED ;Apelarea subrutinei Toggle LED
call Temp_500mS ;Apelarea subrutinei Temp_500mS
goto Bucla ;Salt la Bucla pentru un nou ciclu
;Subrutina ToggleLED - subrutina de comand a Led-ului D0
ToggleLED
btfss FLAGS,0 ;Testare flag de stare LED0 - dac este 1 (LEDOn)
; se sare instruciunea urmtoare i se execut TurnLedOff
goto TurnLedOn ; dac este 0, nseamn LEDoff (stins) i se execut aceasta
; salt la TurnLedOn
TurnLedOff
bcf FLAGS,0 ;Se reseteaz flagul de stare al lui D0
movlw 00
movwf GPIO ;<W> trece n <GPIO>, GP4 devine 0, deci Led-ul D0 va fi stins
return ;ntoarcere la instruciunea care urmeaz dup "call TogleLED"
; din programul principal
TurnLedOn
bsf FLAGS,0 ;Se seteaz flag-ul LEDOn
movlw 0x10 ;Se ncarc W cu 00010000B
movwf GPIO ;<W> trece n <GPIO>, GP4 devine 1 i Led-ul D0 va fi aprins
return ;ntoarcere la instruciunea care urmeaz dup "call TogleLED"
; din programul principal
60
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 6
61
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 6
62
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 6
APLICAIA 2
La nchiderea sau deschiderea unui microswitch apare fenomenul care se cheam
contact imperfect (bouncing). Acesta se manifest prin oscilaii electrice n schem, de
perioad variabil i pentru o durat de timp depinznd de o serie de factori, cum ar fi:
imperfeciunile i impuritile de pe suprafeele de contact, timpii de rspuns ai materialelor,
modul de ncapsulare, puterea pe care o poate suporta suprafaa de contact .a. Pentru
microswitch-uri de tipul celui de pe kit, aceast durat este n general mai mic dect 10 ms.
Numai dup aceast perioad contactul realizat este sigur.
Deoarece aceste contacte imperfecte pot produce modificri nsemnate n
funcionarea normal a schemei n care apar, este necesar eliminarea lor (debouncing).
Acest lucru se poate realiza hardware, prin introducerea unui filtru RC sau a unui CBB tip
R-S sau D ca n figura 6.2, sau prin metode software.
Una din metodele software folosite n acest scop presupune introducerea unei bucle
de temporizare de cca 10 ms din momentul citirii strii modificate, apsat, respectiv relaxat.
Aplicaia pe care o vom realiza pentru citirea strii unui comutator folosete
microswitch-ul de pe plac, SW1, cablat la pinul GP3 al microcontrolerului i semnalizeaz
starea apsat prin bascularea strii Led-ului D1, adic dac acesta este aprins n momentul
apsrii, se va stinge, iar dac este stins, se va aprinde dup apsarea microswitch - ului.
Considerentele avute n vedere la elaborarea fiierului surs pentru aceast aplicaie
sunt urmtoarele:
SW1 este astfel cablat nct la starea relaxat va genera semnal logic 1, iar atunci
cnd este apsat va genera 0 logic.
Vom defini o secven de program (MAIN) n care se testeaz starea lui SW1 i o
subrutin de basculare a strii Led-ului D1 (TOGGLE LED), n care se testeaz
starea unui bit de condiie (flag), numit LEDOn, dintr-un registru special definit:
dac flag-ul LEDOn este 1 (LED-ul este aprins) se va comanda stingerea LED-
ului, iar dac acelai flag este 0 (adic LED-ul este stins) se va comanda
aprinderea lui.
Se definete o a doua subrutin, SWITCH DEBOUNCE, care execut o ntrziere
de cca 10 ms la fiecare relaxare a lui SW1. Ieirea din aceast subrutin se face
doar la starea relaxat a lui SW1, urmnd unei stri de apsare.
63
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 6
64
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 6
APLICAIA 3
Prin realizarea acestei aplicaii se urmrete aprinderea succesiv a celor 8 LED-uri
de pe plac D0, D1, , D7. Momentul aprinderii primului LED este determinat de
apsarea lui SW1, celelalte se vor aprinde succesiv, cu o ntrziere de 100 ms.
Pentru elaborarea fiierului surs se va lua n considerare, pe lng necesitile de
programare descrise n aplicaiile precedente, i schema de cablare a LED-urilor.
65
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 6
;Acest program aprinde cte un LED la fiecare 100ms, dup apsarea lui SW1experimentnd astfel
; aprinderea/stingerea LED-urilor D0, D1, D7
list p=12f675
#include <p12f675.inc>
errorlevel -302 ;suprim mesajele de eroare tip 302 din lista de erori
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_ON &
_PWRTE_ON & _INTRC_OSC_NOCLKOUT
cblock 0x20
CountH ;registru folosit n temporizare, pentru constanta high
CountL ;registru de temporizare, constanta low
endc
#define SW1 GPIO,3 ;microswitch definit pe GP3
#define TRIS_D0_D1 B'00001111' ;setare registru TRISIO pentru aprindere LED D0 i D1
#define TRIS_D2_D3 B'00101011' ;TRISIO pentru D2 si D3
#define TRIS_D4_D5 B'00011011' ;TRISIO pentru D4 si D5
#define TRIS_D6_D7 B'00111001' ;TRISIO pentru D6 si D7
;Definirea valorilor din GPIO pentru aprinderea LED-urilor
#define D0_ON B'00010000' ;LED D0
#define D1_ON B'00100000' ;LED D1
#define D2_ON B'00010000' ;LED D2
#define D3_ON B'00000100' ;LED D3
#define D4_ON B'00100000' ;LED D4
#define D5_ON B'00000100' ;LED D5
#define D6_ON B'00000100' ;LED D6
#define D7_ON B'00000010' ;LED D7
;Start of Program
org 0x005
Initialize
; call 0x3FF ;Restabilirea valorii factorului de calibrare
; Instruciune obligatorie n cazul utilizrii simulatorului
bsf STATUS,RP0 ;Bank 1
movwf OSCCAL ;Actualizarea registrului cu valoarea factorului de calibrare
movlw B'00111111' ;Setarea tuturor pinilor I/o ca intrri, pentru stingerea LED-urilor
movwf TRISIO
clrf ANSEL
bcf STATUS,RP0 ;Bank 0
movlw 0x07
movwf CMCON ;dezactivare comparator
clrf GPIO
clrf CountH
clrf CountL
Main
btfsc SW1 ;Ateapt n bucl apsarea SWITCH-ului
goto Main
movlw 0x14
movwf CountH ;ncarc CountH cu 20D
N0
movlw 0x63
movwf CountL ;ncarc CountL cu 99D
N1
decfsz CountL,f ;ncepe temporizarea de 10 ms pentru eliminarea oscilaiilor
goto N1
decfsz CountH,f
goto N0
bsf STATUS,RP0
movlw TRIS_D0_D1
movwf TRISIO
66
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 6
bcf STATUS,RP0
movlw D0_ON
movwf GPIO ;Aprinderea LED-ului D0
call temp_100mS
movlw D1_ON
movwf GPIO ;Aprinderea LED-ului D1
call temp_100mS
bsf STATUS,RP0
movlw TRIS_D2_D3
movwf TRISIO
bcf STATUS,RP0
movlw D2_ON
movwf GPIO ;Aprinderea LED-ului D2
call temp_100mS
movlw D3_ON
movwf GPIO ;Aprinderea LED-ului D3
call temp_100mS
bsf STATUS,RP0
movlw TRIS_D4_D5
movwf TRISIO
bcf STATUS,RP0
movlw D4_ON
movwf GPIO ;Aprinderea LED-ului D4
call temp_100mS
movlw D5_ON
movwf GPIO ;Aprinderea LED-ului D5
call temp_100mS
bsf STATUS,RP0
movlw TRIS_D6_D7
movwf TRISIO
bcf STATUS,RP0
movlw D6_ON
movwf GPIO ;Aprinderea LED-ului D6
call temp_100mS
movlw D7_ON
movwf GPIO ;Aprinderea LED-ului D7
call temp_100mS
goto Main
temp_100mS
movlw 0x8a
movwf CountH ;ncarc CountH cu 138D
M0
movlw 0x0f0
movwf CountL ;ncarc CountL cu 240D
M1
decfsz CountL,f ;ncepe temporizarea de 100 mS
goto M1
decfsz CountH,f
goto M0
;Temporizarea realizat: (2+138*(2+(240*3)))*1s = 99.636 s
return ;ntoarcere n programul principal
end
1. Se editeaz i se salveaz fiierul surs, cu nume.asm n folderul de proiect, dup care se
construiete proiectul aplicaiei.
2. Se import fiierul nume.hex n fereastra deschis a programului de interfa PICkit1
Flash Starter Kit.
67
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 6
68