Hola a todos de nuevo, pues creo que ya he dado con la solución y la pongo aquí a ver si está bien o tengo algún fallo.
* Formulas para el cálculo del timer0 para ajustarlo a que se desborde
a los 1000ms, lo usaremos de 8Bits, se puede configurar a 16Bits pero
pasa más tiempo para que se desborde el timer0 así que lo dejamos en 8bits
* En los microcontroladores pic si se tiene la opción de HSPLL se multiplica
por 4 la frecuencia del oscilador, si utilizamos un cristal de 4MHz
y activamos esa opción la frecuencia del oscilador será de 16MHz
-DATOS DEL PIC-
XTAL = 4MHz
HSPLL activado = x 4
*Cálculo de Fosc:
Fosc = 4 x 4000000; Fosc = 16000000
*Calculamos el ciclo máquina:
Tcm = 4/Fosc donde Fosc es la frecuencia del oscilador,
Tcm = 4/16000000; Tcm = 0,00000025
*Cálculo del Tiempo máximo del TIMER0 con esto calculamos el valor que tenemos que
escribir en el registro TMR0L para que se derborde el timer0 al tiempo deseado
T = Tcm x Preescaler (256 - TMR0);
T = Tiempo máximo deseado
Tcm = Ciclo máquina
Preescaler = lo que configuramos en el microcontrolador
256 = valor constante
TMR0 = Valor a cargar en el registro, como no lo sabemos se le pone 0
T = (0,00000025 x 128) x (256 - 0); T = 0,008192sg; T = 8,2ms
*Cálculo carga del Timer0
TMR0 = 256 - ((T.Deseado x Fosc)/(4 x Preescaler));
*Datos:
T.Deseado = 1000ms = 0,001sg
Preescaler = 1:128
TMR0 = 256 - ((0,001 x 16000000)/(4 x 128)); TMR0 = 224,75
Cómo el registro del Timer0 (TMR0L) no puede tener numeros decimales pues redondeamos
hacia arriba por que está más cerca del 225 que del 224 y este es el valor que cargamos
en el TMR0L, ya que los timers no son exactos tendremos que ajustar para lograr la mejor
presición posible y para eso dejando el resultado que nos dio en la formula fijo, vamos
cambiando la función que hace el conteo del tiempo.
Así que dejando el TMR0L a 225 tengo que jugar con la función
void TickUpdate(void){
static long cont_TMR0 = 0;
if(INTCONbits.TMR0IF)
{
//Se limpia la bandera
if(cont_TMR0++ == 955){
LED_STATUS_0 ^= 1; //Parpadeo del led
cont_TMR0 = 0;
}
INTCONbits.TMR0IF = 0; //Limpiamos la bandera de aviso de desbordamiento del buffer del Timer0
TMR0L = TICK_LOAD;
}
}Dejando la variable cont_TMR0 a 955 para que mas o menos se ajuste a la velocidad de un cronómetro comercial, habrá que ajustar más si se quiere más precisión pero así tira bien
Comparto proyecto por si alguien le quiere echar un vistazo:
Timer0