第11课 中断程序介绍

我是潘,曾经是个工程师。这是为 Ardui.Co 制作的 “Arduino 公开课” 系列的入门教程。前面我们已经学会了Arduino最基本的使用,现在要介绍一些更高级的玩法:中断,看看怎样打断 Arduino loop() 的循环,去执行其他任务。有任何疑问请在评论区提出,我会逐一回答。

日常生活中,中断是一个很容易理解的概念。比如,正在写这篇教程稿,突然间手机响了,我去接电话,通话完毕,继续写。这个过程就是“中断”和“中断处理”。铃声让我中断当前的工作,去处理更紧急的事情,处理完后,再回头原来的工作。

电话铃响叫做“中断请求”,暂停写稿称为“中断响应”,接电话过程就是“中断处理”。Arduino 执行任务过程中,出现某个事件,转而执行这一事件的程序,执行完后,再回到中断点继续原来的任务,就是中断程序。

为什么要使用中断呢?再举个例子,你来拜访我,但我不知道你何时到达,你到达门口就只能在外面等着。如果门口装个门铃,你按一下门铃,我就会中断当下的工作(比如准备晚餐)去开门,这就避免了等待和浪费时间,提高处理器的执行效率。

产生中断请求的方式,一般有三类:
1、程序或硬件出现异常或故障,称为“异常中断”;
2、程序执行了设定好的中断指令(即定时器),称为“内部中断”;
3、传感器、按钮等外部设备提出中断请求,称为“外部中断”;(没错!开发板上 Reset 按钮就是其一)

这三类中断里面,外部中断最常用也最好理解,内部中断讲起来有点复杂,处理异常中断则是一个严肃的难题。所以遵从从易到难的原则,我们先从外部中断开始介绍。

对大部分 Arduino 来说,要促发外部中断,就要用特定的引脚,不同版本 Arduino 的中断端口的位置、编号也不同。我们一直使用的 Uno ,规定 D2、D3 是中断触发端口,在中断函数的参数里面,编号分别为 0、1。而 Due、101 等版本最厉害,所有端口都可以能触发中断:

更多 Arduino 版本可以参考官方文档

要使用中断程序,可以直接调用 :

attachInterrupt(interrupt, ISR, mode) 

参数含义如下:
interrupt:中断端口编号,Uno 只有0、1(即D2、D3)两个端口
ISR:中断服务程序,即中断后要执行的程序
mode:中断请求的方式,可以设置成下面4种:

LOW 当引脚为低电平时,触发中断
CHANGE 当引脚电平发生改变时,触发中断
RISING 当引脚由低电平变为高电平时,触发中断
FALLING 当引脚由高电平变为低电平时,触发中断

使用 attachInterrupt() 时要注意以下几点:
1、中断函数不能带参数,也没有返回值;
2、中断函数中,delay函数不能使用;
3、读取串口数据的话,可能会丢失(原因后面的课程讲);
4、中断函数里面,使用的变量需要定义为 volatile 型。

这是官方给出的例子:

根据官方文档建议,采用 digitalPinToInterrupt(pin) 可以自动识别不同版本的 Arduino,自动映射中断端口。比如,interruptPin 设置为 D2,在 Uno 上自动映射为中断端口 0,在 Leonardo 上自动映射为1,非常方便,且提高了程序兼容性。

在下一节课,我们将以实际例子来介绍外部中断的应用。

Leave a Reply

Your email address will not be published. Required fields are marked *