Estoy usando el controlador pic18f y se supone que debo obtener un retraso de 1 segundo. Estoy usando un cristal externo de 16 mhz y estos son los bits de configuración que he usado en él. He configurado el temporizador1 y espero una interrupción cuando el registro timeh de 16 bits alcanza el punto de ajuste. Pero en lugar de 1 segundo, obtengo un retraso de 10 segundos. ¿Por qué es así?
Los bits de configuración se establecieron como
HSPLL para fuente de reloj y sin división de CPU seleccionada.
Esta es la configuración del temporizador 1:
T1GCON=0x0; T1CON=0x71; //set the timer on with prescalar of 8 . 16 bit mode and the internal clock TMR1H=0x17; TMR1L=0x70; M_PEIE=1; //peripheral interrupts are enabled. M_TMR1IE=1; //timer1 interrupt enabled.
Y estos son los bits de configuración:
// PIC18F46J53 Configuration Bit Settings
#include<p18f46j53.h>
// CONFIG1L
#pragma config WDTEN = OFF // Watchdog Timer (Disabled - Controlled by SWDTEN bit)
#pragma config PLLDIV = 4 // PLL Prescaler Selection (Divide by 4 (16 MHz oscillator input))
#pragma config CFGPLLEN = ON // PLL Enable Configuration Bit (PLL Enabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset (Enabled)
#pragma config XINST = OFF // Extended Instruction Set (Disabled)
// CONFIG1H
#pragma config CPUDIV = OSC1 // CPU System Clock Postscaler (No CPU system clock divide)
#pragma config CP0 = OFF // Code Protect (Program memory is code-protected)
// CONFIG2L
#pragma config OSC = HSPLL // Oscillator (HS+PLL, USB-HS+PLL)
#pragma config SOSCSEL = HIGH // T1OSC/SOSC Power Selection Bits (High Power T1OSC/SOSC circuit selected)
#pragma config CLKOEC = OFF // EC Clock Out Enable Bit (CLKO output disabled on the RA6 pin)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor (Disabled)
#pragma config IESO = ON // Internal External Oscillator Switch Over Mode (Enabled)
// CONFIG2H
#pragma config WDTPS = 32768 // Watchdog Postscaler (1:32768)
// CONFIG3L
#pragma config DSWDTOSC = T1OSCREF // DSWDT Clock Select (DSWDT uses INTRC)
#pragma config RTCOSC = T1OSCREF // RTCC Clock Select (RTCC uses T1OSC/T1CKI)
#pragma config DSBOREN = OFF // Deep Sleep BOR (Disabled)
#pragma config DSWDTEN = ON // Deep Sleep Watchdog Timer (Disabled)
#pragma config DSWDTPS = 8192 // Deep Sleep Watchdog Postscaler (8.5 SECONDS)
// CONFIG3H
#pragma config IOL1WAY = OFF // IOLOCK One-Way Set Enable bit (The IOLOCK bit (PPSCON<0>) can be set once)
#pragma config ADCSEL = BIT12 // ADC 10 or 12 Bit Select (10 - Bit ADC Enabled)
#pragma config MSSP7B_EN = MSK7 // MSSP address masking (7 Bit address masking mode)
// CONFIG4L
#pragma config WPFP = PAGE_1 // Write/Erase Protect Page Start/End Location (Write Protect Program Flash Page 63)
#pragma config WPCFG = OFF // Write/Erase Protect Configuration Region (Configuration Words page not erase/write-protected)
// CONFIG4H
#pragma config WPDIS = OFF // Write Protect Disable bit (WPFP<6:0>/WPEND region ignored)
#pragma config WPEND = PAGE_0 // Write/Erase Protect Region Select bit (valid when WPDIS = 0) (Pages WPFP<6:0> through Configuration Words erase/write protected)
#pragma config LS48MHZ = SYS48X8 // Low Speed USB mode with 48 MHz system clock bit (System clock at 48 MHz USB CLKEN divide-by is set to 8)
Y en main.c Solo se habilita el cambio de led.
Y esto es lo que sucede en ISR
void isr_handler (void)
{
if(M_TMR1IF)
{
// timer_flag=1;
timer_inc++; //used for testing.
if(timer_inc==1000)//5 sec
{
timer_flag=1;
PORTEbits.RE2^=1;
timer_inc=0; //reset timer.
}
TMR1H=0xc;
TMR1L=0x49;
M_TMR1IF=0; //clear the flag
}//
Confío en que debo borrar el registro de 16 bits también a la derecha