打印

系统自动进入中断,求大神帮忙

[复制链接]
533|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huandaczq|  楼主 | 2019-6-20 23:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 huandaczq 于 2019-6-20 23:30 编辑

设置了RB0下降沿中断。且暂时关闭了RB0中断使能.INT0CONbits.INT0IE=0
void key_pressed()   //RB0端口对应的按钮被按下,每次RB0对应的按钮被按下RB0端口被会拉低
{
        while (check==0)
        {
                if (PORTBbits.RB0==0)
                {
                        delay();
                        if (PORTBbits.RB0==0)
                        {      while(!PORTBbits.RB0)
                                delay();  
                                check=1;}
                }
        }
}
RB0中断:
{
      display(3);  //3代表闪3次。同理display(4)代表闪4次.
}
-----------------------------方便阅读的分割线----------------------------
IO口什么设置之类的就不放了,变量(比如上面的check)等初值也不放了。这里统一当init()一笔带过
main()
{
     1.   init();
     2.   key_pressed();       //这一条一定要记住,问题就是这一条出了问题。
     3.   delay(8888);        // 8888是一个虚数,确保出来等待了N秒;
     4.   INT0CONbits.INT0IE=1;        //开启PORTB的下降沿中断。
     5.   while(1);
}
-----------------------------以下是问题分割线--------------------
【比较1】:执行以上5条指令的情况下,12345,在执行完第四条以后,直接进入了中断,闪了3下.然而并未按下RB0对应的按钮。
之前在第二条按下的时候,中断使能INT0IE为0。所以没有进入中断。那么为什么在执行完第四条以后,立刻进入了中断
【比较2】:在去掉第二条指令的情况下,1345这样去执行。执行完4以后,不进入中断,没有闪3下。
在第5条死循环的时候,按下RB0对应的按钮,进入中断。
【问题】:为什么没有key_pressed()的情况下,不会自动进入中断,然而有key_pressed()的情况下会自动进入中断。
最后PS一句:RB0外接电路只有一个按钮。且在3-4之间加过指令if (PORTBbits.RB0==1)    {     display(1);}
说明在开启中断之前,RB0端口一直都是高电平没有错误的。然而一开启使能int0ie,那么问题就想不明白了。同样的代码,只要没有第2条,就 不会自动进入中断。

使用特权

评论回复

相关帖子

沙发
叶春勇| | 2019-6-21 08:24 | 只看该作者
正常,开外部中断前,把外部中断标志位(不是使能位)也清了。如果还发生,检查硬件例如上拉电阻,电容滤波。

使用特权

评论回复
板凳
huandaczq|  楼主 | 2019-6-21 10:55 | 只看该作者
本帖最后由 huandaczq 于 2019-6-21 10:57 编辑
叶春勇 发表于 2019-6-21 08:24
正常,开外部中断前,把外部中断标志位(不是使能位)也清了。如果还发生,检查硬件例如上拉电阻,电容滤波 ...

标志位(int0if)默认是0。问题关键是:
【1】在开使能int0ie之前,   加一个需要按rb0对应键,在开使能后,自动进入中断。
【2】在开使能int0ie之前,不加一个需要按rb0对应键,在开使能后,   不进入中断。
两者区别,只有在软件部分多了一个按键部分,然而该部分为何会让标志位置1?难道芯片默认只要有升降沿(在按下松开的过程,去掉抖动部分也分别有一个上升和下降的过程)自动会置1.不过我感觉你应该是对的。我应该在key_pressed里,跳出while部分加一个标志位int0if清0,应该可以直接解决。

使用特权

评论回复
地板
叶春勇| | 2019-6-21 11:02 | 只看该作者
huandaczq 发表于 2019-6-21 10:55
标志位(int0if)默认是0。问题关键是:
【1】在开使能int0ie之前,   加一个需要按rb0对应键,在开使能后 ...

这个要看datasheet。你清了int0if然后试试。最好配置外置中断的初始化代码写在一起,然后开中断。

使用特权

评论回复
5
huandaczq|  楼主 | 2019-6-21 11:09 | 只看该作者
叶春勇 发表于 2019-6-21 11:02
这个要看datasheet。你清了int0if然后试试。最好配置外置中断的初始化代码写在一起,然后开中断。 ...

是你对的。我刚刚分析也对了。不管使能与否,在io口经历升降沿以后,标志位自动置1.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

186

帖子

0

粉丝