O timer 1 tem mais recursos que o timer 0 , pois opera com dois registradores
TMR1H - registrados do byte alto
TMR1L - registrador do Byte baixo
Totalizando 16 bits no contador ( contra 8 bits do timer0 ).
Para setar estes dois registradores de maneira correta devemos levar alguns pontos em consideração .
O cristal utilizado ou a frequencia do oscilador interno.
O preescaler selecionado em T1CON
Outros divisores que tenham sido implementados dentro ou fora da prórpia interrupção.
Utilizando o exemplo que escrevi:
Xtal utilizado no PIC = 4 Mhz
Lembrando que o ciclo de máquina devido a arquitetura interna do Pic é igual Fosc/4 .
Ciclo de máquina = 1us ( 0,000001s)
Preescaler selecionado em T1CON = 1:8 ou seja (T1CON = 0b00110001; // Set internal clock, start timer, prescaler 1:
O nosso timer1 sera incrementado a cada 8 ciclos de máquina = 0,000008 = 8us.
Como a interrupção se dá no estouro dos registradores de TMR1 , na passagem de 65535 para 0 , ou de FFFF em hexadecimal
para 0000 , temos mais uma conta para fazer.
O valor que temos que escrever nos registradores será a diferença entre o valor total possível e o tempo que queremos medir.
Como ainda criei um outro divisor dentro da interrupçao ( T1_count==2) , a interrupçao ocorrerá duas vezes para que o flag f_int seja setado.
Isto é útil quando queremos colocar um led piscando a cada 0,5 segundos , por exemplo, mas queremos ter um temporizador com a unidade em segundos.
O valor a ser escrito nos registradores será :
ciclo desejado = 1 segundo
ciclo desejado / t1_count= 0,5 segundos
como nosso preescaler é de 1:8 o nosso Timer 1 será incrementado a cada 8us.
0,5 s / 8us = 62500
Aqui temos que prestar atenção , pois devemos escrever a DIFERENÇA nos registradores :
65536 - 62500 = 3036
Temos que escrever 3036 ( numero decimal) , em dois registradores separados( que juntos formam um hexadecimal de 16 bits) .
Então :
3036 ( decimal) = BDC (hexadecimal )
TMR1H = 0X0B
TMR1L = 0XDC
transformando novamente em decimal ,
TMR1H = 11 ( decimal)
TMR1L = 220 (decimal)
Poderiamos escrever os valores diretamente em hexadecimal no compilador, mas acredito que assim fica mais fácil de fixar estas informações. Bastaria observar a sintaxe 0X00 ...
Ficou meio extenso , mas servirá para aqueles que estão iniciando também.