timer0-pic18f452-ccs- compila ok pero no respeta tiempos

Hola, estoy aprendiendo a utilizar los timers del pic 18F452 y he creado un programa en CCS- MPLAB que me compila y simula bien pero que al pasarlo a una placa de pruebas me da problemas.
He querido utilizar el timer 0 de mi PIC que se puede configurar como de 8 o de 16 bits (en mi caso de 16) y para que desborde en 16.777216 segundos le he puesto un reloj internod e $ MHz y un prescaler de 256,
según la fórmula: overflow= bits*prescaler*4*(1/frecuencia de reloj) que he aplicado después de leer posts del foro.
Lo que hace mi programa es que cuando le meto un pulso se inicia un contador, que cuando llega a 15 segundos, hace que el temporizador desborde y entra en la interrupción RTCC dentro de la cual pone los pines del puerto B a 1 (se habían inicializado a 0)
Para que desborde a los 15 segundos y no en 16.777216 he calculado que tengo que cargar el valor 1B1E en el set_rtcc, que se correspondería con empezar la cuenta en 1.777216 y llegar hasta 16.777216
Mi problema es que cuando lo simulo en el MPLAB SIM me da los tiempos perfectos incluso si le voy variando el valor que cargo al set_RTCC, pero sin embargo en la placa real me salta la interrupción más o menos a los 4 segundos independientemente de lo que le cargue.
¿a alguien se le ocurre qué puedo estar haciendo mal?


Código:

#define compiler __PCWH__ //Compilador CCS


#include "18F452.h" //PIC

#byte PORTA=0xF80 //Defino los puertos que voy a utilizar
#byte PORTB=0xF81

#fuses HS,NOWDT,NOPROTECT,NOLVP // fusibles deben activarse en el dispositivo cuando se programa. Watchdog desactivado por hardware
#use delay(clock=4000000) //reloj de 4 MHz

int aux=0; //inicializo la variable auxiliar a 0

#INT_RTCC //interrupción del timer0
void timer(){ // la interrupción se dispara cuando desborda el timer

output_B(0xFF); //todos los pines del puerto b a 1
disable_interrupts(GLOBAL); // y deshabilito la interrupción para que no vuelva a iniciar el Timer cuando salga de la interrupción, a no ser que se den las condiciones necesarias
disable_interrupts(INT_RTCC);
aux=0;
}



void main()

{
setup_WDT(WDT_OFF); //Desactivo el Watchdog por programa

set_tris_a(0x01); //puerto A, bit 0 como entrada digital
set_tris_b(0x00); //puerto B, todos los bits como salidas


output_B(0x00); //inicializo el puerto B a 0 para indicar que el sensor no está dando error de giro



while (1){

if( input(PIN_A0) ){ //si tengo a 1 el pin A0
if(aux==0){ // y la variable auxiliar a 0
SET_RTCC(0x1B1E); //tiempo en que tiene que empezar el timer para desbordar en 15 segundos
SETUP_TIMER_0(RTCC_INTERNAL | RTCC_DIV_256 );// configuro el Timer para que desborde en 16.777216 s
enable_interrupts(GLOBAL); //habilito itnerrupciones
enable_interrupts(INT_RTCC);
aux=1;
}
}



}
}
 
He descubierto que los tiempos iban mal porque aunque en el programa tengo 4MHz de reloj, el cristal oscilador de mi placa era de 20 MHz, y estba usando el cristal externo en vez del reloj interno, a pesar de que en mi programa he puesto la instrucción: code: SETUP_TIMER_0(RTCC_INTERNAL | RTCC_DIV_256 ) tal y como pone en la librería del "18F452.h" .
He probado a cambiar el fuse HS por XT que es el que corresponde para relojes de menos de 8MHz y sigue sin reconocerme el oscilador itnerno, sólo el externo.
el tema es que quiero poder usar el reloj interno, no el oscilador externo. Y no puedo, sólo me usa el externo
 
Atrás
Arriba