Sunteți pe pagina 1din 16

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

Lecia nr. 7

CIRCUITELE TIMER ALE MICROCONTROLERULUI PIC 12F675

Scopul acestei lecii este de a prezenta structura hardware i posibilitile de


programare a circuitelor Timer0 i Timer1 ale microcontrolerului PIC 12F675. Se vor
realiza cteva proiecte de aplicaii cu acestea.

7.1. INTRODUCERE
n numeroase aplicaii apare necesitatea generrii unor impulsuri cu perioad i factor
de umplere variabile sau de a numra impulsuri generate de traductoare diverse, eventual n
intervale de timp presetabile. Funciile mai sus menionate sunt realizate cu circuite
cunoscute sub numele de timer.
Un astfel de circuit conine n esen un registru numrtor care poate fi ncrcat cu o
valoare iniial. n funcie de aceast valoare, circuitul va realiza factorul de divizare dorit.
Pe intrarea registrului se aplic tactul (intern pentru generare de impulsuri, sau
extern pentru numrare de impulsuri) i cnd coninutul lui atinge capacitatea maxim, la
urmtorul tact este emis o cerere de ntrerupere.
Microcontrolerul PIC 12F675 are n structura sa dou circuite timer (Timer0 i
Timer1) a cror funcionare este cea standard.

7.2. TIMER0
Circuitul Timer0 are urmtoarele caracteristici:
Are implementat funcia de generator de impulsuri (Timer) i de numrtor de
impulsuri (Counter);
Registrul numrtor, TMR0 (adresa 01H), este de 8 bii i poate fi citit sau scris
(cu o valoare iniial) prin soft;
Are un circuit de prescalare programabil de 8 bii;
Tactul aplicat pe intrarea registrului numrtor poate fi setat intern sau extern, iar
pentru cel extern se poate selecta frontul activ al impulsului de tact;
Genereaz ntrerupere la depirea capacitaii registrului numrtor, adic la
trecerea din starea FFH n 00H.

7.2.1. STRUCTURA HARDWARE A CIRCUITULUI TIMER0


Schema bloc a circuitului Timer0 este prezentat n figura 7.1.
Schema se compune, n esen, din registrul numrtor TMR0 i circuitul de
prescalare de 8 bii (8-bit Prescaler), precum i o serie de circuite de multiplexare cu cte
dou intrri care vor asigura, prin alegerea convenabil a biilor de selecie, cele dou funcii
de baz (timer i counter) i o serie de alte faciliti utile n aplicaii.

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

Figura 7.1. Schema bloc de principiu a circuitului Timer0

n schem mai figureaz i circuitul de supraveghere (Watchdog Timer) care


utilizeaz acelai circuit de prescalare pentru a genera semnalul de aducere la zero (n caz de
funcionare incorect), semnalul WDT Time-out.
7.2.2. REGISTRE DE COMAND I CONTROL ALE CIRCUITULUI TIMER0
Registrele cu funcii speciale asociate funcionrii timer-ului sunt prezentate n
tabelul 7.1. Facem precizarea c este descris semnificaia doar a acelor bii care intervin n
programarea circuitului Timer0.
Observaie: n celulele marcate cu gri n tabelul de mai jos, se afl bii ale cror
atribuii nu influeneaz programarea circuitului Timer0.
Tabelul 7.1 Registrele asociate funcionrii circuitului Timer0
Adresa Nume Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
01H TMR0 Registru numrtor
0BH/8BH INTCON GIE PEIE T0IE INTE GPIE T0IF INTF GPIF
81H OPTION_REG GPPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
85H TRISIO - - TRISIO5 TRISIO4 TRISIO3 TRISIO2 TRISIO1 TRISIO0
Descrierea biilor de comand i control:
INTCON Registru cu setri i flag-uri pentru lucrul n ntreruperi
Bit 7 GIE: Bit de validare general a ntreruperilor
1 = activeaz toate ntreruperile nemascabile
0 = dezactiveaz toate ntreruperile
Bit 6 PEIE: Bit de validare ntreruperi generate de periferice
1 = activeaz toate ntreruperile nemascabile generate de
periferice
0 = dezactiveaz toate ntreruperile de la periferice

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

Bit 5 T0IE: Bit de validare a ntreruperilor de depire


1= activeaz ntreruperea generat de TMR0
0= dezactiveaz ntreruperea generat de TMR0
Bit 2 T0IF: Flag de ntreruperi de depire a lui TMR0
1= coninutul registrului TMR0 a depit capacitatea maxim
0= coninutul registrului TMR0 nu a depit capacitatea maxim
OPTION_REG Registru pentru setarea unor opiuni de lucru
Bit 7 GPPU : Bit de activare Pull-up pentru toi pinii de intrare/ieire
1 = dezactivare Pull-up general
0 = activare Pull-up general
Bit 5 T0CS: Bit de selectare a sursei tactului
1 = tact extern pe pinul GP2/INT
0 = tact intern
Bit 4 T0SE: Bit de selectare a frontului activ al tactului extern
1 = front descresctor (high to low)
0 = front cresctor (low to high)
Bit 3 PSA: Bit de alocare a prescalerului
1 = prescalerul este alocat circuitului WDT
0 = prescalerul este alocat TMR0
Bit 20 PS2PS0: Bii de selectare a factorului de divizare
Pentru TMR0 Pentru WDT
000 = 1:2 1:1
001 = 1:4 1:2
010 = 1:8 1:4
011 = 1:16 1:8
100 = 1:32 1:16
101 = 1:64 1:32
110 = 1:128 1:64
111 = 1:256 1:128
TRISIO Registru pentru orientarea transferului pe pini
Bit 50 TRISIO5
TRSIO0: Bii de selectare intrare/ieire pentru pinii GP5, GP4, ..., GP0
1 = pinul este setat ca intrare digital
0 = pinul este setat ca ieire; GP3 poate fi doar intrare digital

7.2.3. FUNCII DE BAZ REALIZATE DE CIRCUITUL TIMER0

Funcia Timer
Acest mod de lucru este activat prin resetarea bitului T0CS (INTCON.2). n acest
caz, registrul numrtor TMR0 numr impulsurile ceasului intern (FOSC/4). n cazul n care
se dorete ca n acest mod de lucru s fie folosit i circuitul de divizare programabil
(Prescaler), atunci bitul de selectare PSA (OPTION_REG.3) trebuie resetat iar cu biii de
selectare a factorului de divizare PS2, PS1, PS0 (OPTION_REG.<2, 1, 0>) se alege factorul
de divizare dorit.

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

Observaie: n cazul unei operaii de scriere n registrul numrtor TMR0 (adresa


01H), incrementarea acestuia este suspendat pe durata a dou impulsuri de tact

Funcia Counter
Acest mod de lucru este selectat prin setarea bitului T0CS (INTCON.2) iar
numrtorul TMR0 va contoriza impulsurile aplicate din exterior pe pinul GP2/T0CKI, cu
sau fr prescalare, n funcie de valorile biilor PSA, PS2, PS1, PS0.
Cu ajutorul bitului T0SE (OPTION_REG.4) putem alege frontul activ al impulsului
numrat.
Observaia 1: Pentru a putea folosi pinul GP2 (T0CKI) pentru aplicarea
impulsurilor externe, este necesar dezactivarea funciilor sale analogice i definirea
lui ca pin de port de intrare digital.
Observaia 2: n cazul n care circuitul de prescalare nu este utilizat, este necesar
sincronizarea impulsului extern aplicat pe pinul GP2 (T0CKI) cu tactul intern.
Pentru ca acest lucru s se poat produce, trebuie ca impulsul extern s fie pe nivel
logic 1 pentru cel puin 2TOSC i pe nivel logic 0, de asemenea pentru cel puin 2TOSC.

Watchdog Timer
Circuitul de prescalare este utilizat n comun pentru funciile de Timer, Counter
respectiv Watchdog Timer. Cu bitul de selecie PSA = 1 (OPTION_REG.3), circuitul de
prescalare este alocat circuitului Watchdog Timer. Schimbarea alocrii circuitului de
prescalare ntre cele dou circuite poate conduce la generarea de comenzi de RESET
nedorite. Pentru a evita o astfel de situaie este recomandat ca respectivele treceri s se fac
cu nserarea n program a secvenelor de mai jos:
Timer Watchdog Timer
bcf STATUS, RP0 ;Selectare banc 0
clrwdt ;Resetare WDT
clrf TMR0 ;Resetarea registrului TMR0 i a prescalerului
bsf STATUS,RP0 ;Selectare banc 1
movlw b00101111 ;ncrcarea registrului W cu constanta 2FH
movwf OPTION_REG ;Se aloc prescalerul circuitului WDT
clrfwdt
movlw b00101xxx
movwf OPTION_REG ;Se seteaz factorul de divizare la valoarea dorit
bcf STATUS, RP0

Watchdog Timer Timer


clrwdt ;Resetare WDT
bsf STATUS,RP0 ;Selectare banc 1
movlw bxxxx0xxx
movwf OPTION_REG ;Se aloc prescalerul circuitului Timer0
bcf STATUS, RP0 ;Selectare banc 0

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

7.2.4. LUCRUL N NTRERUPERI AL CIRCUITULUI TIMER0


n cazul n care numrtorul TMR0 trece din stare 0FFH n starea 00H (depire),
este setat bitul T0IF (OPTION_REG.2) care semnalizeaz acest lucru. Pentru ca aceast
depire s conduc la o cerere efectiv de ntrerupere, trebuie ca biii urmtori s fie setai,
adic s aib valori logice 1, conform schemei cu logica ntreruperilor la microcontrolerul
PIC 12F675 din figura 5.2, lecia 5:
bitul T0IE (INTCON.5), de validare a ntreruperilor generate de Timer0,
bitul PEIE (INTCON.6), de validare a ntreruperilor generate de periferice,
bitul GIE (INTCON.7), de validare general a ntreruperilor.

7.3. TIMER1
Microcontrolerul PIC 12F675 are un circuit Timer1 de 16 bii cu urmtoarele
caracteristici:
Are dou registre de numrare, TMR1H (adresa 0EH) i TMR1L (adresa 0FH),
de cte 8 bii care pot fi citite i/sau ncrcate cu o valoare iniial;
Tactul de pe intrare poate fi selectat: intern (funcionare n mod timer) sau extern
(funcionare n mod counter);
n mod counter poate funciona sincron sau asincron cu clock-ul intern;
Genereaz o cerere de ntrerupere la tactul urmtor depirii capacitii registrului
numrtor (la trecerea din FFFFH n 0000H);
Poate fi selectat funcia de activare extern a funcionrii timerului (Gate
Control);
Poate fi selectat funcionarea n mod timer cu oscilator LP (Low Power) extern
pe intrarea de tact.

7.3.1. STRUCTURA HARDWARE A CIRCUITULUI TIMER1


Schema bloc a circuitului este prezentat n figura 7.2.

Figura 7.2. Schema bloc a circuitului Timer1

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

Schema se compune dintr-un registru numrtor de 16 bii, TMR1H i TMR1L, care


genereaz o cerere de ntrerupere la depirea capacitii de numrare prin setarea bitului
TMR1F (PIR1.0).
La intrarea numrtorului se afl poarta SI1 cu dou intrri:
Pe una din intrri, notat cu IMP, se aplic impulsurile care provin fie de la
oscilatorul local (FOSC/4), fie din exterior impulsurile aplicate pe intrarea OSC1
(pinul GP5). Impulsurile respective sunt divizate cu un factor de divizare
programabil, de ctre circuitul de prescalare, i pot fi sincronizate sau nu cu tactul
sistemului.
Pe cealalt intrare a porii SI1 ajunge impulsul de comand aplicat din exterior, cu
anumite condiionri, pe intrarea T1G (pinul GP4), cu rolul de a controla
intervalul de timp n care se face contorizarea impulsurilor.

7.3.2. REGISTRE DE COMAND I CONTROL ALE CIRCUITULUI TIMER1


Tabelul cu registrele specifice de comand i control ale funcionrii circuitului
Timer1 sunt prezentate n tabelul 7.2.
Tabelul 7.2. Registrele asociate funcionrii circuitului Timer1
Adresa Nume Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
01H TMR0 Registru numrtor
0BH/8BH INTCON GIE PEIE T0IE INTE GPIE T0IF INTF GPIF
0CH PIR1 EEIF ADIF - - CMIF - - TMR1IF
0EH TMR1L Registru cu cel mai puin semnificativ byte din cei 16 bii ai registrului TMR1
0FH TMR1H Registru cu cel mai semnificativ byte din cei 16 bii ai registrului TMR1
10H T1CON - TMR1GE T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON
8CH PIE1 EEIE ADIE - - CMIE - - TMR1IE

Facem precizarea c vor fi descrii doar biii care intervin n programarea circuitului
Timer1 (celulele editate pe fond alb).
Avnd n vedere importana cunoaterii biilor de comand din registrul T1CON
(adresa 10H) aceti bii vor fi comentai n continuare.
T1CON Registru de control al circuitului Timer1
Bit 7 Neimplementat: se citete 0
Bit 6 TMR1GE: Bit de activare a porii circuitului Timer1
Valoarea cestui bit conteaz doar dac TMR1ON = 1, i anume:
1 = Timer1 este pornit dac pinul T1G este 0 logic
0 = Timer1 este pornit
Dac TMR1ON = 0, bitul TMR1GE este ignorat
Bit 54 T1CKPS1
T1CKPS0: Bii de selectare a factorului de prescalare a impulsului de tact
11 = 1:8
10 = 1:4
01 = 1:2
00 = 1:1

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

Bit 3 T1OSCEN: Bit de activare a oscilatorului LP; valoarea acestui bit conteaz
doar dac microcontrolerul este configurat cu INTOSC activ i fr
CLKOUT:
1 = este activat oscilatorul LP pe intrarea de tact a circuitului Timer1
0 = oscilatorul LP este dezactivat
Bit 2 T1SYNC : Bit de control al sincronizrii impulsului de tact extern
Valoarea acestui bit conteaz doar dac TMR1CS = 1, i anume:
1 = tactul extern nu se sincronizeaz cu ceasul intern
0 = tactul extern se sincronizeaz cu ceasul intern
Dac TMR1CS = 0, bitul T1SYNC este ignorat
Bit 1 TMR1CS: Bit de selectare a sursei impulsului de tact
1 = tact extern aplicat pe pinul GP5 (T1CKI/T1OSC1)
0 = tact intern (FOSC/4)
Bit 0 TMR1ON: Bit de activare a circuitului Timer1
1 = Timer1 este activat
0 = Timer1 este dezactivat

7.3.3. FUNCII DE BAZ REALIZATE CU CIRCUITUL TIMER1

Funcia Timer
n acest mod de lucru sunt numrate impulsurile ceasului intern (FOSC/4) sau ale unui
oscilator extern de putere mic (LP Oscillator) de frecven 37 KHz. Selectarea uneia sau a
celeilalte surse de impulsuri se face cu bitul TMR1CS (T1CON.1) iar factorul de prescalare
se alege cu biii T1CKPS1 i T1CKPS0 (T1CON.<5, 4>).
Impulsurile externe pot fi sincronizate sau nu cu tactul intern, n funcie de valoarea
bitului T1SYNC (T1CON.2). Cnd se lucreaz cu FOSC/4, adic TMR1CS = 0, valoarea
bitului T1SYNC este ignorat.

Funcia Counter
Circuitul permite implementarea funciilor de numrare (Counter) sincron sau
asincron de 16 bii. Impulsurile care urmeaz a fi numrate se aplic pe pinul GP5 (T1CKI)
i vor incrementa numrtorul TMR1L, respectiv TMR1H pe frontul cresctor al acestor
impulsuri.
Acest mod de lucru este selectat cu TMR1CS = 1 (T1CON.1). Impulsurile sunt
prescalate cu 1, 2, 4 respectiv 8 n funcie de valorile biilor T1CKPS<1, 0>
(T1CON.<5, 4>), iar funcia de numrare sincron sau asincron este selectat cu bitul
T1SYNC (T1CON.2).
n ambele moduri de funcionare, intervalul pe care se face numrarea impulsurilor
poate fi controlat din exterior cu un impuls aplicat pe pinul GP4 ( T1G ). n cazul n care
circuitul Timer1 este activat TMR1ON = 1 (T1CON.0) i controlul funcionrii din
exterior validat TMR1GE = 1 (T1CON.6), atunci pe durata nivelului logic cobort al

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

impulsului aplicat pe GP4 ( T1G ) se va face contorizarea impulsurilor aplicate pe cealalt


intrare a porii SI1 (notat cu IMP).

7.3.4. LUCRUL N NTRERUPERI AL CIRCUITULUI TIMER1


n cazul n care numrtorul TMR1 trece din stare 0FFFFH n starea 0000H
(depire), este setat bitul TMR1IF (PIR1.0) care semnalizeaz acest lucru. Pentru ca
aceast depire s conduc la o cerere efectiv de ntrerupere, trebuie ca urmtorii bii s
fie setai, adic s aib valori logice 1, conform schemei din figura 5.2, lecia 5:
bitul TMR1IE (PIE1.0), de validare a ntreruperilor generate de Timer1,
bitul PEIE (INTCON.6), de validare a ntreruperilor generate de periferice,
bitul GIE (INTCON.7), de validare general a ntreruperilor.
Observaia 1: La citirea registrelor TMR1H i TMR1L n timpul funcionrii
circuitului cu un tact extern, trebuie avut n vedere faptul c pe timpul citirii a dou
cuvinte a cte 8 bii poate aprea o depire a coninutului ceea ce va conduce la
citirea unui rezultat eronat.
Observaia 2: Dac dorim s modificm coninutul registrelor TMR1H i TMR1L n
timpul funcionrii, se recomand oprirea timer-ului pe durata nscrierii.

7.4. APLICAII

APLICAIA 1 GENERAREA UNOR IMPULSURI


DE FRECVEN JOAS CU TIMER0
Ne propunem s comandm LED-ul D0 cu frecvena cea mai mic posibil folosind
circuitul Timer0.
Frecvena minim (perioada maxim) a impulsurilor generate de Timer0 se poate
obine, innd cont de schema bloc din figura 7.1, pentru o valoare iniial 0 a registrului
TMR0 i un factor maxim de divizare (introdus de prescaler) de 1/256. Valoarea rezultat a
acestei frecvene este de: F = fOSC/4/256/256 = 15,25 Hz.
Comanda aprins/stins a unui LED la aceast frecven este posibil i uor de
urmrit.
Pentru elaborarea programului care s realizeze aceasta, trebuie avute n vedere
cteva considerente de programare, i anume:
Selectarea opiunilor de lucru ale circuitului Timer0 se face prin setarea/resetarea
valorii unor bii din registrul OPTION_REG, astfel:
o T0CS = 0 pe intrarea de tact a registrului TMR0 se aplic oscilatorul intern
a crui frecven este divizat cu 4 (fOSC/4);
o PSA = 0 circuitul de prescalare este alocat circuitului Timer0;
o PS2 = PS1 = PS0 = 1 la ieirea circuitului de prescalare se va obine un
factor de divizare egal cu 1/256;
o GPPU = 1 dezactivarea funciei pull-up pentru toi pinii de port.
Validarea ntreruperilor generate de Timer0 se face prin setarea valorii unor bii
din registrul INTCON:

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

o PEIE = 1 validare ntreruperi generate de oricare dintre perifericele


microcontrolerului;
o T0IE = 1 validare ntreruperi generate de Timer0;
o GIE = 1 validare ntreruperi generale.
Setarea flagului de ntreruperi a circuitului Timer0 se face hardware, dar resetarea
lui se face numai prin program. Este deci necesar ca n subrutina de tratare a
ntreruperii generate de timer s fie introdus o secven de program pentru
resetarea acestui flag (bitul T0IF din registrul INTCON).
Vectorul de ntreruperi are adresa 04H n memoria RAM a microcontrolerului.
Deoarece aplicaia const doar din programarea timer-ului, secvena principal a
programului va fi o bucl de ateptare a generrii ntreruperii iar secvena de
comand a LED-ului D0 se va gsi n subrutina de servire a ntreruperii.
Pentru recunoaterea n program a strii LED-ului D0, vom defini un registru de 8
bii de condiie, denumit Flags, n care pe poziia bitului 0 va fi nscris valoarea
bitului de condiie a LED-ului: 0 pentru LED stins (Ledoff) i 1 pentru LED
aprins (Ledon).
Cu aceste precizri suplimentare, programul aplicaiei este urmtorul:
;Program cu Timer0 pentru comanda LED-ului D0 cu o frecven de fosc/(4*256*256)
list p=12F675
#include <p12f675.inc>
errorlevel -302
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF &
_PWRTE_ON & _INTRC_OSC_NOCLKOUT
cblock 0x20
FLAGS
Endc
#define BANK1 banksel 0x80 ;Selectare banc 1
#define BANK0 banksel 0x00 ;Selectare banc 0
#define TRIS_D0_D1 B'00001111'
;Setare TRISIO pentru aprindere D0 i D1
#define D0_ON B'00010000' ;LED D0 aprins
#define TRIS_OFFD0_D1 B'00111111'
;Setare TRISIO pentru stingere D0 i D1
ORG 0x000
nop
goto Init
ORG 0x004 ;Adresa vectorului de ntrerupere
Timer0Interrupt
btfss FLAGS,0 ;Se testeaz bitul de stare a LED-ului
goto LEDON ;Dac D0 este stins, salt la secvena de aprindere
bcf FLAGS,0 ;Dac este aprins, se va executa stingerea lui
bsf STATUS,RP0
movlw TRIS_OFFD0_D1
movwf TRISIO
bcf STATUS,RP0
movwf GPIO
goto RET_I
LEDON
bsf FLAGS,0
bsf STATUS,RP0
movlw TRIS_D0_D1

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

movwf TRISIO
bcf STATUS,RP0
movlw D0_ON
movwf GPIO
RET_I
BANK1
bcf INTCON,T0IF ;Se reseteaz flagul de ntrerupereTMR0
retfie ;Revenire n programul principal
Init
; call 0x3FF
BANK1
movwf OSCCAL
BANK0
clrf GPIO ;Resetare port I/O
BANK1
clrf ANSEL ;PIC12F675 Only
movlw 0xFF
movwf TRISIO ;Toate intrrile sunt puse n high Z - stingere LED-uri
clrf VRCON ;Vref Off
BANK0
movlw 0x07
movwf CMCON ;Comparator Off
BANK1
movlw b'10000111'
movwf OPTION_REG ;Setare funcie Timer (T0CS=0), cu prescaler
;(PSA=0), factor de divizare=1/256 (PS2 = PS1 = 1 = PS0 = 1)
bsf INTCON,PEIE ;Activare ntreruperi generate de periferice
bsf INTCON,T0IE ;Activare ntreruperi generate de depire Timer0
bcf INTCON,T0IF ;Resetare flag de ntreruperi Timer0
bsf INTCON,GIE ;Activare ntreruperi generale
BANK0
clrf TMR0 ;Resetarea coninutului registrului numrtor
Main
goto Main
end

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 i se urmrete clipirea LED-ului D0.

APLICAIA 2 GENERAREA UNOR IMPULSURI DE 10 HZ CU TIMER1


Ne propunem s comandm LED-ul D1 cu o frecven de 10 Hz utiliznd funcia
timer a circuitului Timer1.
Calculul valorii iniiale cu care va trebui ncrcat registrul TMR1 de 16 bii, respectiv
TMR1H i TMR1L de cte 8 bii, se face plecnd de la frecvena impulsurilor dat n enun,
astfel:
Pentru o frecven de 10 Hz perioada impulsurilor este de 100 ms;
Pentru factor de umplere egal cu rezult o durat puls (egal cu durat pauz) de
50 ms (50.000 s) sau, dac se exprim n hexazecimal, 0C350H.
ntruct cererea de ntrerupere este emis la primul impuls dup ncrcarea
registrului TMR1 cu valoarea FFFFH, pentru ca timerul s numere 50.000

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

impulsuri de ceas (cu tact de 1 s), este necesar ca valoarea iniial a registrului
TMR1 s fie:
FFFFH + 1 0C350H = 3CB0H.
TMR1H se va ncrca cu 3CH iar TMR1L cu constanta 0B0H. n aceast situaie,
factorul de divizare introdus de circuitul de prescalare trebuie s fie 1/1.
Pentru elaborarea programului care s realizeze aceasta, trebuie avute n vedere
cteva considerente de programare, i anume:
Selectarea opiunilor de lucru ale circuitului Timer1 se face prin setarea/resetarea
valorii unor bii din registrul T1CON, astfel:
o TMR1ON = 1 activare Timer1;
o TMR1CS = 0 pe intrarea de tact a registrului TMR1 se aplic oscilatorul
intern a crui frecven este divizat cu 4 (fOSC/4);
o T1OSCEN = 0 Oscilatorul de putere mic (LP oscillator) este dezactivat;
o T1CKPS1 = T1CKPS0 = 0 la ieirea circuitului de prescalare se va obine
un factor de divizare egal cu 1/1;
o TMR1GE = 0 Pornire Timer1. Reamintim c intrarea TMR1GE este activ
pe 0 logic i c valoarea acestui bit conteaz doar dac TMR1ON = 1.
Validarea ntreruperilor generate de Timer1 se face prin setarea valorii unor bii
din registrul INTCON, ca la Timer0, i din registrul PIE1:
o PEIE = 1 validare ntreruperi generate de oricare dintre perifericele
microcontrolerului;
o GIE = 1 validare ntreruperi generale;
o TMR1IE = 1 validare ntreruperi generate de Timer1.
Setarea flagului de ntreruperi a circuitului Timer1 se face hardware, dar resetarea
lui se face numai prin program. Este deci necesar ca n subrutina de tratare a
ntreruperii generate de timer s fie introdus o secven de program pentru
resetarea acestui flag (bitul TMR1IF din registrul PIR1).
Vectorul de ntreruperi are adresa 04H n memoria RAM a microcontrolerului.
Deoarece aplicaia const doar din programarea timer-ului, secvena principal a
programului va fi o bucl de ateptare a generrii ntreruperii iar secvena de
comand a LED-ului D1 se va gsi n subrutina de servire a ntreruperii.
Pentru recunoaterea n program a strii LED-ului D1, vom defini un registru de 8
bii de condiie, denumit Flags, n care pe poziia bitului 1 va fi nscris valoarea
bitului de condiie a LED-ului: 0 pentru LED stins (Ledoff) i 1 pentru LED
aprins (Ledon).
Cu aceste precizri suplimentare, programul aplicaiei este urmtorul:
;Program cu TIMER1 pentru comanda LED-ului D1 cu o frecven de 10 Hz
list p=12F675
#include <p12f675.inc>
errorlevel -302
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF &
_PWRTE_ON & _INTRC_OSC_NOCLKOUT
cblock 0x20
FLAGS
endc

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

#define BANK1 banksel 0x80 ;Select BANK1


#define BANK0 banksel 0x00 ;Select BANK0
#define TRIS_D0_D1 B'00001111'
;Setare registru TRISIO pentru aprindere D0 si D1
#define D1_ON B'00100000' ;LED D1 aprins
#define TRIS_OFFD0_D1 B'00111111'
;Setare registru TRISIO pentru aprindere D0 si D1
ORG 0x000
nop
goto Init
ORG 0x004
Timer1Interrupt
movlw 0x3C
movwf TMR1H ;Se reiniializeaz TMR1H
movlw 0x0B0 ;Se reiniializeaz TMR1L
movwf TMR1L
btfss FLAGS,1 ;Se testeaz bitul de stare a LED-ului
goto LEDON ;Dac D1 este stins, salt la secvena de aprindere
bcf FLAGS,1 ;Dac este aprins, se va executa stingerea lui i se
; va reseta bitul de condiie.
bsf STATUS,RP0
movlw TRIS_OFFD0_D1
movwf TRISIO
bcf STATUS,RP0
movwf GPIO
goto RET_I
LEDON
bsf FLAGS,1
bsf STATUS,RP0
movlw TRIS_D0_D1
movwf TRISIO
bcf STATUS,RP0
movlw D1_ON
movwf GPIO
RET_I
bcf STATUS,RP0
bcf PIR1,TMR1IF ;Resetarea flagului de TMR1 a circuitului Timer1
retfie
Init
; call 0x3FF
BANK1
movwf OSCCAL
BANK0
clrf GPIO
BANK1
clrf ANSEL
movlw 0xFF
movwf TRISIO ;Stingere LED-uri
clrf VRCON ;Vref Off
bsf PIE1,TMR1IE ;Activare ntreruperi generate la depire Timer1
BANK0
movlw 0x07
movwf CMCON ;Comparator Off
bsf INTCON,PEIE ;Activare ntreruperi generate de periferice
bcf PIR1,TMR1IF ;Resetare flag de ntreruperi TIMER0
bsf INTCON,GIE ;Activare ntreruperi generale
movlw 0x3C
movwf TMR1H

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

movlw 0x0B0
movwf TMR1L
movlw b'10000001'
movwf T1CON ;Activare Timer1 (TMR1ON = 1), setare funcie Timer
; (TMR1CS = 0), cu factor de divizare a impulsului intern de 1/1
; (T1CKPS1 = T1CK PS0 = 0)
; i dezactivarea oscilatorului LP (T1OSCEN = 0)
Main
goto Main
end

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 i se urmrete clipirea LED-ului D1.

APLICAIA 3 GENERAREA UNOR IMPULSURI DE 2 HZ


CU FACTOR DE UMPLERE 1/10 FOLOSIND TIMER1
Aplicaia aceasta este de fapt o modificare a celei precedente. Se urmrete comanda
LED-ului D1 cu impulsuri de 2 Hz i factor de umplere diferit de .
Pentru a obine impulsuri de frecven 2 Hz (perioada de 500 ms), va trebui ca
factorul de divizare ales pentru prescaler s fie cel maxim (1/8). Aceasta se deduce din
capacitatea maxim a registrului TMR1 de 16 bii, care este FFFFH = 65535D.
Calculul constantelor de ncrcare, se va face n modul urmtor:
1/10 din T va fi 50 ms = 50.000 s. Pentru tact de 8 s, rezult 50.000/8 = 6.250
impulsuri adic 186AH. Constanta de ncrcare va fi deci FFFF + 1 186A =
F796. Aceast constant se va ncrca n cele dou registre de 8 bii astfel: F7H n
TMR1H i 96H n TMR1L.
9/10 din T va fi 450 ms = 450.000 s. Pentru tact de 8 s, rezult 450.000/8 =
56.250 impulsuri = 0DBBAH.
FFFF + 1 DBBA = 2446 (24H n TMR1H i 46H n TMR1L).
Deci impulsul cu care se comand LED-ul D1 va avea durata pulsului egal cu
50 ms, iar durata pauzei va fi 450 ms.
Pentru scrierea programului va trebui s se in seama c registrul TMR1 trebuie s
fie ncrcat alternativ cu cele dou valori calculate anterior, una pentru durat puls, cealalt
pentru durat pauz.
Cu aceste considerente avute n vedere programul surs al aplicaiei va fi urmtorul:
;Program cu TIMER1 pentru comanda LED-ului D1 cu o frecventa 2 Hz si un factor de
; umplere de 1/10
list p=12F675
#include <p12f675.inc>
errorlevel -302
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF &
_PWRTE_ON & _INTRC_OSC_NOCLKOUT
cblock 0x20
FLAGS
endc

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

#define BANK1 banksel 0x80 ;Selectare BANK1


#define BANK0 banksel 0x00 ;Selectare BANK0
#define TRIS_D0_D1 B'00001111'
;Setare registru TRISIO pentru aprindere D0 si D1
#define D1_ON B'00100000' ;D0 LED
#define TRIS_OFFD0_D1 B'00111111'
;Setare registru TRISIO pentru aprindere D0 si D1
ORG 0x000
nop
goto Init
ORG 0x004
Timer1Interrupt
btfss FLAGS,1
goto LEDON
bcf FLAGS,1
movlw 0x24
movwf TMR1H
movlw 0x46
movwf TMR1L
bsf STATUS,RP0
movlw TRIS_OFFD0_D1
movwf TRISIO
bcf STATUS,RP0
movwf GPIO
goto RET_I
LEDON
movlw 0x0F7
movwf TMR1H
movlw 0x96
movwf TMR1L
bsf FLAGS,1
bsf STATUS,RP0
movlw TRIS_D0_D1
movwf TRISIO
bcf STATUS,RP0
movlw D1_ON
movwf GPIO
RET_I
bcf STATUS,RP0
bcf PIR1,TMR1IF ;Resetare Flag de ntrerupere TMR1
retfie
Init
; call 0x3FF
BANK1
movwf OSCCAL
BANK0
clrf GPIO ;Resetare Port
BANK1
clrf ANSEL ;Numai PIC 12F675
movlw 0xFF
movwf TRISIO ;Stingere LED-uri
clrf VRCON ;Vref Off
bsf PIE1,TMR1IE ;Activare ntreruperi generate de depire Timer1
BANK0
movlw 0x07
movwf CMCON ;Comparator Off
bsf INTCON,PEIE ;Activare ntreruperi generate de periferice

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

bcf PIR1,TMR1IF ;Resetare flag de ntreruperi TIMER0


bsf INTCON,GIE ;Activare ntreruperi generale
movlw 0x24
movwf TMR1H
movlw 0x46
movwf TMR1L
movlw b'10110001'
movwf T1CON ;Setare funcie Timer , factor de divizare=1/8
Main
goto Main
end

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

84

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