Você está na página 1de 7

www.mecatronicadegaragem.blogspot.

com

[www.denteazul.com.br]

4 TUTORIAL PRTICO: TIMER 0


Usar a instruo delay como forma de fazer o microcontrolador contar o tempo para realizar uma tarefa no vantajosa porque esta instruo no permite que o processador execute mais de uma rotina ao mesmo tempo, ou seja, quando se usa a instruo delay o PIC realmente aguarda o tempo determinado e somente depois deste tempo ele ir executar a prxima instruo. Por isso, uma forma de melhorar esta contagem de tempo e impedir que o processador perca tempo desnecessrio nesta tarefa a interrupo por temporizadores.

INTRODUO Cada microcontrolador possui em sua folha de dados uma informao a respeito das interrupes por temporizadores suportadas. O microcontrolador PIC16F877A possui trs tipos de temporizadores, a saber: Timer 0, Timer 1 e Timer 2. O que difere um timer de outro o limite de contagem de tempo, o tipo de incrementao, se utiliza prescaler ou postcaler, a gerao de interrupes e os perifricos e eles associados. importante destacar que a frequncia de operao interna do PIC a frequncia do cristal oscilador divida por 4 e os clculos realizados referente aos temporizadores so baseados nesta frequncia. O Timer 0 um temporizador de 8 bits (para o PIC16F877A), ou seja, a cada ciclo de mquina (um ciclo de mquina dura 1/(5000000Hz) = 200ns) ele incrementa de 1 chegando a um valor mximo de 256 (28), o que equivale dizer que no timer 0, a cada 200ns a contagem incrementada de 1 chegando a um tempo mximo de 51,2s (256x200ns). Assim que o contador chegar a este tempo mximo, ou estourar, microcontrolador ir executar a funo de interrupo #int_timerx, (x = 0,1,2,3...) e atender s instrues nela contida. O tempo de estouro (overflow) do timer0 consideravelmente pequeno (51,2s), mas possvel aumentar este limite e controlar a taxa de estouro mxima utilizando o

www.mecatronicadegaragem.blogspot.com

[www.denteazul.com.br]
chamado prescaler. Esta funo responsvel por dividir a frequncia de operao do microcontrolador por um fator determinado (1, 2, 4, 8, 16, 32, 64, 128 ou 512) e com isso aumentar o tempo de estouro do timer. Configurar o uso do prescaler no programa bem simples, mas primeiramente veja como so realizados os clculos na tabela a seguir:
Tabela 1 - Clculo do prescaler

Fator de diviso do Prescaler Frequncia interna f (MHz) Perodo T (s) Tempo de estouro t (s)

1 5 0.2 51.2

4 5/4 = 1,25 0.8 204.8

8 5/8 = 0,625 1.6 409.6

64 5/64 = 0,0781 12.8 3276.8

Sabendo que:

Onde: T o periodo de operao; t o tempo de estouro do timer 0. Ainda assim possvel perceber que o tempo de estouro do timer0 no to grande, mas este temporizador pode ser utilizado para contar um tempo bem maior, basta criar uma lgica que, alm da utilizao do prescaler, aumente o tempo entre as execues da interrupo por timer 0. Para isso, ser criada uma varivel do tipo int16 chamada contador, a localizao desta varivel ser no comeo da funo da interrupo por timer0. Ela ser incrementada de 1 toda vez que houver overflow do timer0 sendo possvel manipular esta varivel de forma que ao atingir um determinado valor, atravs de um if /else por exemplo, possamos realizar algum tipo de instruo. Para ficar mais claro vamos criar um projeto simples para piscar um LED a cada um segundo. Acompanhe a seguir.

www.mecatronicadegaragem.blogspot.com

[www.denteazul.com.br]
Cdigo do Programa A lgica envolvida no programa simples, o LED ir piscar a cada um segundo. Para isso foi criada uma varivel chamada contador e ela ser incrementado toda vez que o tempo da interrupo timer 0 estourar (overflow do timer 0). Sendo assim para conseguir um tempo de um segundo, quando o fator de diviso do prescaler for um, o valor que o contador dever assumir o seguinte:

Fazendo uma rotina que incrementa esta varivel a cada overflow do timer 0, quando esta atingir o valor de 19531 ento ter passado um segundo. importante lembrar de zerar o contador quando tiver passado o tempo requerido. Para outros temos a lgica anloga. Segue abaixo o trecho do programa em que a interrupo timer 0 implementada: int16 contador=0; //varivel contador do tipo int16 #int_RTCC //funo RTCC ou interrupo timer 0 void RTCC_isr(void) { contador++; //esta varivel incrementada a cada overflow do timer 0 //quando o contador atingir o valor de 19531 o estado do pino D0 ser invertido e o contador zerado. if(contador==19531){ output_toggle(PIN_D0); //instruo que inverte o estado do pino contador=0; } } Ou seja, de um em um segundo o estado do pino D0 ser alterado, logo o LED conectado ao pino D0 piscar de um em um segundo.

www.mecatronicadegaragem.blogspot.com

[www.denteazul.com.br]
Para facilitar a configurao do timer 0, ao criar um novo arquivo no PIC C deve-se seguir os seguintes passos: 1 Passo: Aps configurar qual PIC usar e determinar os tipos de Fuses, clicar sobre Timers, conforme mostra a figura abaixo:

2 Passo: J na janela de configurao do Timer, preste ateno no Timer 0 (RTCC) e escolha a resoluo (resolution) ou perodo de acordo com a tabela 1. Observe que o overflow, ou tempo de estouro da interrupo mostrada, de acordo com a figura abaixo. Aps concluda esta etapa clique sobre Interrupts.

www.mecatronicadegaragem.blogspot.com

[www.denteazul.com.br]
3 Passo: Na janela Interrupts habilite a opo: Timer 0 overflow (using RTCC name) e clique em OK.

Confira o cdigo: #include <16F877A.h> #device adc=8 #FUSES NOWDT //No Watch Dog Timer #FUSES HS //High speed Osc (> 4mhz) #FUSES PUT //Power Up Timer #FUSES NOPROTECT //Code not protected from reading #FUSES NODEBUG //No Debug mode for ICD #FUSES NOBROWNOUT //No brownout reset #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOCPD //No EE protection #FUSES WRT_50% //Lower half of Program Memory is Write Protected #use delay(clock=20000000) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) int16 contador=0; //varivel criada para ser incrementada de 1 toda vez que houver o overflow do timer0

www.mecatronicadegaragem.blogspot.com

[www.denteazul.com.br]
//funo da interrupo timer0 #int_RTCC void RTCC_isr(void) { contador++; //incrementao da varivel contador //caso a varivel atinja o valor de 19531, o equivalente a 1 segundo executa a instruo abaixo if(contador==19531){ contador=0; //atribui o valor zero varivel contador. output_toggle(PIN_D0); //muda o estado do pino D0. } } void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(SPI_SS_DISABLED); //configurao do temporizador timer0, verifique que foi usado um prescaler de 1 (DIV_1) setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); //habilitao das interrupes usadas enable_interrupts(INT_RTCC); enable_interrupts(GLOBAL); //lao infinito while(1); }

www.mecatronicadegaragem.blogspot.com

[www.denteazul.com.br]
SIMULAO NO PROTEUS

C1
33pF

C2
33pF GND

X1

CRYSTAL

13 14 2 3 4 5 6 7 8 9 10 1

U1
OSC1/CLKIN OSC2/CLKOUT RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD

VCC

R9
1k

RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+ RA4/T0CKI/C1OUT RA5/AN4/SS/C2OUT RC0/T1OSO/T1CKI RE0/AN5/RD RC1/T1OSI/CCP2 RE1/AN6/WR RC2/CCP1 RE2/AN7/CS RC3/SCK/SCL RC4/SDI/SDA MCLR/Vpp/THV RC5/SDO RC6/TX/CK RC7/RX/DT RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7 PIC16F877A

33 34 35 36 37 38 39 40 15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30

R1
330

D1
LED-RED

GND

Você também pode gostar