考慮一輛快速行駛的汽車,如果它突然被相反方向的另一輛車撞到,首先發生的事情是,汽車中的加速度計傳感器感應到突然減速并觸發微控制器的外部中斷車。然后基于該中斷,微控制器產生電信號以立即展開安全氣囊。汽車中的微控制器同時監控許多事情,例如感應汽車的速度、檢查其他傳感器、控制空調溫度等。那么是什么讓安全氣囊在幾秒鐘內突然打開?答案是中斷,這里使用了一個具有最高優先級的中斷信號。
中斷的另一個簡單示例是對“觸摸”感具有最高優先級的觸摸屏手機。幾乎每個電子設備都有某種中斷來“中斷”常規過程并在特定事件上執行一些更高優先級的事情。服務中斷后恢復常規進程。
因此從技術上講,中斷是一種機制,通過該機制,I/O 或指令可以暫停處理器的正常執行并像它具有更高的優先級一樣讓自己得到服務。例如,執行正常執行的處理器可能會被某個傳感器中斷以執行 ISR(中斷服務程序)中存在的特定進程。執行完 ISR 處理器可以再次恢復正常執行。
中斷類型
有兩種類型的中斷:
硬件中斷:當外部事件發生時發生,例如外部中斷引腳將其狀態從 LOW 變為 HIGH 或 HIGH 變為 LOW。
軟件中斷:根據軟件的指令發生。例如定時器中斷是軟件中斷。
Arduino中的中斷
現在我們將了解如何在 Arduino Board中使用中斷。它有兩種類型的中斷:
外部中斷
引腳變化中斷
外部中斷:
這些中斷由硬件解釋并且非常快。這些中斷可以設置為在 RISING 或 FALLING 或 LOW 電平的事件上觸發。
引腳變化中斷:
Arduinos 可以通過使用引腳更改中斷來啟用更多的中斷引腳。在基于 ATmega168/328 的 Arduino 板上,任何引腳或所有 20 個信號引腳都可以用作中斷引腳。它們也可以使用上升沿或下降沿觸發。
在 Arduino 中使用中斷
為了在 Arduino 中使用中斷,需要了解以下概念。
中斷服務程序 (ISR)
中斷服務程序或中斷處理程序是一個包含少量指令的事件。當發生外部中斷時,處理器首先執行 ISR 中存在的這些代碼,然后返回到它離開正常執行的狀態。
ISR在 Arduino 中具有以下語法:
attachInterrupt(digitalPinToInterrupt(pin),ISR,模式);
digitalPinToInterrupt(pin):在 Arduino Uno、NANO 中,用于中斷的引腳為 2,3 和 mega 2,3,18,19,20,21。在此處指定用于外部中斷的輸入引腳。
ISR:外部中斷完成時調用的函數。
模式:要觸發的轉換類型,例如下降、上升等。
RISING:當引腳從低電平變為高電平時觸發中斷。
FALLING:當引腳從 HIGH 變為 LOW 時觸發中斷。
CHANGE:當引腳從 LOW 變為 HIGH 或 HIGH 變為 LOW 時觸發中斷(即當引腳狀態發生變化時)。
使用中斷時的一些條件
中斷服務程序功能 (ISR) 必須盡可能短。
Delay() 函數在 ISR 中不起作用,應避免使用。
在這個Arduino 中斷教程中,一個數字從 0 開始遞增,兩個按鈕用于觸發中斷,每個按鈕都連接到 D2 和 D3。LED 用于指示中斷。如果按下一個按鈕,LED 亮起,顯示屏顯示中斷 2 并熄滅,當按下另一個按鈕時,LED 熄滅,顯示屏顯示中斷 1 并熄滅。
所需組件
Arduino 板(在本教程中使用 Arduino NANO)
按鈕 - 2
LED - 1
電阻器 (10K) - 2
液晶顯示器 (16x2) - 1
面包板
連接電線
電路原理圖
Arduino Nano 和 16x2 LCD 顯示器之間的電路連接:
兩個按鈕在引腳 D2 和 D3 處連接到 Arduino Nano。它們用于使用兩個外部中斷,一個用于打開 LED,另一個用于關閉 LED。每個按鈕都有一個接地的 10k下拉電阻。因此,按下按鈕時為邏輯高(1),未按下時為邏輯低(0)。下拉電阻是強制性的,否則輸入引腳 D2 和 D3 處會有浮動值。
LED還用于指示已觸發中斷或已按下按鈕。
Arduino中斷編程
在本教程中,一個數字從 0 開始遞增,該數字在連接到 Arduino Nano 的 (16x2) LCD 中連續顯示,每當按下左按鈕(中斷引腳 D3)時,LED 亮起并顯示 Interrupt2,當右按鈕時(中斷引腳 D2)被按下,LED 熄滅,顯示屏顯示 Interrupt1。
本教程末尾提供了帶有工作視頻的完整代碼。
1. 首先包含 LCD 顯示器的頭文件,然后定義用于連接 Arduino Nano 的 LCD 引腳。
#includeLiquidCrystal lcd (7,8,9,10,11,12); //定義LCD顯示引腳RS、E、D4、D5、D6、D7
2.在 void setup()函數中,首先在 LCD 顯示屏上顯示一些介紹信息。在此處了解有關將LCD 與 Arduino 連接的更多信息。
lcd.開始(16,2); lcd.setCursor(0,0); lcd.print("電路文摘"); lcd.setCursor(0,1); lcd.print("ArduinoInterrupt"); 延遲(3000); lcd.clear();
3. 然后在同一個 void setup() 函數中必須指定輸入和輸出引腳。引腳 D13 連接到 LED 的陽極,因此該引腳必須定義為輸出。
pinMode(13,輸出);
4. 現在編程中最重要的部分是attachInterrupt()函數,它也包含在void setup()中。
attachInterrupt(digitalPinToInterrupt(2),buttonPressed1,RISING); attachInterrupt(digitalPinToInterrupt(3),buttonPressed2,RISING);
這里指定引腳 2 為外部中斷,當 D2 引腳有 RISING(低到高)時調用buttonPressed1函數。并且引腳 3 也用于外部中斷,當 D3 引腳有 RISING 時調用 buttonPressed2 函數。
5.在 void loop() 內部,一個數字 (i) 從零遞增并打印在 LCD(16x2) 上。
lcd.clear(); lcd.print("計數器:"); lcd.print(i); ++i; 延遲(1000);
在同一個 void loop() 中,digitalWrite()用于連接 LED 陽極的引腳 D13。根據可變輸出中的值LED 將打開或關閉
數字寫入(13,輸出);
6. 最重要的部分是根據attachInterrupt()函數中使用的名稱創建一個中斷處理函數。
由于使用了兩個中斷引腳 2 和 3,因此需要兩個 ISR。在此編程中,使用了以下 ISR
buttonPressed1():
無效 buttonPressed1() { 輸出 = 低; lcd.setCursor(0,1); lcd.print("中斷 1"); }
當按下引腳 D2 上的按鈕時(上升沿)執行此功能。此功能將輸出狀態更改為低電平,導致 LED 關閉并在 LCD 顯示屏上打印“interrupt1”。
buttonPressed2():
無效按鈕Pressed2() { 輸出=高; lcd.setCursor(0,1); lcd.print("中斷2"); }
當按下引腳 D3 上的按鈕時執行此功能。此功能將輸出狀態更改為高電平,導致 LED 亮起并在 LCD 顯示屏上打印“interrupt2”。
Arduino 中斷演示
1. 按下左側的PUSH BUTTON 時,LED 亮起,LCD 顯示Interrupt2。
2.當按下右側的PUSH BUTTON時,LED熄滅,LCD顯示Interrupt1
這就是中斷在正常執行之間觸發任何重要任務的有用方式。
//使用 Arduino 中斷
//電路文摘
#include
LiquidCrystal lcd(7,8,9,10,11,12); // 定義 LCD 顯示引腳 RS,E,D4,D5,D6,D7
volatile int 輸出 = 低;
詮釋 i = 0;
無效設置()
{
lcd.begin(16,2); // 將 LCD 設置為 16x2 類型
lcd.setCursor(0,0);
lcd.print("電路文摘");
lcd.setCursor(0,1);
lcd.print("ArduinoInterrupt");
延遲(3000);
lcd.clear();
pinMode(13,輸出);
attachInterrupt(digitalPinToInterrupt(2),buttonPressed1,RISING);// 用于在上升沿(從低到高)的 pin2 處創建外部中斷的函數
attachInterrupt(digitalPinToInterrupt(3),buttonPressed2,RISING); // 用于在上升沿(從低到高)的 pin3 上創建外部中斷的函數
}
無效循環()
{
lcd.clear();
lcd.print("計數器:");
lcd.print(i);
++i;
延遲(1000);
數字寫入(13,輸出);//根據輸出值打開或關閉 LED
}
void buttonPressed1() //按下 pinD2 上的按鈕時執行 ISR 函數
{
output = LOW; //將輸出值更改為低
lcd.setCursor(0,1);
lcd.print("中斷 1");
}
void buttonPressed2() //按下 pinD3 上的按鈕時執行 ISR 函數
{
output = HIGH; //將輸出值更改為
高 lcd.setCursor(0,1);
lcd.print("中斷2");
}
-
中斷
+關注
關注
5文章
898瀏覽量
41474 -
Arduino
+關注
關注
188文章
6469瀏覽量
186963 -
中斷編程
+關注
關注
0文章
5瀏覽量
7388
發布評論請先 登錄
相關推薦
評論