fullmous 发表于 2016-3-12 19:45:00

关于while无限循环的问题

        有哪位朋友能告诉我,我下面这段程序为什么实现不了预想的要求。
        我的想法是,主程序的while循环就等待中断的发生。一旦中断发生就跳出循环。但实际情况不是这样。敬请高人指点。

char show = 0;                //是否发生中断标志字

void setup()                //
{
attachInterrupt(0, int0_isr, FALLING);
Serial.begin(9600);

}
void int0_isr()        //中断服务程序
{
show = 1;        //发生了中断
Serial.print("Show = ");
Serial.println(show,DEC);
}

void loop()        //主程序
{
while(show == 0)                //无限循环,等待中断发生
{
    ;
}
Serial.println("Interrupt!");//报告发生中断
show = 0;                //关闭中断发生标志

}

seesea 发表于 2016-3-12 21:58:02

第一行改为如下试试:volatile char show = 0;                //是否发生中断标志字

老来疯 发表于 2016-3-12 23:29:47

概念错误。

你程序中的中断条件是   attachInterrupt(0, int0_isr, FALLING);   语句中的      0,,FALLING    是条件。 int0_isr是发生中断后要执行的 函数语句。

在 328P中,0(使用数字引脚2)和 1(使用数字引脚3)。FALLING 是当引脚由高电平变为低电平时,触发中断. 你指定了在引脚D2 电平由高变低时 发生 中断,

中断的发生是由后台 自动检测的,不需要你的程序检查,而且你指定的中断 优先级很高,在中断表里好像是第二级,当发生中断时,CPU 会放下所有的事情,转而执行你的中断程序。

164335413 发表于 2016-3-13 00:36:24

楼主,不知道你说的实际情况不一样是哪儿不一样,是没有输出SHOW = 1,还是嫌show =1 输出太多了?

fullmous 发表于 2016-3-13 19:57:18

可能是我没说明。首先,我的意图就是使用外部中断0,下降沿有效。在中断服务函数里,设置show.打印输出语句是调试用的,可以不要。主要是show 平时为0 while 将无限循环,一旦发生中断,show 变为1,while 应跳出循环,继续后面的语句。但实际情况是,运行后,死了。程序很简单,不妨试一下,再做答复。

catnull 发表于 2016-3-13 20:52:29

你确定你的外部中断信号是一个脉冲么?

fullmous 发表于 2016-3-13 21:33:32

补充说明,程序的硬件搭建是在引脚2,也就是外部中断的引脚接一按键,并配上拉电阻。平时是高电平,按键按下后,变低电平,引发中断。中断部分工作正常。

Super169 发表于 2016-3-14 14:23:52

程式看似是沒問題的, 但要肯定接線是否正確, 又或上拉電阻是否真的有效.
你說的 "中断部分工作正常。"是什麼意思?最好把你的 output 貼上來吧.

簡單的可以在 while 之中, 加入 Serial.println(digitalRead(2));看看 D2 的變化, 是否跟你所想的一樣.
如果不是的話, 就可能是線路上有問題.
又或在設定 interrupt 之前, 加上 pinMode(2, INPUT_PULLUP); 使用內部的上拉電阻.

萧芸凤 发表于 2016-3-14 15:10:59

char show = 0;
字符型变量赋值应该是char show =’ 0’;吧
把char改为byte 或者unit_ 8 再或者int试试看

fullmous 发表于 2016-3-14 18:26:27

"中断部分工作正常。"就是当 按下按键后发生中断,中断服务函数里的Serial.print语句输出" show = 1",
说明硬件电路和中断服务部分都 正确。

a1039752256 发表于 2016-8-13 16:06:31

while 裡面加 delay
页: [1]
查看完整版本: 关于while无限循环的问题