Hola 22.manuel.
Si dispones de tiempo y ganas le puedes pegar un vistazo a esta rutina. Yo me he acostumbrado a ella y me resulta muy cómoda.
Codigo:
;*****************************************************************************
; Delay_time = ((DELAY_value * 3) + 4) * Cycle_time
; DELAY_value = (Delay_time - (4 * Cycle_time)) / (3 * Cycle_time)
;
; i.e. (@ 4MHz crystal)
; Delay_time = ((32 * 3) + 4) * 1uSec
; = 100uSec
; DELAY_value = (500uSec - 4 * 1uSec) / (3 * 1uSec)
; = 165.33
; = 165
;*****************************************************************************
DELAY500 ; ESTO SON 0.5 ms
MOVLW .165 ; +1 1 cycle
MOVWF DELAY ; +2 1 cycle
DELAY500_LOOP DECFSZ DELAY, F ; step 1 1 cycle
GOTO DELAY500_LOOP ; step 2 2 cycles
DELAY500_END RETURN ; +3 2 cycles
X_DELAY500
MOVWF X_DELAY ; +1 1 cycle
X_DELAY500_LOOP CALL DELAY500 ; step1 wait 500uSec
DECFSZ X_DELAY, F ; step2 1 cycle
GOTO X_DELAY500_LOOP ; step3 2 cycles
X_DELAY500_END RETURN
Un saludo desde Alicante.