AttachInterrupt()

出自YFRobotwiki
在2017年9月13日 (三) 14:42由Allblue對話 | 貢獻所做的修訂版本

跳轉到: 導覽搜尋

描述

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.


返回



擴展閱讀

- byte




返回Arduino語法參考列表

更多建議和問題歡迎反饋至 YFRobot論壇