极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9949|回复: 6

求助!奇怪的中断

[复制链接]
发表于 2013-11-8 12:50:28 | 显示全部楼层 |阅读模式
我的想法是使用外部中断作为程序开始和停止的开关,但是遇到一个问题:
在setup里设置了外部中断:attachInterrupt(0, switch_p, FALLING);

中断函数:
void switch_p()           
{
  state = !state;            
  if (state == 1)
  {
    MsTimer2::start();
    Serial.println("Program start");
    Serial.print("state:");
    Serial.println(state);
    digitalWrite(13, 1);
    delay(500);
    digitalWrite(13, 0);
  }
  else
  {
    MsTimer2::stop();
    count=0;
    pic=0;
    Serial.println("Program stop");
    Serial.print("state:");
    Serial.println(state);
    digitalWrite(13, 1);
    delay(500);
    digitalWrite(13, 0);
  }
}


按下按钮一次,执行结果输出是这样:
Program start
state:1
Program stop
state:0
Program start
state:1

再次按下按钮,输出:
Program stop
state:0
Program start
state:1
Program stop
state:0

如果中断设置成:attachInterrupt(0, switch_p, RISING);
无论按几次都输出:
Program start
state:1
Program stop
state:0

请教大家,这是怎么回事?


回复

使用道具 举报

发表于 2013-11-8 15:15:25 | 显示全部楼层
中斷...實在無解
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-9 16:14:16 | 显示全部楼层
继续求助
回复 支持 反对

使用道具 举报

发表于 2013-11-9 16:54:17 | 显示全部楼层
尝试下按键消抖呢

另外尝试下在switch_p() 里先deattach掉中断,等代码执行完毕后重新attach上试试呢
回复 支持 反对

使用道具 举报

发表于 2013-11-9 19:38:38 | 显示全部楼层
你中断使用方法不正确,不应该在任何中断程序里进行任何延时操作,中断程序应该尽量设计的短小精悍,一般中断程序中只标记状态、数据复制等简单操作,然后在main程序里根据状态标记进行数据处理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-11 09:00:41 | 显示全部楼层
pathletboy 发表于 2013-11-9 19:38
你中断使用方法不正确,不应该在任何中断程序里进行任何延时操作,中断程序应该尽量设计的短小精悍,一般中 ...

多谢指点,我试试~
回复 支持 反对

使用道具 举报

发表于 2013-11-12 17:14:32 | 显示全部楼层
官网里面有解释的 延时串口指令在中断里面不能使用
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 07:54 , Processed in 0.047453 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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