Delay function timing not matching.

Thread Starter

elecbeg

Joined Sep 7, 2009
30
Hi,

I am using MPLABX and XC8, with PIC18F14K22.

I am trying to use the __delay_ms () function to set a delay time. It does delay, but not for the expected time.
Below is the code im using, I would expect that whatever number I insert into the delay function would delay for that many milliseconds. Instead, if I enter 125, it actually delays for about 500 milliseconds. If I enter 185, it delays for about 750 milliseconds.

Could you explain what I doing wrong please.
Thanks.

Code:
// CONFIG1H
#pragma config FOSC = IRC       // Oscillator Selection bits (External RC oscillator)
#pragma config PLLEN = OFF      // 4 X PLL Enable bit (PLL is under software control)
#pragma config PCLKEN = ON      // Primary Clock Enable bit (Primary clock enabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)

// CONFIG2L
#pragma config PWRTEN = OFF     // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = SBORDIS  // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
#pragma config BORV = 19        // Brown Out Reset Voltage bits (VBOR set to 1.9 V nominal)

// CONFIG2H
#pragma config WDTEN = OFF      // Watchdog Timer Enable bit (WDT is always enabled. SWDTEN bit has no effect.)
#pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)

// CONFIG3H
#pragma config HFOFST = ON      // HFINTOSC Fast Start-up bit (HFINTOSC starts clocking the CPU without waiting for the oscillator to stablize.)
#pragma config MCLRE = OFF      // MCLR Pin Enable bit (RA3 input pin enabled; MCLR disabled)

// CONFIG4L
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = OFF         // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled)
#pragma config BBSIZ = OFF      // Boot Block Size Select bit (1kW boot block size)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))

// CONFIG5L
#pragma config CP0 = OFF        // Code Protection bit (Block 0 not code-protected)
#pragma config CP1 = OFF        // Code Protection bit (Block 1 not code-protected)

// CONFIG5H
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block not code-protected)
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code-protected)

// CONFIG6L
#pragma config WRT0 = OFF       // Write Protection bit (Block 0 not write-protected)
#pragma config WRT1 = OFF       // Write Protection bit (Block 1 not write-protected)

// CONFIG6H
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers not write-protected)
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot block not write-protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)

// CONFIG7L
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 not protected from table reads executed in other blocks)

// CONFIG7H
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot block not protected from table reads executed in other blocks)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#define _XTAL_FREQ 4000000  //Sets oscillator to 4Mhz
#define LED1ON LATC = 0x01 //Lights LED1
#define LED1OFF LATC = 0x00 //Turn LED 1 off


#include <xc.h>




void main(void)
{
   
    TRISC = 0x00;
   
    while (1)
    {
       
        LED1ON;
        __delay_ms (180);
        LED1OFF;
        __delay_ms (180);
    }
}
 

NorthGuy

Joined Jun 28, 2014
611
The default speed of the internal oscillator is 1 MHz, which you don't seem to change anywhere, so your _XTAL_FREQ should be 1000000. It is 4000000 right now.
 

Thread Starter

elecbeg

Joined Sep 7, 2009
30
Yes, I forgot to change the comment to say it is the internal oscillator being used, sorry about that.

I did forget to say I changed the XTAL_FREQ to 1000000 before posting, but the delay was still no where near 1ms per number in the delay code. I did not time how far it was off and dont have the hardware to hand for next couple of days, but changing the XTAL to 1000000 did not sort out the problem. I posted the XTAL 4000000 as it did show a more clear time scale and I am hoping someone can tell me what else the problem could be?

Thanks in advance.
 

Thread Starter

elecbeg

Joined Sep 7, 2009
30
I will try looking through it all again, have gone through it a few times, I know I am missing something, just cant seem to find what it is.
Thanks for help.
 

Thread Starter

elecbeg

Joined Sep 7, 2009
30
Thank you all for your help, the timing was wrong when I changed XTAL_FREQ to 1000000, because I actually changed it to 100000 (I missed out a "0").

Sorry for bothering you all with such a silly mistake, its working fine now.
 
Top