您将获得为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行中最终得不到相同的值。你能告诉我详细的计算吗?
答案 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。