Arduino在中断函数里面怎么延时

Arduino在中断函数里面怎么延时

Arduino里面有两种中断,一种是内部中断,就象系统时钟那样,一直在那儿持续,轮询到中断信号,以最高的优先级去执行。另一种是外部中断,输入中断信号,以低于内部中断的优先级去执行。

一般用不上中断,但中断异常重要。因为loop里面的耗时的动作,例如持续不停的for循环,for之外的动作,只能等到for之后再去执行。如果正在for的时候需要另一个紧急任务,或者无条件去执行的任务,就只能使用中断了。中断有些象应急抢险系统,无论什么情况,只要中断信号来了,无条件去执行。

据资料介绍,中断会打断代码的正常执行次序,所以中断函数里不能使用诸如millis()、 delay()等由中断实现的延时函数。

又有资料说可以使用 delayMicroseconds(),因为这个函数与中断无关。但是试用之下,感觉似乎并没有起到延时的作用,很可能它也不能使用。搜索一下有没有人解决这个问题呢,确实有人遇到类似问题,已经解决。

LED发光二极管3只,220R电阻3只,1K电阻1只。

接线如图:

设置997ms轮询1次内部中断,触发则使D1亮2000ms熄灭。电键由打开到闭合,触发则使D2亮2000ms熄灭。接线后,执行代码,D1亮暗几次后,节奏紊乱,说明997ms轮询和2000ms延时有效。电键闭合,若闭合时D3为熄灭状态,D2亮起后,约2000ms后D3重复亮起,说明中断函数中的延时有效。

代码:

#include <MsTimer2.h>//需MsTimer2库
const int led_pin7 = 7;//内部中断LED脚
const int led_pin6 = 6; //外部中断LED脚
const int led_pin5 = 5; //自己闪的LED
const int pinInterrupt = 2;//外部中断信号输入
////////////////////软件延时///////////////////////
#define NOP do { __asm__ __volatile__ ("nop"); } while (0)
#define ulong unsigned long
void delay_(int ms)
{
  for (int i = 0; i < ms; i++)
  {
    for (ulong j = 0; j < 1985; j++) NOP;
  }
}
/////////////////////////////////////////////////
void flash7()
{
  //使用自己的delay_才能正确延时
  static boolean output = HIGH;
  digitalWrite(led_pin7, output);
  delay_(2000);
  output = !output;
}

void flash6()
{
  if ( digitalRead(pinInterrupt) == LOW ) {
    digitalWrite(led_pin6, HIGH);
    delay_(2000);
  }
  else
  {
    digitalWrite(led_pin6, LOW);
  }
}

void setup()
{
  pinMode(led_pin7, OUTPUT);
  pinMode(led_pin6, OUTPUT);
  pinMode(led_pin5, OUTPUT);
  pinMode(pinInterrupt, INPUT);
  //内部中断钩子
  MsTimer2::set(977, flash7); //997毫秒轮询一次
  MsTimer2::start();
  //外部中断钩子
  attachInterrupt( digitalPinToInterrupt(pinInterrupt), flash6, CHANGE);
}

void loop()
{
  digitalWrite(led_pin5, HIGH);
  delay(157);
  digitalWrite(led_pin5, LOW);
  delay(137);
}

(0)

相关推荐