Trong bài viết này Điện Tử Tương Lai sẽ giúp bạn tìm hiểu hàm attachInterrupt là gì và dùng để làm gì.
attachInterrupt được sử dụng để chỉ định một hàm để gọi khi xảy ra ngắt ngoài.
Tham số đầu tiên cho AttachInterrupt () là một số ngắt. Thông thường, bạn nên sử dụng digitalPinToInterrupt (pin) để dịch chân digital thực tế thành số ngắt cụ thể. Ví dụ: nếu bạn kết nối với chân 3, hãy sử dụng digitalPinToInterrupt (3) làm tham số đầu tiên đến attachInterrupt ().
Bo |
Chân digital dùng cho Interrupt |
Uno, Nano, Mini, và các bo khác dựa trên 328 |
2, 3 |
Uno WiFi Rev.2, Nano Every |
tất cả các chân digital |
Mega, Mega2560, MegaADK |
2, 3, 18, 19, 20, 21 |
Micro, Leonardo, và các bo khác dựa trên 32u4 |
0, 1, 2, 3, 7 |
Zero |
tất cả các chân digital, ngoại trừ chân 4 |
Các bo thuộc họ MKR |
0, 1, 4, 5, 6, 7, 8, 9, A1, A2 |
Nano 33 IoT |
2, 3, 9, 10, 11, 13, A1, A5, A7 |
Nano 33 BLE, Nano 33 BLE Sense |
tất cả các chân |
Due |
tất cả các chân digital |
101 |
tất cả các chân digital (Chỉ các chân 2, 5, 7, 8, 10, 11, 12, 13 hoạt động với CHANGE) |
Lưu ý
Bên trong hàm attach, delay () sẽ không hoạt động và giá trị được trả về bởi millis () sẽ không tăng lên. Dữ liệu nối tiếp nhận được khi ở trong hàm có thể bị mất. Bạn nên khai báo volatile bất kỳ biến nào mà bạn sửa đổi trong hàm attach. Xem phần ISR bên dưới để hiểu thêm.
Sử dụng interrupt
Interrupt (ngắt) rất hữu ích để làm cho mọi thứ diễn ra tự động trong các chương trình vi điều khiển và có thể giúp giải quyết các vấn đề về thời gian. Các tác vụ sử dụng interrupt rất tốt như đọc bộ mã hóa quay hoặc giám sát đầu vào của người dùng.
Nếu bạn muốn đảm bảo một chương trình luôn bắt được các xung từ bộ mã hóa quay, và không bỏ lỡ một xung nào, thì sẽ rất khó để viết một chương trình có thể làm những thứ khác, bởi vì chương trình sẽ cần phải liên tục thăm dò các đường cảm biến cho bộ mã hóa, để bắt các xung. Các cảm biến khác cũng có giao diện động tương tự, chẳng hạn như đọc cảm biến âm thanh đang bắt một lần nhấp hoặc cảm biến khe hồng ngoại (bộ ngắt quang) đang bắt một đồng xu rơi. Trong tất cả các tình huống này, việc sử dụng interrupt có thể giải phóng vi điều khiển để hoàn thành một số công việc khác và không bị thiếu đầu vào.
Giới thiệu về ISR
ISR là loại chức năng đặc biệt có một số hạn chế riêng mà hầu hết các chức năng khác không có. ISR không được có bất kỳ tham số nào và nó sẽ không trả về bất kỳ thông số nào.
Nói chung, ISR phải ngắn và nhanh nhất có thể. Nếu sketch của bạn sử dụng nhiều ISR thì chỉ một ISR có thể chạy tại một thời điểm, các interrupt khác sẽ được thực thi sau khi cái hiện tại kết thúc theo thứ tự phụ thuộc vào mức độ ưu tiên. millis () dựa vào các interrupt để đếm, vì vậy nó sẽ không bao giờ tăng bên trong ISR. Vì delay () yêu cầu interrupt hoạt động, nó sẽ không hoạt động nếu được gọi bên trong ISR. micros () hoạt động lúc đầu nhưng sẽ bắt đầu hoạt động thất thường sau 1-2 mili giây. delayMicroseconds () không sử dụng bất kỳ bộ đếm nào, vì vậy nó sẽ hoạt động như bình thường.
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à volatile.
Cú pháp
AttachInterrupt(digitalPinToInterrupt (pin), ISR, mode) (khuyến nghị)
AttachInterrupt(interrupt, ISR, mode) (không được khuyến nghị)
AttachInterrupt (pin, ISR, mode) (Không được khuyến nghị. Ngoài ra, cú pháp này chỉ hoạt động trên Bo mạch Arduino SAMD, Uno WiFi Rev2, Due và 101.)
Thông số
interrupt: số lần ngắt. Các kiểu dữ liệu được phép: int.
pin: số chân Arduino.
ISR: ISR để gọi khi xảy ra ngắt; hàm này không được nhận tham số và không trả về gì. Hàm này đôi khi được gọi là quy trình dịch vụ ngắt.
mode: xác định khi nào ngắt nên được kích hoạt. Bốn hằng số được xác định trước dưới dạng 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ị
RISING kích hoạt khi chân đi từ mức thấp đến mức cao,
FALLING khi chân đi từ mức cao xuống mức thấp.
Các bo mạch Due, Zero và MKR1000 cũng cho phép:
HIGH để kích hoạt ngắt bất cứ khi nào chân ở mức cao.
Return
Không có gì
Code mẫu
Ví dụ sau sẽ nhấp nháy LED bất kỳ lúc nào chân 0 thay đổi từ HIGH sang LOW hoặc ngược lại.
Trong ví dụ này, hàm blink() là trình xử lý ngắt. Bất cứ khi nào trạng thái trên chân 0 thay đổi, blink() sẽ được gọi. Nó phản ứng với sự thay đổi bằng cách thay đổi biến state thành LOW nếu nó ở mức cao và thành HIGH nếu nó ở mức thấp. Sau đó, nó thoát ra, cho phép bo mạch quay trở lại gọi loop (). Vì loop () cài đặt chân LED ở bất kỳ trạng thái nào, việc thay đổi điện áp trên chân 0 sẽ làm bật tắt LED.
Số ngắt
Thông thường, bạn nên sử dụng digitalPinToInterrupt (pin), thay vì đặt một số ngắt trực tiếp vào sketch. Các chân cụ thể với các ngắt và ánh xạ của chúng với số ngắt khác nhau đối với từng loại bo. Việc sử dụng trực tiếp các số ngắt có vẻ đơn giản, nhưng nó có thể gây ra các vấn đề về tương thích khi sketch chạy trên một bo khác.
Các sketch cũ thường có số ngắt trực tiếp. Thường thì số 0 (đối với chân số 2) hoặc số 1 (đối với chân số 3) được sử dụng. Bảng dưới đây trình bày các chân ngắt có trên các bo mạch khác nhau.
Lưu ý rằng trong bảng dưới đây, các số ngắt tham chiếu đến số sẽ được chuyển tới attachInterrupt (). Việc đánh số này không phải lúc nào cũng tương ứng trực tiếp với đánh số ngắt trên chip ATmega (ví dụ: int.0 tương ứng với INT4 trên chip ATmega2560).
Bo |
INT.0 |
INT.1 |
INT.2 |
INT.3 |
INT.4 |
INT.5 |
Uno, Ethernet |
2 |
3 |
||||
Mega2560 |
2 |
3 |
21 |
20 |
19 |
18 |
Các bo dựa trên 32u4 (ví dụ như Leonardo, Micro) |
3 |
2 |
0 |
1 |
7 |
Đối với bo Uno WiFiRev.2, Due, Zero, MKR và 101, số ngắt = số chân.
Hotline: 0979 466 469