查看: 10048|回复: 7

Arduino/Genuino101教程——中断的使用

[复制链接]
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2016-8-7 22:13 | 显示全部楼层 |阅读模式
    还没写完!

    之前写过一篇arduino中断教程 http://www.arduino.cn/thread-2421-1-1.html
    本篇是针对Genuino 101重写的中断教程。

           程序运行中,我们时常需要监控一些事件的发生,如对某一传感器的检测结果做出反应。使用轮询的方式检测,效率较低,等待时间较长,而使用中断方式检测,可以到达实时检测的效果。
           如图3-13所示,中断程序可以看作是一段独立于主程序之外的程序,当中断触发时,控制器会暂停当然正在运行的主程序,而跳转去运行中断程序,中断程序运行完后,会再回到之前主程序暂停的位置,继续运行主程序。如此便可做到实时响应处理事件的效果。
    中断.jpg

    3.5.1        外部中断的使用
    外部中断是由外部设备发起请求的中断。要使用外部中断,你需要了解中断引脚的位置,根据你外部设备选择中断模式,并编写一个中断触发后执行的中断函数。

    中断引脚与中断编号
    在不同型号的Arduino控制器上中断引脚的位置也不同,只有中断信号发生在带外部中断功能的引脚上,Arduino才能捕获到这个中断信号并做出响应。

    在Genuino101上的中断使用,和其他Arduino控制器有些许不同:
    其他Arduino只有部分引脚支持外部中断,而Genuino 101所有引脚都支持外部中断;

    在其他型号的Arduino,中断编号和引脚号是不一样的,而在Genuino 101上,中断编号即是引脚编号。

    中断模式
    你还需要了解设备触发外部中断的输入信号类型,以此来设置中断模式。中断模式也就是中断触发的方式。在大多数Arduino上支持表3-4中的四种中断触发方式:

    可用中断模式有如下几种:
    LOW        低电平触发
    HIGH       高电平触发
    CHANGE        电平变化触发,高电平变低电平、低电平变高电平(仅2, 5, 7, 8, 10, 11, 12, 13引脚支持)
    RISING        上升沿触发,低电平变高电平
    FALLING        下降沿触发,高电平变低电平


    中断函数
    你还需要编写一个响应中断的处理程序——中断函数,中断触发后,便让Arduino运行这个函数。中断函数就是当中断触发后要去执行的函数,这个函数不能带任何参数,且返回类型为空,如:

    当中断触发后,Arduino便会执行这个函数中的语句。

    中断初始化
    这些准备工作做好后,我们还需要在Setup() 中,使用attachInterrupt() 函数对中断引脚进行初始化配置,以开启Arduino的外部中断功能,其方法如下:

    参数
    pin:中断引脚。
    ISR:中断函数名。中断触发后,即会运行的函数名称
    mode:中断模式。

    例如:

    该语句即会开启3号引脚上的外部中断功能,并指定下降沿时触发该中断。当3号引脚上电平由高变低后,该中断会被触发,Arduino即会运行Hello() 函数中的语句。

    关闭中断
    如果你不需要使用外部中断了,你可以用中断分离函数detachInterrupt() 来关闭中断功能。

    禁用外部中断。
    参数
    pin:需要禁用中断引脚。




    如果以上内容对你有帮助,你可以通过打赏支持作者
  • TA的每日心情
    擦汗
    2019-2-16 14:22
  • 签到天数: 845 天

    [LV.10]以坛为家III

    发表于 2016-8-7 22:37 | 显示全部楼层
    这个教程讲得太好了,我看到了一个坑
    请PY我
  • TA的每日心情
    擦汗
    2019-1-26 16:31
  • 签到天数: 446 天

    [LV.9]以坛为家II

    发表于 2016-8-7 23:00 | 显示全部楼层
    更新啦。难得速度这么快
    PY让世界更美好~

    该用户从未签到

    发表于 2018-5-30 15:12 | 显示全部楼层
    我想说一下:关闭中断的detachInterrupt(pin),里面的pin不是填引脚,是填中断号。应该是detachInterrupt(digitalPinToInterrupt(interruptPin));
    digitalPinToInterrupt(interruptPin)这个是中断号。
    开启中断函数里面的Pin也是填中断号,不是填引脚号。
    我是新手,至少关闭中断里面经我测试过,填引脚号没用。
    我手上拿着的《Arduino程序设计基础 第一版》里面解释说,开启中断和关闭中断里面填的都是中断号。
    望改正

    点评

    这是101教程,101上是引脚号。 注意看上面教程加粗的内容:  详情 回复 发表于 2018-5-30 19:16
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2018-5-30 19:16 | 显示全部楼层
    藍Cream 发表于 2018-5-30 15:12
    我想说一下:关闭中断的detachInterrupt(pin),里面的pin不是填引脚,是填中断号。应该是detachInterrupt(d ...

    这是101教程,101上是引脚号。
    注意看上面教程加粗的内容:
    在Genuino101上的中断使用,和其他Arduino控制器有些许不同:
    其他Arduino只有部分引脚支持外部中断,而Genuino 101所有引脚都支持外部中断;
    在其他型号的Arduino,中断编号和引脚号是不一样的,而在Genuino 101上,中断编号即是引脚编号。
    1楼有arduino UNO的中断教程
    如果以上内容对你有帮助,你可以通过打赏支持作者

    该用户从未签到

    发表于 2018-7-24 16:50 | 显示全部楼层
    这个中断是异步还是同步的啊

    点评

    arduino编程中没有线程概念  详情 回复 发表于 2018-7-24 17:45
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2018-7-24 17:45 | 显示全部楼层
    bluesky0318 发表于 2018-7-24 16:50
    这个中断是异步还是同步的啊

    arduino编程中没有线程概念
    如果以上内容对你有帮助,你可以通过打赏支持作者

    该用户从未签到

    发表于 2018-7-27 14:06 | 显示全部楼层
    奈何col 发表于 2018-7-24 17:45
    arduino编程中没有线程概念

    是的,我理解错了就是顺序执行的,只是中断响应快一些,谢谢哦
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    博哥零基础教你玩转ESP8266(十三) ESP8266WiFiGeneric库
    博哥零基础教你玩转ESP826
    帖子导航帖 博哥零基础教你玩转ESP8266(一) 重识ESP8266 博哥零基础教你玩转ESP8266
    求助!WeMos D1 WiFi怎么接0.96寸OLED?(ㄒoㄒ)
    求助!WeMos D1 WiFi怎么
    求助!WeMos D1 WiFi怎么接0.96寸OLED?(ㄒoㄒ) 想用WeMos D1 WiFi接收服务器的数据然
    串口发送16进制指令求助
    串口发送16进制指令求助
    我准备串口发出16进制指令到我的外置设备 代码如下图 我分别监控ARDUINO的tx口和USB口
    一文教你选择Arduino开发板,小白进
    一文教你选择Arduino开发
    笔者在2016年接触了Arduino,跳了万条坑,行了千里弯,到今天也算是Arduino的一
    大神们!1602显示屏上的MQ2浓度示数不是实时监测的何解
    大神们!1602显示屏上的MQ
    本人小白,刚刚接触arduino,长时间的查阅资料后,通过复制修改代码接线实现了DHT11实
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表