-
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=FRC
porlotanto,lafuenteesFRC(Fosc=8MHz)- Foscsedividepor2,frecuenciadeinstrucción(4MHz)
- Elregistroasociadocon
DOZE
esCLKDIV
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
- La fuente del reloj es
-
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 enPR1
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.