Ngắt trên AVR

Ngắt trên AVR

1. Ngắt là gì ?

 Ngắt (Interrupts) là tín hiệu khẩn cấp gửi đến bộ vi xử lý yêu cầu tạm dừng các hoạt động hiện tại để “ nhảy ” đến nơi khác thực hiện nhiệm vụ.  Nhiệm vụ này gọi là trình phục vụ ngắt.

Chương trình không có ngắt

                           Hình 1: Chương trình không có ngắt

 

Chương trình có ngắt

                           Hình 2: Chương trình có ngắt

Khi thực hiện xong chương trình ngắt mới, vi xử lý trở về thực hiện tiếp chương trình đã bị ngắt tại chỗ bị ngắt. Một số trường hợp chương trình ngắt đang chạy lại bị chương trình ngắt mới khác làm ngắt ( ngắt trong ngắt ), thì chương trình ngắt mới được thực hiện. Chương trình ngắt cũ bị dừng lại được thực hiện sau khi chương trình ngắt mới kết thúc và chương trình đầu tiên được thực hiện tiếp sau cùng.

Hình 3: Bảng vector ngắt ATmega8L

                                Hình 3: Bảng vector ngắt ATmega8L

2. Ngắt ngoài (External Interrupt)

Ngắt ngoài là ngắt duy nhất độc lập với các thiết bị của chip, để giao tiếp giữa người dùng và chip. Trên ATmega8L có hai ngắt ngoài INT0 – INT 1 (PD2 – PD3 ). Có 3 thanh ghi liên quan đến ngắt MCUCR, GICR, GIFR.

Kết nối mạch như hình dưới:

Hình 5: Sơ đồ kết nối tín hiệu ngắt ngoài

Hình 5: Sơ đồ kết nối tín hiệu ngắt ngoài

 

Khi chưa nhấn nút INT0, INT1 ở trạn thái HIGH do điện trở kéo pull-up. Nhấn nút trạng thái tại INT0, INT1 chuyển tử HIGH -> LOW gọi là cạnh xuống Falling Edge. 

       Khi button được nhấn và giữ, trạng thái các chân INT là LOW. Nhả button tạng thái chuyển từ LOW-> HIGH gọi là cạnh lên Rising Edge.

2.1 Thanh ghi điều khiển MCUCR

       Là thanh ghi thiết lập chế độ ngắt cho ngắt ngoài. MCUCR là thanh ghi 8 bit, 4 bit cao: SE, SM2, SM1, SM0 dùng cho chế độ Power manager           và Sleep Mode. 4 bit thấp là các bit Interrupt Sense Control (ISC).

Hình 6: Thanh ghi điều khiển MCUCR

Hình 6: Thanh ghi điều khiển MCUCR

       ISC11:ISC10- dùng cho INT1 và ISC01:ISC00 dùng cho INT0. Tương tự với INT1

Hình 7: Các mode hoạt động của INT0

Hình 7: Các mode hoạt động của INT0

        Ví dụ: Set up INT0 ngắt cạnh xuống, INT1 ngắt cạnh lên. Thanh ghi MCUCR= 00001110 = 0x0E.

2.2 Thanh ghi điều khiển ngắt chung- GICR( General Interrupt Control Register)

        Là thanh ghi 8 bit , bit 6, 7 sử dụng cho điều khiển ngắt.

Hình 8: Thanh ghi điều khiển ngắt chung - GICR

Hình 8: Thanh ghi điều khiển ngắt chung – GICR

       BIT 6 – INT0 gọi là bit cho phép ngắt. BIT 6 = 1cho phép INT0 hoạt động.

2.3 Thanh ghi cờ ngắt chung – GIFR (General Interrupt Flag Register)

       Gồm 2 bit INTF1 và INTF0 là các bit cờ. Nếu có sự kiện ngắt các bit này tự động set bằng 1

Hình 9: Thanh ghi cờ ngắt chung – GIFR

Hình 9: Thanh ghi cờ ngắt chung – GIFR

Tóm lại để thiết lập ngắt trên AVR theo các bước sau:

Hình 10: Sơ đồ khởi tạo ngắt trên AVR

Hình 10: Sơ đồ khởi tạo ngắt trên AVR

2.4 Ngắt ngoài với C

Ví dụ: Chương trình thực hiện : Chớp tắt PORTC xen kẽ. Nhấn Key1 tăng 0->9 , nhấn Key2 giảm 9-> 0 hiển thị led 7 thanh.

Code mẫu: 

#include <avr/io.h>

#include <avr/delay.h>

#include <avr/interrupt.h>

void khoitao_gpio(void);

void khoitao_ngat(void);

volatile int8_t temp = 0; // Biến toàn cục được truy xuất từ các tiến trình con xử lý ngắt (interrupt service routine)

int main(void)

{

       khoitao_gpio();

       khoitao_ngat();

       sei();

    while(1)

    {

        //TODO:: Please write your application code

              PORTC = 0x55;

              _delay_ms(500);

              PORTC = ~0x55;

              _delay_ms(500);

    }

}

void khoitao_gpio()

{

       DDRD  = 0x00;  // PORTD la input su dung 2 chan ngat.

       PORTD = 0x0C;  // Su dung dien tro keo tai INT1 va INT0

       DDRB  = 0xFF;  // PORTB la output

       DDRC  = 0xFF;  // PORTC la output

       PORTC = 0x00;  // Muc logic khoi tao la 0

}

void khoitao_ngat()

{

       MCUCR |= (1<<ISC11)|(1<<ISC01); // MODE NGAT CANH XUONG

       GICR |=(1<<INT1)|(1<<INT0);

}

ISR(INT0_vect)

{

       temp++;

       if(temp >9) temp = 0;

       PORTB = temp;

}

ISR(INT1_vect)

{

       temp–;

       if(temp <0) temp = 9;

       PORTB = temp;

}

Bài tập:

     1. Viết chương trình sử dụng ngắt. Kiểm tra 4 phím nhấn, nếu nhấn phím lần lượt đèn sáng nhả phím đèn tắt. Led D5,D6 chớp tắt chu kỳ 1s.            Mạch như hình vẽ.

Hình 11: Sơ đồ mạch

                       Hình 11: Sơ đồ mạch

2. Viết chương trình sáng lần lượt led tại PORTC. Nếu nhấn phím tất cả các led chớp tắt. Mạch như hình vẽ.

Hình 12: Sơ đồ mạch

Hình 12: Sơ đồ mạch

 

  DOWNLOAD CODES FILES

 

Đ/C: Ngách 30/18 Tạ Quang Bửu, Bách Khoa, Hai Bà Trưng, Hà Nội.

Điện Thoại: 043 2151 690 hoặc 0985 11 7969.

Website: linhkien360.vn

SupportTeam: linhkien360hotro@gmail.com

Linh kiện 360 luôn cam kết bán hàng tốt nhất !
Tags: , , , , ,