RBIE中断仅工作一次-PIC16F877A

时间:2019-01-20 20:12:32

标签: c interrupt pic mikroc

在我的代码中,我有两次中断,一次是由于TMR0的溢出引起的,另一次是当按下按钮时发生的。

这是MikroC中的代码:

int compt = 0;
int seconds = 10 ;
int enable = 0;

void interrupt(){

     if (INTCON.INTF) {
        PORTD = 9;
        enable = 1;
        seconds = 10;
        INTCON.INTF = 0;
     }

     if (INTCON.TMR0IF) {
        compt++;
        INTCON.TMR0IF  = 0;
        TMR0 = 0x06;
     }
}


void main() {

     TRISB = 0x01;
     PORTB = 0;

     PORTD = 0;
     TRISD = 0x00;


     INTCON = 0xB0;
     OPTION_REG = 0x44;
     TMR0 = 0x06;

     while(1){

        if (compt == 625){
           if (enable) seconds--;
           compt = 0;
        }

        if (seconds > 0 && enable == 1) {
           PORTD = seconds;
           PORTB.RB1 = 1;
        }  else {
            enable = 0;
            PORTB.RB1 = 0;
            PORTD = 0;
        }

     }

}

我要用代码实现的目标如下图所示:

enter image description here

当我按下其中一个按钮时,倒数开始,并且LED亮起直到倒数结束;如果用户在倒数仍未达到0的情况下按下按钮,则它将重新开始,直到倒数达到0再次,然后指示灯应该熄灭。

我在这里面对的是,RBIE的中断只能运行一次,第二次按下按钮时,什么也没有发生。

我不确定TMR0F是否与此有关,尝试了许多尝试,但无法使其正常工作。

我希望你能看到我没注意到的东西,并帮助我。

2 个答案:

答案 0 :(得分:0)

发布的代码在使用MikroC进行编译时不会发出警告或错误。

该代码使用MLPAB v8.92中的模拟器运行,并且当使用模拟器激励来声明INT0中断时,每次都会对其进行正确处理。

您的电路图看起来像是使用Proteus创建的,也许该模拟器的工作方式存在问题。

我能找到的唯一可疑的设置是为PORTB启用了弱上拉功能,但是您的电路图在INT0(RB0)引脚中有一个10K欧姆的下拉电阻。

我建议将OPTION_REG的第8位设置为1,以关闭PORTB上拉电阻。

抱歉,我的回答还不确定,但是我无法从发布的信息中重现您的问题。

似乎也有人在StackExchange上问过这个问题。

答案 1 :(得分:0)

您已启用内部弱上拉电阻并在引脚 RB0 上连接下拉电阻,不需要外部电阻,您还需要在按下按钮后提供一些延迟(约 300 毫秒)。