RETARDO ;llama de subrutina con call 2
movlw N ;1
movwf CONTADOR ;1
CICLO decfsz CONTADOR,F ;1*(N-1)+2
goto CICLO ;2*(N-1)
T=2+1+1+1(N-1)+2+2(N-1)
5+1(N-1)+2(N-1)
5+N-1+2N-2
2N+N+5-1-2
T=3N+2
N=T-2/3 --> N=500-2/3 = 166
Realmente para casos MUY inusuales o de curiosidad para ver si lo puedo sacar haria algo asi. Y me gusta el ASM, pero no le veo sentido romperse la cabeza.
Y tenes un error que contaste el CALL pero no el RETURN,
4 ciclos- CALL + RETURN
2 ciclos- Carga al contador
3(N-1) - 3 ciclos tarda la resta y el GOTO, y esto se produce (N-1) veces
2 - del salto del DECFSZ , para cuando llega a N
4 + 2 + 2 + 3(N-1)
8 + 3(N-1)
3N+5 (ciclos)
Si necesito 500us, serian 500us / Tcy = 500us / 1us = 500 ciclos
(500 - 5) / 3 = 165
En fin, como dije es solo por "curiosidad", o meramente aprendizaje, sino directamente uso algo como esto:
http://www.piclist.com/techref/piclist/codegen/delay.htm
Y te da:Código: ASM
; Delay = 1 seconds ; Clock frequency = 4 MHz ; Actual delay = 1 seconds = 1000000 cycles ; Error = 0 % cblock d1 d2 d3 endc Delay ;999990 cycles movlw 0x07 movwf d1 movlw 0x2F movwf d2 movlw 0x03 movwf d3 Delay_0 decfsz d1, f goto $+2 decfsz d2, f goto $+2 decfsz d3, f goto Delay_0 ;6 cycles goto $+1 goto $+1 goto $+1 ;4 cycles (including call) return
Ya tenes tu rutina de delay :tongue:
; Delay = 0.02 seconds
; Clock frequency = 4 MHz
; Actual delay = 0.02 seconds = 20000 cycles
; Error = 0 %
cblock
d1
d2
endc
RETARDO
;19993 cycles
movlw 0x9E
movwf d1
movlw 0x10
movwf d2
RETARDO_0
decfsz d1, f
goto $+2
decfsz d2, f
goto RETARDO_0
;3 cycles
goto $+1
nop
;4 cycles (including call)
return
; Actual delay = 0.02 seconds = 20000 cycles
; Error = 0 %
Si, es correcto. Yo por ahi hablo de ciclos por que uno puede cambiar el oscilador. Cuanto tarda un ciclo es la inversa de frecuencia del oscilador por 4
Tcy = 4 / Fosc
Si es 4Mhz
Tcy = 4 / 4Mhz = 4 / 4000000 Hz = 1us ( es lo que tarda un ciclo interno )
Del codigo que pasaste:Citar; Actual delay = 0.02 seconds = 20000 cycles
; Error = 0 %
20000 ciclos * 1us = 20000us o 20ms ( si lo divido por 1000)
Si pones un cristal de 8Mhz por ejemplo ahora tu ciclo es de 0.5us y ese retardo es de
20000 ciclos * 0.5us = 10ms
----------------------------------------------------------
Si necesitas pasar de 10^-3 a 10^-6
1 * 10^-3 = 0.001 (3 lugares luego de la coma)
1 * 10^-6 = 0.000001 (6 lugares luego de la coma)
20 * 10^-3 = 0.020 = 0.02