【问题标题】:MPLAB, trying to clear a bit but it remains 1MPLAB,试图清零,但仍为 1
【发布时间】:2016-04-24 21:16:09
【问题描述】:

我正在使用 MPLAB 为我的项目编程 PIC16F84A。我有一个汇编代码,其中 RB4-7 位连接到按钮,因此用作输入。实现一个中断子程序来处理任何新的中断(当按下按钮时)。一切正常,当按下按钮时,图片转到指定的子程序。但是现在当我在子程序中时,我必须清除标志(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

【问题讨论】:

  • 如果这是“更改中断”,您需要实际读取端口,即使您不需要知道状态。如果您不这样做,触发中断的逻辑将继续触发。
  • @RogerRowland 是的,这就是问题所在。

标签: interrupt pic mplab


【解决方案1】:

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

此外,数据表指出:

输入引脚(RB7:RB4) 与最后锁存的旧值进行比较 读取 PORTB。 RB7:RB4 的“不匹配”输出 进行或运算以生成 RB 端口更改 中断标志位 RBIF(INTCON)。

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

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 数据表中。

【讨论】:

  • 延迟已经在处理去弹跳效果。而且我已经按照您的建议做了,但是没有用。
  • 清除 RBIF 后,PORTB 上的任何活动都会在硬件中重新设置它。延迟仅在清除 RBIF 之前执行时才有帮助。
  • 是的,你说的是对的,但这不是我的问题。该标志未设置为零。我正在使用刺激来触发中断,并且我正在查看每一步的位,但仍然没有清除 RBIF。
  • @mhmdhsenkamal :我设法重现您的问题并修复它,发布更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
相关资源
最近更新 更多