Mạch Điện

Attachinterrupt là gì ? Hướng dẫn ngắt ( interrupt ) trong Arduino

Hãy xem xét một chiếc ô tô đang di chuyển nhanh, nếu nó bất ngờ bị một chiếc ô tô khác đi ngược chiều đâm vào, điều đầu tiên xảy ra là, cảm biến gia tốc có trong ô tô sẽ cảm nhận được sự giảm tốc đột ngột và kích hoạt ngắt ngoài đối với bộ vi điều khiển có trong xe ô tô. Sau đó dựa vào ngắt đó mà vi điều khiển tạo ra tín hiệu điện để triển khai các túi khí ngay lập tức. Bộ vi điều khiển trong ô tô giám sát nhiều thứ đồng thời như cảm biến tốc độ của xe, kiểm tra các cảm biến khác, kiểm soát nhiệt độ điều hòa, vv Vậy điều gì làm cho túi khí mở đột ngột trong vài giây? Câu trả lời là ngắt ( Attachinterrupt ) , một tín hiệu ngắt được sử dụng ở đây có mức ưu tiên cao nhất. Hãy cùng tham khảo với hocdientu nhé !

Attachinterrupt là gì ? Hướng dẫn ngắt ( interrupt ) trong Arduino
Attachinterrupt là gì ? Hướng dẫn ngắt ( interrupt ) trong Arduino

Một ví dụ đơn giản khác về Ngắt là điện thoại di động màn hình cảm ứng có mức độ ưu tiên cao nhất đối với cảm giác “Chạm”. Hầu hết mọi thiết bị điện tử đều có một số loại ngắt để ‘làm gián đoạn’ quá trình thông thường và thực hiện một số việc ưu tiên cao hơn trong một sự kiện cụ thể. Quá trình thông thường được tiếp tục sau khi cung cấp Gián đoạn.

Vì vậy, về mặt kỹ thuật, Ngắt là một cơ chế mà I / O hoặc lệnh có thể tạm dừng quá trình thực thi bình thường của bộ xử lý và tự nó được phục vụ giống như nó có mức độ ưu tiên cao hơn . Ví dụ, một bộ xử lý đang thực hiện một quá trình bình thường có thể bị ngắt bởi một số cảm biến để thực thi một quá trình cụ thể có trong ISR (Interrupt Service Routine). Sau khi thực thi, bộ xử lý ISR ​​có thể tiếp tục lại quá trình thực thi bình thường.

AttachInterrupt là gì ?

AttachInterrupt là Chỉ định một hàm để gọi khi xảy ra ngắt ngoài. Thay thế bất kỳ chức năng nào trước đó đã được gắn vào ngắt. Hầu hết các bo mạch Arduino đều có hai ngắt bên ngoài: số 0 (trên chân số 2) và số 1 (trên chân số 3). Arduino Mega có thêm bốn số: số 2 (pin 21), 3 (pin 20), 4 (pin 19) và 5 (pin 18)

Các loại interrupt trong Arduino

Có hai loại ngắt:

Ngắt phần cứng ( Hardware Interrupt ): Nó xảy ra khi một sự kiện bên ngoài xảy ra như một chân ngắt ngoài thay đổi trạng thái của nó từ LOW sang HIGH hoặc HIGH thành LOW.

Ngắt phần mềm ( Software Interrupt ): Nó xảy ra theo hướng dẫn từ phần mềm. Ví dụ ngắt Timer là ngắt phần mềm .

Ngắt ( interrupt ) trong Arduino

Bây giờ chúng ta sẽ xem cách sử dụng ngắt trong Arduino . Nó có hai loại ngắt:

  • Ngắt ngoài
  • Ngắt thay đổi chân

Ngắt ngoài:

Ngắt ngoài được thể hiện bằng phần cứng và rất nhanh. ngắt ngoài có thể được thiết lập để kích hoạt trong trường hợp mức RISING hoặc FALLING hoặc LOW .

 Arduino

Các chân ngắt ngoài:

UNO , NANO

2,3

Mega

2,3,18,19,20,21

Ngắt thay đổi chân :

Arduinos có thể kích hoạt nhiều chân ngắt hơn bằng cách sử dụng ngắt thay đổi chân . Trong Arduino ATmega168 / 328, bất kỳ chân nào hoặc tất cả 20 chân tín hiệu đều có thể được sử dụng làm chân ngắt. Chúng cũng có thể được kích hoạt bằng cách sử dụng các cạnh RISING hoặc FALLING.

Sử dụng ngắt ( interrupt ) trong Arduino

Để sử dụng ngắt trong Arduino, cần hiểu các khái niệm sau.

Interrupt Service Routine (ISR) Hay trình xử lý ngắt

Trình xử lý ngắt là một sự kiện có một tập hợp các lệnh nhỏ trong đó. Khi một ngắt ngoài xảy ra, bộ xử lý đầu tiên thực thi những đoạn Code này có trong ISR và trở lại trạng thái mà nó đã rời khỏi quá trình thực thi bình thường.

ISR có câu lệnh sau trong Arduino:

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

digitalPinToInterrupt (pin): Trong Arduino Uno, NANO, các chân được sử dụng để ngắt là 2,3 & trong mega 2,3,18,19,20,21. Chỉ định chân đầu vào được sử dụng cho ngắt ngoài tại đây.

ISR: Là một hàm được gọi khi thực hiện ngắt ngoài.

Mode : Loại chuyển đổi để kích hoạt, ví dụ như giảm, tăng, v.v.

  • RISING: Để kích hoạt ngắt khi chân chuyển từ THẤP đến CAO.
  • FALLING: Để kích hoạt ngắt khi chân chuyển từ CAO xuống THẤP.
  • CHANGE: Để kích hoạt ngắt khi chân chuyển từ THẤP sang CAO hoặc CAO sang THẤP (tức là khi trạng thái chân thay đổi).

Một số điều kiện khi sử dụng ngắt

  • Hàm (ISR) phải càng ngắn càng tốt.
  • Hàm Delay () không hoạt động bên trong ISR và nên tránh điều này.

Trong hướng dẫn về Ngắt Arduino này , một số được tăng dần từ 0 và hai nút nhấn được sử dụng để kích hoạt Ngắt, mỗi nút được kết nối với D2 & D3. Đèn LED được sử dụng để chỉ báo Ngắt. Nếu một nút nhấn được nhấn , đèn LED sẽ BẬT và màn hình hiển thị ngắt 2 và tắt, và khi nhấn một nút nhấn khác , đèn LED sẽ TẮT và màn hình hiển thị ngắt 1 và tắt.

Linh kiện bắt buộc 

  • Arduino (Trong hướng dẫn này, Arduino NANO được sử dụng)
  • Nút ấn – 2
  • LED – 1
  • Điện trở (10K) – 2
  • LCD (16×2) – 1
  • Breadboard
  • Kết nối dây

Sơ đồ mạch Sử dụng ngắt ( interrupt )trong Arduino

Sơ đồ mạch Sử dụng ngắt ( interrupt )trong Arduino
Sơ đồ mạch Sử dụng ngắt ( interrupt )trong Arduino

Kết nối mạch giữa Arduino Nano và màn hình LCD 16×2:

LCD

Arduino Nano

VSS

GND

VDD

+ 5V

V0

Tới chân trung tâm chiết áp

Để kiểm soát độ tương phản của màn hình LCD

RS

D7

RW

GND

E

D8

D4

D9

D5

D10

D6

D11

D7

D12

A

+ 5V

K

GND

Hai nút nhấn được kết nối với Arduino Nano tại chân D2 & D3. Chúng được sử dụng để sử dụng hai ngắt ngoài, một để BẬT LED và một để TẮT LED. Mỗi nút nhấn có một điện trở kéo xuống 10k được nối với đất. Vì vậy, khi nhấn nút nhấn, nó là logic CAO (1) và khi không nhấn, nó là logic THẤP (0). Một điện trở kéo xuống là bắt buộc nếu không sẽ có điện áp trôi ở chân đầu vào D2 & D3.

Đèn LED cũng được sử dụng để cho biết rằng Ngắt đã được kích hoạt hoặc một nút đã được nhấn.

Code ngắt ( Interrupt ) Arduino

Trong hướng dẫn này, một số được tăng từ 0 hiển thị liên tục trong màn hình LCD (16×2) được kết nối với Arduino Nano, bất cứ khi nào nhấn nút nhấn bên trái (chân ngắt D3), đèn LED sẽ BẬT và màn hình hiển thị Interrupt2 và khi nhấn nút nhấn bên phải (chân ngắt D2) được nhấn, đèn LED TẮT và màn hình hiển thị Ngắt 1.

1. Đầu tiên , header file  cho màn hình LCD được bao gồm và sau đó các chân LCD được sử dụng để kết nối với Arduino Nano được xác định.

#include<LiquidCrystal.h>                        
LiquidCrystal lcd (7,8,9,10,11,12); // Define LCD display pins RS, E, D4, D5, D6, D7

2. Bên trong hàm void setup () , trước tiên hãy hiển thị một số thông báo giới thiệu trên màn hình LCD.

 lcd.begin(16,2);                            
 lcd.setCursor(0,0);
 lcd.print("CIRCUIT DIGEST");                                   
 lcd.setCursor(0,1);
 lcd.print("ArduinoInterrupt");
 delay(3000);                                                    
 lcd.clear();  

3. Sau đó, trong cùng một hàm void setup (), các chân đầu vào và đầu ra phải được chỉ định. Chân D13 được kết nối với Cực dương của LED, vì vậy chân này phải được xác định là đầu ra.

pinMode (13, OUTPUT);

4. Bây giờ phần quan trọng chính trong lập trình là hàm attachInterrupt() , nó cũng được bao gồm bên trong void setup ().

attachInterrupt(digitalPinToInterrupt(2),buttonPressed1,RISING); 
attachInterrupt(digitalPinToInterrupt(3),buttonPressed2,RISING); 

Ở đây nó được chỉ định rằng chân 2 dành cho ngắt ngoài và Hàm buttonPressed1 được gọi khi có RISING (THẤP đến CAO) tại chân D2. Và chân 3 cũng dành cho ngắt ngoài và Hàm buttonPressed2 được gọi khi có RISING ở chân D3.

5. Bên trong vòng lặp void (), một số (i) được tăng từ 0 và được in trên màn hình LCD (16×2).

 lcd.clear();                                                  
 lcd.print("COUNTER:");                                          
 lcd.print(i);                                                 
 ++i;                                                           
 delay(1000); 

Trong cùng vòng lặp void (), digitalWrite () được sử dụng trên chân D13 nơi kết nối cực dương của đèn LED. Tùy thuộc vào giá trị trong đầu ra có thể thay đổi , đèn LED sẽ bật hoặc tắt

digitalWrite(13,output);

6. Phần quan trọng nhất là tạo một hàm xử lý ngắt theo tên được sử dụng trong hàm attachmentInterrupt () .

Vì hai chân ngắt được sử dụng 2 và 3 nên cần có hai ISR. Ở đây trong lập trình này ISR sau được sử dụng

buttonPressed1 ():

void buttonPressed1()          
{                   
   output = LOW;               
   lcd.setCursor(0,1);                                         
   lcd.print("Interrupt 1");

}

Hàm này thực hiện khi nhấn nút ấn trên chân D2 (RISING EDGE). Hàm này thay đổi trạng thái của đầu ra thành LOW khiến đèn LED TẮT và in “ngắt 1” trên màn hình LCD.

buttonPressed2 ():

void buttonPressed2()          
{                   
   output = HIGH;              
   lcd.setCursor(0,1);                                         
   lcd.print("Interrupt2");
}

Hàm này thực hiện khi nhấn nút ấn trên chân D3. Hàm này thay đổi trạng thái của đầu ra thành CAO khiến đèn LED BẬT và in “ngắt 2” trên màn hình LCD.

Minh họa Hướng dẫn ngắt ( interrupt ) trong Arduino

1. Khi nhấn NÚT PUSH ở bên trái, đèn LED BẬT và màn hình LCD hiển thị interrupt2.

Minh họa Hướng dẫn ngắt ( interrupt ) trong Arduino
Minh họa Hướng dẫn ngắt ( interrupt ) trong Arduino

2. Khi nhấn NÚT PUSH ở phía bên phải, đèn LED TẮT và màn hình LCD hiển thị interrupt1

Minh họa Hướng dẫn ngắt ( interrupt ) trong Arduino 2
Minh họa Hướng dẫn ngắt ( interrupt ) trong Arduino 2

Đây là cách một Ngắt có thể hữu ích để kích hoạt bất kỳ tác vụ quan trọng nào giữa quá trình thực thi bình thường.

Code ngắt trong Ardunio :


#include<LiquidCrystal.h>                        // Including lcd display library
LiquidCrystal lcd (7,8,9,10,11,12);              // Define LCD display pins RS,E,D4,D5,D6,D7


volatile int output = LOW;                      

int i = 0;   


void setup()                                                      


{

  lcd.begin(16,2);                              //  setting LCD as 16x2 type

  lcd.setCursor(0,0);

  lcd.print("CIRCUIT DIGEST");                                    

  lcd.setCursor(0,1);

  lcd.print("ArduinoInterrupt");

  delay(3000);                                                     

  lcd.clear();                                                    

  pinMode(13,OUTPUT);                                           

                                   

  attachInterrupt(digitalPinToInterrupt(2),buttonPressed1,RISING);  //  function for creating external interrupts at pin2 on Rising (LOW to HIGH)

  attachInterrupt(digitalPinToInterrupt(3),buttonPressed2,RISING);  //  function for creating external interrupts at pin3 on Rising (LOW to HIGH)   

  

}


void loop()                                                      

{  

   lcd.clear();                                                   

   lcd.print("COUNTER:");                                           

   lcd.print(i);                                                  

   ++i;                                                            

   delay(1000);   

   digitalWrite(13,output);     //Turns LED ON or OFF depending upon output value

}


void buttonPressed1()           //ISR function excutes when push button at pinD2 is pressed

{                    

   output = LOW;                //Change Output value to LOW                                

   lcd.setCursor(0,1);                                          

   lcd.print("Interrupt 1");

}


void buttonPressed2()           //ISR function excutes when push button at pinD3 is pressed                             

{                    

   output = HIGH;               //Change Output value to HIGH                                    

   lcd.setCursor(0,1);                                          

   lcd.print("Interrupt2");

}


Video hướng dẫn attachinterrupt mới nhất

Đỗ Thủy Học Điện Tử

Tôi một người đam mê cung cấp kiến thức cuộc sống và kiến thức giáo dục văn học , vật lý , điện tử đến cho mọi người hãy cùng tôi tiếp nhận kiến thức mới nhé !

Trả lời

Email của bạn sẽ không được hiển thị công khai.

Back to top button