Tài liệu Bài giảng môn Điện - Điện tử - Bài 03: Ngắt (interrupt): [THỰC HÀNH VI ĐIỀU KHIỂN] 2013
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang 1
BÀI 03
NGẮT (Interrupt)
MỤC ĐÍCH
- Nắm bắt các khái niệm cơ bản về ngắt và cách sử dụng ngắt trong vi điều khiển
PIC24FJ128GA010
- Làm quen với cấu trúc phần cứng của module điều khiển ngắt trong vi điều khiển
PIC24FJ128GA010
- Làm quen với việc lập trình Interrupt trên PIC24 FJ128GA010 và mô phỏng
project kiểm tra Interrupt trên Proteus
TÀI LIỆU THAM KHẢO
1. PIC24FJ128GA010 Family Data Sheet
2. PIC24F Reference Manuals - Section 8: Interrupt
[THỰC HÀNH VI ĐIỀU KHIỂN] 2013
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang 2
I/ GIỚI THIỆU
Module điều khiển ngắt của PIC24 giúp giảm số lượng yêu cầu ngắt tới CPU chỉ còn một
tín hiệu.
Module điều khiển ngắt trong vi điều khiển PIC24 có những đặc điểm sau:
o Gồm tối đa 8 ngoại lệ (processor exception) và các bẫy phần mềm (software
traps).
o Gồm 7 mức độ ưu tiên cho người dùng lựa chọn...
14 trang |
Chia sẻ: ntt139 | Lượt xem: 1266 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Bài giảng môn Điện - Điện tử - Bài 03: Ngắt (interrupt), để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
[THỰC HÀNH VI ĐIỀU KHIỂN] 2013
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang 1
BÀI 03
NGẮT (Interrupt)
MỤC ĐÍCH
- Nắm bắt các khái niệm cơ bản về ngắt và cách sử dụng ngắt trong vi điều khiển
PIC24FJ128GA010
- Làm quen với cấu trúc phần cứng của module điều khiển ngắt trong vi điều khiển
PIC24FJ128GA010
- Làm quen với việc lập trình Interrupt trên PIC24 FJ128GA010 và mô phỏng
project kiểm tra Interrupt trên Proteus
TÀI LIỆU THAM KHẢO
1. PIC24FJ128GA010 Family Data Sheet
2. PIC24F Reference Manuals - Section 8: Interrupt
[THỰC HÀNH VI ĐIỀU KHIỂN] 2013
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang 2
I/ GIỚI THIỆU
Module điều khiển ngắt của PIC24 giúp giảm số lượng yêu cầu ngắt tới CPU chỉ còn một
tín hiệu.
Module điều khiển ngắt trong vi điều khiển PIC24 có những đặc điểm sau:
o Gồm tối đa 8 ngoại lệ (processor exception) và các bẫy phần mềm (software
traps).
o Gồm 7 mức độ ưu tiên cho người dùng lựa chọn.
o Bảng vector ngắt (Interrupt Vector Table – IVT ) gồm tối đa 118 vector.
o Một nguồn ngắt (interrupt source) hoặc nguồn ngoại lệ (exception source) sẽ có
một vector đại diện duy nhất.
o PIC24F có hỗ trợ bảng vector ngắt (AIVT) để hỗ trợ việc debug.
I.1/ Bảng vector ngắt (Interrupt Vector Table - IVT)
Bảng vector ngắt (Interrupt Vector Table - IVT) nằm bên trong bộ nhớ chương trình, bắt
đầu tại địa chỉ 0x000004. IVT gồm 126 vectors, gồm 8 vectors bẫy non-maskable (non-
maskable trap) và 118 nguồn ngắt.
Mỗi nguồn ngắt có một vector cho riêng nó. Mỗi vector ngắt chứa địa chỉ 24-bit, địa chỉ
này là địa chỉ bắt đầu của chương trình phục vụ ngắt (Interrupt Service Routine - ISR).
I.2/ Bảng vector ngắt thay thế (Alternate Interrupt Vector Table - AIVT)
Bảng vector ngắt thay thế (Alternate Interrupt Vector Table - AIVT) nằm sau bảng
vector ngắt (IVT). Việc truy xuất tới AIVT được điều khiển thông qua bit ALTIVT
(INTCON2). Nếu bit ALTIVT được tích cực, tất cả quá trình ngắt và ngoại lệ
(exception) sẽ dùng các vector thay thế thay vì dùng các vector mặc định. Các vector thay
thế được tổ chức tương tự như các vector mặc định.
AIVT hỗ trợ quá trình emulation và debugging bằng cách cung cấp một cơ chế
chuyển đổi qua lại giữa ứng dụng và môi trường hỗ trợ phát triển mà không cần phải lập
trình lại các vector ngắt.
[THỰC HÀNH VI ĐIỀU KHIỂN] 2013
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang 3
Một phần vector ngắt của PIC24 được định nghĩa trong MPLAB C Compiler theo bảng
sau. Những vector ngắt khác (_Interrupt69 _Interrupt117) hiện vẫn chưa được sử dụng
Bảng 1: Các tên vector ngắt được định nghĩa trong MPLAB C Compiler
[THỰC HÀNH VI ĐIỀU KHIỂN] 2013
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang 4
Bảng 2: Những vector interrupt trong PIC24
[THỰC HÀNH VI ĐIỀU KHIỂN] 2013
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang 5
I.3/ Độ ưu tiên ngắt (Interrupt Priority)
[THỰC HÀNH VI ĐIỀU KHIỂN] 2013
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang 6
Mỗi nguồn ngắt ngoại vi có thể được cấu hình mức ưu tiên từ 1-7. Các bit điều
khiển độ ưu tiên ngắt cho mỗi nguồn ngắt nằm ở 3 bit Least Significant ở mỗi nibble
trong các thanh ghi IPCn.
Độ ưu tiên thấp nhất là 1, độ ưu tiên cao nhất là 7. Nếu các bit cấu hình độ ưu tiên
ngắt trong các thanh ghi IPCn bị xóa, khi đó các nguồn ngắt bị vô hiệu hóa lập tức.
Ghi chú: Khi vi điều khiển bị reset, các thanh ghi IPCn được khởi tạo mặc định để các
nguồn ngắt được gán độ ưu tiên là 4.
I.4/ Trạng thái ưu tiên của CPU
CPU có thể hoạt động ở 1 trong 16 mức ưu tiên 0-15. Một nguồn ngắt hoặc nguồn
bẫy phải có mức ưu tiên cao hơn mức ưu tiên của CPU hiện tại để bắt đầu một quá trình
exception. Các nguồn ngắt ngoại vi (peripheral interrupt) và ngắt ngoài (external
interrupt) có thể được lập trình ở mức ưu tiên 0-7, trong khi các mức ưu tiên CPU 8-15
được dự trữ cho các nguồn bẫy (trap source). Một bẫy (trap) là nguồn ngắt non-maskable
được dùng để phát hiện những vấn đề phần cứng và phần mềm.
Chú ý: Một nguồn ngắt có mức ưu tiên là 0 sẽ bị vô hiệu hóa vì nó sẽ không bao giờ có
độ ưu tiên cao hơn độ ưu tiên của CPU.
Mức độ ưu tiên CPU được chỉ thị bởi 4 bit trạng thái sau:
Các bit trạng thái IPL nằm trong thanh ghi SR.
Bit trạng thái IPL3 nằm trong thanh ghi CORCON.
Người dùng có thể cấu hình độ ưu tiên cho CPU bằng cách ghi giá trị ưu tiên mong
muốn vào IPL, nhờ đó có thể vô hiệu được những nguồn ngắt có độ ưu tiên thấp
hơn giá trị ghi vào. Ví dụ, nếu IPL = 111, CPU sẽ không bị ngắt bởi những nguồn
ngắt có độ ưu tiên bằng 0, 1, 2, 3.
Các sự kiện bẫy (trap) có độ ưu tiên từ 8-15, cao hơn bất cứ nguồn ngắt ngoại vi và
ngắt ngoài. Khi sự kiện bẫy (trap) xảy ra, bit IPL3 được thiết lập lên mức 1. Tuy nhiên bit
[THỰC HÀNH VI ĐIỀU KHIỂN] 2013
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang 7
IPL3 chỉ có thể xóa mà không được thiết lập bởi người dùng, do đó khi có bẫy xảy ra,
người dùng nên xóa bit IPL3.
II/ NHỮNG THANH GHI TRẠNG THÁI VÀ ĐIỀU KHIỂN
INTERRUPT
PIC24FJ128GA010 gồm 28 thanh ghi điều khiển ngắt:
- INTCON1
- INTCON2
- IFS0 IFS4
- IEC0 IEC4
- IPC0 IPC16
Việc điều khiển ngắt toàn cục được điều khiển thông qua INTCON1, INTCON2.
Thanh ghi INTCON1 có bit gỡ bỏ ngắt chồng (Interrupt Nesting Disable (NSTDIS) bit)
và các cờ trạng thái và điều khiển nguồn bẫy xử lý (processor trap source). Thanh ghi
INTCON2 điều khiển hoạt động của tín hiệu yêu cầu ngắt ngoài và điều khiển việc dùng
bảng vector ngắt thay thế (Alternate Interrupt Vector Table).
Các thanh ghi IFS lưu giữ các cờ yêu cầu ngắt. Mỗi nguồn ngắt có một bit trạng thái
được thiết lập bởi ngoại vi tương ứng hoặc tín hiệu bên ngoài, và bit này được xóa bằng
phần mềm.
Các thanh ghi IEC lưu giữ tất cả các bit cho phép ngắt. Những bit điều khiển này
được dùng để cho phép ngắt từ ngoại vi hay tín hiệu bên ngoài.
Các thanh ghi IPC được dùng để thiết lập mức ưu tiên ngắt cho mỗi nguồn ngắt. Mỗi
nguồn ngắt có thể được gán mức ưu tiên từ 1 8.
Các nguồn ngắt được gán với những thanh ghi IFSx, IECx và IPCx như trong bảng 2.
Ví dụ, INT0 (External Interrupt 0) có mã số vector là 0 và mức ưu tiên tự nhiên là 0. Vì
vậy, bit trạng thái INT0IF là IFS0, bit enable là IEC0 và các bit ưu tiên là
IPC0.
[THỰC HÀNH VI ĐIỀU KHIỂN] 2013
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang 8
Dù không nằm trong phần cứng bộ điều khiển interrupt nhưng 2 trong số những
thanh ghi điều khiển CPU lại có những bit điều khiển chức năng ngắt.
o Thanh ghi STATUS của CPU (SR) có các bit IPL2:IPL0 (SR), những bit
này chỉ thị mức ưu tiên ngắt hiện tại của CPU. Người dùng có thể thay đổi mức
ưu tiên của CPU hiện tại bằng cách ghi dữ liệu mới vào các bit IPL.
o Thanh ghi CORCON có bit IPL3. IPL3 cùng với IPL2:IPL0 chỉ thị mức ưu
tiên ngắt hiện hành của CPU.
II.1/ Thanh ghi điều khiển ngắt INTCON1
Bit Tên Chức năng
15 NSTDIS: Interrupt Nesting
Disable bit
Bit điều khiển việc không cho phép ngắt chồng
1 = Không cho phép ngắt chồng
0 = Cho phép ngắt chồng
14-5 Unimplemented Không dùng
4 MATHERR: Arithmetic
Error Trap Status bit
Bit trạng thái bẫy lỗi toán học (Math Error Trap)
1 = Overflow trap đã xảy ra
0 = Overflow trap chưa xảy ra
3 ADDRERR: Address Error
Trap Status bit
Bit trạng thái bẫy lỗi địa chỉ (Address Error Trap)
1 = Address Error Trap đã xảy ra
0 = Address Error Trap chưa xảy ra
2 STKERR: Stack Error Trap
Status bit
Bit trạng thái bẫy lỗi stack (Stack Error Trap)
1 = Stack Error Trap đã xảy ra
0 = Stack Error Trap chưa xảy ra
[THỰC HÀNH VI ĐIỀU KHIỂN] 2013
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang 9
1 OSCFAIL: Oscillator
Failure Trap Status bit
Bit trạng thái bẫy lỗi dao động (Oscillator Failure
Trap)
1 = Oscillator failure trap đã xảy ra
0 = Oscillator failure trap chưa xảy ra
0 Unimplemented Không dùng
II.2/ Thanh ghi điều khiển ngắt INTCON2
Bit Tên Chức năng
15 ALTIVT: Enable Alterate
Interrupt Vector Table bit
Bit cho phép dùng bảng vector ngắt thay thế
1 = Dùng bảng vector thay thế
0 = Dùng bảng vector mặc định
14 DISI: DISI Instruction
Status bit
1 = Lệnh DISI được kích hoạt
0 = Lệnh DISI không được kích hoạt
13-5 Unimplemented Không dùng
4 INT4EP: External Interrupt
4 Edge Detect Polarity
Select bit
Bit lựa chọn cạnh ngắt cho nguồn ngắt ngoài 4
1 = Ngắt tại cạnh xuống
0 = Ngắt tại cạnh lên
3 INT3EP: External Interrupt
3 Edge Detect Polarity
Select bi
Bit lựa chọn cạnh ngắt cho nguồn ngắt ngoài 3
1 = Ngắt tại cạnh xuống
0 = Ngắt tại cạnh lên
2 INT2EP: External Interrupt
2 Edge Detect Polarity
Select bit
Bit lựa chọn cạnh ngắt cho nguồn ngắt ngoài 2
1 = Ngắt tại cạnh xuống
0 = Ngắt tại cạnh lên
[THỰC HÀNH VI ĐIỀU KHIỂN] 2013
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang 10
1 INT1EP: External Interrupt
1 Edge Detect Polarity
Select bit
Bit lựa chọn cạnh ngắt cho nguồn ngắt ngoài 1
1 = Ngắt tại cạnh xuống
0 = Ngắt tại cạnh lên
0 INT0EP: External Interrupt
0 Edge Detect Polarity
Select bit
Bit lựa chọn cạnh ngắt cho nguồn ngắt ngoài 0
1 = Ngắt tại cạnh xuống
0 = Ngắt tại cạnh lên
II.3/ Các thanh ghi trạng thái cờ ngắt (Interrupt Flag Status Register)
Bộ điều khiển ngắt trong PIC24 gồm 5 thanh ghi trạng thái cờ ngắt gồm: IFS0, IFS1,
IFS2, IFS3, IFS4.
Tham khảo bảng 2 để biết thông tin vị trí bit trạng thái cờ ngắt cho từng nguồn ngắt riêng
biệt.
II.4/ Các thanh ghi điều khiển việc tích cực các nguồn ngắt (Interrupt Enable)
Bộ điều khiển ngắt trong PIC24 gồm 5 thanh ghi điều khiển ngắt gồm: IEC0, IEC1,
IEC2, IEC3, IEC4.
Tham khảo bảng 2 để biết thông tin vị trí bit điều khiển tích cực ngắt cho từng nguồn
ngắt riêng biệt.
II.5/ Các thanh ghi điều khiển độ ưu tiên ngắt
Bộ điều khiển ngắt trong PIC24 gồm 17 thanh ghi điều khiển độ ưu tiên ngắt gồm: IPC0,
IPC1, IPC2, IPC3, IPC4, IPC5, IPC6, IPC7, IPC8, IPC9, IPC10, IPC11, IPC12, IPC13,
IPC14, IPC15, IPC16.
Tham khảo bảng 2 để biết thông tin vị trí các bit điều khiển độ ưu tiên ngắt cho từng
nguồn ngắt riêng biệt.
III/ TRÌNH TỰ THIẾT LẬP NGẮT
III.1/ Khởi tạo (Initialization)
Để cấu hình cho một nguồn ngắt:
[THỰC HÀNH VI ĐIỀU KHIỂN] 2013
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang 11
Nếu không dùng ngắt chồng, bit điều khiển NSTDIS (INTCON1) được thiết
lập đến mức 1.
Lựa chọn mức ưu tiên cho nguồn ngắt (ghi giá trị vào các bit điều khiển mức ưu
tiên trong các thanh ghi IPCx)
Xóa trạng thái cờ ngắt (xóa bit trạng thái cờ ngắt ứng với từng nguồn ngắt riêng
biệt trong các thanh ghi IFSx)
Cho phép ngắt (thiết lập bit điều khiển cho phép ngắt ứng với từng nguồn ngắt
trong các thanh ghi IECx)
Để tác động vào các bit điều khiển ngắt, sinh viên có thể sử dụng tên các bit theo
MPLAB C Compiler. Tên bit = tên ngắt (Primary name trong bảng Vector ngắt bỏ đi từ
“Interrupt”) + hậu tố (IE, IF, IP). Ví dụ, các bit điều khiển ngắt Timer1: _TIIF (cờ ngắt),
_T1IE (cho phép ngắt) và _T1IP (mức ưu tiên ngắt).
III.2/ Hàm phục vụ ngắt (Interrupt Service Routine)
Là một hàm chức năng phục vụ ngắt (ISR), hàm này nằm tại địa chỉ được qui định
trong bảng vector ngắt đối với từng nguồn ngắt riêng biệt. Khi ISR được thực hiện, người
dùng nên tìm cách xóa cờ ngắt tương ứng với nguồn ngắt đã sinh ra ngắt, nếu không
ISR sẽ được thực thi lại ngay khi vừa thực thi xong các câu lệnh trong ISR.
Các lưu ý khi xây dựng hàm phục vụ ngắt:
Không có tham số và kiểu trả về là void
Không gọi hàm phục vụ ngắt trong chương trình chính
Hàm phục vụ ngắt không nên gọi các hàm khác
Cú pháp của hàm phục vụ ngắt:
void __attribute__ ((interrupt)) Interrupt_name(void)
{
// interrupt service routine code here...
}
Với Interrupt_name chính là primary name trong bảng 1.
[THỰC HÀNH VI ĐIỀU KHIỂN] 2013
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang 12
III.3/ Hàm phục vụ bẫy (Trap Service Routine)
Một hàm phục vụ bẫy (TSR) được lập trình tương tự như 1 ISR, ngoại trừ cờ trạng
thái bẫy (trap flag) của bẫy tương ứng trong thanh ghi INTCON1 phải được xóa để tránh
hiện tượng chương trình trong TSR lại được thực hiện lại sau khi đã thực hiện xong.
III.4/ Vô hiệu hóa Interrupt
Các nguồn có thể được vô hiệu hóa bằng những cách sau:
Đẩy giá trị thanh ghi SR hiện tại vào stack phần mềm dùng lệnh PUSH
Cấu hình độ ưu tiên cho CPU là 7
Để cho phép nguồn ngắt hoạt động trở lại, lệnh POP được dùng để phục hồi giá trị thanh
ghi SR đã lưu trước trong stack.
Chú ý: Đối với nguồn ngắt có độ ưu tiên là 7 hoặc nhỏ hơn đều có thể bị vô hiệu hóa. Các
nguồn bẫy (mức ưu tiên 8-15) không thể bị vô hiệu hóa.
IV/ CHƯƠNG TRÌNH MẪU
IV.1/ Ngắt Timer ở chế độ định thời
Công thức tính thời gian định thời
Xem lại bài 2 để biết cách thiết lập Timer hoạt động ở chế độ định thời. Dưới đây là
khung chương trình gợi ý.
#include
void Timer1_Init(void)
{
T1CON = 0x10;
TMR1 = 0x00;
PR1 = 0x800A;
IPC0bits.T1IP = 0x01;
IFS0bits.T1IF = 0;
IEC0bits.T1IE = 1;
T1CONbits.TON = 1;
}
[THỰC HÀNH VI ĐIỀU KHIỂN] 2013
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang 13
int main(void)
{
Timer1_Init();
}
void __attribute__((__interrupt__,auto_psv))_T1Interrupt (void)
{
IFS0bits.T1IF = 0;
}
IV.2/ Ngắt ngoài
Trên vi điều khiển PIC24FJ128GA010 có thể có 5 nguồn ngắt ngoài, đó là tín hiệu vào
các chân INT0, INT1, INT2, INT3, INT4.
Dưới đây là khung chương trình gợi ý sử dụng nguồn ngắt ngoài INT1 tại pin số 18 của
vi điều khiển PIC24FJ128GA010. Ngắt ngoài INT1 sinh ra ngắt khi có cạnh xuống của
tín hiệu tại pin 18 của vi điều khiển.
Chú ý: Sinh viên nên xem lại bảng 2 để biết thông tin về các bit cấu hình cho từng nguồn
ngắt.
#include
void External_Interrupt1_Init(void)
{
INTCON1 = 0x0000;
INTCON2 = 0x0002; //ngat tai canh xuong ngat ngoai 0
IPC5bits.INT1IP = 5;
IFS1bits.INT1IF = 0;
IEC1bits.INT1IE = 1;
}
int main(void)
{
External_Interrupt1_Init();
}
[THỰC HÀNH VI ĐIỀU KHIỂN] 2013
Bộ môn Máy Tính và Hệ Thống Nhúng – Khoa Điện Tử Viễn Thông Trang 14
void __attribute__((__interrupt__,auto_psv))_INT1Interrupt void)
{
IFS1bits.INT1IF = 0;
}
V/ BÀI TẬP TẠI LỚP
(Sinh viên nhận bài tập từ giáo viên hướng dẫn thực hành)
Các file đính kèm theo tài liệu này:
- tailieu.pdf