TIMER0 en PIC18F4550

0

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.

    
pregunta Mohit

1 respuesta

4

A menos que haya realizado cambios en la configuración del oscilador con el registro OSCCON, el valor predeterminado será un prescaler de / 8 para dar 1MHz. Si eso es cierto, entonces el \ $ F_ {CY} \ $ será 256000Hz.

Su preescalador está configurado en 256, por lo que la marca del reloj estará en \ $ \ frac {256000} {256} = 1000Hz \ $

Crees que estás configurando el valor de desbordamiento en 65535, pero no lo estás. En realidad, está configurando el byte alto del temporizador actual en 0xFFFF (que, dado que es un registro de 8 bits en realidad es 0xFF), y el byte bajo del temporizador en 0x00, por lo que el conteo actual del temporizador es 0xFF00 en total . Se activa y cuando pasa de 0xFFFF a 0x0000, se dispara una interrupción. Eso es 256 garrapatas de distancia.

Entonces, a 1000Hz dividido por 256 tics, eso es \ $ \ frac {1000} {256} = 3.90625Hz. \ $

Lo que es casi 4 veces por segundo.

Entonces, para obtener exactamente un segundo, con un tick de 1000Hz, necesitas 1000 ticks. Por lo tanto, debe establecer sus valores de temporizador en 65536 menos 1000 o 64536, que es 0xFC18, por lo que su TIMERH sería 0xFC y su TIMERL sería 0x18.

    
respondido por el Majenko

Lea otras preguntas en las etiquetas