ndfweb.cn

Arduino定時器中斷attachInterrupt()詳解


2020-02-22 21:17:22 (21910)



說明

attachInterrupt()函數是用於為Arduino開發板設置和執行ISR(中斷服務程序)用的

ISR(中斷服務程序)顧名思義就是中斷Arduino當前正在處理的事情而優先去執行中斷服務程序。當中斷服務程序完成以後,再回來繼續執行剛才執行的事情。中斷服務程序對監測Arduino輸入有很大的用處。

我們可以使用attachInterrupt()函數,利用Arduino的引腳觸發中斷程序。以下列表說明支持中斷的引腳有哪些:

Arduino控製板支持中斷的引腳
Uno, Nano, Mini2, 3
Mega, Mega2560, MegaADK2, 3, 18, 19, 20, 21
Micro, Leonardo0, 1, 2, 3, 7
Zero除4號引腳以外的所有數字引腳
MKR1000 Rev.10, 1, 4, 5, 6, 7, 8, 9, A1, A2
Due所有數字引腳

注意

在ISR(中斷服務程序)函數中,delay()函數是不工作的,而且millis()函數返回值也不再增長。在ISR(中斷服務程序)運行期間Arduino開發板接收到的串口數據也可能丟失。另外ISR函數裏所使用的變量應聲明為volatile類型。詳情請見以下”關於ISR(中斷服務程序)”部分。

使用中斷

中斷很適合執行那些需要不斷檢查的工作,比如檢查一個引腳上連接的按鍵開關是否被按下。中斷更適用於很快就會消失的信號檢查,比如某一個引腳用於檢測脈衝信號,這個脈衝信號的持續時間可能十分短暫。如果不使用中斷,那麼假如Arduino開發板正在執行其它任務時,突然這個脈衝信號來了,還不等Arduino開發板完成正在執行的工作,這個脈衝信號可能就已經消失了。而使用中斷,就可以確保這個轉瞬即逝的脈衝信號可以很好的被Arduino開發板檢測到並執行相應任務。

關於ISR(中斷服務程序)

對於Arduino開發板來說,ISR(中斷服務程序)是一種特殊的函數。它的特殊意味著它具有其它類型函數所不具備的限製和特點。

  • ISR函數不能有任何參數。ISR也沒有任何返回值。

  • 通常ISR需要越短小精悍越好!另外如果您的代碼中有多個ISR函數,那麼每次Arduino隻能運行一個ISR函數,其它ISR函數隻有在當前的ISR函數執行結束以後,才能按照其優先級別順序執行。

  • millis()函數的運行依賴Arduino開發板的中斷功能,因此ISR函數中的millis()函數是無法正常運行的。micros() 也是類似的情況,它隻能在初始的1-2毫秒中可以運行,但是過了這1-2毫秒後就開始出現問題了。 delayMicroseconds() 不需要任何計數器就可以運行,所以delayMicroseconds() 運行是不會受到影響的。

  • 一般情況下,ISR函數與主程序之間傳遞數據是依靠全局變量來實現的。為了確保全局變量在ISR函數中可以正常的工作,應該將可能被ISR函數中使用的全局變量聲明為volatile類型。

如需更多有關中斷方麵的知識,請參考 Nick Gammon’s notes.

語法

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);

參數

pin: 中斷引腳號
ISR: 中斷服務程序名
mode:中斷模式

中斷模式(mode)有以下幾種形式:

LOW: 當引腳為低電平時觸發中斷服務程序
CHANGE: 當引腳電平發生變化時觸發中斷服務程序
RISING: 當引腳電平由低電平變為高電平時觸發中斷服務程序
FALLING: 當引腳電平由高電平變為低電平時觸發中斷服務程序

返回值

示例

const byte ledPin = 13;
 
//用2號引腳作為中斷觸發引腳
const byte interruptPin = 2;  
 
volatile byte state = LOW;
 
void setup() {
  pinMode(ledPin, OUTPUT);
 
  //將中斷觸發引腳(2號引腳)設置為INPUT_PULLUP(輸入上拉)模式
  pinMode(interruptPin, INPUT_PULLUP); 
 
  //設置中斷觸發程序
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}
 
void loop() {
  digitalWrite(ledPin, state);
}
 
//中斷服務程序
void blink() {
  state = !state;
}


注意

  • 在中斷服務程序中,不能使用delay()函數和millis()函數。因為他們無法在中斷服務程序中正常工作。delayMicroseconds()可以在中斷服務程序中正常工作。

  • 中斷服務程序應盡量保持簡單短小。否則可能會影響Arduino工作。

  • 中斷服務程序中涉及的變量應聲明為volatile類型。

  • 中斷服務程序不能返回任何數值。所以應盡量在中斷服務程序中使用全局變量。


本文版权:http://www.ndfweb.cn/news-777.html
  NDF俱乐部
  国际域名注册
  建站咨询
简体中文 NDF网站建设淘宝店 | ICO图标在线生成 | 外贸网站建设 | 联系我们
©2007-2025 NDF Corporation 鲁ICP备08005967号 Sitemap - RSSRSS订阅