Hola amigos, quiero conseguir que el Timer0 me salte cada 0,1ms. Para ellos utilizo un cristal de 4MHzy precargo el timer0 a 156 de forma que el tiempo de interrupción me queda:
T=(256-156)*(4/4·10^6)=0,0001
Dentro del Timer tengo el siguiente código:
#INT_TIMER0
void Interrupcion_Timer0()
{
set_timer0(156);
nClocks++;
if(nClocks==40000)
{
nClocks=0;
output_toggle(LED);
}
}
De forma que el led debería cambiar cada 4 segundos. Pues bien, ni por asomo se acerca a ese valor. De hecho el tiempo que obtengo es de 5,36 a 5,44 dependiendo de mi capacidad de reacción al parar el crono. La variable nClocks es un int16.
El Timer está configurado así:
setup_TIMER_0(RTCC_INTERNAL | RTCC_DIV_1);
setup_TIMER_1(T1_DISABLED);
setup_TIMER_2(T2_DISABLED,0,1);
He probado a quitar el set_timer0(156) y entonces la temporización es exacta a 10,24 segundos, como debe ser.
Qué estoy pasando por alto?
Se os ocurre otra forma de conseguir los 0,1ms.
Olvidé decir que programa en CCS, que el PIC es un 16F818 y que en el main no hay nada, es un simple bluce do-while vacío.