Funcionamiento incorrecto del Timer1 en la foto18

-1

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

    
pregunta Rookie91

1 respuesta

2

No has publicado suficiente de tu código para estar seguro de lo que está pasando, pero supongo que no estás reiniciando el temporizador después de un "golpe", por lo que obtienes 65536 / 0x1770 = 10.92 veces el intervalo esperado.

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas