Temporizadores actuando de manera extraña

4
  • PIC24FJ1024GB610 de Microchip

  • Depurador Pikit a bordo de Explorer 16/32 Development Board de Microchip

Escribí un programa, donde intenté crear un retardo de 250 ms con Timer 1 , y cada vez que se establece el indicador de interrupción del temporizador IFS0bits.T1IF , el pin conectado al LED PORTAbits.RA7 / LATAbits.LATA7 alternará .

este es el siguiente código:

#include <xc.h>

#pragma config FWDTEN = OFF //watchdog timer off
#pragma config FNOSC = FRC //Osc source from FRC (8MHz)
#pragma config ICS = PGD2

#define LED LATAbits.LATA7
#define TMR1_IF IFS0bits.T1IF
#define GLOBAL_INT INTCON2bits.GIE 
#define TRIS_LED TRISAbits.TRISA7

void Set_LED (void)
{
    TRISAbits.TRISA7 = 0;//output
    ANSAbits.ANSA7 = 0;//Digital Not Analogue
    LED = 0;  
}

void Set_Timer1 (void)
{
    T1CONbits.TCS = 1;//Clock Source internal from Tcy 
    T1CONbits.TCKPS = 2;//1:64
    T1CONbits.TSIDL = 0;//continues through idle mode

    /*
     Fosc = 8MHz, Fosc/2 = Fcy = 4MHz
     Tcy = 1/Fcy = 1/4 us = 0.25 us
     t = 250 ms = 250,000 us
     t = Tcy*(PRESCALAR)*PR1
     PR1 = t/(Tcy*PRESCALAR)
     PR1 = 250,000 / (0.25*64)
     PR1 = 15625
    */

    PR1 = 15625;

   T1CONbits.TON = 1;//run timer
}

int main (void)
{
    Set_LED ();//Set LEDs
    Set_Timer1 ();//Set Timers


    while(1)
    {
        while(!TMR1_IF);//stay till IFS0bits.T1IF = 0

        LED = !LED;//Toggle LED / LATAbits.LATA7

        TMR1_IF = 0; //Clear Interrupt Flag

    }

    return 0;
}

Ejecuto el programa en el PIC24, y espero que el LED parpadee muy rápido, pero en cambio, toma (aproximadamente) 40 segundos para cambiar el LED.

Esto me confunde, porque verifiqué la página de la hoja de datos de OSC y la página de la hoja de datos del temporizador 1 de la hoja de datos de PIC24FJ1024GB610, parece estar bien, y debo esperar un cambio de 250 ms.

Mirando el DS, esto es lo que deduje:

  • FNOSC=FRCporlotanto,lafuenteesFRC(Fosc=8MHz)
  • Foscsedividepor2,frecuenciadeinstrucción(4MHz)
  • ElregistroasociadoconDOZEesCLKDIV
  • CLKDIVbits.DOZEN=0,larelacióndelrelojperiféricodelaCPUes1:1,porlotanto,Fcy=4MHz
  • Tcy=1/Fcy,Tcy=1/4us=0.25us

  • T1CONbits.TCS = 1 Clock Source es interno desde FRC Oscillator
    • La fuente del reloj es Tcy interno, que en nuestro caso es 0.25 us
    • Operación sin puerta
  • T1CONbits.TCKPS = 0b10 Prescalar es 1:64, (cada marca de 64 Clock Source incrementará TMR1 de registro en 1
  • si TMR1 == PR1 , T1IF se establecerá. TMR1 cuenta hasta que es igual al valor en PR1

dando la información que tengo para hacer un retraso de 250 ms (250,000 us), solía seguir la siguiente ecuación:

  • t = Tcy * (PRE) * (PR1)
  • 250,000 = 0.25 * 64 * (PR1)
  • PR1 = 250,000 / (0.25 * 64)
  • PR1 = 15625

Pensé que es sencillo, alguien puede ayudarme con mi pregunta.

Gracias de antemano.

    
pregunta Forat

1 respuesta

1

Está sincronizando el temporizador con SOSC, verifique sus bits T1CON nuevamente.

TCS debería ser 0.

    
respondido por el justing

Lea otras preguntas en las etiquetas