Ele jamais diria isso, ele diria que o tempo pode ser dividido até chegar a 1.10^-457 s e que menos que isso o tempo dá uns pulos. Ou coisa parecida.
Sobre o timer do PIC, vou dar um micro exemplo. Estou neste momento infelizmente e não por vontade própria, eu podia estar matando, roubando, mas estou mexendo num firmware com PIC18F4520, e precisava de uma base de tempo precisa de 1s. Estou programando no CCS, não por vontade própria, eu podia estar matando, roubando... acho que já disse isso.
Então assim:
O PIC está rodando em cima de um cristal de 20MHz. Ele deveria estar com um cristal de 10MHz, e com PLL rodando a 40MHz, mas eu também podia estar matando... você entendeu.
O clock das instruções vem do cristal, porém dividido por 4. Ou seja, o clock das instruções é de 5MHz, ou 200ns.
Aí eu configurei o timer 2 assim:
setup_timer_2(T2_DIV_BY_16,249,10);
O que isso quer dizer:
Primeiro ele tem um prescaler de 16. Isso quer dizer que antes de entrar no timer, o clock é dividido por 16. O que era 5MHz, passou a ser 312,5kHz, ou 3,2us.
O timer tem um contador, que no caso do timer 2, começa em zero e vai aumentando a cada clock, no meu caso, a cada 3,2us. E ele também tem um comparador, que quando é igual, ele gera um trigger. Eu configurei o comparador para 249. Como ele começa em zero, ele precisa de 250 clocks para ficar igual a 249. Ao chegar neste valor, ele zera o contador e gera um trigger e reinicia a contagem.
Dessa forma, eu gero um trigger a cada 800us.
E o timer 2 também tem um postscale, que no meu caso eu configurei para 10. Ou seja, quando ele receber 10 triggers, ele gera uma interrupção. O que no meu caso quer dizer que o timer 2 recebe uma interrupção a cada 8ms.
Minha ISR do timer 2 ficou assim:
- Código: Selecionar todos
#int_TIMER2
void TIMER2_isr(void)
{
contador_8ms++;
if(contador_8ms == 125)
{
contador_8ms = 0;
segundos++;
}
}
Ou seja, na ISR eu faço um contador até 125, isso quer dizer que ele chega a 125 em 8ms*125 = exatamente 1s.
Para a ISR ser chamada, logo depois de configurar o timer 0 precisa habilitar as interrupções:
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
Note que isto serve para o timer2 do 4520, eu não lembro mais (graças a Deus) como são os timers do 628, mas espero que isto tenha ajudado de alguma forma.