PIC中的循环计数计算

时间:2015-03-31 20:24:29

标签: pic

您将获得为PIC16F877工作的子程序,工作频率为4MHz 获得大约30ms的延迟。

1 COUNTER1 equ 0x20
2 COUNTER2 equ 0x21
3
4 delay_loop:
5
6 movlw d'30'
7 movwf COUNTER2
8
9 ; Loop1 body takes about 1ms
10 LOOP1:
11 movlw d'200'
12 movwf COUNTER1
13
14 ; Loop2 body takes about 5us
15 LOOP2:
16 nop
17 nop
18 decfsz COUNTER1, F
19 goto LOOP2
20
21 decfsz COUNTER2, F
22 goto LOOP1
23 return

Instruction Cycles
movlw          1
movwf          1
 nop           1
decfsz         1*
goto           1
return         2 

好吧,我在第9行和第14行中最终得不到相同的值。你能告诉我详细的计算吗?

1 个答案:

答案 0 :(得分:3)

首先,您的指令周期不正确。 GOTO为两个周期,DECFSZ为一个或两个周期,具体取决于结果。

因此,LOOP2

LOOP2:
    nop                  ; 1 cycle
    nop                  ; 1 cycle
    decfsz COUNTER1, F   ; 1 cycle except at loop end, then 2 cycles
    goto LOOP2           ; 2 cycles

因此总共为5个周期,其中4MHz时钟具有1us周期时间 1 为5us。 COUNTER1为200时,内循环需要200 * 5us = 1000us = 1ms。

现在是封闭循环,LOOP1

LOOP1:
    movlw d'200'         ; 1 cycle
    movwf COUNTER1       ; 1 cycle

    ; 1ms delay from LOOP2 (removed for clarity)

    decfsz COUNTER2, F   ; 1 cycle except at loop end, then 2 cycles
    goto LOOP1           ; 2 cycles
    return               ; 2 cycles

所以LOOP1内务处理总共有5个周期(忽略最后的RETURN),从内环= 1005us增加到1000us。当COUNTER2为30时,总延迟为30 * 1005us = 30.15ms(给出或接受少数初始内务管理指令和最终返回,但您明白了。)

1 请记住,这些PIC每条指令使用4个时钟周期,因此4MHz时钟在1MIP执行,指令时间为1us。