2015-04-09 1 views
1

J'écris un programme qui fera clignoter les DEL rouge, jaune et verte pour qu'elles correspondent à la fonction d'un feu de circulation. Cependant, lorsque je l'exécute dans le débogueur et que je l'utilise (j'utilise MPLAB X IDE), il semble s'arrêter après avoir appelé la fonction 'LOOP1'. La valeur reflétée dans PORTD est la valeur à retenir après la fin de LOOP1, plutôt qu'après la fin de LOOP6. Des idées?PIC184550: Le programme semble s'arrêter à la fonction d'appel

list p=18f4550, r=DEC 
 
#include <p18f4550.inc> 
 
CONFIG LVP=OFF 
 
CONFIG WDT=OFF 
 
CONFIG MCLRE=OFF 
 

 
CONFIG FOSC = INTOSCIO_EC 
 

 
    ORG 0x00 
 
    CBLOCK 0 
 
DELAY1:1 
 
DELAY2:1 
 
COUNTER:1 
 
    ENDC 
 

 
START: 
 
    CLRF TRISD 
 
    CLRF PORTD 
 
    CLRF COUNTER 
 
    CLRF DELAY1 
 
    CLRF DELAY2 
 
    MOVLW 0x00 
 

 
PRIMARYLOOP: 
 
    CALL LOOP1 
 
    CALL LOOP2 
 
    CALL LOOP3 
 
    CALL LOOP4 
 
    CALL LOOP5 
 
    CALL LOOP6 
 
    GOTO PRIMARYLOOP 
 

 
LOOP1: 
 
    MOVLW b'00010010' 
 
    MOVWF PORTD 
 
    MOVLW 0x01 
 
    MOVWF COUNTER 
 
    CALL DELAYMAIN 
 
    RETURN 
 
LOOP2: 
 
    MOVLW b'01000010' 
 
    MOVWF PORTD 
 
    MOVLW 0x05 
 
    MOVWF COUNTER 
 
    CALL DELAYMAIN 
 
    RETURN 
 
LOOP3: 
 
    MOVLW b'00100010' 
 
    MOVWF PORTD 
 
    MOVLW 0x03 
 
    MOVWF COUNTER 
 
    CALL DELAYMAIN 
 
    RETURN 
 
LOOP4: 
 
    MOVLW b'00010010' 
 
    MOVWF PORTD 
 
    MOVLW 0x01 
 
    MOVWF COUNTER 
 
    CALL DELAYMAIN 
 
    RETURN 
 
LOOP5: 
 
    MOVLW b'01000010' 
 
    MOVWF PORTD 
 
    MOVLW 0x05 
 
    MOVWF COUNTER 
 
    CALL DELAYMAIN 
 
    RETURN 
 
LOOP6: 
 
    MOVLW b'00100010' 
 
    MOVWF PORTD 
 
    MOVLW 0x03 
 
    MOVWF COUNTER 
 
    CALL DELAYMAIN 
 
    RETURN 
 

 
DELAYMAIN: 
 
    DECFSZ DELAY1,1 
 
    GOTO DELAYMAIN 
 
    DECFSZ DELAY2,1 
 
    GOTO DELAYMAIN 
 
    DECFSZ COUNTER,0,0 
 
    RETURN 
 

 
    END

Répondre

0

Vous êtes sauter l'instruction de retour dans DELAYMAIN, ce qui provoque l'exécution d'aller au-delà du programme. Le reste de la mémoire contient probablement des instructions NOP, donc le contrôle continuera jusqu'à ce que le PC se termine à 0 et le programme redémarre.

Il suffit d'ajouter l'instruction manquante GOTO (ou BRA) après la dernière DECFSZ et il devrait arriver à la deuxième boucle. Vous devez également modifier la destination de ce DECFSZ pour écrire dans le registre, ou il ne finira jamais lorsque .