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:
- 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.
WPUB<7:0>: Weak Pull-up Register bit
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:
3. Các thanh ghi và các bit điều khiển ngắt ON-CHANGE:
- 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.
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.
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.
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
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.
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:
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;
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(){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 ;
ANSEL=ANSELH=0;
TRISB=PORTB=0xFF;
IOCB=?;WPUB=?;RBPU=0;
RBIE=1;RBIF=0;GIE=1;
while(1);
TRISB=PORTB=0xFF;
IOCB=?;WPUB=?;RBPU=0;
RBIE=1;RBIF=0;GIE=1;
while(1);
}
void interrupt isr(){
void interrupt isr(){
if(RBIF){
//Enter your code here
RBIF=0;// xóa cờ ngắt
bien=PORTB;
}
}//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.
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#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;
}
}
}
EmoticonEmoticon