Ngắt là gì ?
“Ngắt ” là tạm dừng một việc nào đó lại để thực làm một việc khác, sau khi làm xong lại tiếp tục làm công việc cũ đang dở dang. Đối với Vi Xử Lý PIC cũng tương tự, một sự kiện nào đó không xác định thời điểm xảy ra nhưng khi đã xảy ra thì lập tức được phát hiện và xử lý dừng chương trình chính lại để thực hiện một công việc tương ứng với sự kiện trên, thực hiện xong thì quay lại chương trình chính. Toàn bộ quá trình trên gọi chung là ngắt.
Khi vi xử lý PIC đang thực thi chương trình, có thể có 15 sự kiện được nó xem là nguyên nhân ngắt. Tức là khi sự kiện đã được cho phép, vi xử lý vẫn làm việc bình thường nhưng bất kỳ khi nào sự kiện xảy ra vi xử lý đều biết được(tự động) và có đáp ứng cho nguyên nhân ngắt tương ứng.
Sau đây mình sẽ giới thiệu với các bạn 1 số ngắt như là : ngắt RB0 , ngắt PORT, ngắt do Timer, ngắt ADC, ngắt do PORT nối tiếp.
Và trong bài này chúng ta sẽ học về ngắt RB0/INT trước nha ! Vậy ngắt RB0 là gì chúng ta sẽ đi tìm hiểu về nó.
Ngắt RB0 : Khi có điện áp thay đổi trên chân RB0 thì ngắt này xảy ra. Ngoài các bita cần khai báo GIE=1,INTE=1 ta cần đặt gí trị cho bit liên quan là (OPTION_REG<6>). Khi INTEDG = 1 thì ngắt RB0 xảy ra khi có cạnh lên ở chân RB0, khi INTEDG = 0 thì ngắt RB0 xảy ra khi có cạnh xuống ở chân RB0. Khi có cạnh phù hợp với khai báo thì cờ báo ngắt INTF được set lên 1 và xảy ra ngắt. Cờ báo ngắt phải được xóa về 0 bằng phần mềm (lệnh) để ngắt tiếp theo có thể tác động. Nếu không khai báo bít INTEDG thì mặc định ngắt cạnh lên ở chân RB0.
Đây chỉ là phần lý thuyết thôi. Và trình biên dịch CCS nó có hỗ trợ cho chúng ta các lệnh để sử dụng ngắt này.
- Đây là ảnh mô phỏng protues.
- Đây là code chương trình.
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(d)
#byte portb=0x06
#byte portd=0x08
const unsigned char digital[]={0x3F,0x06,0x5B,0x4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
#int_ext
void ngat_RB0()
{
int i;
portd=digital[i];
++i;
if(i==10)
{
i=0;
}
}
void main(void)
{
set_tris_b(0b00000001);
set_tris_d(0);
enable_interrupts(global);
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
portd=0b00111111;
while(true)
{
}
}
EmoticonEmoticon