1.什么是中断?
试想一下,你正在家里吃饭,这时传来了敲门声,虽然你巨饿,虽然面前全是山珍海味,但此时你不得不去开门,同时不得不放停下生命中最重要的事情——吃饭。打开门后,你发现只是一个查水表的,你检查了水表读数并告诉了查水表的人。关上门,你马不停蹄的又投入了于食物的作战中。
我们来分析一下这个颇具传奇性的故事,在这里人生的主旋律——吃饭,就是你的主程序,而敲门声,就是一个中断信号,它让你不得不去执行你的人生插曲——开门接客这个中断函数。完成这个小插曲后,你又要投入到主线剧情 吃饭这个主程序上。
现在我想告诉你一个惊天秘密,其实你妈欺骗了你,你根本不是他们亲生的,你是人造人,而你的大脑里装备了一个arduino控制器!你的型号是 Arduino 吃货,之所以叫这么2的名字,是因为你的loop的写法问题。我们来看看你的loop函数。
void loop() { 吃(); }
吃,是的,你没有看错,你的人生是如此的幸福,就是不断的 吃();循环。
但实际上,你还有附加功能 开门();
void 开门(){ 打开门; if(门口的人==女神) 跪舔(); if(门口的人==查水表的) 报告水表读数(); }
为了让你能顺利执行 开门();动作,你的亲生父母还得在Setup函数中设置 开门();这个动作何时启动。(也可能是你后妈设定的),具体的方法是attachInterrupt(中断通道, 中断函数, 触发方式); ,在这里中断通道就是你的耳朵(不要问为什么不是屁股),触发 开门();这个函数的方式是 敲门声。
void setup(){ attachInterrupt(耳朵, 开门, 敲门声);//耳朵传感器在此不做介绍,有兴趣的自行研究 }
这样设定后,你每次听到敲门声,就不得不去打开门,并执行相应的动作了。
也许你对这样的人物设定不太满意,但这就是你的宿命,少年。
忘记你蛋碎的屌丝设定吧,我们要开始严肃的讨论问题了!
2.各种型号Arduino外部中断引脚
外部中断在不同的Arduino型号上位置也不同,只有外部中断发生在以下端口,Arduino才能捕获到,以下例举了常见的几种型号的外部中断引脚标号。
型号 | int.0 | int.1 | int.2 | int.3 | int.4 | int.5 |
UNO\Ethernet | 2 | 3 | ||||
Mega2560 | 2 | 3 | 21 | 20 | 19 | 18 |
Leonardo | 3 | 2 | 0 | 1 | ||
Due | 所有IO口均可 |
3.中断函数,中断触发模式与设置中断
中断函数就是你要去执行的函数,这个函数不能带任何参数,且没有返回类型。如:
void hello() { Serial.println("hello"); }
中断模式就是你的中断触发方式。在大多数arduino上有以下四种触发方式:
LOW 低电平触发
CHANGE 电平变化,高电平变低电平、低电平变高电平
RISING 上升沿触发
FALLING 下降沿触发
HIGH 高电平触发(该中断模式仅适用于Arduino due)
在定义中断函数后,要使用外部中断,你只需要在程序的Setup部分配置好中断函数即可,配置函数如下:
attachInterrupt(interrupt, function, mode);//interrupt为你中断通道编号,function为中断函数,mode为中断触发模式
需要注意的是在Arduino Due中,中断设置有点不同:
attachInterrupt(pin, function, mode); //due 的每个IO均可以进行外部中断,所以这里第一个参数为pin,即你使用的引脚编号。
如果在程序中途,你不需要使用外部中断了,你可以用中断分离函数 detachInterrupt(interrupt);来取消这一中断设置。
同样在Arduino Due上,该函数为 detachInterrupt(interrupt);。
4.例程
外部中断的使用也是非常简单的,下面我们来看一个官方提供的例程。
int pin = 13; volatile int state = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE);//当int.0电平改变时,触发中断函数blink } void loop() { digitalWrite(pin, state); } void blink()//中断函数 { state = !state; }
使用中断的好处
1、实行分时操作 提高 CPU 的效率 只有当服务对象向 CPU 发出中断申请时才去为它服务。这样我们就可以利用中断功能同时为多个对象服务从而大大提高了CPU的工作效率。
2、实现实时处理
利用中断技术 各个服务对象可以根据需要随时向 CPU 发出中断申请,及时发现和处理中断请求并为。
注意事项
当中断函数发生时,delya()和millis()的数值将不会继续变化。当中断发生时,串口收到的数据可能会丢失。你应该声明一个变量来在未发生中断时储存变量。
重新分配中断
中断可以再任何时候通过attachInterrupt()命令进行改变。当重新使用attachInterrupt()时,先前分配的中断就会从对应引脚上移除。
启用\停止中断
Arduino也可以忽略所有中断。如果你需要在一段代码中不执行中断,只需要执行 noInterrupts()命令。当这段代码执行完以后,你可以使用 interrupts()命令重新启用中断。
删除中断
终端也可以通过detachInterrupt(interrupt_number)命令进行删除。
发表评论
要发表评论,您必须先登录。