attachInterrupt()
描述
发生中断时指定呼叫一个中断服务程式,替代任何之前带有中断的函式;86Duino 板拥有三个外部中断:No.0 (数位 pin 42) No.1 (数位 pin 43) No.2 (数位 pin 44),下面的表列出各 86Dino 版本可使用的中断 pin 脚。
对应 int.0~5 的 pin 脚列表:
Board | int.0 | int.1 | int.2 | int.3 | int.4 | int.5 |
Zero | 42 | 43 | 44 | |||
One | 42 | 43 | 44 | 18 | 19 | 20 |
EduCake | 42 | 43 | 44 | 18 | 19 | 20 |
PLC | 0 | 2 | 5 | 6 |
对应 int.6~11 的 pin 脚列表:
Board | int.6 | int.7 | int.8 | int.9 | int.10 | int.11 |
Zero | ||||||
One | 33 | 34 | 35 | 36 | 37 | 38 |
EduCake | ||||||
PLC |
注意
中断处理需要越快越好,所以放 delay() 在附加函式中不是一个良好的撰写程式风格。
在附加函式中使用序列埠有可能会漏收资料。
必须将每个附加函式中会被修改到的变数宣告为 volatile,请看下面有关 ISR 的叙述来获得更多资讯。
使用中断
中断在控制器程式中可以自动处理外部发生的事件,也可以帮助处理一些即时性的问题,像是读取轴编码器或是监控使用者输入等等。
一般来说,如果想要确定一支程式总是能接收到轴编码器传来的脉冲,就必须让程式不断的轮询编码感测器而不去做别的事,才能准确接收到编码感测器产生的每一个脉冲;其他的感测器也有类似的动态介面,像是尝试去读取一个声音感测器的声音,或者一个红外线感测闸门感测一枚硬币掉落;在这些应用中,若使用中断就能让控制程式去做主要的事情,同时不会漏掉外部输入。
关于中断服务程式 (ISRs)
ISRs 是一种特别的函式类别,它有许多独特的限制是其他函式所没有的,ISR 不具备任何参数,它们也不会回传任何东西。
一般来说 ISR 要越短、越快越好,如果你的程式码用到多个 ISR 的话,同一时间只有一个会运作,其他的中断会被忽略 (关闭) 直到目前这一个做完。
不像 Arduino,86Duino 的 delay()
和 millis()
函式不依赖中断并且能在 ISR 中正常运作,但是这仍然不是一个良好的撰写程式风格,还是要避免经常在 ISR 中呼叫 delay()
。
在 ISR 和主程式之间用来传递资料的全域变数应该要宣告为 volatile
,来确保在 ISR 中取用的变数有正确更新。
语法
attachInterrupt(interrupt, ISR, mode)
参数
interrupt
: 中断的数字 (int)
ISR
: 当中断发生时会呼叫 ISR;这个函式不需要给予参数,它也不会回传任何东西,这个函式通常被称为中断服务程式。
mode
: 定义中断何时要触发,有预先定义三个有效数值的常数:
CHANGE
在 pin 脚电位改变的边缘触发RISING
在 pin 脚电位从 low 升到 high 的边缘触发FALLING
在 pin 脚电位从 high 降到 low 的边缘触发HIGH
在 pin 脚电位置于 high 时触发LOW
在 pin 脚电位置于 low 时触发
回传
无回传值
范例
int pin = 13; volatile int state = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE); } void loop() { digitalWrite(pin, state); } void blink() { state = !state; }
See also
- detachInterrupt()
本页由热血青年 LBU 译自英文版。
The text of the 86Duino reference is a modification of the Arduino reference, and is licensed under a Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain.