MPLAB,尝试清除一点,但它仍然是1

时间:2016-04-24 21:16:09

标签: interrupt pic mplab

我正在使用MPLAB为我的项目编程PIC16F84A。我有一个汇编代码,其中RB4-7位连接到按钮,因此用作输入。实现中断子程序以处理任何新的中断(当按下按钮时)。一切正常,当按下按钮时,pic进入指定的子程序。但是现在当我进入子程序时,我必须清除标志(INTCON - RBIF)但它没有被清零,但是清除INTCON寄存器中的任何其他位都能正常工作。那我该怎么办?

这是我的代码:

        ORG     0X00
        GOTO    START
        ORG     0x04
        BTFSC   INTCON,RBIF
        GOTO    RBX_INT
START   CLRF    PORTA
        MOVLW   B'10001000'
        MOVWF   INTCON
        BSF     STATUS,RP0
        CLRF    TRISA
        MOVLW   B'11110000'
        MOVWF   TRISB
        MOVLW   B'10000111'
        MOVWF   OPTION_REG 
        BCF     STATUS,RP0
MAIN    GOTO    MAIN

这是我的子程序:

RBX_INT BCF     INTCON,RBIF
        MOVLW   D'156'
        CALL    DELAY
        RETFIE

1 个答案:

答案 0 :(得分:0)

您应该在从中断返回之前清除该位,否则在delay循环中可能已经发生新的中断,并且RBIF将再次被清除。这是因为按钮反弹(https://en.wikipedia.org/wiki/Switch#Contact_bounce)。

此外,数据表指出:

  

输入引脚(RB7:RB4)   与最后锁定的旧值进行比较   阅读PORTB。 RB7的“不匹配”输出:RB4   OR一起生成RB端口更改   具有标志位RBIF(INTCON< 0>)的中断。

这意味着您必须在清除PORTB之前阅读RBIF以更新锁定值。

RBX_INT 

    MOVFW   PORTB        ;Read PORTB to update the latch.
    MOVLW   D'156'
    CALL    DELAY
    BCF     INTCON,RBIF  ;Clear interrupt flag as close as possible to RETFIE.
    RETFIE

此外,您应该阅读有关中断服务例程的上下文保存/恢复的信息。对于这个例子,重要的不是,因为主循环什么都不做,只是因为中断可以在任何时刻发生,它应该注意保存它使用的所有寄存器和资源,并在退出中断之前恢复它们,以防止破坏任何数据/状态主要的代码路径。

部分
  

6.9   中断期间的上下文保存

在PIC16F84A数据表中。