Professional Documents
Culture Documents
umento
Programando o Timer0
O TIMER0:
Realizamos nas unidades passada um estudo no muito aprofundado sobre as funes e
caracteristicas dos TIMERS do PIC. Agora chegou o momento de estudarmos mais
profundamente os recursos e a programao dos registradores e modos de trabalho
desses temporizadores e contadores.
O TIMER0 pode operar como temporizador ou como contador. Esse perifrico do PIC
pode operar em dois modos:
Modo 8 bits, com contagem mxima de 0 a 255
Modo 16 bits, com contagem mxima de 0 a 65535
Dizemos que o timer esta operando como temporizador quando a referencia do clock de
incremento da contagem realizada pelo clock interno do PIC, e dizemos que o timer
esta operando como contador quando a referencia do clock de incrremento da contagem
proveniente de um clock externo ao PIC. (pulso aplicado no pino T0CK1
Os Registradores relacionados ao TIMER0 so:
Repare que os esquemas parecem com uma instalao eltrica, no qual vai habilitando
ou desabilitando mdulos, de acordo com o chaveamanto definido pelo operador.
Configuraes:
Cristal: 8 Mhz
Microcontrolador: PIC18F452
Numerao Funo
1
Cristal externo
Chave seletora de funo: define se o
2
timer0 ir operar como temporizador
ou contador
PSA : Chave seletora que habilita ou
desabilita a utilizao do prescaler
3
(podemos considerar prescaler como
um "redutor" de tempo)
4
Escala de ajuste do prescaler
Chave seletora do modo de contagem
5
do TIMER0: formato 8 bits ou
formato 16 bits
Registradores de contagem TMR0L e
6
TMR0H (dois registradores de 8 bits,
formando 16 bits)
Bit de sinalizao de estouro do
7
TIMER0 (muita ateno no uso desse
bit)
8
Chave liga desliga do Timer0
Vamos inciar nosso programa
void main(){
//************ configurao do Leds ************************
TMR0H = 0X48;
Com certeza voc dever estar pensando da onde surgio o valor 1:128 do prescaler no
exerccio?? Na formula de temporizao do Timer0, mais fcil encontrarmos o valor
de carregagem nos registradores de contagem TMR0H e TMR0L do que o valor do
prescaler, pois lembre-se que temos algumas poucas opes de valores de prescaler, que
j so pr-definidas no hardware do PIC. No exerccio adotamos um valor alto do
prescaler, pois nossa temporizao de 3 segundos considerado um tempo alto para
quem trabalha em escalas de us segundos.
pronto, nosso programa final esta pronto, basta compilarmos e visualizarmos seu
funcionamento no kit de desenvolvimento.
Programa Final:
void main(){
//************ configurao do Leds ************************
trisd = 0; //define portd como saida
portd = 0; //estado incial dos leds apagado
//*********** configurao do Timer0 ************************
//vamos seguir a numerao
//numero1: cristal de 8Mhz, ciclo de mquina: 8MHz
/ 4 = 2Mhz --> 1/2Mhz = 0,5us
t0con.t0cs = 0; //numero2: timer0 operando como temporizador
t0con.psa = 0; //numero3: prescaler ativado
t0con.t0ps2 = 1; //numero4: define prescaler 1:128
t0con.t0ps1 = 1; //numero4: define prescaler 1:128
t0con.t0ps0 = 0; //numero4: define prescaler 1:128
t0con.t08bit = 0; //numero5: define contagem no modo 16 bits
tmr0l = 0xe5;
tmr0h = 0x48 ;
Exemplo 02:
Configuraes:
Cristal: 8 Mhz
Microcontrolador: PIC18F452
Esboo do programa:
Calculo do tempo de estouro TIMER0:
tempo de estouro = ciclo de mquina * prescaler * (modo 8/16 bits - valor de contagem
inicial em TMR0L e TMR0H)
Logo: (lembre-se que nosso tempo desejado agora de 20ms, ou seja, 20 000us
O valor 63036 justamente o valor que devemos carregar em TMR0L e TMR0H. Para
realizarmos com facilidade esta operao matemtica, basta simplesmente converter
este valor decimal para hexadecima:
63036 (decimal) = F63C , teremos ento:
TMR0L = 0X3C;
TMR0H = 0XF6;
Programa:
//********************** rotina de varredura do teclado
**************************************
void varredura_teclas(){
if (portb.f0 == 0 ){
portb.f7 = 1;
}
if (portb.f1 == 0 ){
portb.f7 = 0;
}
portb.f6 = ~portb.f6;
led rb6
tmr0l = 0x3c;
//carrega o valor baixo do numero 18661
tmr0h = 0xf6; //carrega o valor alto do nmero 18661
intcon.tmr0if = 0; //apaga flag de estouro do timer0 para uma nova
contagem de tempo
}
//********************** programa
principal*****************************************************
void main(){
//************
trisb.f0 =
trisb.f1 =
trisb.f6 =
trisb.f7 =
Obs: Podemos substituir o seguinte trecho do nosso programa por uma simples linha de
cdigo:
t0con.t0cs = 0; //numero2: timer0 operando como temporizador
t0con.psa = 0; //numero3: prescaler ativado
t0con.t0ps2 = 0; //numero4: define prescaler 1:16
t0con.t0ps1 = 1; //numero4: define prescaler 1:16
t0con.t0ps0 = 1; //numero4: define prescaler 1:16
t0con.t08bit = 0; //numero5: define contagem no modo 16 bits
e
t0con.tmr0on = 1; //numero8: liga timer0
por:
t0con = 0b10000011;