PIC18f4550 Configuración del temporizador para la interrupción de 1 seg.

1

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.

    
pregunta Mohit

1 respuesta

1

El temporizador 0 no es adecuado para interrupciones periódicas largas pero precisas. Puede realizar breves interrupciones utilizando el temporizador 0 en modo de 8 bits con un calibrador de presión de 1, pero estos están limitados a 256 ciclos. También debe comprender muy bien el temporizador para no perder ningún ciclo en cada período.

El temporizador 2 es una mejor respuesta ya que tiene un registro de período incorporado. Quizás no pueda obtener un tiempo de hasta 1 s, pero eso puede crearse fácilmente contando una cantidad de interrupciones del temporizador 2 más rápidas pero precisas. Como mínimo, puede configurar el temporizador 2 para que interrumpa cada 1000 ciclos, por lo que la sobrecarga de contar algunos de esos antes de llegar a 1 segundo es ruido.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas