Estoy escribiendo el código de ensamblaje para el microcontrolador 16F84A y he tenido algunos problemas. He implementado un código de retardo de 1 segundo que se repite consecutivamente por un total de 3 segundos, en lugar de volver al programa, en su lugar vuelve a "comenzar". Ya he intentado el mismo código con un retraso de 3 segundos y me he encontrado con problemas similares, no parece querer ejecutar un retraso de tiempo superior a 2 segundos.
Entonces pensé que iría aquí y vería si alguien tiene una idea de por qué esto sigue sucediendo. Me doy cuenta de que mi código no es el mejor y podría mejorar mucho, así que me disculpo por eso.
¡Gracias!
;Register Label Equates
PCL EQU 02 ;Program Counter Low
PORTB EQU 06 ;Port B Data Register
TRISB EQU 86 ;Port B Data direction register
STATUS EQU 03 ;Status register
RP0 EQU 05 ;Bank select bit
point EQU 0D ;GPR2 used as table pointer
;Variable definitions
UDATA_SHR
COUNT_1 RES 1 ;
COUNT_2 RES 1 ;
;*******************************************************
ORG 000
GOTO start ;Goto main program
;1 second delay subroutine.............................
delay MOVLW H'32' ;(1 cycle)
MOVWF COUNT_1 ;(1 cycle)
NOP
OLOOP MOVLW H'7C' ;(1 cycle)
MOVWF COUNT_2 ;(1 cycle)
ILOOP NOP ;(1 cycle)
DECFSZ COUNT_2,F ;(1 cycle)
GOTO ILOOP ;(2 cycles)
DECFSZ COUNT_1,F ;(1 cycle)
GOTO OLOOP ;(2 cycles)
RETURN ;return to main program
;Table of Output Code.......................
table ADDWF PCL ;Add pointer to PCL
RETLW D'0' ;Decimal 0
;Initialise Port B...................................
start bcf STATUS,RP0 ;Bank select 0
clrf PORTB ;Clear Port B data latches
bsf STATUS,RP0 ;Bank select 1
movlw 0x00 ;
movwf TRISB ;Set port B lines to output
bcf STATUS,RP0 ;Bank select 0
;Main loop...........................................
CLRF point ;Reset pointer
MOVLW D'0' ;Point to ASCII 2
CALL table ;access table...
MOVWF PORTB ;and output to LEDs
CALL delay ;Call 1 second delay
CALL delay ;Call 1 second delay
CALL delay ;Call 1 second delay
END ;Terminate source code