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.
返回
none
示例
const byte ledPin = 13; const byte interruptPin = 2; volatile byte state = LOW; void setup() { pinMode(ledPin, OUTPUT); pinMode(interruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE); } void loop() { digitalWrite(ledPin, state); } void blink() { state = !state; }
中斷引腳
通常您應該使用digitalPinToInterrupt(pin),而不是將中斷號碼直接放入草圖中。 具有中斷的特定引腳及其對中斷號的映射在每種類型的板上都不同。 直接使用中斷號碼可能看起來很簡單,但是當您的草圖在不同的電路板上運行時,可能會導致兼容性問題。
然而,較老的草圖通常具有直接的中斷號碼。 通常使用數字0(對於數字引腳2)或數字1(對於數字引腳3)。 下表顯示了各種電路板上可用的中斷引腳。
請注意,在下表中,中斷號碼是指傳遞給attachInterrupt()的號碼。 由於歷史原因,該編號並不總是直接對應於atmega晶元上的中斷編號(例如,int.0對應於Atmega2560晶元上的INT4)。
Board | int.0 | int.1 | int.2 | int.3 | int.4 | int.5 |
Uno, Ethernet | 2 | 3 | ||||
Mega2560 | 2 | 3 | 21 | 20 | 19 | 18 |
32u4-based (e.g Leonardo, Micro) | 3 | 2 | 0 | 1 | 7 | |
Due, Zero, MKR1000, 101 | interrupt number = pin number |
擴展閱讀
更多建議和問題歡迎反饋至 YFRobot論壇