¿Cuál es el problema en este código LED PIC18 ASM parpadeante?

Tengo que codificar el ejemplo típico de 8 LED que se encienden y se apagan, y luego todos se encienden en un bucle.

Obtuve un PIC 18F4550 y codifiqué esto:

    List    P=18F4550               ;Microcontrolador a utilizar
    include <P18F4550.inc>          ;Definiciones de constantes


;**********   Palabra de conficuración  *******************************************
    CONFIG FOSC = INTOSC_EC ;INTOSC_EC          ; Internal oscillator                                
    CONFIG PWRT= ON             ; Power-up Timer Enable bit
    CONFIG BOR=OFF              ; Brown-out Reset disabled in hardware and software
    CONFIG WDT=OFF              ; WDT disabled
    CONFIG MCLRE=ON             ; MCLR pin enabled
    CONFIG PBADEN=OFF           ; PORTB<4:0> pins are configured as digital I/O
    CONFIG LVP=OFF              ; Single-Supply ICSP disabled
    CONFIG DEBUG = OFF                  ; Background debugger disabled
    CONFIG XINST = OFF          ; Extended Instruction disabled
;******************************Variables***********************************
    conta equ 0x00

;**********************************************************************************


    org     0x0000      
    movlw   0x62        
    movwf   OSCCON    
    clrf    TRISD      

CICLO   
    bcf PORTD,0         
    call RETARDO
    bsf PORTD,0       
    bcf PORTD,1
    CALL RETARDO

        bcf PORTD,1         
    call RETARDO
    bsf PORTD,1        
    bcf PORTD,2
    CALL RETARDO

        bcf PORTD,2         
    call RETARDO
    bsf PORTD,2      
    bcf PORTD,3
    CALL RETARDO    

        bcf PORTD,3        
    call RETARDO
    bsf PORTD,3       
    bcf PORTD,4
    CALL RETARDO    

        bcf PORTD,4        
    call RETARDO
    bsf PORTD,4      
    bcf PORTD,5
    CALL RETARDO        

        bcf PORTD,5         
    call RETARDO
    bsf PORTD,5       
    bcf PORTD,6
    CALL RETARDO        

        bcf PORTD,6        
    call RETARDO
    bsf PORTD,6       
    bcf PORTD,7
    CALL RETARDO    

        bcf PORTD,7       
    call RETARDO
    bsf PORTD,7   
        bcf PORTD,0
    CALL RETARDO        


bra  CICLO

RETARDO 
    movlw   .255  
    movwf   conta

    CICLO2
         DECFSZ   conta,F  

    bra  CICLO2

    nop
    nop
    nop
    nop



    return 


    end 

Cuando simulo, ese código casi funciona. A veces se encienden y apagan uno tras otro comenzando por el primer LED, pero a veces la secuencia salta y algunos LED aleatorios se encienden inesperadamente.

Traté de agregar esta parte del código antes bra CICLOpara producir el efecto completo de los LED ON, pero solo hizo que se comportara peor.

bcf PORTD,0
bcf PORTD,1
bcf PORTD,2
bcf PORTD,3
bcf PORTD,4
bcf PORTD,5
bcf PORTD,6
CALL RETARDO
bsf PORTD,1
bsf PORTD,2
bsf PORTD,3
bsf PORTD,4
bsf PORTD,5
bsf PORTD,6
bsf PORTD,7
CALL RETARDO

Esta es una foto de mi simulación:

ingrese la descripción de la imagen aquí

¿Qué estoy haciendo mal? ¿Cómo podría asegurarme, trabajando a 4 MhZ, de que los retrasos serán de 1 segundo?

Hola, Diego. Soy un revisor y acabo de rechazar la edición que hiciste en la respuesta de Akintoyeii. No es nada personal, es solo que la forma correcta de informar qué solucionó su problema es publicar su propia respuesta (sí, puede responder su propia pregunta, si eso tiene sentido) o puede publicar un comentario a su respuesta complementando lo que más tenías que hacer para resolver tu problema. Luego, si elige hacerlo, puede editar su propia respuesta.

Respuestas (1)

Intente escribir en los respectivos registros LATDx, use solo PORTD para operaciones de lectura

    bcf LATD,0

Esto debería solucionar tu problema.

@diegoaguilar Tuve que rechazar tu edición como "demasiado radical", a pesar de que la información es útil. En una situación como esta, es mejor publicarlo como un comentario, calificador que como una edición.
Code, que fue propuesto en la edición de Diego, es bcf LATD,xybsf LATD,x