piclist 2000\05\26\072615a >
www.piclist.com/techref/microchip/time.htm?key=delay
BY : Scott Dattalo email (remove spam text)

On Fri, 26 May 2000, Tim Hamel wrote:

{Quote hidden}

Sean breaks this down on his site. Perhaps he'll elaborate.

First, there are two nested loops. The inner one:

loop_inner
decfsz  some_reg,f
goto   loop_inner

The time it takes for this loop to execute depends on the contents of
"some_reg":

some_reg   loop time
-----------------------
1           2
2           5
3           8
x           2 + 3*(x-1)   1 <= x <= 255

This says that it takes three cycles for each pass through the loop except for
the very last one which only takes two cycles.

x=0 is a special case. The first time through the loop, x will decrement to 255.
So what happens is that the maximum delay time occurs for x=0. And in fact, the
time for the loop to execute is 2 + 3*(256-1) cycles. So for x=0 you substitute
x=256 and the general formula:

loop_time = 2 + 3*(x-1)

still applies.

The outer loop can be abstracted like so:

loop_outer:

<some pic code>

decfsz  some_other_reg,f
goto   loop_outer

In other words, it's structurally identically to the inner loop with some extra
code in the loop. Let's say that the time for this extra code to execute is
'Q'. Then the total time for the outer loop is:

some_other_reg   loop time
-----------------------------
1             Q + 2
2             2*Q + 5
3             3*Q + 8
y             y*Q + 2 + 3*(y-1)   1 <= y <= 255

The same caveat for y = 0 applies. This equation can be simplified:

outer_loop_time = y*(Q+3) + 2 - 3
= y*(Q+3) - 1

Now to combine the two loops, all we have to do is find the value for Q. This is
the time it take for this snippet to execute:

> Pause Movlw  "value2"
>           Movwf  N
>
> Delay1 Decfsz N
>          goto Delay1

There are two cycles for initializing N and then there's the loop. So the total
time is:

Q = 2 + (2 + 3*(N-1))     , 1 <= N <= 255
= 4 + 3*N - 3
= 1 + 3*N

The total time for both loops is:

total = M*(Q+3) - 1     , 1 <= M <= 255
= M*(1+3*N +3) - 1
= 3*M*N + 4*M - 1

(keep in mind, if M or N is 0 then we need to replace the 0 with 256)

Benson is wrong.

Scott

> some kind soul break down into bits and pieces so I could figure it out? I'm
> going to be doing a weather project, and I'm sure I'll need this knowledge.
> Hopefully, I'll be able to complete the project without being dependant on
> you guys =)

Is this why it's so hard to predict the weather?

<Pine.LNX.4.21.0005260549100.3287-100000@tempest2.blackhat.net>