Was ist das Problem bei diesem LED-blinkenden PIC18-ASM-Code?

Ich muss das typische Beispiel von 8 LEDs codieren, die ein- und ausgeschaltet werden und dann alle in einer Schleife eingeschaltet werden.

Ich habe einen PIC 18F4550 bekommen und das codiert:

    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 

Wenn ich simuliere, funktioniert dieser Code fast. Manchmal werden sie nacheinander ein- und ausgeschaltet, beginnend mit der ersten LED, aber manchmal springt die Sequenz und einige zufällige LEDs werden unerwartet eingeschaltet.

Ich habe zuvor versucht, diesen Teil des Codes hinzuzufügen, bra CICLOum den gesamten LED-ON-Effekt zu erzeugen, aber es hat nur dazu geführt, dass es sich am schlechtesten verhält.

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

Dies ist ein Bild meiner Simulation:

Geben Sie hier die Bildbeschreibung ein

Was mache ich falsch? Wie kann ich bei 4 MhZ sicherstellen, dass die Verzögerungen 1 Sekunde betragen?

Hallo Diego. Ich bin ein Rezensent und habe gerade die Änderung abgelehnt, die Sie an Akintoyeiis Antwort vorgenommen haben. Es ist nichts Persönliches, es ist nur der richtige Weg, um zu melden, was Ihr Problem behoben hat, dass Sie Ihre eigene Antwort posten (ja, Sie können Ihre eigene Frage beantworten, wenn das Sinn macht) oder Sie können einen Kommentar zu seiner Antwort posten, der ergänzt, was sonst mussten Sie tun, um Ihr Problem zu lösen. Wenn er sich dann dafür entscheidet, kann er seine eigene Antwort bearbeiten.

Antworten (1)

Versuchen Sie, in die entsprechenden LATDx-Register zu schreiben, verwenden Sie nur PORTD für Leseoperationen

    bcf LATD,0

Dies sollte Ihr Problem beheben

@diegoaguilar Ich musste Ihre Bearbeitung als "zu radikal" ablehnen, obwohl die Informationen nützlich sind. In einer solchen Situation ist es besser, es als Kommentar zu posten, anstatt es zu bearbeiten.
Code, der in Diegos Bearbeitung vorgeschlagen wurde, ist bcf LATD,xundbsf LATD,x