查看: 8549|回复: 7

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

[复制链接]
  • TA的每日心情
    奋斗
    2018-8-17 09:12
  • 签到天数: 47 天

    [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运行这个函数。中断函数就是当中断触发后要去执行的函数,这个函数不能带任何参数,且返回类型为空,如:
    [C++] 纯文本查看 复制代码
    void Holle()
    {
    Serial.println("holle");
    }

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

    中断初始化
    这些准备工作做好后,我们还需要在Setup() 中,使用attachInterrupt() 函数对中断引脚进行初始化配置,以开启Arduino的外部中断功能,其方法如下:
    [C++] 纯文本查看 复制代码
    attachInterrupt(pin, ISR, mode) 

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

    例如:
    [C++] 纯文本查看 复制代码
    attachInterrupt(3, Hello, LOW);

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

    关闭中断
    如果你不需要使用外部中断了,你可以用中断分离函数detachInterrupt() 来关闭中断功能。
    [C++] 纯文本查看 复制代码
    detachInterrupt(pin)

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




    如果以上内容对你有帮助,你可以通过打赏支持作者
  • TA的每日心情
    奋斗
    2018-10-17 20:01
  • 签到天数: 831 天

    [LV.10]以坛为家III

    发表于 2016-8-7 22:37 | 显示全部楼层
    这个教程讲得太好了,我看到了一个坑
    请PY我
  • TA的每日心情
    无聊
    2018-10-13 13:00
  • 签到天数: 444 天

    [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-8-17 09:12
  • 签到天数: 47 天

    [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-8-17 09:12
  • 签到天数: 47 天

    [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编程中没有线程概念

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

    本版积分规则

    热门推荐

    体验OneNET,登录就送好礼
    体验OneNET,登录就送好礼
    OneNET--中国移动物联网开发平台,解决协议适配、海量连接、数据存储、设备管理等物
    初学arduino求助
    初学arduino求助
    大佬们,我想问一下,我现在想做一个程序:按下开关持续时间t,延迟7.77t后点亮led0.
    Arduino模拟USB鼠标
    Arduino模拟USB鼠标
    [md]### 模拟鼠标控制 下面将使用摇杆模块和Arduino Leonardo模拟USB鼠标。 [/md] [s
    ATK-esp8266WiFi模块
    ATK-esp8266WiFi模块
    我的esp8266模块以前烧进去过一次,半年没玩了。重新烧就提示错误了[/backcolor] 这是
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表