关于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; //关闭中断发生标志
}
第一行改为如下试试:volatile char show = 0; //是否发生中断标志字 概念错误。
你程序中的中断条件是 attachInterrupt(0, int0_isr, FALLING); 语句中的 0,,FALLING 是条件。 int0_isr是发生中断后要执行的 函数语句。
在 328P中,0(使用数字引脚2)和 1(使用数字引脚3)。FALLING 是当引脚由高电平变为低电平时,触发中断. 你指定了在引脚D2 电平由高变低时 发生 中断,
中断的发生是由后台 自动检测的,不需要你的程序检查,而且你指定的中断 优先级很高,在中断表里好像是第二级,当发生中断时,CPU 会放下所有的事情,转而执行你的中断程序。
楼主,不知道你说的实际情况不一样是哪儿不一样,是没有输出SHOW = 1,还是嫌show =1 输出太多了?
可能是我没说明。首先,我的意图就是使用外部中断0,下降沿有效。在中断服务函数里,设置show.打印输出语句是调试用的,可以不要。主要是show 平时为0 while 将无限循环,一旦发生中断,show 变为1,while 应跳出循环,继续后面的语句。但实际情况是,运行后,死了。程序很简单,不妨试一下,再做答复。 你确定你的外部中断信号是一个脉冲么? 补充说明,程序的硬件搭建是在引脚2,也就是外部中断的引脚接一按键,并配上拉电阻。平时是高电平,按键按下后,变低电平,引发中断。中断部分工作正常。 程式看似是沒問題的, 但要肯定接線是否正確, 又或上拉電阻是否真的有效.
你說的 "中断部分工作正常。"是什麼意思?最好把你的 output 貼上來吧.
簡單的可以在 while 之中, 加入 Serial.println(digitalRead(2));看看 D2 的變化, 是否跟你所想的一樣.
如果不是的話, 就可能是線路上有問題.
又或在設定 interrupt 之前, 加上 pinMode(2, INPUT_PULLUP); 使用內部的上拉電阻.
char show = 0;
字符型变量赋值应该是char show =’ 0’;吧
把char改为byte 或者unit_ 8 再或者int试试看 "中断部分工作正常。"就是当 按下按键后发生中断,中断服务函数里的Serial.print语句输出" show = 1",
说明硬件电路和中断服务部分都 正确。 while 裡面加 delay
页:
[1]