AttachInterrupt()
描述
Digital Pins With Interrupts
attachInterrupt的第一个参数是中断号。 通常,您应该使用digitalPinToInterrupt(引脚)将实际的数字引脚转换为特定的中断号。 例如,如果连接到引脚3,则使用digitalPinToInterrupt(3)作为attachInterrupt的第一个参数。
Board | Digital Pins Usable For Interrupts |
Uno, Nano, Mini, other 328-based | 2, 3 |
Mega, Mega2560, MegaADK | 2, 3, 18, 19, 20, 21 |
Micro, Leonardo, other 32u4-based | 0, 1, 2, 3, 7 |
Zero | all digital pins, except 4 |
MKR1000 Rev.1 | 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 |
Due | all digital pins |
101 | all digital pins (Only pins 2, 5, 7, 8, 10, 11, 12, 13 work with CHANGE |
注意:在附加函数中,delay()将不起作用,并且由millis()返回的值不会递增。 在功能中接收的串行数据可能会丢失。 你应该声明一个变量在未发生中断时储存变量。 有关详细信息,请参阅下面的ISR部分。
使用中断
中断对于在微控制器程序中自动执行事件非常有用,并且可以帮助解决计时问题。 使用中断的良好任务可能包括读取旋转编码器或监视用户输入。
如果你想确保一个程序总是从旋转编码器捕获脉冲,这样就不会错过脉冲,所以编写一个程序来做任何其他事情会变得非常棘手,因为程序需要不断地轮询传感器 用于编码器的线,以便在发生时捕获脉冲。 其他传感器也具有类似的界面动态,例如尝试读取试图抓住咔嗒声的声音传感器,或者试图抓住硬币丢失的红外线槽传感器(光电断路器)。 在所有这些情况下,使用中断可以释放微控制器以完成其他工作,而不会丢失输入。
关于中断服务程序
ISR是特殊的功能,它们具有大多数其他功能没有的独特的限制。 ISR不能有任何参数,它们不应该返回任何东西。
一般来说,ISR应尽可能短且快。 如果您的草图使用多个ISR,则一次只能运行一次,其他中断将在当前操作完成后依照其所拥有的优先级执行。 millis()依赖于中断计数,所以它不会在ISR内增加。 由于delay()要求中断工作,所以如果在ISR内部调用,它将不起作用。 micros()最初工作,但会在1-2毫秒后开始行为不规律。 delayMicroseconds()不使用任何计数器,因此它将正常工作。
通常,全局变量用于在ISR和主程序之间传递数据。 为了确保ISR和主程序之间共享的变量被正确更新,请将其声明为 volatile。
有关中断的更多信息,请参阅Nick Gammon的笔记。
语法
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); (recommended) attachInterrupt(interrupt, ISR, mode); (not recommended) attachInterrupt(pin, ISR, mode) ; (not recommended Arduino Due, Zero, MKR1000, 101 only)
参数
- interrupt: the number of the interrupt (int)
- pin: the pin number (Arduino Due, Zero, MKR1000 only)
- ISR: the ISR to call when the interrupt occurs; this function must take no parameters and return nothing. This function is sometimes referred to as an interrupt service routine.
- mode: defines when the interrupt should be triggered. Four constants are predefined as valid values:
- - LOW to trigger the interrupt whenever the pin is low,
- - CHANGE to trigger the interrupt whenever the pin changes value
- - RISING to trigger when the pin goes from low to high,
- - FALLING for when the pin goes from high to low.
- The Due board allows also:
- - HIGH to trigger the interrupt whenever the pin is high.
返回
扩展阅读
- - byte
更多建议和问题欢迎反馈至 YFRobot论坛