Estoy usando PIC18F4550
Estoy intentando generar una interrupción cada 1 segundo, y por prueba y error (es decir, solo estoy escribiendo y simulando en un hardware) estoy recibiendo una interrupción de aproximadamente 1 segundo. El código para esto es: -
#pragma config PLLDIV = 5 , CPUDIV = OSC1_PLL2 , USBDIV = 2
#pragma config FOSC = INTOSCIO_EC
#pragma config FCMEN = OFF
#pragma config BORV = 3
#pragma config WDT = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
void intinter(void)
{
RCONbits.IPEN =1; //Priority Interrupt is enabled
INTCON = 0b11100000; //all high and low priority interrupt is enabled, timer 0 overflow interrupt enable
INTCON2bits.TMR0IP = 0; //set timer 0 interrupt low priority
}
void inittimer(void)
{
T0CON = 0b00000111; //prescaler of 256, 16 bit, internal clock
TMR0H = 0xFFFF; // Set TMRH and L Value
TMR0L = 0x0000;
}
void interrupt low_priority timerinterrupt (void)
{
if(TMR0IF == 1)
{
TMR0ON =0;//Timer 0 off
TMR0IF = 0; //Timer 0 IF disable
TMR0H = 0xFFFF;
TMR0L = 0x0000;
i++;
if(i==4)
{
//if i==4 I am getting approx 1 sec interrupt.
}
Ahora, después de leer la hoja de datos y sobre el procedimiento para calcular el valor del registro TMR0H y TMR0L, no puedo entender mi código.
Como he configurado el reloj interno con un valor predeterminado con solo usar esto,
#pragma config FOSC = INTOSCIO_EC
Creo que el reloj es Fosc = 1Mhz, por lo que el cálculo es, Nuestra FCPU = 1MHz / 4 (Funcionamos desde 1Mhz Internal Clock)
= 0.25MHz
Período de tiempo = 4uS
Período de Prescaler = 4 x 256 = 1.024x10 ^ -3 (El Prescaler está configurado para dividir la frecuencia por 256)
Período de desbordamiento = 1.024x10 ^ -3 x 65535 = 67.10 s (Cada exceso de flujo toma 65535 cuentas)
Entonces, parece que cada desbordamiento tarda 67 segundos, pero está tomando 4 desbordamientos durante un temporizador de 1 seg. ¿Cómo es posible? ¿Está mal mi procedimiento de cálculo? O estoy tomando el reloj equivocado.
Por favor, ayúdeme a entender mi error ya que soy nuevo en la programación PIC.
Gracias.