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);
}