Arduino - 中斷
中斷阻止了 Arduino 的當前工作,以便可以完成其他一些工作。
假設你坐在家裡和某人聊天。電話突然響了起來。你停止聊天,拿起電話與來電者通話。當你完成電話交談後,你會在電話響起之前回復與該人聊天。
同樣,你可以將主要函式視為與某人聊天,電話鈴聲會導致你停止聊天。中斷服務程式是通過電話通話的過程。電話會話結束後,你將回到主要的聊天程式。此示例準確說明了中斷如何導致處理器執行操作。
主程式正在執行並在電路中執行某些功能。但是,當發生中斷時,主程式停止,同時執行另一個函式。當該函式完成時,處理器再次返回主程式。
重要特徵
以下是有關中斷的一些重要功能 -
-
中斷可以來自各種來源。在這種情況下,我們使用的硬體中斷由其中一個數字引腳上的狀態更改觸發。
-
大多數 Arduino 設計有兩個硬體中斷(稱為
interrupt0
和interrupt1
)分別硬連線到數字 I/O 引腳 2 和 3。 -
Arduino Mega 有六個硬體中斷,包括引腳 21,20,19 和 18 上的附加中斷(
interrupt 2
到interrupt 5
)。 -
你可以使用稱為“中斷服務程式”(通常稱為 ISR)的特殊函式來定義函式。
-
你可以定義例程並在上升沿,下降沿或兩者中指定條件。在這些特定條件下,中斷將得到響應服務。
-
每次在輸入引腳上發生事件時,都可以自動執行該功能。
中斷的型別
有兩種型別的中斷 -
-
硬體中斷 - 它們響應外部事件而發生,例如外部中斷引腳變為高電平或低電平。
-
軟體中斷 - 它們響應軟體傳送的指令而發生。 “Arduino 語言”支援的唯一中斷型別是
attachInterrupt()
函式。
在 Arduino 中使用中斷
中斷在 Arduino 程式中非常有用,因為它有助於解決時序問題。中斷的一個良好應用的例子是讀取旋轉編碼器或觀察使用者輸入。通常,ISR 應儘可能短且快。如果草圖使用多個 ISR,則一次只能執行一個 ISR。其他中斷將在當前中斷完成之後執行,其順序取決於它們具有的優先順序。
通常,全域性變數用於在 ISR 和主程式之間傳遞資料。要確保正確更新 ISR 和主程式之間共享的變數,請將它們宣告為 volatile。
attachInterrupt
語句語法
attachInterrupt(digitalPinToInterrupt(pin),ISR,mode);//recommended for arduino board
attachInterrupt(pin, ISR, mode) ; //recommended Arduino Due, Zero only
//argument pin: the pin number
//argument 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.
//argument mode: defines when the interrupt should be triggered.
以下三個常量被預定義為有效值 -
-
LOW
,只要引腳為低電平就觸發中斷。 -
CHANGE
當引腳改變值時,就觸發中斷。 -
FALLING
每當引腳由高變為低時。
例
int pin = 2; //define interrupt pin to 2
volatile int state = LOW; // To make sure variables shared between an ISR
//the main program are updated correctly,declare them as volatile.
void setup() {
pinMode(13, OUTPUT); //set pin 13 as output
attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE);
//interrupt at pin 2 blink ISR when pin to change the value
}
void loop() {
digitalWrite(13, state); //pin 13 equal the state value
}
void blink() {
//ISR function
state = !state; //toggle the state when the interrupt occurs
}