attachInterrupt()函数

attachInterrupt()函数介绍


  • attachInterrupt()函数是用于为Arduino开发板设置和执行ISR(中断服务程序)用的。
  • ISR(中断服务程序)顾名思义就是中断Arduino当前正在处理的事情而优先去执行中断服务程序。当中断服务程序完成以后,再回来继续执行刚才执行的事情。中断服务程序对监测Arduino输入有很大的用处
  • 中断函数:
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);
  • 参数:
    pin: 中断引脚号
    ISR: 中断服务程序名
    mode:中断模式
  • 中断模式(mode)有以下几种形式:

LOW: 当引脚为低电平时触发中断服务程序
CHANGE: 当引脚电平发生变化时触发中断服务程序
RISING: 当引脚电平由低电平变为高电平时触发中断服务程序
FALLING: 当引脚电平由高电平变为低电平时触发中断服务程序

  • 返回值

  • 注意
    在ISR(中断服务程序)函数中,delay()函数是不工作的,而且millis()函数返回值也不再增长。在ISR(中断服务程序)运行期间Arduino开发板接收到的串口数据也可能丢失。另外ISR函数里所使用的变量应声明为volatile类型。详情请见以下”关于ISR(中断服务程序)”部分。

  • 使用中断

中断很适合执行那些需要不断检查的工作,比如检查一个引脚上连接的按键开关是否被按下。中断更适用于很快就会消失的信号检查,比如某一个引脚用于检测脉冲信号,这个脉冲信号的持续时间可能十分短暂。如果不使用中断,那么假如Arduino开发板正在执行其它任务时,突然这个脉冲信号来了,还不等Arduino开发板完成正在执行的工作,这个脉冲信号可能就已经消失了。而使用中断,就可以确保这个转瞬即逝的脉冲信号可以很好的被Arduino开发板检测到并执行相应任务。

  • 支持中断的引脚
    在这里插入图片描述

  • 关于ISR(中断服务程序)
    对于Arduino开发板来说,ISR(中断服务程序)是一种特殊的函数。它的特殊意味着它具有其它类型函数所不具备的限制和特点。

  • ISR函数不能有任何参数。ISR也没有任何返回值。

    通常ISR需要越短小精悍越好!另外如果您的代码中有多个ISR函数,那么每次Arduino只能运行一个ISR函数,其它ISR函数只有在当前的ISR函数执行结束以后,才能按照其优先级别顺序执行。

millis()函数的运行依赖Arduino开发板的中断功能,因此ISR函数中的millis()函数是无法正常运行的。micros() 也是类似的情况,它只能在初始的1-2毫秒中可以运行,但是过了这1-2毫秒后就开始出现问题了。 delayMicroseconds() 不需要任何计数器就可以运行,所以delayMicroseconds() 运行是不会受到影响的。

一般情况下,ISR函数与主程序之间传递数据是依靠全局变量来实现的。为了确保全局变量在ISR函数中可以正常的工作,应该将可能被ISR函数中使用的全局变量声明为volatile类型。

  • 示例
const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}

void loop() {
  digitalWrite(ledPin, state);
}

void blink() {
  state = !state;
}

官方链接:https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

  • 6
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: attachInterrupt函数Arduino编程语言中的一个函数,用于将一个中断服务程序(ISR)与一个特定的硬件中断引脚相连。当该引脚上发生中断时,ISR将被调用并执行预定义的操作。该函数的语法为:attachInterrupt(pin, ISR, mode),其中pin是要连接的引脚,ISR是要执行的中断服务程序,mode是中断触发模式,可以是RISING(上升沿触发)、FALLING(下降沿触发)或CHANGE(任何边沿触发)。该函数通常用于处理实时事件,如按钮按下、传感器检测等。 ### 回答2: attachInterrupt()函数Arduino编程中常用的一个中断函数。当某个事件发生时,该函数可以触发一个中断,让Arduino停止执行当前的任务,转而去处理中断事件,从而提高了程序的响应速度和处理能力。 attachInterrupt()函数需要三个参数:中断引脚、中断服务函数中断触发方式。其中,中断引脚是指要监听的引脚,可以是数字引脚(D2~D13)或模拟引脚(A0~A5),中断服务函数是指当中断事件发生时,Arduino要执行的代码块,中断触发方式是指引脚触发中断的条件,可选值包括LOW、CHANGE、RISING和FALLING。 在使用attachInterrupt()函数时,我们需要注意几点。首先,中断服务函数要尽可能简短,避免在中断服务函数中处理过于复杂的任务。其次,因为中断会暂停当前正在执行的代码,在实时性要求较高的项目中,应谨慎使用中断。最后,如果同时使用多个中断,需要注意优先级的设置,避免产生冲突。 总之,attachInterrupt()函数Arduino编程中重要的一个函数,掌握它的使用方法和注意事项,有利于我们更好地利用中断提高程序性能和响应能力。 ### 回答3: attachInterrupt() 是 Arduino 的一个函数,用于将外部中断引脚(INT0、INT1、INT2等)与特定的函数或代码段进行关联,当外部中断触发时,相关的函数或代码段会被执行。 在 Arduino 中,每个外部中断引脚都与一个特定的编号相对应。例如,引脚2连接到INT0中断,引脚3连接到INT1中断,引脚21连接到INT2中断等。当外部中断引脚触发时,相关的中断标志位会被设置,这时 Arduino 会立即停止当前运行的程序,开始执行与该中断标志位关联的代码段或函数,直到代码执行完毕后才会回到原程序并继续运行。 attachInterrupt() 函数有三个参数,其基本语法如下: attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); 其中,digitalPinToInterrupt(pin) 表示将数字引脚转换为中断号,ISR 表示与中断相关联的函数名或代码段,mode 则表示中断触发方式。MODE 可以有以下值: * LOW:当引脚电平为低电平时触发中断。 * CHANGE:当引脚电平变化时触发中断。 * RISING:当引脚电平由低电平变为高电平时触发中断。 * FALLING:当引脚电平由高电平变为低电平时触发中断。 通过使用 attachInterrupt() 函数,我们可以轻松地将外部的事件(如按钮按下,传感器检测到某种信号等)与特定的代码段或函数进行关联,从而提高我们的程序的响应速度,增强其可靠性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值