Ornusashas
Ornusashas

Reputation: 7

Understanding How DelayMS Function Works With PIC18F Microcontroller

I am trying to use a PIC18F45K22 to flash an LED on for a second, then off for a second, repeating indefinitely. The code incorporates a delay function that keeps the PIC busy for one second but I am not sure how it works (it was done through trial-and-error.) To achieve a 1 second delay, tWait should equal 125,000. I am using a 8MHz MCU clock frequency with PLL disabled. I know that 8MHz is 125nSec but after that, I am stuck. Can anyone please explain to me how it works? I've been at it for a few hours and it's driving me bonkers.

#define SYSTEM_FREQUENCY        (8000000) // 8MHz

// Prototype Function
void delayS(unsigned int sec);

void main()
{
     // Sets RA0 to output...
     TRISA.RA0 = 0;

     do
     {
       // Turns RA0 off...
       LATA.RA0 = 0;
       delayS(1);
       // Turns RA0 on...
       LATA.RA0 = 1;
       delayS(1);
     } while(1); // Repeat...
}

// My attempt at writing the function...
void delayS(unsigned int sec)
{
     unsigned long  tWait, tStart;
     /*
          To achieve a 1 Second On 1 Second Off cycle, tWait should be 125,000.
          How? Why? 64 is arbitrary to achieve 125,000.
     */
     tWait = Sec*(SYSTEM_FREQUENCY/64);
     for(tStart = 0; tStart < tWait; tStart++);

}

Upvotes: 0

Views: 4964

Answers (1)

francis
francis

Reputation: 9817

The clock frequency is 8MHz, so there are 2.10^6 cycles per seconds since a cycle takes 4 clock ticks. Any assembly operation of the microcontroller takes at least one cycle. There is still a factor 16 to explain.

The factor 16 must correspond to one pass of the loop. Since unsigned long are used in this loop, it is not surprising that it takes a few operations. You will need to look at the assembly code to understand what is happening and get a precise count, like here.

If you are working with MPLAB and the xc8 compiler, there are some functions you can use, such as Delay10KTCYx(unsigned char);.

The microcontroller spends 99.99% of its time counting, wich is not critical if you flash leds. But, to use efficiently a pic, you will need to avoid these functions by using timers and interruptions. Have fun !

Upvotes: 1

Related Questions