Xin chào các bạn!
Trong nội dung bài viết này, tôi xin trình bày để các bạn có thể thiết lập và sử dụng được ngắt ngoài trên họ vi điều khiển AVR, cụ thể là vi điều khiển ATmega8.
Chú ý : Source code bài viết dưới đây được biên dịch bằng phần mềm CodeVisionAVR để biên dịch code không lỗi xin vui lòng Download bảnCodeVisionAVR Tại Đây
I.NGẮT NGOÀI TRÊN Atmega8.
– Ngắt ngoài (External Interrupt) là loại ngắt độc lập với các thiết bị của vi điều khiển. Atmega 8 có hai ngắt ngoài là:
- INT0 (chân 4: PD2).
- INT1 (chân 5: PD3).
– Trên AVR, Có 3 thanh ghi liên quan đến ngắt ngoài:
MCUCR: thanh ghi lựa chọn chế độ ngắt cho ngắt ngoài.
Chế độ ngắt ngoài cho INT1:
(Tương tự với INT0: ISC01, ISC00)
·GICR: thanh ghi điều khiển ngắt chung.
Bit INT1 = 1: Ngắt ngoài 1 được sử dụng.
Bit INT0 = 1: Ngắt ngoài 0 được sử dụng.
·GIFR: thanh ghi cờ ngắt chung.
II.BÀI TOÁN VÍ DỤ.
Để các bạn hiểu rõ hơn cách sử dụng ngắt ngoài trên vi điều khiển Atmega8, tôi xét bài toán cụ thể sau:
Sử dụng INT1 và INT0:
- Khi có ngắt ngoài 1: truyền chuỗi “MINHHAGROUP” lên máy tính.
- Khi có ngắt ngoài 0: truyền chuỗi “BANLINHKIEN.VN” lên máy tính.
1.CÁCH THIẾT LẬP NGẮT NGOÀI BẰNG CodeVisionAVR.
Trình biên dịch CodeVisionAVR đã hỗ trợ để các bạn có thể sử dụng tốt các ngắt ngoài.
Sau khi lập Project mới à chọn CodeWizardAVR à chọn External IRQ
Các bạn tích vào ô để sử dụng INT1, INT0. Chọn chế độ ngắt ở Mode (trên đây tôi chọn chế độ ngắt cạnh xuống).
Trong bài tập này tôi có sử dụng thêm USART để truyền dữ liệu lên máy tính (các bạn có thể hiểu rõ ở các bài sau).
2.CODE MẪU.
Khi ngắt ngoài xảy ra, chương trình sẽ thực hiện yêu cầu của các bạn trong trình phục vụ ngắt của từng ngắt.
#include <main.h>
// TRINH PHUC VU NGAT NGOAI 0
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
puts("BANLINHKIEN.VN "); // TRUYEN LEN MAY TINH
}
// TRINH PHUC VU NGAT NGOAI 1
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
puts("MINHHAGROUP "); // TRUYEN LEN MAY TINH
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x0C;
DDRD=0x00;
// KHOI TAO NGAT NGOAI
// INT0: On
// INT0 Mode: Falling Edge (NGAT CANH XUONG)
// INT1: On
// INT1 Mode: Falling Edge (NGAT CANH XUONG)
GICR|=0xC0; // Cho phep su dung INT1, INT0
MCUCR=0x0A; // Thiet lap che do ngat ngoai
GIFR=0xC0; // Bat co ngat chung
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// KHOI TAO USART
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33; // TOC DO TRUYEN 9600
// Global enable interrupts
#asm("sei") // CHO PHEP NGAT TOAN CUC
while (1)
{
// Place your code here
}
}
Các bạn có thể tham khảo code mẫu và mô phỏng tại đây:
DOWNLOAD FULL SRC+ Mô Phỏng TẠI ĐÂY