Sunteți pe pagina 1din 14

Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr.

Lecia nr. 8

CONVERTORUL ANALOG-DIGITAL

Scopul leciei este familiarizarea cu structura hardware i posibilitile de


programare ale convertorului analog-digital al microcontrolerului PIC 12F675. Se va realiza
i un proiect de aplicaii cu acesta.

8.1. SCHEMA BLOC I REGISTRE DE COMAND


Microcontrolerul PIC 12F675 conine un convertor analog-digital (A/D) de 10 bii cu
patru canale analogice de intrare (figura 8.1).

Figura 8.1. Schema bloc a convertorului A/D

Cele patru canale analogice sunt multiplexate i aplicate unui circuit de eantionare i
meninere (Sample and Hold) de la intrarea convertorului A/D. n urma conversiei, este
generat un cuvnt de 10 bii care va fi stocat ntr-un registru intern. Tensiunea de referin
cu care lucreaz convertorul este selectabil prin soft, fie la valoarea VDD fie la o valoare
VREF aplicat din exterior pe pinul GP1.
Registrele speciale care controleaz funcionarea convertorului A/D sunt prezentate
n tabelul 8.1.
Tabelul 8.1. Registre de comand ale convertorului A/D
Adresa Nume Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
05H GPIO - - GP5 GP4 GP3 GP2 GP1 GP0
0BH/8BH INTCON GIE PEIE T0IE INTE GPIE T0IF INTF GPIF
0CH PIR1 EEIF ADIF - - CMIF - - TMR1IF
1EH ADRESH C.m.s 8 bii ai rezultatului aliniai la stnga sau 2 bii ai rezultatului aliniai la dreapta
1FH ADCON0 ADFM VCFG - - CHS1 CHS0 GO ADON
85H TRISIO - - TRISIO5 TRISIO4 TRISIO3 TRISIO2 TRISIO1 TRISIO0
8CH PIE1 EEIE ADIE - - CMIE - - TMR1IE
9EH ADRESL C.m.p.s. 2 bii ai rezultatului aliniai la stnga sau 8 bii ai rezultatului aliniai la dreapta
9FH ANSEL - ADCS2 ADCS1 ADCS0 ANS3 ANS2 ANS1 ANS0

85
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 8

8.2. CONFIGURAREA CONVERTORULUI I A MODULUI DE LUCRU


Vom prezenta n continuare posibilitile de configurare a convertorului pentru
diferite moduri de lucru prin intermediul biilor cu atribuii specifice din tabelul 8.1.

Intrrile analogice
Semnalele analogice care urmeaz s fie convertite, sunt prevzute a se citi pe pinii
GP4, GP2, GP1 i GP0, care vor trebui definii ca intrri analogice. Pentru aceasta, se va
proceda astfel:
o n registrul TRISIO (adresa 85H), se vor seta biii TRISIO4 = TRISIO2 =
TRISIO1 = TRISIO0 = 1, pentru configurarea lor ca intrri,
o n registrul ANSEL (adresa 9FH) se vor seta biii ANS3 = ANS2 = ANS1 =
ANS0 = 1 pentru a defini pinii respectivi ca fiind intrri analogice.

Selecia canalelor
Din figura 8.1 observm c adresarea multiplexorului analogic de intrare se face cu
biii CHS1 i CHS0. Aceti bii fac parte din registrul de comand ADCON0 (adresa 1FH)
i vor defini canalele de intrare astfel:
CHS1 CHS0
0 0 canal 0 (AN0)
0 1 canal 1 (AN1)
1 0 canal 2 (AN2)
1 1 canal 3 (AN3)

Tensiunea de referin
Aa cum s-a mai menionat n paragraful precedent, convertorul analog-digital poate
lucra fie cu o tensiune de referin VREF aplicat din exterior pe pinul GP1, fie cu tensiunea
de referin intern egal cu VDD.
Selecia ntre cele dou variante se face cu bitul 6 al registrului de comand
ADCON0 astfel:
VCFG = 1 se lucreaz cu VREF extern (pe GP1)
VCFG =1 se lucreaz cu VREF = VDD

Tactul de conversie
Durata unei conversii este de 11 TAD. Pentru alegerea tactului conversiei (TAD) exist
dou variante:
o se poate selecta prin soft la una din valorile: FOSC/2, FOSC/4, FOSC/8, FOSC/16,
FOSC/32, FOSC/64, unde FOSC este frecvena oscilatorului la care lucreaz
microcontrolerul,
o se poate selecta un oscilator RC intern dedicat convertorului A/D.
Biii de selecie a frecvenei de lucru sunt ADCS2, ADCS1 i ADCS0 aflai n
poziiile 6, 5, 4 din registrul de comand ANSEL (adresa 9FH).

86
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 8

n tabelul 8.2 sunt prezentate frecvenele setabile pentru diverse valori ale
oscilatorului local.
Tabelul 8.2. Frecvenele de lucru selectabile
Sursa de tact a convertorului (TAD) Frecvena microcontrolerului
Operare ADCS2ADCS0 20 MHz 5 MHz 4 MHz 1,25MHz
2 TOSC 000 100 ns(2) 400 ns(2) 500 ns(2) 1,6 s
4 TOSC 100 200 ns(2) 800 ns(2) 1.0 s(2) 3,2 s
8 TOSC 001 400 ns(2) 1,6 s 2,0 s 6,4 s
16 TOSC 101 800 ns(2) 3,2 s 4,0 s 12,8 s(3)
32 TOSC 010 1,6 s 6,4 s 8,0 s(3) 25,6 s(3)
64 TOSC 110 3,2 s 12,8 s(3) 16,0 s(3) 51,2 s(3)
A/D RC x11 2 6 s(1,4) 2 6 s(1,4) 2 6 s(1,4) 2 6 s(1,4)
Legend: Valorile din celulele marcate sunt n afara domeniului recomandat
Not referitoare la valorile din tabel
1. Oscilatorul dedicat convertorului (A/D RC) are TAD = 4 s pentru VDD > 3,0 V.
2. Aceste valori ncalc condiia de TAD minim.
3. Pentru conversii mai rapide se recomand selectarea unei alte surse de tact.
4. Cnd frecvena microcontrolerului este mai mare dect 1 MHz, A/D RC este recomandat
numai dac conversia se execut n modul de lucru SLEEP a circuitului.
Observaie: Pentru o conversie corect este nevoie ca TAD > 1,6 s.

Declanarea conversiei i generarea ntreruperii la sfritul acesteia


o Declanarea unui ciclu de conversie se face prin setarea bitului 1 (GO/ DONE ) din
registrul ADCON0 (adresa 1FH). La sfritul ciclului de conversie, acest bit este
resetat n mod automat de hardware-ul intern al convertorului indicnd starea DONE.
o Bitul de stare al convertorului este ADON din registrul de comand ADCON0.
ADON = 1 conversie n curs de execuie
ADON = 0 convertor decuplat
o Solicitarea unei ntreruperi la sfritul ciclului de conversie se face automat de ctre
hardware-ul intern care seteaz bitul 6 (ADIF Analog to Digilal Interrupt Flag) din
registrul de comand PIR1 (adresa 0CH) semnificnd solicitarea unei ntreruperi.
o Pentru a se declana o cerere de ntrerupere ctre CPU trebuie setai biii de validare
a acestei cereri de ntrerupere i anume:
bitul 6 (ADIE Analog to Digital Interrupt Enable) din registrul de comand
PIE1 (adresa 8CH),
biii 7 i 6 (GIE respectiv PEIE) din registrul de comand al ntreruperilor
INTCON adresa 08H/88H (GIE este bitul general da validare a ntreruperilor,
iar PEIE este bitul de validare a ntreruperilor generate de modulele periferice).

Ieirea digital
Rezultatul conversiei este un cuvnt binar de 10 bii nscris n registrele ADRESH
(adresa 1EH) i ADRESL (adresa 9EH). Cuvntul de 10 bii poate fi nscris n cele dou
registre a cte 8 bii aliniat la stnga sau aliniat la dreapta (figura 8.2).

87
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 8

Figura 8.2. Formatul rezultatului


Formatul rezultatului este controlat de bitul 8 (ADFM) din registrul ADCON0, dup
cum urmeaz:
ADFM = 1 aliniere la dreapta
ADON = 0 aliniere la stnga

Modelul intrrii analogice


Pentru a asigura corectitudinea conversiei cu o eroare de LSB (o treapt din cele
1024 ale convertorului), condensatorul etajului de eantionare i meninere (CHOLD) trebuie
s aib timpul necesar pentru ncrcare la valoarea curent a tensiunii analogice de la intrare
(timp de eantionare timp necesar ntre comutarea intrrii multiplexorului i momentul
cnd pornete conversia). Pentru a putea identifica parametrii de care depinde acest timp de
eantionare (TES), avem nevoie de un model al canalului analogic de intrare (figura 8.3).

Figura 8.3. Modelul canalului analogic de intrare

Din schem observm c impedana sursei de semnal (RS) precum i impedana


comutatorului de eantionare (RSS) influeneaz n mod direct acest timp. Se recomand ca
RS s nu depeasc 10 K iar valoarea lui RSS depinde de tensiunea de alimentare VDD.

88
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 8

Timpul de eantionare poate fi calculat cu formula:


TES = TAMP + TC + TCOFF
unde:
TAMP este timpul de comutare al amplificatorului (tipic TAMP = 2 s),
TC = C HOLD (R IC + R S + R SS ) = 120 pF (1K + 10K + 7K) = 16,47 s este timpul
de ncrcare al condensatorului,
TCOFF = (Temp 25o C) (0,05 s/ C) = (50o C 25o C) (0,05 s/ o C) = 1,25 s
reprezint influena variaiei de temperatur asupra timpului de ncrcare.
Cu precizrile de mai sus, putem determina timpul minim de eantionare ca fiind:
TACQ = TAMP + TC + TCOFF = 2 s + 16,47 s + 1,25 s = 19,72 s .

8.3. EXEMPLU DE PROGRAMARE A CONVERTORULUI A/D


Aplicaia pe care ne propunem s o rezolvm este convertirea unei tensiuni analogice
aplicate pe GP0 (AN0) i afiarea rezultatului de 8 bii pe cele 8 LED-uri de pe kit.
Pentru elaborarea programului acestei aplicaii, vor trebui luate n considerare att
necesitile de programare a convertorului, ct i cele de afiare pe matricea de LED-uri de
pe kit, i anume:
Crearea impresiei de simultaneitate n afiarea unor valori binare pe LED-urile de
pe kit, se obine prin serializarea comenzilor de aprindere, la o frecven suficient
de mare, astfel nct s nu fie sesizat de ochiul uman (multiplexarea n timp a
aprinderii LED-urilor astfel ca fiecare LED s se aprind cu o frecven mai mare
dect 50 Hz). Aceasta se poate realiza folosind ntreruperile generate de unul
dintre timer-ele microcontrolerului (TIMER0, de exemplu) la momente de timp
programabile, de exemplu, n aplicaia care urmeaz, la fiecare 1 ms (frecvena
ntreruperilor de 1 KHz);
Programarea convertorului A/D astfel nct s achiziioneze i s converteasc
semnalul de pe GP0 la care este conectat, pe plac, cursorul unui semireglabil.
Semnalul cules are ca referin (masa de msur) linia GND a plcii i poate varia
ntre 0 i +5 V;
Programarea corespunztoare a pinilor de port, adic configurarea lui GP1, GP2,
GP4 i GP5 ca porturi de ieire digital (pentru comanda LED-urilor) i a lui GP0
ca intrare analogic.
Programul realizat conform acestor cerine poate fi structurat, pentru o mai bun
nelegere, punere n funciune i depanare, astfel:
O bucl principal de program (Main), de ateptare a apariiei ntreruperilor, care
s fie precedat de o secven de iniializare i setare a opiunilor de lucru pentru
componentele hardware utilizate;
O secven de program, ncepnd cu adresa vectorului de ntrerupere 0004, n
care s fie testat sursa care a generat ntreruperea i care va direciona execuia
spre una sau alta dintre subrutinele de tratare a lor (a convertorului
AD_Functions sau a timer-ului Timer0Interrupt);
Definirea unor subrutine suplimentare pentru afiarea rezultatului, i anume:

89
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 8

o Subrutina Display pentru afiarea pe LED-uri a rezultatului conversiei.


o Subrutina LEDStateMachine, care s baleieze comanda LED-urilor, cu un
program bazat pe conceptul de automat finit,
o Subrutine specifice de comand efectiv a LED-urilor: Led0, Led1, , Led7
Organigrama programului astfel structurat este desenat n figura 8.4.

CONVERSIE A/D

Iniializri
Main
Da Nu
Isr Exist ntreruperi?

Salvare registre de
lucru (STATUS, W)
Timer0InterruptCheck
Nu Da
T0IF = 1? Timer0Interrupt

Nu Da
FLAGS.0 = 1?

Display A_D Functions

FLAGS.0 FLAGS.0
T0IF=0
EndIsr
Refacere registre de
lucru (STATUS, W)

Figura 8.4. Organigrama programului principal


S comentm acum subrutina de tratare a ntreruperii generate de Timer0, care apare
atunci cnd T0IF = 1:
naintea executrii subrutinei, va trebui salvat coninutul registrelor de lucru
(STATUS i W) n dou registre temporare, definite n prealabil, iar dup
execuia subrutinei, naintea revenirii n programul principal, coninutul celor
dou registre va trebui restabilit la valoarea anterioar.
Momentul generrii ntreruperii de ctre convertorul A/D nu este important
pentru aceast aplicaie, motiv pentru care nu este testat flagul de ntrerupere
ADIF. nregistrarea rezultatului conversiei se face n subrutina AD_Functions.
n funcie de valoarea unui bit de condiie definit n prealabil ntr-un registru,
FLAGS (bitul 0 FLAGS.0), se va apela fie subrutina de nregistrare a
rezultatelor conversiei (AD_Functions) fie subrutina de afiare (Display). Oricare
dinte aceste dou subrutine este executat la fiecare a doua ntrerupere generat
de Timer0 (adic la un interval de 2 ms, dac temporizarea timer-ului este setat
la 1 ms).

90
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 8

Subrutinele LEDStateMachine, Led0, Led1, , Led7 nu apar explicit n figura 8.4,


ele fiind incluse n subrutina Display, pe care o vom descrie n continuare.
Display este o subrutin complex, a crei organigram este prezentat n figura 8.5.
La elaborarea programului pentru aceast subrutin trebuie avute n vedere urmtoarele
aspecte:
Deoarece LED-urile pot fi comandate numai secvenial (comand serializat),
nseamn c aceast subrutin va trebui parcurs de 8 ori pentru a afia coninutul
registrului ADRESH (vezi figura 8.2) pe cele 8 LED-uri. Pentru pstrarea
rezultatului binar al conversiei (numai cei 8 bii mai semnificativi), vor fi
necesare dou registre suplimentare:
un registru tampon (LEDREGISTERBUFFER) care va pstra cei 8 bii ai
rezultatului, pentru o durat de 2 8 ms, pn la comanda tuturor celor 8 LED-
uri pentru un ciclu de afiare complet,
un registru (LEDREGISTER) al crui coninut va fi actualizat n mod
continuu cu rezultatul binar pe 8 bii, la fiecare nou ciclu de conversie.
Valoarea din registrul LEDREGISTERBUFFER va fi actualizat cu valoarea
din LEDREGISTER doar dup 8 execuii ale subrutinei Display.

Subrutina
Display

Nu Da
BUFFERLOADED STATE_COUNTER = 0?

Nu Da BUFFERRESET
<STATE_COUNTER>=8?

LEDREGISTERBUFFERLEDREGISTER
STATE_COUNTER 0

Nu Bitul urmtor din Da


LEDREGISTERBUFFER UpdateLed
are valoarea 1?
LEDStateMachine
Continue

STATE_COUNTER+1

Return

Figura 8.5. Organigrama subrutinei Display

Pentru comanda efectiv a LED-urilor va trebui executat o alt subrutin,


LEDStateMachine, elaborat pe baza conceptului de automat finit, pentru care va
trebui definit un registru numrtor de stare, STATE_COUNTER. n fiecare stare
a acestui automat se va comanda afiarea unui singur bit (din rezultatul binar al
conversiei) pe LED-ul de rang corespunztor, deci automatul va avea definite 8
stri (S0, S1, , S7) pentru afiare pe cele 8 LED-uri. n fiecare stare se va
executa cte o subrutin de comand a LED-urilor: Led0 pentru S0, Led1 pentru
S1, , Led7 pentru S7. Organigrama acestei subrutine este desenat n figura 8.6.

91
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 8

Subrutina
LEDStateMachine

W(adr.start+<STATE_COUNTER>)
PCLW
StateMachineStart
Computed Goto
S0 S1 S7

Led0 Led1 Led7

Return

Figura 8.6. Organigrama subrutinei LEDStateMachine


Cu aceste precizri suplimentare, programul elaborat pentru conversia tensiunii
analogice de pe pinul GP0 i afiarea rezultatului binar pe LED-uri este urmtorul:
list p=12F675
#include <p12f675.inc>
errorlevel -302
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF &
_PWRTE_ON & _INTRC_OSC_NOCLKOUT
;Defines
#define BANK1 banksel 0x80 ;Definirea directivei de selectare Bank1 cu simbolul BANK1
#define BANK0 banksel 0x00
#define LED0TRIS b'11001111' ;Atribuirea unei valori binare variabilei LED0TRIS prin
; care GP4 I GP5 vor fi configurate ca ieiri
#define LED1TRIS b'11001111'
#define LED2TRIS b'11101011'
#define LED3TRIS b'11101011'
#define LED4TRIS b'11011011'
#define LED5TRIS b'11011011'
#define LED6TRIS b'11111001'
#define LED7TRIS b'11111001'
#define LED0ON b'00010000' ;Atribuirea valorii 0x10 simbolului LED0ON
#define LED1ON b'00100000'
#define LED2ON b'00010000'
#define LED3ON b'00000100'
#define LED4ON b'00100000'
#define LED5ON b'00000100'
#define LED6ON b'00000100'
#define LED7ON b'00000010'
#define ANSelect b'00010001' ;Registru folosit n configurare AD
#define ADControl b'00000001' ;La fel AD
Cblock 0x20 ;Definirea unor registre temporare folosite n tratare a ntreruperilor
WTEMP
STATUSTEMP FLAGS ;Registru de condiie n care bitul 0 indic care ntrerupere este
; servit la un moment dat astfel:
; bit0 = 1
; va fi servit subrutina de ntrerupere generat de convertor;
; bit0 = 0
; va fi servit subrutina Display
Endc

92
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 8

CBlock 0x50 ;Definirea unor registre folosite n subrutina Display i


STATEMACHINE
STATE_COUNTER ;Registru numrtor de stare
LEDREGISTER ;Registru folosit n subrutina DISPLAY
LEDREGISTERBUFFER ;La fel
Endc
ORG 0x000
nop
goto Init
ORG 0x004 ;Adresa vectorului de ntrerupere este 0x004
Isr
movwf WTEMP ;Salvarea coninutului registrului W
movf STATUS,w
clrf STATUS ;Resetare registru STATUS
movwf STATUSTEMP
BANK1
;Verificarea perifericelor pentru a vedea dac unul dintre ele a generat ntrerupere
Timer0InterruptCheck
btfss INTCON,5 ;Este T0IE High?
goto EndIsr ;Nu
btfsc INTCON,2 ;Este T0IF Low?
goto Timer0Interrupt ;Nu, este High, deci a aprut ntreruperea T0
goto EndIsr
Timer0Interrupt ;Rutina de tratare a ntreruperii generate de T0.
; Se execut la fiecare 1024 uS
BANK0
btfsc FLAGS,0 ;Verific care rutin de tratare ntreruperi trebuie servit:
call AD_Functions ;Dac FLAGS,0 este 1, se va servi rutina de conversie, AD Function
BANK0 ;BANK0
btfss FLAGS,0 ;Dac FLAGS,0 este 0, se va servi rutina Display
call Display
BANK0 ;BANK0
movlw b'00000001'
xorwf FLAGS,F ;Se trece n stare complementar bitul 0 din FLAGS
BANK1 ;BANK1
bcf INTCON,T0IF ;Se reseteaz Flag-ul de ntrerupere al lui TMR0
EndIsr
BANK0 ;Selectare Bank0
movf STATUSTEMP,w
movwf STATUS ;Restaurare STATUS
movf WTEMP,w
retfie ;Revenire din ntrerupere
AD_Functions ;Operaii care se execut n subrutina de tratare
; ntreruperi generate de CAD
BANK0 ;BANK0
movf ADRESH,W ;Transfer cel mai semnificativ byte al rezultatului n W
movwf LEDREGISTER ;Acest rezultat este apoi mutat n LEDREGISTER pentru afiare
bsf ADCON0,GO ;Se d start unei noi conversii A/D
return
;Iniializare
Init
; call 0x3FF
BANK1
movwf OSCCAL
call InitLED ;Apelare subrutina de iniializare a strii LED-urilor
movlw 0xFF
movwf TRISIO ;Toi pinii de port sunt configurai ca intrri
BANK0 ;BANK 0

93
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 8

clrf GPIO ;Resetare Port I/O


BANK1 ;BANK 1
clrf VRCON ;Dezactivare Vref
BANK0 ;BANK 0
clrf TMR0
movlw 0x07
movwf CMCON ;Dezactivare comparator
BANK1 ;BANK 1
movlw b'10000001'
movwf OPTION_REG ;TIMER0 Prescaler = 4, deci T0 va genera ntreruperi la
; fiecare 256*4 = 1024 uS.
bsf INTCON,T0IE ;Activare ntreruperi TIMER0
bcf INTCON,T0IF
bsf INTCON,GIE ;Activare ntreruperi generale
bsf INTCON,PEIE
movlw ANSelect
movwf ANSEL ;Configurare pin GP0 ca intrare analogic i frecvena
; de conversie egal cu fosc/8 (ANSEL: 00010001
; adic ADCS <2:0> = 001 i ANS<3:0> = 0001)
BANK0 ;BANK 0
movlw ADControl
movwf ADCON0 ;Selectare AN0, biii cei mai semnificativi n ADRESH
; (Left justified) i activare conversie (ADCON0:00000001
; adic CHS1 = CHS0 = 0, ADFM = 0 i ADON = 1)
NOP
NOP
NOP
NOP ;Se ntrzie cu 4 uS startul conversiei A/D
bsf ADCON0,GO ;Start A/D
Main ;Program principal
goto Main
InitLED
clrf STATE_COUNTER
;Iniializarea registrului STATE_COUNTER
clrf LEDREGISTERBUFFER
;Iniializarea registrului Buffer
return
;LEDStateMachine - este o subrutin inclus n rutina Display i execut aprinderea sau nu a
; celor 8 LED-uri de pe plac, n funcie de coninutul registrului LEDREGISTERBUFFER, care
; conine rezultatul binar al conversiei. Incrementarea numrtorului de stare (registrul
; STATE_COUNTER) se face la fiecare execuie a subrutinei Display.
LEDStateMachine
movlw StateMachineStart
;Se depune n W adresa etichetei StateMachineStart
addwf STATE_COUNTER,w
;Adun coninutul registrului STATE_COUNTER la W
movwf PCL ;PCL = Cei 8 bii mai puini semnificativi ai PC
StateMachineStart ;Secvena de program cu 8 instruciuni goto
; pentru cele 8 stri ale automatului
goto S0
goto S1
goto S2
goto S3
goto S4
goto S5
goto S6
goto S7

94
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 8

S0 call Led0
goto EndLEDStateMachine
S1 call Led1
goto EndLEDStateMachine
S2 call Led2
goto EndLEDStateMachine
S3 call Led3
goto EndLEDStateMachine
S4 call Led4
goto EndLEDStateMachine
S5 call Led5
goto EndLEDStateMachine
S6 call Led6
goto EndLEDStateMachine
S7 call Led7
EndLEDStateMachine
return
Led0 ;LED0 - subrutina de comand a LED-ului D0
BANK1
movlw LED0TRIS
movwf TRISIO
BANK0
movlw LED0ON
movwf GPIO
return
Led1
BANK1
movlw LED1TRIS
movwf TRISIO
BANK0
movlw LED1ON
movwf GPIO
return
Led2
BANK1
movlw LED2TRIS
movwf TRISIO
BANK0
movlw LED2ON
movwf GPIO
return
Led3
BANK1
movlw LED3TRIS
movwf TRISIO
BANK0
movlw LED3ON
movwf GPIO
return
Led4
BANK1
movlw LED4TRIS
movwf TRISIO
BANK0
movlw LED4ON
movwf GPIO
return

95
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 8

Led5
BANK1
movlw LED5TRIS
movwf TRISIO
BANK0
movlw LED5ON
movwf GPIO
return
Led6
BANK1
movlw LED6TRIS
movwf TRISIO
BANK0
movlw LED6ON
movwf GPIO
return
Led7
BANK1
movlw LED7TRIS
movwf TRISIO
BANK0
movlw LED7ON
movwf GPIO
return
;Subrutina Display - afieaz valoarea din LEDREGISTERBUFFER pe cele 8 LED-uri - la fiecare
; apelare se va comanda un LED. Dup 8 apelri ale acestei subrutine, LEDREGISTERBUFFER se
; va rencrca cu valoarea din LEDREGISTER
Display
movf STATE_COUNTER,w
btfsc STATUS,Z ;LEDStateMachine este n state 0?
goto BUFFERRESET
;Da
btfss STATE_COUNTER,3
;Nu, se testeaz dac s-au depit cele 8 stri.
goto BUFFERLOADED
;Nu
BUFFERRESET ;Da
movf LEDREGISTER,w
movwf LEDREGISTERBUFFER
;ncarc bufferul cu valoarea din LEDREGISTER
clrf STATE_COUNTER
;Se va pleca din State 0
BUFFERLOADED
bcf STATUS,C ;Reseteaz C. Urmeaz o operaie care-l va afecta
rrf LEDREGISTERBUFFER,f
;Rotirea se efectueaz prin Carry
btfsc STATUS,C ;Urmtorul bit este '1'?
goto UpdateLed ;Da, actualizeaz starea LED-urilor
goto Continue ;Nu
UpdateLed ;Actualizarea strii LED-urilor
call LEDStateMachine
Continue
incf STATE_COUNTER,f
;Se incrementeaz numrtorul de stri
return
END

96
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 8

1. Se construiete proiectul aplicaiei n care se include acest fiier surs.


2. Se import n PICkit FLASH Starter Kit fiierul n format executabil (cu extensie .hex)
creat la punctul 1.
3. Se ncarc acest fiier n memoria FLASH a microcontrolerului PIC 12F675.
4. Se lanseaz n execuie programul. Se va urmri rezultatul conversiei pe cele 8 LED-uri
de afiare, nregistrnd valorile celor 8 bii. Reamintim c pentru 0 logic LED-ul este
stins i se aprinde pentru valoarea de 1 logic.
5. Se modific tensiunea de intrare a convertorului, din semireglabilul de pe plac, pentru a
obine valorile de 1 V, 2 V, 3 V, 4 V i 5 V. Citirea tensiunilor se va face pe multimetru
numeric, ntre cursorul semireglabilului i mas. La fiecare valoare msurat se va
nregistra valoarea binar a rezultatului.
6. Se va determina abaterea de la liniaritate a convertorului folosind formula
V IN AV ref
REZULTAT 256
AV ref + AV ref
n care AVref+ este 5 V, AVref este 0 V iar Rezultat este obinut din conversia din binar
n zecimal a valorii citite cu ajutorul LED-urilor la punctul 5.

97
Aplicaii hardware i software cu microcontrolerul PIC 12F675 Lecia nr. 8

98

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