Saturday, February 20, 2016

BÀI 19 : NGẮT PORTB (ON - CHANGE) PIC16F887 XC8

1. INTERRUPT ON-CHANGE PORTB:
Ngoài ngắt INT chỉ có duy nhất ở chân RB0, thì cả PORTB (từ RB0 đến RB7) còn hỗ trợ ngắt on-change, ngắt on-change xảy ra khi tín hiệu logic ở chân của PORTB thay đổi trạng thái logic.
2. Sơ đồ ngắt ON-CHANGE:sơ đồ ngắt on change pic16f887

3. Các thanh ghi và các bit điều khiển ngắt ON-CHANGE:
wpub register

iocb register
- Khi IOCB(0-7) = 1 thì cho phép ngắt ngược lại khi IOCB(0-7) = 0 thì không cho phép ngắt.
option_reg register
WPUB<7:0>: Weak Pull-up Register bit
WPUBx=0 : Không cho phép điện trở kéo lên ở chân thứ x của PORTB.
WPUBx=1 : Cho phép điện trở kéo lên ở chân thứ x của PORTB.
IOCB<7:0>: Interrupt-on-Change PORTB Control bit
IOCBx=0 : Không cho phép ngắt on-change ở chân thứ x của PORTB.
IOCBx=1 : Cho phép ngắt on-change ở chân thứ x của PORTB.
RBPU: PORTB Pull-up Enable bit
RBPU=1 : Không cho phép điện trở kéo lên PORTB
RBPU=0 : Cho phép điện trở kéo lên PORTB
Các bit khởi tạo khác :
RBIF : Cờ ngắt on-change ở PORTB, cần phải xóa bít này trong lập trình.
RBIE : Bit cho phép ngắt on-change của PORTB.
GIE : Bit cho phép ngắt toàn cục.
4. Các bước khởi tạo ngắt on-change :
Bước 1: Khởi tạo PORTB là ngõ vào , tác động mức thấp:
TRISB=0xFF;PORTB=0xFF;
Bước 2: Khởi tạo điện trở kéo lên ở PORTB:
IOCB=?;WPUB=?;RBPU=0;
nếu chỉ dùng ngắt trên RB0 thì:
IOCB=0x01;// hoặc IOCB0=1;
WPUB=0x01;// hoặc WPUB1=1;
RBPU=0;
nếu ngắt cả PORTB thì:
IOCB=0xFF;WPUB=0xFF;RBPU=0;
Bước 3: Khởi tạo ngắt On-Change PORTB:
RBIE=1;RBIF=0;GIE=1;
Chú ý : Đối với ngắt on-change , việc xóa cờ ngắt (RBIF=0) không đủ để cho lần ngắt 
tiếp theo được thực hiện , mà còn phải thêm điều kiện đọc hoặc viết vào thanh ghi PORTB.
Ví dụ:
unsigned char bien ;
bien = PORTB ;//đọc thanh ghi PORTB.
hoặc PORTB=7 ;//viết vào thanh ghi PORTB
5. Code ví dụ.

unsigned char bien ;
void main(){
ANSEL=ANSELH=0;
TRISB=PORTB=0xFF;
IOCB=?;WPUB=?;RBPU=0;
RBIE=1;RBIF=0;GIE=1;
while(1);
}
void interrupt isr(){
if(RBIF){
//Enter your code here
RBIF=0;// xóa cờ ngắt
bien=PORTB;
}
}
6. So sánh giữa ngắt INT và ngắt ON-CHANGE:

7. Ảnh mô phỏng protues.

ngắt on - change pic16f887

8. Code chương trình đầy đủ.
#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)
{
    TRISD = 0x00;
    PORTD = 0XAA;
    IOCB = 0xFF;
    ANSELH = 0;
    INTCONbits.GIE = 1;
    INTCONbits.RBIE = 1;
    OPTION_REGbits.INTEDG = 1;
    while(1)
    {

    } 
}
void interrupt ISR(void)
{
        if(INTCONbits.RBIF==1)
        {
            {
                INTCONbits.RBIF = 0;
                PORTD = ~PORTD;
            }
        } 

}         
- Link download project Click here

No comments:

Post a Comment