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