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.