2015-04-09 3 views
1

Я пишу программу, которая будет мигать красным, желтым и зеленым светодиодами вкл. И вкл., Чтобы соответствовать функции светофора. Однако, когда я запускаю его в отладчике и выполняю (я использую MPLAB X IDE), он, кажется, останавливается после вызова функции «LOOP1». Значение, отраженное в PORTD, - это значение, которое оно должно удерживать после завершения LOOP1, а не после завершения LOOP6. Есть идеи?PIC184550: Программа, кажется, завершается при вызове функции

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

ответ

0

Вы пропуск команды возврата в DELAYMAIN, в результате чего выполнения выйти за рамки программы. Остальная часть памяти, вероятно, содержит команды NOP, поэтому управление будет продолжаться до тех пор, пока ПК не обернется до 0 и программа не перезагрузится.

Просто добавьте недостающую команду GOTO (или BRA) после последних DECFSZ, и она должна попасть во второй цикл. Вам также необходимо изменить пункт назначения этого DECFSZ, чтобы записать его в реестр, или он никогда не завершится, когда COUNTER > 1.

Смежные вопросы