BÀI 18 : NGẮT RB0 PIC16F877A XC8

11:25:00 PM
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.
- Ok trong  bài này mình chỉ giới thiệu về ngắt RB0 và mô phỏng để cho các bạn biết ngắt hoạt động như thế nào. Trong bài sau chúng ta sẽ ứng dụng ngắt và LED 7 đoạn.
 - Đây là ảnh mô phỏng protues.
interrupt rb0 pic16f877a xc8
- Đây là code chương trình.
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 8000000
#include <xc.h>
// BEGIN CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
void interrupt ISR(void);
void main (void)
{
    TRISD0 = 0;
    PORTD = 0X00;
    TRISBbits.TRISB0 = 1;
    PORTB = 0X00;
    INTCONbits.GIE = 1;
    INTCONbits.INTE = 1;
    OPTION_REGbits.INTEDG = 1;
    while(1)
    {

    } 
}
void interrupt ISR(void)
{
        if(INTCONbits.INTF==1)
        {
            {
                PORTDbits.RD0 =!PORTDbits.RD0;
                INTCONbits.INTF=0;
            }
        } 

}
- Link download project Click here

Share this

Related Posts

Previous
Next Post »

2 nhận xét

Write nhận xét
April 23, 2018 at 1:55 AM delete

Anh cho em hỏi khi có cạnh lên, cạnh xuống ở chân RB0 nghĩa là thế nào hả anh?
Với cả em tưởng khi dùng nút nhấn thì PIC sẽ tự đọc giá trị của nút nhất chứ sao anh phải khai bảo PORTB như thế kia ?

Reply
avatar
April 24, 2018 at 2:59 AM delete

Cấu hình vậy khi có thay đổi ở RB0 thì lệnh sẽ được thực thi, đây chỉ là ví dụ, còn ứng dụng thực tế là để được xung từ encoder hoặc xung từ 1 thiết bị nào đó trả về.

Reply
avatar