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.