por xultz » 10 Set 2009 15:38
Fernandor, o timer 0 estoura quando ultrapassar de 255, ele volta para zero.
E se a int estiver setada, ele gera uma interrupção e desvia para a ISR.
A questão é a seguinte, suponha que você queira que ele gera uma interrupção exatamente a cada período de tempo (por exemplo, a cada 1ms exatamente) porque você quer fazer um relógio (ou seja, a cada 1000 vezes que entrar na ISR se passou exatamente 1 segundo).
Suponha que para o clock do teu PIC, você configura um prescaler e chega À conclusão que o timer 0 vai contar 125 vezes. Assim, se você setar o timer 0 com o valor 131, ele vai contar 125 vezes até estourar o valor (ou seja, passar de 255 para 0, já que 256-125=131).
Daí você liga o timer zero, seta ele com 131 e espera. Ele vai contar, e quando passar de 255 para 0 vai para a ISR, e se passou exatamente 1ms. O problema é que agora ele só vai estourar de novo após contar 256 vezes, o que dará pouco mais de 2ms. Então, a primeira coisa que você vai fazer na ISR é setar ele com 131, assim ele vai contar mais 125 vezes até cair na ISR de novo.
Assim, teoricamente ele vai cair na ISR a cada 1ms.
Porém, entre ele entrar na ISR e você setar ele com 131 vai ter passado um tempo, afinal desviar para a ISR toma dois ciclos de clock, salvar o contexto mais alguns, e assim por diante. Daí, em vez de levar 1ms ele vai levar 1ms e mais um tiquinho a cada interrupção, e teu relógio já não tem mais a precisão de um Big Ben. Então, o macete é ler quanto o timer0 contou desde que entrou na ISR até você decidir setar o valor dele, e somar este valor com os 131 que você quer. Note que quanto mais você adiciona aos 131, menos tempo o timer 0 leva para gerar interrupção. Se você ler quanto ele contou e somar aos 131 vai descontar exatamente o tempo gasto para tratar a ISR.
Me fiz entender?
98% das vezes estou certo, e não estou nem aí pros outros 3%.