Hola, quería ver si me podían dar una ayudita.
Estoy intentando crear un bucle consistente en dos rutinas. Es decir, de los 8 leds conectados al puerto B de mi 16F84A, primero quiero que roten los 4 primeros y cuando lo haya hecho tres veces que vaya a que roten los otros 4 leds y cuando también hayan rotado otras 3 veces, que vuelva a hacerlo.
El problema es que cuando entra en el bucle de "Decrementa2" y hace el "CONTA2,1" siempre se queda haciendo ese bucle y se va a "Inicio3" y siempre están rotando esos 4 leds y nunca vuelve a Inicio1. Es como si "CONTA2" nunca restara y nunca valiera cero.
Ya sé que el resto del programa se podría hacer con rrf o rrl y demás pero este pequeño programa lo he montado más que nada para el tema de contar bucles y salir hacia otro bucle y luego poder volver y así.
Si me pudieran decir dónde puedo estar fallando se lo agradezco.
Saludos.
;*****Establecimiento constantes ****
STATUS equ 03h
TRISB equ 86h
PORTB equ 06h
PDel0 equ 0Ch
PDel1 equ 0Fh
PDel2 equ 0Dh
CONTA1 equ 0Eh
CONTA2 equ 0Fh
;
;****Configuración del Puerto****
bsf STATUS,5 ; Cambiamos al banco 1Switch to Bank 1
movlw 00h ; Ponemos los pines del puerto B ...
movwf TRISB ; ...como salidas.
bcf STATUS,5 ; Volvemos al Banco 0.
Inicio1
clrf CONTA1
clrf CONTA2
movlw d'4'
movwf CONTA1
movlw d'4'
movwf CONTA2
Decrementa1
decfsz CONTA1,1
goto Inicio2
goto Decrementa2
Inicio2
movlw b'00000001'
movwf PORTB
call PDelay
movlw b'00000010'
movwf PORTB
call PDelay
movlw b'00000100'
movwf PORTB
call PDelay
movlw b'00001000'
movwf PORTB
call PDelay
movlw b'00000000'
movwf PORTB
call PDelay
goto Decrementa1
Decrementa2
decfsz CONTA2,1
goto Inicio3
goto Inicio1
Inicio3
movlw b'10000000'
movwf PORTB
call PDelay
movlw b'01000000'
movwf PORTB
call PDelay
movlw b'00100000'
movwf PORTB
call PDelay
movlw b'00010000'
movwf PORTB
call PDelay
goto Decrementa2
PDelay movlw .14 ; 1 set number of repetitions (C)
movwf PDel0 ; 1 |
PLoop0 movlw .72 ; 1 set number of repetitions (B)
movwf PDel1 ; 1 |
PLoop1 movlw .247 ; 1 set number of repetitions (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) is the time over? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) is the time over? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 cycles delay
PDelL2 clrwdt ; 1 cycle delay
return ; 2+2 Done
end