YFROBOT创客社区

标题: Arduino入门教程—拓展实验篇六 外部中断的使用 [打印本页]

作者: AllBlue    时间: 2013-6-19 19:37
标题: Arduino入门教程—拓展实验篇六 外部中断的使用
本帖最后由 AllBlue 于 2013-8-29 16:16 编辑

外部中断的使用

1、什么是中断呢?

可以举一个日常生活中的例子来说明,假如你正在给朋友写信,电话铃响了。这时,你放下手中的笔,去接电话。通话完毕,再继续写信。这个例子就表现了中断及其处理过程:电话铃声使你暂时中止当前的工作,而去处理更为急需处理的事情(接电话),把急需处理的事情处理完毕之后,再回头来继续原来的事情。

在这个例子中,电话铃声称为“中断请求”,你暂停写信去接电话叫作“中断响应”,接电话的过程就是“中断处理”,相应地,在计算机执行程序的过程中,由于出现某个特殊情况(或称为“事件”),使得暂时中止现行程序,而转去执行处理这一事件的处理程序,处理完毕之后再回到原来程序的中断点继续向下执行,这个过程就是中断

2、那我们为什么要使用中断呢?

再举一个例子,假设你有一个朋友来拜访你,但是由于不知道何时到达,你只能在大门等待,于是什么事情也干不了。如果在门口装一个门铃,你就不必在门口等待而去干其它的工作,朋友来了按门铃通知你,你这时才中断你的工作去开门,这样就避免等待和浪费时间,同样它能使得CPU的效率大大提高。

3、中断是怎样分类的呢?

产生中断请求的设备或事件称为“中断源”。从中断源来看,中断一般可分为三类:

      (1)由计算机硬件异常或故障引起的中断,也称为内部异常中断

             (2)由程序中执行了中断指令引起的中断,也称为软中断

      (3)外部设备(如输入输出设备)请求引起的中断,也称为外部中断I/O中断

在这三类中断中,外部中断我们接触得最多,好了中断相信介绍到这,大家了解的也差不多了~~~

下面我们就来介绍下Arduino的外部中断使用!

外部中断在不同的Arduino型号上位置也不同,只有外部中断发生在以下端口,Arduino才能捕获到,大部分Arduino控制板上有两个外部中断:数字0(数字端口2)和数字1(数字端口3),以下是常见的几种型号的外部中断引脚标号。
[attach]396[/attach]

Arduino Due 控制板的中断功能很强大,它的每个引脚都可以使用中断。
语法 :

attachInterrupt(interrupt, function, mode)

attachInterrupt(pin, function, mode)(只适用于 Arduino Due )

参数:

interrupt:中断引脚数

pin:  the pin number 可以直接使用引脚号 (只适用于 Arduino Due)

function:中断发生时调用的函数,此函数必须不带参数和不返回任何值。该函数有时被称为中断服务程序。

mode:定义何时发生中断以下四个contstants预定有效值:

       LOW           当引脚为低电平时,触发中断

       CHANGE     当引脚电平发生改变时,触发中断

       RISING       当引脚由低电平变为高电平时,触发中断

       FALLING     当引脚由高电平变为低电平时,触发中断
              HIGH          当引脚为高电平时,触发中断 (只适用于 Arduino Due)

在使用attachInterrupt函数时要注意以下几点:

中断函数是没有返回值的;

在中断函数中delay函数不能使用;

读取串口数据的话,可能会丢失;

中断函数中使用的变量需要定义为volatile型。

关闭中断

当然如果你在程序中某段不需要中断,也可以使用函数detachInterrupt(interrupt)来关闭设定的中断;在使用Arduino Due控制板时,我们可以使用detachInterrupt(pin)。(参数同上)

下面我们看下官方给出的例子:

  1. int pin = 13;
  2. volatile int state = LOW;

  3. void setup()
  4. {
  5. pinMode(pin, OUTPUT);
  6. attachInterrupt(0, blink, CHANGE);//当int.0电平改变时,触发中断函数blink
  7. }

  8. void loop()
  9. {
  10. digitalWrite(pin, state);
  11. }

  12. void blink()//中断函数
  13. {
  14. state = !state; //状态改变
  15. }
复制代码

外部中断的应用还是很多的,大家在以后编写程序中可以用在程序中,来提高程序的效率~


作者: wqb123    时间: 2014-1-6 12:34
这个如果是arduino mini怎么使用attachInterrupt(interrupt, function, mode)  这个interrupt代表了什么?
作者: AllBlue    时间: 2014-1-6 14:40
wqb123 发表于 2014-1-6 12:34
这个如果是arduino mini怎么使用attachInterrupt(interrupt, function, mode)  这个interrupt代表了什么?

中断引脚:0 -- 2号引脚
               1 -- 3号引脚
作者: cjt880    时间: 2018-8-6 18:25
不错的基础东西。值得赞啦
作者: 1610092227    时间: 2019-1-27 16:12
AllBlue 发表于 2014-1-6 14:40
中断引脚:0 -- 2号引脚
               1 -- 3号引脚

还是没有明白0和1是什么意思
作者: AllBlue    时间: 2019-1-29 14:41
1610092227 发表于 2019-1-27 16:12
还是没有明白0和1是什么意思

你结合代码就知道了

attachInterrupt(0, blink, CHANGE);//当int.0电平改变时,触发中断函数blink

作者: zh68a11    时间: 2019-12-2 22:15
不错的基础东西。学习了。




欢迎光临 YFROBOT创客社区 (http://yfrobot.com.cn/) Powered by Discuz! X3.1