极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 24182|回复: 10

关于while无限循环的问题

[复制链接]
发表于 2016-3-12 19:45:00 | 显示全部楼层 |阅读模式
        有哪位朋友能告诉我,我下面这段程序为什么实现不了预想的要求。
        我的想法是,主程序的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;                //关闭中断发生标志

}

回复

使用道具 举报

发表于 2016-3-12 21:58:02 | 显示全部楼层
第一行改为如下试试:
  1. 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 会放下所有的事情,转而执行你的中断程序。

回复 支持 反对

使用道具 举报

发表于 2016-3-13 00:36:24 | 显示全部楼层
楼主,不知道你说的实际情况不一样是哪儿不一样,是没有输出SHOW = 1,还是嫌show =1 输出太多了?
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2016-3-13 20:52:29 | 显示全部楼层
你确定你的外部中断信号是一个脉冲么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-13 21:33:32 | 显示全部楼层
补充说明,程序的硬件搭建是在引脚2,也就是外部中断的引脚接一按键,并配上拉电阻。平时是高电平,按键按下后,变低电平,引发中断。中断部分工作正常。
回复 支持 反对

使用道具 举报

发表于 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试试看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-14 18:26:27 | 显示全部楼层
"中断部分工作正常。"  就是当 按下按键后发生中断,中断服务函数里的Serial.print语句输出" show = 1",
说明硬件电路和中断服务部分都 正确。
回复 支持 反对

使用道具 举报

发表于 2016-8-13 16:06:31 来自手机 | 显示全部楼层
while 裡面加 delay
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 03:38 , Processed in 0.037950 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表