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.