Thứ Tư, 17 tháng 2, 2016

BÀI 17 : NGẮT RB0 PIC16F887 XC8

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.
- Ảnh mô phỏng protues.

ngắt rb0 pic16f887

- Đây là code chương trình.
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <string.h>
#define _XTAL_FREQ 8000000
// CONFIG1
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)

// CONFIG2
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)
void interrupt ISR(void);
void main (void)
{
    TRISDbits.TRISD0 = 0;
    TRISBbits.TRISB0 = 1;
    PORTD = 0;
    INTCONbits.GIE = 1;
    INTCONbits.INTE = 1;
    OPTION_REGbits.INTEDG = 1;
    ANSELHbits.ANS12 = 0;
    while(1)
    {

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

}
- Link download project Click here


EmoticonEmoticon