【发布时间】:2014-05-09 08:53:16
【问题描述】:
我有这个代码 - 所有 LED 每 1 秒打开和关闭一次(使用 MPLAB X IDE,汇编程序,振荡器频率为 4MHz):
#include <p16f84a.inc>
__CONFIG _WDTE_OFF & _PWRTE_OFF & _CP_OFF & _FOSC_HS
;General registers for delay
CounterA equ h'0c'
CounterB equ h'0d'
CounterC equ h'0e'
org 0
Start:
; select bank 1
bsf STATUS, RP0
; set port B as output
movlw b'00000000'
movwf TRISB
; select bank 0
bcf STATUS, RP0
MainLoop:
; turn on LEDS
movlw b'11111111'
movwf PORTB
call Delay_1s
movlw b'00000000'
movwf PORTB
call Delay_1s
goto MainLoop ;Repeat
Delay_1s:
movlw d'6'
movwf CounterC
movlw d'24'
movwf CounterB
movlw d'168'
movwf CounterA
loop:
decfsz CounterA,1
goto loop
decfsz CounterB,1
goto loop
decfsz CounterC,1
goto loop
return
end
有人能解释一下Delay_1s 是如何工作的吗?我试图乘以 168 * 24 * 6 = 24192 µS,但这是不正确的,我应该得到 1000000 µS..
编辑:
我越来越近了 - decfsz CounterA,1 需要 1 µS,goto loop 需要 2 µS 来处理。所以我认为答案应该是 (168 * 3) * (24 * 3) * (6 * 3) = 653184 µS。当然,在将值设置为 CounterA、CounterB 和 CounterC 时,我应该增加 6 µS。有什么我想念的吗?
EDIT2:
我在下面的每个操作中添加了时间值。我理解的对吗?
Delay_1s:
movlw d'6' ; 1µS
movwf CounterC ; 1µS
movlw d'24' ; 1µS
movwf CounterB ; 1µS
movlw d'168' ; 1µS
movwf CounterA ; 1µS
loop:
decfsz CounterA,1 ; 1µS
goto loop ; 2µS (the same while skipping)
decfsz CounterB,1 ; 1µS
goto loop ; 2µS (the same while skipping)
decfsz CounterC,1 ; 1µS
goto loop ; 2µS (the same while skipping)
return ; 1µS ??
【问题讨论】:
-
自从我做了很多 PIC 汇编程序以来已经有一段时间了,但我认为诀窍可能是,例如 CounterA 第一次只会是 168,然后第二次会是 256,因为它不会被重置。如果你这样算,那会加起来吗?
-
是的,它可能是 - 如果
CounterA和CounterB从 256 开始(CounterC只会变为零然后例程返回) - 那么结果是 390150,如果我将它相乘3µS - 然后我得到 1,170450 秒