No puedes esperar que este TIMER te de temporizaciones precisas de ninguna forma, excepto la que él por su propia naturaleza puede ofrecerte, es decir, contar desde 0 a 255, y provocar una petición de interrupción en su desbordamiento, uses el lenguaje que uses para programarlo.
Si modificas el registro de conteo para que el TIMER0 cuente un poco menos, digamos desde 100 a 255, porque si lo hace así te dará un período de interrupción más apropiado para lo que intentas hacer, se cometerán errores en la temporización, errores debido a la latencia del proceso de interrupción (tiempo que le toma al procesador comenzar a atender la interrupción luego de que esta se activa).
La latencia de la interrupción es el peor dolor de cabeza para este método porque es muy difícil predecir cuanto tiempo demorará el procesador en atender la interrupción, sobre todo si cuando el TIMER0 pide interrupción se está atendiendo a otra interrupción, ya que la forma más frecuente de atender interrupciones en PIC es enmascarar las interrupciones dentro de una ISR, lo que evita que las interrupciones se puedan anidar (así lo hace CCS por defecto). también depende de si la instrucción que se está ejecutando cuando llega el pedido de interrupción es de 1 o dos ciclos (como las de salto), de lo que le tome al proceso de discriminación de interrupciones decidir que es la del TIMER0 la que será atendida(recordemos que en PIC las interrupciones no son individualmente vectorizadas, existe un solo vector de interrupción y allí hay que decidir cual atender). Suma a ello que una vez en la ISR deberías leer el TIMER0 para saber cuantos períodos se han contado, hacer un cálculo de ajuste del valor de recarga, escribir el contador y esperar dos ciclos de máquina para que este recomience el conteo.
Muchas complicaciones para intentar conseguir una precisión que no se consigue. Ahora, esto no implica que este método se inútil, sino que hay que saber donde utilizarlo y donde NO.
Donde NO utilizarlo:
En aplicaciones que requieran temporizaciones precisas en un período largo de tiempo (entiéndase de 1 hora en adelante). Ya que los errores serán acumulativos y la temporización se verá afectada.
Ejemplos de estas aplicaciones:
Relojes calendarios
Cronómetros
Contadores largos que requieran precisiones de segundos (1 hora o más)
Donde sí tulizarla
Aplicaciones que requieran de tiempos relativamente precisos, pero donde la precisión a lo largo del tiempo no sea esencial, no importa la acumulación del error.
Ejemplos:
Sincronización de procesos (seteo y encuesta de banderas)
Temporización para procesos de encuesta como por ejemplo. Escribir una lámpara de 7 segmentos multiplexada, lectura de teclados, procesos de conversión con el AD (no siempre sirve, pero la mayoría de las veces sí)
Saludos
Reinier