У меня такой код - все светодиоды включаются и выключаются каждую 1 секунду (используется MPLAB X IDE, ассемблер, частота генератора 4МГц):
#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 мкс, но это неверно, я должен получить 1000000 мкс.
ИЗМЕНИТЬ:
Я приближаюсь - decfsz CounterA,1 занимает 1 мкс, а goto loop занимает 2 мкс для обработки. Поэтому я думаю, что ответ должен выглядеть так (168 * 3) * (24 * 3) * (6 * 3) = 653184 мкс. Конечно, я должен добавить 6 мкс при установке значений CounterA, CounterB и CounterC. Я что-то упускаю?
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 ??
CounterAиCounterBначинаются с 256 (CounterCтолько стремится к нулю, а затем возвращается процедура) - тогда результат будет 390150, а если я умножу его на 3 мкс - то я получаю 1,170450 сек. - person Ernestas Gruodis   schedule 09.05.2014