Arduino - 中斷

中斷阻止了 Arduino 的當前工作,以便可以完成其他一些工作。

假設你坐在家裡和某人聊天。電話突然響了起來。你停止聊天,拿起電話與來電者通話。當你完成電話交談後,你會在電話響起之前回復與該人聊天。

同樣,你可以將主要函式視為與某人聊天,電話鈴聲會導致你停止聊天。中斷服務程式是通過電話通話的過程。電話會話結束後,你將回到主要的聊天程式。此示例準確說明了中斷如何導致處理器執行操作。

主程式正在執行並在電路中執行某些功能。但是,當發生中斷時,主程式停止,同時執行另一個函式。當該函式完成時,處理器再次返回主程式。

打斷

重要特徵

以下是有關中斷的一些重要功能 -

  • 中斷可以來自各種來源。在這種情況下,我們使用的硬體中斷由其中一個數字引腳上的狀態更改觸發。

  • 大多數 Arduino 設計有兩個硬體中斷(稱為 interrupt0interrupt1)分別硬連線到數字 I/O 引腳 2 和 3。

  • Arduino Mega 有六個硬體中斷,包括引腳 21,20,19 和 18 上的附加中斷(interrupt 2interrupt 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
}