0

在我的代码中,我有两个中断,一个来自 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;
        }

     }

}

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

在此处输入图像描述

当我按下其中一个按钮时,倒计时开始并且 LED 亮起直到倒计时结束,如果用户在倒计时仍未达到 0 时按下按钮,它将重新开始,直到倒计时再次达到 0,然后LED 应关闭。

我在这里面临的是,来自 RBIE 的中断只工作一次,第二次按下按钮时,什么也没有发生。

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

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

4

2 回答 2

0

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

于 2021-06-30T05:32:36.180 回答
0

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

该代码使用 MLPAB v8.92 中的模拟器运行,并且当使用模拟器刺激来断言 INT0 中断时,它每次都得到正确处理。

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

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

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

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

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

于 2019-01-21T23:40:16.403 回答