Quiero generar una interrupción (en PIC18f4550 usando TIMER0) cada 1 segundo, pero al usar el siguiente código, se genera una interrupción cada 6 segundos.
#include<pic18f4550.h>
#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);
void inittimer(void);
void interrupt low_priority timerinterrupt(void);
void main()
{
TRISB =0x00; // Port B as output for LCD
PORTB =0xff;
intinter(); // Initialise Interrupt
inittimer(); // Initialise Timer
TMR0ON =1; // Timer 0 on
while(1);
}
void intinter(void)
{
RCONbits.IPEN =1; //Low priority enable
INTCON = 0b11100000; //timer 0 interrupt enable
INTCON2bits.TMR0IP = 0; //set timer 0 int. low priority
}
void inittimer(void)
{
T0CON = 0b00000111; //prescaler of 256, 16 bit, internal clock
TMR0H = 0xED; // Set TMRH and L Value
TMR0L = 0xB0;
}
void interrupt low_priority timerinterrupt (void)
{
if(TMR0IF == 1)
{
TMR0ON =0;//Timer 0 off
TMR0IF = 0; //Timer 0 IF disable
TMR0H = 0xED;
TMR0L = 0xB0;
PORTB = ~ PORTB; //complement port B
TMR0ON = 1; //Timer 0 on
}
}
Estoy configurando el reloj interno a 20MHz y creo que el problema está en los valores de TMR0L y TMR0H. ¿Alguien me puede guiar, cómo establecer los valores correctos para estos y obtener una interrupción de 1 segundo si es posible? O hay otra forma de hacerlo.
Gracias.