Buscar

Tutorial Timer0

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 7 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 7 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

[www.denteazul.com.br] 
 
1 
4º TUTORIAL PRÁTICO: 
TIMER 0 
 
Usar a instrução “delay” como forma de fazer o microcontrolador contar o tempo para 
realizar uma tarefa não é vantajosa porque esta instrução não permite que o 
processador execute mais de uma rotina ao mesmo tempo, ou seja, quando se usa a 
instrução “delay” o PIC realmente aguarda o tempo determinado e somente depois 
deste tempo ele irá executar a próxima instrução. 
Por isso, uma forma de melhorar esta contagem de tempo e impedir que o processador 
perca tempo desnecessário nesta tarefa é a interrupção por temporizadores. 
INTRODUÇÃO 
Cada microcontrolador possui em sua folha de dados uma informação a respeito das 
interrupções por temporizadores suportadas. O microcontrolador PIC16F877A possui 
três 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 
incrementação, se utiliza prescaler ou postcaler, a geração de interrupções e os 
periféricos e eles associados. 
É importante destacar que a frequência de operação interna do PIC é a frequência do 
cristal oscilador divida por 4 e os cálculos realizados referente aos temporizadores são 
baseados nesta frequência. 
O Timer 0 é um temporizador de 8 bits (para o PIC16F877A), ou seja, a cada ciclo de 
máquina (um ciclo de máquina dura 1/(5000000Hz) = 200ns) ele incrementa de 1 
chegando a um valor máximo de 256 (28), o que equivale dizer que no timer 0, a cada 
200ns a contagem é incrementada de 1 chegando a um tempo máximo de 51,2µs 
(256x200ns). Assim que o contador chegar a este tempo máximo, ou “estourar”, 
microcontrolador irá executar a função de interrupção #int_timerx, (x = 0,1,2,3...) e 
atender às instruções nela contida. 
O tempo de estouro (overflow) do timer0 é consideravelmente pequeno (51,2µs), mas é 
possível aumentar este limite e controlar a taxa de estouro máxima utilizando o 
[www.denteazul.com.br] 
 
2 
chamado prescaler. Esta função é responsável por dividir a frequência de operação 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 são realizados os cálculos na tabela a 
seguir: 
Tabela 1 - Cálculo do prescaler 
Fator de divisão do Prescaler 1 4 8 64 
Frequência interna f (MHz) 5 5/4 = 1,25 5/8 = 0,625 5/64 = 0,0781 
Período T (µs) 0.2 0.8 1.6 12.8 
Tempo de estouro t (µs) 51.2 204.8 409.6 3276.8 
 
Sabendo que: 
 
 
 
 
 
Onde: T é o periodo de operação; 
 t é o tempo de estouro do timer 0. 
Ainda assim é possível perceber que o tempo de estouro do timer0 não é tão grande, 
mas este temporizador pode ser utilizado para contar um tempo bem maior, basta 
criar uma lógica que, além da utilização do prescaler, aumente o tempo entre as 
execuções da interrupção por timer 0. 
Para isso, será criada uma variável do tipo int16 chamada contador, a localização 
desta variável será no começo da função da interrupção por timer0. Ela será 
incrementada de 1 toda vez que houver overflow do timer0 sendo possível manipular 
esta variável de forma que ao atingir um determinado valor, através de um if /else por 
exemplo, possamos realizar algum tipo de instrução. 
Para ficar mais claro vamos criar um projeto simples para piscar um LED a cada um 
segundo. Acompanhe a seguir. 
 
[www.denteazul.com.br] 
 
3 
Código do Programa 
A lógica envolvida no programa é simples, o LED irá piscar a cada um segundo. Para 
isso foi criada uma variável chamada contador e ela será incrementado toda vez que o 
tempo da interrupção timer 0 estourar (overflow do timer 0). Sendo assim para 
conseguir um tempo de um segundo, quando o fator de divisão do prescaler for um, o 
valor que o contador deverá assumir é o seguinte: 
 
 
 
Fazendo uma rotina que incrementa esta variável a cada overflow do timer 0, quando 
esta atingir o valor de 19531 então terá passado um segundo. É importante lembrar de 
zerar o contador quando tiver passado o tempo requerido. Para outros temos a lógica é 
análoga. 
 
Segue abaixo o trecho do programa em que a interrupção timer 0 é implementada: 
 
int16 contador=0; //variável contador do tipo int16 
 
#int_RTCC 
 
//função RTCC ou interrupção timer 0 
void RTCC_isr(void) 
{ 
 contador++; //esta variável é 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); //instrução 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.denteazul.com.br] 
 
4 
Para facilitar a configuração do timer 0, ao criar um novo arquivo no PIC C deve-se 
seguir os seguintes passos: 
1º Passo: Após configurar qual PIC usar e determinar os tipos de Fuses, clicar sobre 
Timers, conforme mostra a figura abaixo: 
 
2º Passo: Já na janela de configuração do Timer, preste atenção no Timer 0 (RTCC) e 
escolha a resolução (resolution) ou período de acordo com a tabela 1. Observe que o 
overflow, ou tempo de estouro da interrupção é mostrada, de acordo com a figura 
abaixo. Após concluída esta etapa clique sobre Interrupts. 
 
 
[www.denteazul.com.br] 
 
5 
3º Passo: Na janela Interrupts habilite a opção: Timer 0 overflow (using RTCC name) e 
clique em OK. 
 
 
Confira o código: 
 
#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; //variável criada para ser incrementada de 1 toda vez que 
houver o overflow do timer0 
 
[www.denteazul.com.br] 
 
6 
//função da interrupção timer0 
#int_RTCC 
void RTCC_isr(void) 
{ 
 
 contador++; //incrementação da variável contador 
 
//caso a variável atinja o valor de 19531, o equivalente a 1 segundo executa a 
instrução abaixo 
 if(contador==19531){ 
contador=0; //atribui o valor zero à variável 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); 
 
//configuração 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); 
 
//habilitação das interrupções usadas 
 enable_interrupts(INT_RTCC); 
 enable_interrupts(GLOBAL); 
 
//laço infinito 
 while(1); 
 
} 
 
 
[www.denteazul.com.br] 
 
7 
SIMULAÇÃO NO PROTEUS 
 
 
 
 
 
RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-/CVREF
4
RA4/T0CKI/C1OUT
6
RA5/AN4/SS/C2OUT
7
RE0/AN5/RD
8
RE1/AN6/WR
9
RE2/AN7/CS
10
OSC1/CLKIN
13
OSC2/CLKOUT
14
RC1/T1OSI/CCP2
16
RC2/CCP1
17
RC3/SCK/SCL
18
RD0/PSP0
19
RD1/PSP1
20
RB7/PGD
40
RB6/PGC
39
RB5
38
RB4
37
RB3/PGM
36
RB2
35
RB1
34
RB0/INT
33
RD7/PSP7
30
RD6/PSP6
29
RD5/PSP5
28
RD4/PSP4
27
RD3/PSP3
22
RD2/PSP2
21
RC7/RX/DT
26
RC6/TX/CK
25
RC5/SDO
24
RC4/SDI/SDA
23
RA3/AN3/VREF+5
RC0/T1OSO/T1CKI
15
MCLR/Vpp/THV
1
U1
PIC16F877A
C1
33pF
C2
33pF
X1
CRYSTAL
R1
330
D1
LED-RED
GND
R9
1k
GND
VCC

Continue navegando