1. Thiết kế mạch điều khiển động cơ DC-Encoder
1.2.2. Ngắt ngoài trong Arduino
Ngắt (interrupt) là những lời gọi hàm tự động khi hệ thống sinh ra một sự kiện. Những sự kiện này được nhà sản xuất vi điều khiển thiết lập bằng phần cứng và được cấu hình trong phần mềm bằng những tên gọi cố định.
Ngắt giúp chương trình gọn nhẹ và xử lý nhanh hơn. Chẳng hạn, khi kiểm tra 1 nút nhấn có được nhấn hay không, thông thường bạn cần kiểm tra trạng thái nút nhấn bằng hàm digitalRead() trong đoạn chương trình loop(). Với việc sử dụng ngắt, bạn chỉ cần nối nút nhấn đến đúng chân có hỗ trợ ngắt, sau đó cài đặt ngắt sẽ sinh ra khi trạng thái nút chuyển từ HIGH->LOW. Thêm 1 tên hàm sẽ gọi khi ngắt sinh ra. Vậy là xong, biến trong đoạn chương trình ngắt sẽ cho ta biết trạng thái nút nhấn.
Số lượng các ngắt phụ thuộc vào từng dòng vi điều khiển. Với Arduino Uno bạn chỉ có 2 ngắt, Mega 2560 có 6 ngắt và Leonardo có 5 ngắt.
Cú pháp:
attachInterrupt(interrupt, ISR, mode);
Thông số
interrupt: Số thứ tự của ngắt. Trên Arduino Uno, bạn có 2 ngắt với số thứ tự là 0 và 1. Ngắt số 0 nối với chân digital số 2 và ngắt số 1 nối với chân digital số 3.
ISR: tên hàm sẽ gọi khi có sự kiện ngắt được sinh ra. mode: kiểu kích hoạt ngắt, bao gồm
LOW: kích hoạt liên tục khi trạng thái chân digital có mức thấp HIGH: kích hoạt liên tục khi trạng thái chân digital có mức cao.
RISING: kích hoạt khi trạng thái của chân digital chuyển từ mức điện áp thấp sang mức điện áp cao.
35
FALLING: kích hoạt khi trạng thái của chân digital chuyển từ mức điện áp cao sang mức điện áp thấp.
Lưu ý: với mode LOW và HIGH, chương trình ngắt sẽ được gọi liên tục khi chân digital còn giữ mức điện áp tương ứng.
void setup() {
...
attachInterrupt(0, dao, FALLING); ...
}
void dao() // chương trình con ngắt, khi có ngắt xảy ra sẽ thực hiện chương trình này.
{
c=digitalRead(2); //chan ngat -kenh A b=digitalRead(13); //kenh B
if (c==b) a=a-1; // tru bot xung A (nghich)
else a=a+1; // cong them xung cua A (thuan) }