por Pask » 03 Ago 2008 09:31
Vou tentar ajudar.
O timer0 é um timer de 8 bits do PIC que conta de 0 a 255 incrementado pelo clock do próprio PIC ou por um clock externo aplicado num determinado pino. O timer 0, na verdade, inicia a sua contagem em 0 e conta até um máximo de 255, voltando a zero e repetindo tudo outra vez. Eu sou contra decorar fórmulas. Vamos tentar entender:
Se o seu PIC estiver trabalhando com um clock de 4MHz, o seu período será 4x10^6 / 4 = 1MHz = 1/1x10^6 = 1us (período real de trabalho do clock de máquina). Isto acontece porque, internamente, o período do clock é dividido por 4.
Este valor de 1us significa que a cada 1 micro segundo o timer 0 vai incrementar em uma unidade, ou seja, a cada 1 micro segundo a contagem do timer 0 vai crescer (0,1,2,3....255, 0, 1...). Então, já sabemos que o timer0 vai demorar 255 us para atingir o seu valor máximo e estourar voltando a zero! Porém, este tempo de 255us é muito pequeno e nós podemos aumentá-lo como desejarmos. Então, existe o prescale do timer0 que pode multiplicar esse valor por várias constantes até um máximo de 255. Se o prescaler estiver configurado para 1:255, por exemplo, o tempo total do timer0 vai ser 255us x 255 = 65.025 us ou 65,025 ms! Viu? Agora o tempo já aumentou para 65 milissegundos!
E se eu quiser um tempo maior, como 1 segundo?
Para chegar a temporizar até um 1 segundo, podemos fazer a seguinte conta: 1s / 0,065025s = 15,319. Então, devemos multiplicar esse tempo de 65ms por um fator arredondado de 15. Isto vai dar um tempo de 0,975 segundos! Podemos multiplicar por 16 e teremos 1,040 segundos (mais próximo)!
Mas, como fazer essa multiplicação? Podemos utilizar a interrupção do timer0, pois a cada 65,025 ms ela acontecerá e cada vez que ela ocorrer, incrementamos uma variável inteira de 8 bits em 1 unidade até o máximo de 16, mais ou menos assim:
static int x;
#interrupt_timer0
set_timer0(0);
while (x <= 16) {
x++;
}
Com isto, assim que a variável x atingir o valor 16, terá passado exatamente 1,04 segundos!
Espero ter ajudado.