Arduino - Ngắt

Các ngắt dừng công việc hiện tại của Arduino để một số công việc khác có thể được thực hiện.

Giả sử bạn đang ngồi ở nhà, trò chuyện với ai đó. Đột nhiên điện thoại đổ chuông. Bạn ngừng trò chuyện và nhấc điện thoại để nói chuyện với người gọi. Khi bạn kết thúc cuộc trò chuyện qua điện thoại, bạn quay lại trò chuyện với người đó trước khi điện thoại đổ chuông.

Tương tự, bạn có thể nghĩ về thói quen chính là trò chuyện với ai đó, chuông điện thoại khiến bạn ngừng trò chuyện. Quy trình dịch vụ ngắt quãng là quy trình nói chuyện qua điện thoại. Khi cuộc trò chuyện qua điện thoại kết thúc, bạn quay trở lại thói quen trò chuyện chính của mình. Ví dụ này giải thích chính xác cách một ngắt khiến bộ xử lý hoạt động.

Chương trình chính đang chạy và thực hiện một số chức năng trong mạch. Tuy nhiên, khi một ngắt xảy ra, chương trình chính sẽ tạm dừng trong khi một quy trình khác được thực hiện. Khi quy trình này kết thúc, bộ xử lý sẽ quay lại quy trình chính một lần nữa.

Những đặc điểm quan trọng

Dưới đây là một số tính năng quan trọng về ngắt -

  • Ngắt có thể đến từ nhiều nguồn khác nhau. Trong trường hợp này, chúng tôi đang sử dụng ngắt phần cứng được kích hoạt bởi sự thay đổi trạng thái trên một trong các chân kỹ thuật số.

  • Hầu hết các thiết kế Arduino đều có hai ngắt phần cứng (được gọi là "ngắt0" và "ngắt1") được nối với các chân I / O kỹ thuật số 2 và 3 tương ứng.

  • Arduino Mega có sáu ngắt phần cứng bao gồm các ngắt bổ sung ("ngắt 2" đến "ngắt5") trên các chân 21, 20, 19 và 18.

  • Bạn có thể xác định một quy trình bằng cách sử dụng một chức năng đặc biệt được gọi là “Quy trình Dịch vụ Ngắt” (thường được gọi là ISR).

  • Bạn có thể xác định quy trình và chỉ định các điều kiện ở cạnh tăng, cạnh xuống hoặc cả hai. Tại các điều kiện cụ thể này, ngắt sẽ được bảo dưỡng.

  • Có thể có chức năng đó được thực thi tự động, mỗi khi một sự kiện xảy ra trên một chân đầu vào.

Các loại ngắt

Có hai loại ngắt -

  • Hardware Interrupts - Chúng xảy ra để phản ứng với một sự kiện bên ngoài, chẳng hạn như một chân ngắt bên ngoài đi lên cao hoặc thấp.

  • Software Interrupts- Chúng xảy ra để đáp ứng một lệnh được gửi trong phần mềm. Loại ngắt duy nhất mà “ngôn ngữ Arduino” hỗ trợ là hàm đính kèm ().

Sử dụng ngắt trong Arduino

Ngắt rất hữu ích trong các chương trình Arduino vì nó giúp giải quyết các vấn đề về thời gian. Một ứng dụng tốt của ngắt là đọc bộ mã hóa quay hoặc quan sát đầu vào của người dùng. Nói chung, ISR phải ngắn và nhanh nhất có thể. Nếu bản phác thảo của bạn sử dụng nhiều ISR, chỉ một ISR có thể chạy tại một thời điểm. Các ngắt khác sẽ được thực hiện sau khi ngắt hiện tại kết thúc theo thứ tự phụ thuộc vào mức độ ưu tiên mà chúng có.

Thông thường, các biến toàn cục được sử dụng để truyền dữ liệu giữa ISR và chương trình chính. Để đảm bảo các biến được chia sẻ giữa ISR và chương trình chính được cập nhật chính xác, hãy khai báo chúng là biến động.

Cú pháp câu lệnh đính kèm

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.

Ba hằng số sau được xác định trước là giá trị hợp lệ:

  • LOW để kích hoạt ngắt bất cứ khi nào chân ở mức thấp.

  • CHANGE để kích hoạt ngắt bất cứ khi nào chân thay đổi giá trị.

  • FALLING bất cứ khi nào chốt đi từ cao xuống thấp.

Example

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
}