Creo que has malinterpretado las funciones del temporizador. De acuerdo a tu comentario, estás asumiendo que set_timer1
establecerá el valor al que cuenta el temporizador. Pero lo que realmente sucede es que estás configurando el temporizador 1 con el valor 8000. La interrupción del temporizador se activa cada vez que el temporizador se desborda. Dado que el temporizador 1 es un temporizador de 16 bits, esto sucede cuando el contador llega a 65535. Entonces, la primera vez el temporizador cuenta de 8000 a 65535, activa la interrupción, reinicia el contador a 0 y vuelve a contar hasta 65535, activando la interrupción, y así sucesivamente.
Sea \$f\$ la frecuencia del reloj, entonces el intervalo de tiempo \$T\$ en el que se activa tu interrupción es: $$ T = \frac{4\cdot2^{16}}{f} $$ Así que para una frecuencia de reloj de 1Mhz, tu interrupción se activa cada 262ms, para una frecuencia de 20Mhz se activa cada 13ms.
Lo que necesitas hacer para obtener un retraso mayor es aumentar un contador en software en tu rutina de interrupción. Pero con tu frecuencia de reloj de 20Mhz estás obteniendo estos extraños 13ms. Para obtener un número redondo, como 10ms, necesitas contar hasta 50000 (reorganiza la fórmula de arriba). Entonces lo que puedes hacer es inicializar el temporizador no en 0 sino en \$2^{16} - 50000 = 15536\$ (esta vez con la función set_timer1
). La última cosa que necesitas hacer es aumentar el contador de software mencionado cada vez que tu interrupción se activa. Cuando tu variable alcance un valor de 8000, sabrás que han transcurrido 8 segundos.
Deberías leer la hoja de datos para el pic, especialmente el capítulo 6 'Módulo Timer1', para comprender mejor lo que está sucediendo y cómo usar tu microcontrolador pic.