PIC184550:程序似乎在呼叫功能处终止

时间:2015-04-09 21:40:55

标签: microcontroller mplab microprocessors pic18

我正在编写一个程序,它会关闭和打开红色,黄色和绿色LED,以匹配交通信号灯的功能。但是,当我在调试器中运行它并逐步执行(我使用的是MPLAB X IDE)时,它似乎在调用函数'LOOP1'后停止。 PORTD中反映的值是LOOP1完成后应保留的值,而不是LOOP6完成后的值。有什么想法吗?

 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

1 个答案:

答案 0 :(得分:0)

您正在跳过DELAYMAIN中的返回指令,导致执行超出程序范围。其余的内存可能包含NOP指令,因此控制将继续,直到PC回绕到0并且程序重新启动。

只需在最后GOTO之后添加缺少的BRA(或DECFSZ)指令,它就应该进入第二个循环。您还需要更改DECFSZ的目的地以写入寄存器,或者在COUNTER > 1时永远不会完成。