Chương trình phục vụ ngắt nhận có thuật toán tương tự chương trình xử lý phím. Thuật toán chương trình phục vụ ngắt nhận được thể hiện trong hình 4.4.
Mỗi lần điều khiển từ máy tính, chương trình điều khiển trên máy tính viết bằng Visual Basic sẽ gởi 2 byte. Byte thứ nhất là byte chứa mã lệnh để mạch điều khiển nhận biết giá trị đang được cài đặt. Byte thứ hai là byte dữ liệu chứa giá trị cần cài đặt.
Các biến được sử dụng trong hàm này gồm:
- Biến dem_byte: biến này đếm số byte nhận được.
- Biến byte_lenh: biến này chứa nội dung của byte nhận đầu tiên. - Biến byte_dulieu: biến này chứa nội dung của byte thứ hai.
Ban đầu, hàm sẽ không cho phép ngắt toàn cục nhằm tránh hiện tượng xung đột ngắt khi các ngắt có thứ tự ưu tiên hơn xảy ra trong khi đang thực hiện chương trình phục vụ ngắt nhận UART.
Sau đó hàm sẽ kiểm tra biến dem_byte để biết được số thứ tự byte đang nhận. Nếu byte nhận được là byte đầu tiên (dem_byte bằng 0), hàm sẽ gán giá trị thanh ghi RCREG cho biến byte_lenh và tăng giá trị của biến dem_byte một đơn vị rồi kết thúc hàm.
Nếu byte nhận được không phải byte đầu tiên (lúc này dem_byte bằng 1), hàm sẽ gán giá trị thanh ghi RCREG cho biến byte_dulieu, gán 0 cho biến dem_byte, kiểm tra giá trị của biến byte_lenh và có các xử lý tương ứng với từng giá trị của byte_lenh rồi kết thúc hàm.
- Với byte_lenh bằng 0: hàm gán giá trị biến byte_dulieu cho biến Kp. - Với byte_lenh bằng 1: hàm gán giá trị biến byte_dulieu cho biến Ki. - Với byte_lenh bằng 2: hàm gán giá trị biến byte_dulieu cho biến Kd. - Với byte_lenh bằng 3: hàm gán giá trị biến byte_dulieu cho biến Sp. - Với byte_lenh bằng 4: nếu byte_dulieu bằng 0 tắt động cơ, nếu byte
dữ liệu bằng 1 mở động cơ.
Chương 4: Thiết kế phần mềm
Hình 4.3 Lưu đồ thuật toán chương trình phục vụ ngắt nhận UART. Bắt đầu
Tăng biến dem_byte 1 đơn vị: dem_byte++ . Gán giá trị thanh ghi RCREG cho biến byte_lenh. Byte thứ nhất?
Gán 0 cho biến đếm số byte dem_byte = 0. Gán giá trị thanh ghi RCREG
cho biến dữ liệu nhận byte_dulieu = RCREG.
Byte_lenh= =0? Gán biến byte_dulieu cho biến Kp
byte_dulieu bằng 0? tắt PWM để dừng động cơ Mở PWM để bật động cơ Kết thúc Đúng Sai Đúng Đúng Đúng Đúng Đúng Sai Sai Sai Sai Sai Byte_lenh= =1?
Gán biến byte_dulieu cho biến Ki Byte_lenh=
=2?
Gán biến byte_dulieu cho biến Kd Byte_lenh=
=3?
Gán biến byte_dulieu cho biến Sp Byte_lenh=
=4?
Byte_lenh= =5?
Đảo chân RB3 để đảo chiều Đúng
Sai Sai
Chương 4: Thiết kế phần mềm