從多個方面詳細闡述Arduino 中斷

一、中斷的基礎知識

1. 中斷定義:中斷是一種計算機系統通信方式,允許計算機處理多個任務並響應外部事件(如硬體終端、軟體信號和外部設備的請求等)。

2. 中斷的分類: 體外中斷和軟體中斷。硬體中斷來源於外部電路的特殊信號,而軟體中斷的來源是程序中定義的需要暫停處理並處理其他東西的信號。

3. 中斷服務函數:中斷髮生後,處理器將立即暫停當前正在執行的程序並轉到中斷服務程序。中斷服務程序完成後,控制權返回到中斷髮生時的點。

二、Arduino 中斷的應用

1. Arduino 上常用的中斷類型

// Attach an interrupt to digital pin 2. Digital pin 2 is the interrupt number!
attachInterrupt(digitalPinToInterrupt(2), myInterruptFunction, CHANGE); 

其中的digitalPinToInterrupt()函數是將Arduino的數字引腳轉換為對應引腳的中斷號。

2. 在Arduino 中斷代碼中的預處理器:

當代碼運行到預處理器是檢測引腳電平狀態的函數實現時,中斷函數將被調用。可以在中斷函數中執行相關的任務。

#define pin 2

void setup() {
  attachInterrupt(digitalPinToInterrupt(pin), ISR_example, CHANGE);
}

void ISR_example() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
}

void loop() {
  // Create a loop to continuously check for the presence of objects, etc.
}

三、Arduino 中斷的共享數據

1. 在中斷服務程序中使用共享變數:

有時,在中斷服務程序和主循環之間需要共享數據,例如,用於記錄推動按鈕的總次數。為了確保共享變數的完整性,需要在訪問其時使用關中斷函數。

 int buttonPushes = 0;
 const byte pushButton = 2;
 int state = LOW;
 unsigned long previousMillis = 0;
 int interval = 1000;

 void setup() {
   pinMode(pushButton, INPUT);
   attachInterrupt(digitalPinToInterrupt(2), buttonISR, RISING);
 }
 
 void loop() {
   unsigned long currentMillis = millis();
   if (currentMillis - previousMillis >= interval) {
     previousMillis = currentMillis;
     Serial.println(buttonPushes);
   }
 }

 void buttonISR() {
   noInterrupts();
   state = digitalRead(pushButton);
   if (state == HIGH) {
     buttonPushes++;
   }
   interrupts();
 }
 

2. 在主程序中使用共享變數:

在進行I\O操作時,可能需要在主程序中訪問中斷服務程序中更新的共享變數。在使用共享變數時,請使用臨界段代碼(關中斷/開中斷)。

volatile int buttonPushes = 0;

void setup() {
  attachInterrupt(digitalPinToInterrupt(2), ISR_example, FALLING);
}

void ISR_example() {
  buttonPushes++;
}

void loop() {
  noInterrupts();
  int localButtonPushes = buttonPushes;
  interrupts();
  Serial.println(localButtonPushes);
}
 

四、中斷 vs 輪詢

中斷和輪詢都是可以在Arduino中檢測IO事件的方法。輪詢要求程序不斷地檢查一個設備,而中斷則可以在發生I\O事件後自動觸發。中斷通常比輪詢處理相同的任務更有效率。但是,中斷不允許程序及時響應,而輪詢可以允許程序及時響應,這取決於每個特定案例的需求。

五、總結

本文詳細闡述了Arduino 中斷的基礎知識,應用方法和與輪詢的比較,並提供相應的代碼示例以方便使用者理解。希望本文能夠幫助各位Arduino開發者更好地使用中斷,在項目中應用中斷的方法,提高開發效率。

原創文章,作者:TRXZZ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/331522.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
TRXZZ的頭像TRXZZ
上一篇 2025-01-20 14:10
下一篇 2025-01-20 14:10

相關推薦

發表回復

登錄後才能評論