Hi Tim and Scott,
As Scott says, I have information about PIC loops on my page at
http://www.people.cornell.edu/pages/shb7/lop.html
I recently found out that the section on a certain type of loop (called N2
on my page) was incorrect, so I just corrected that, and added some great
suggestions from Scott and Reggie Burdin. Long overdue update of that page!
It looks like you did a better job of explaining this than I could do,
Scott. The only thing is that I get 3*M*N + 4*M + 1, instead of 1 at the
end. I think you may have forgotten the two instructions at the very top of
the loop, but it is possible that I could be the one making the mistake.
Sean
At 06:24 AM 5/26/00 0500, you 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*(x1) 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*(2561) cycles. So for x=0 you
substitute
{Quote hidden}>x=256 and the general formula:
>
> loop_time = 2 + 3*(x1)
>
>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
{Quote hidden}>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*(y1) 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
{Quote hidden}>time is:
>
> Q = 2 + (2 + 3*(N1)) , 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
>

 Sean Breheny
 Amateur Radio Callsign: KA3YXM
 Electrical Engineering Student
\=
Save lives, please look at http://www.all.org
Personal page: http://www.people.cornell.edu/pages/shb7
.....shb7KILLspam@spam@cornell.edu ICQ #: 3329174
_____________________________________________
NetZero  Defenders of the Free World
Click here for FREE Internet Access and Email
http://www.netzero.net/download/index.html