Ngắt là một tín hiệu gởi đến bộ xử lí, yêu cầu bộ xử lí tạm ngừng các
Download
Report
Transcript Ngắt là một tín hiệu gởi đến bộ xử lí, yêu cầu bộ xử lí tạm ngừng các
Ngắt là gì?
Ngắt là một tín hiệu gởi đến bộ xử lí, yêu cầu
bộ xử lí tạm ngừng các hoạt động hiện tại để
nhảy đến một nơi khác thực hiện một nhiệm vụ
nào đó .
Chương trình đi cùng với ngắt được gọi là trình
dịch vụ ngắt ISR (Interrupt Service Routine) hay
còn gọi là trình quản lý ngắt (Interrupt handler).
Các tín hiệu dẫn đến ngắt có thể
xuất phát từ :
1.Thiết bị bên trong chip (ngắt báo bộ đếm
timer/counter tràn, ngắt báo quá trình gởi
dữ liệu bằng RS232 kết thúc…) .
2. Các tác nhân bên ngoài (ngắt báo có 1
button được nhấn, ngắt báo có 1 gói dữ
liệu đã được nhận
3…
BẢNG VECTOR NGẮT.
Đối với mỗi ngắt thì phải có một trình phục vụ
ngắt ISR. Khi một ngắt đựợc gọi thì bộ vi
điều khiển chạy trình phục vụ ngắt. Đối với
mỗi ngắt thì có một vị trí cố định trong bộ nhớ
để giữ địa chỉ ISR của nó.
Nhóm các vị trí nhớ được dành riêng để
gửi các địa chỉ của các ISR được gọi là
bảng véc tơ ngắt.
Các bước hoạt động của một ngắt
Vi điều khiển kết thúc lệnh đang thực hiện và lưu địa
chỉ của lệnh kế tiếp vào ngăn xếp.
•
●
•
● Nó
•
● Bộ
•
● Khi
nhảy đến một vị trí cố định trong bộ nhớ được gọi là
bảng véc tơ ngắt nơi lưu giữ địa chỉ của một trình phục
vụ ngắt.
vi điều khiển nhận địa chỉ ISR từ bảng véc tơ ngắt
và nhảy tới đó. Nó bắt đầu thực hiện trình phục vụ ngắt
cho đến lệnh cuối cùng của ISR là RETI (trở về từ ngắt).
thực hiện lệnh RETI bộ vi điều khiển quay trở về
nơi nó đã bị ngắt. Trước hết nó nhận địa chỉ của bộ đếm
chương trình PC từ ngăn xếp bằng cách kéo hai byte
trên đỉnh của ngăn xếp vào PC. Sau đó bắt đầu thực
hiện các lệnh từ địa chỉ đó.
THỨ TỰ ƯU TIÊN NGẮT.
Một vec tơ ngắt có địa chỉ thấp hơn trong bộ nhớ
chương trình có mức độ ưu tiên cao hơn
Chẳn hạn ngắt ngoài 0 ( INT0 ) có mức độ ưu
tiên cao hơn ngắt ngoài 1 ( INT1 ).
THỨ TỰ ƯU TIÊN NGẮT
• Khi AVR đang thực hiện một trình phục vụ ngắt
thuộc một ngắt nào đó thì lại có một ngắt khác
được kích hoạt. Trong những trường hợp như
vậy thì một ngắt có mức ưu tiên cao hơn có thể
ngắt một ngắt có mức ưu tiên thấp hơn.Lúc này
ISR của ngắt có mức ưu tiên cao hơn sẽ được
thực thi (*).
• Khi thực hiện xong ISR của ngắt có mức ưu
tiên cao hơn thì nó mới quay lại phục vụ tiếp
ISR của ngắt có mức ưu tiên thấp hơn trước khi
trở về chương trình chính. Đây gọi là ngắt trong
ngắt
Sơ đồ các ngắt lồng nhau
External Interrupt – Ngắt ngoài
Đây là loại ngắt duy nhất độc lập với các
thiết bị ngoại vi của chip, các ngắt khác
thường gắn với hoạt động của 1 thiết bị
nào đó như Timer/Counter ,ADC…
ATmega128 có 8 ngắt ngoài từ INT0 đến
INT7 ( chưa kể tới ngắt reset ).Tám ngắt
này tương ứng với 8 chân của MCU là
INT0 ,INT1, …, INT7 tương ứng với các
PIN của Atmega128
Có 4 thanh ghi liên quan đến ngắt ngoài
đó là :
1.Thanh ghi EIMSK (External Interrupt
Mask Register).
2. Thanh ghi EICRA (External Interrupt
Control Register A).
3. Thanh ghi EICRB (External Interrupt
Control Register B)
4.Thanh ghi EIFR(External Interrupt Flag
Register)
1.Thanh ghi EIMSK
• Thanh ghi 8 bit, cho phép 8 ngắt ngoài .
Bit có giá trị là 1: cho phép ngắt
0: không cho phép ngắt
Khi cho phép ngắt toàn cục ( set bit I trong
thanh ghi SREG thành 1 ) thì các ngắt vẫn
chưa thể thực thi, để ngắt có thể thực thi ta
cần phải cho phép nó, 8 bit trong thanh ghi
EIMSK sẽ quyết định 8 ngắt ngoài tương ứng
( từ INT7 ...INT0 ) có được cho phép hay
không. Khi một trong số 8 bit ( từ INT7
...INT0 ) được set thành 1 và ngắt toàn cục
được cho phép thì ngắt ngoài tương ứng
được cho phép. Còn tín hiệu ngắt là mức hay
cạnh sẽ do các thanh ghi EICRA và EICRB
qui định.
Thanh ghi EICRA
Tám bit của thanh ghi EICRA sẽ điều khiển
kiểu bắt mẫu cho 4 ngắt INT3, INT2, INT1,
INT0
Bảng điều khiển ý nghĩa của ngắt:
Kiểu bắt mẫu
ISCn1
ISCn0
0
0
Mức thấp sẽ tạo yêu cầu ngắt
0
1
Dự trữ
1
0
Cạnh xuống ( Falling ) sẽ tạo yêu
cầu ngắt
1
1
Cạnh lên ( Rising ) sẽ tạo yêu
cầu ngắt
n = 0, 1, 2 hoặc 3
Ví dụ: cho phép sử dụng ngắt số 6 (INT6), như vậy
chúng ta cần phải khởi tạo cho thanh ghi EIMSK giá
trị là: 01000000b tương ứng EIMSK=0x40
Thanh ghi EICRB
thanh ghi 8 bit, điều khiển ngắt từ INT 4 -> INT7
Ví dụ: Khởi tạo CPU cho phép ngắt ngoài số 6
và phát sinh ngắt khi có tác động ở mức thấp.
EIMSK= 0x40 // cho phép ngắt ngoài số 6
EICRB = 0x00 // tác động ở mức thấp
Bảng điều khiển ý nghĩa của ngắt:
4.Thanh ghi EIFR
• • Bits 7..0 – INTF7 - INTF0: External Interrupt
Flags 7 – 0 : Đây là tám cờ ngắt tương ứng với
tám ngắt ngoài INT7..INT0. Khi có tín hiệu yêu
cầu ngắt ngoài thì cờ ngắt tương ứng sẽ được
set thành 1, nếu ngắt tương ứng được cho phép
thì MCU sẽ nhảy tới bảng véc tơ ngắt, cờ ngắt
sẽ được xóa khi chương trình phục vụ ngắt (
ISR ) được thực thi.
• Ngoài ra ta cũng có đặt hay xóa cờ ngắt bằng
cách ghi trực tiếp một giá trị logic vào nó.
chương trình phục vụ ngắt
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
#include <iom128v.h>
// Khai báo biến toàn cục (nếu cần)
// Khai báo hàm khởi tạo CPU, PORT
// Khai báo hàm phục vụ ngắt
#pragma interrupt_handler <tên hàm phục vụ ngắt>:<vectơ ngắt>
void <tên hàm phục vụ ngắt>(void)
{
// Thực thi các yêu cầu ngắt
}
// Khai báo các hàm con
// Đoạn chương trình chính
void main (void)
{
CPU_init ();
PORT_init ();
...
while(1)
{
// Các lệnh thực thi yêu cầu
// Gọi hàm con
}
}