#pragma config POSCMD = XT // Primary Oscillator Source (XT Oscillator Mode)
Para 4Mhz o mas usa HS, XT usalo para 4Mhz o menos.
Eso tal ves te solucione ya el tema de los tiempos.
#pragma config FWDTEN = ON // Watchdog Timer Enable (Watchdog timer always enabled)
Por ahora pasalo a OFF, sino tenes que poner la instruccion para resetear el WDT, porque se te va a reiniciar a cada rato.
Luego me fijo bien en el timer. Pero noto un par de cosas mal aplicadas.
Eso esta mal, el timer1 es un Timer del tipo A ( si es que bajas la hoja de datos del dsPIC ) este timer, cuenta desde 0 hasta PR1, cuando llega a PR1 se resetea el Timer0 por si solo, Entonces si yo quiero que pasen 10000 ticks, directamente cargo 10000 a PR1 y activo el timer, y ya no tengo que hacer mas nada. Respecto al calculo:
Uso un oscilador de cristal de cuarzo de Fosc =20 MHz. ... un Preescaler de 256.
Calculo Tcy = 2 / Fosc - Correcto
Calculo 1TYC = Tcy x 256 ( tiempo en realizar un conteo ) - Correcto
Uso la formula de tiempo de desbordamiento ... como:
Tdesb = ( 65536 - TMR1 ) x 1TYC --- > de esta formula despejo TMRO ( poniendo como dato el tiempo q quiero obtener en el timer)
TMR1 = 65536 - ( Tdesb / 1 TYC )
Ahora para cargar el RP1 .....
RP1 = Tdesb / 1 TYC ( El entero mas cercano )
Pensalo de esta forma, al timer entra una frecuencia que es Tcy, luego se divide con el preescaler por 256 a esa frecuencia, o lo que es lo mismo que el periodo se multiplica por 256, Y esa es la señal de reloj que entra al timer, es decir que por cada 1 que cuente va a pasar
(2 * Preescaler) / Fosc segundos, Supongamos que tenes 20Mhz y 1:256, eso te da 25.6us cada ves que sume 1 el timer. Si quisiera hacer una interrupcion cada 0.5s deberia contar hasta
0.5s / 25.6us = 19531.25Obviamente no podemos poner fracciones, asi que nos quedamos con el mas cercano que es 19531, eso lo cargamos en el PR1, ponemos a 0 el TMR1, configuramos, activamos interrupciones y finalmente lo hacemos arrancar. Una ves que arranco Cuando el registro del TMR1 sea igual al PR1 activa la bandera de interrupcion, y ademas de eso procede a poner a 0 el TMR1, asi vuelve a contar de nuevo.
Resumen, Pones a 0 el TMR1 y cargas el PR1 al comienzo y no lo tocas nunca mas ( a no ser que quieras cambiar el tiempo de la interrupcion en el medio del programa )