Chia sẻ PIC16F887 #02: INTERRUPT INT (RB0)

quachlenhho

Sinh viên cao đẳng
#1
1. Ngắt ngoài INT ở chân RB0:
Để xử lý được các tín hiệu tức thời ( cạnh lên hay cạnh xuống ) , chân RB0 có hỗ trợ xử lý ngắt (interrupt) ký hiệu INT
2. Sơ đồ ngắt:

1.PNG


-INTE (Interrupt enable) : bit cho phép ngắt ở PORTB.
-INTF (Interrupt flag): cờ ngắt , bit này tự động bằng 1 khi có sự kiện ngắt (cạnh lên hay cạnh xuống) xảy ra ở chân RB0, ta phải xóa bít này trong khi lập trình.
-GIE (Global interrupt) : bit cho phép ngắt toàn cục.
-INTEDG (interrupt edge select bit ) : Bit chọn cạnh tác động để sinh ra sự kiện ngắt ở PORTB.

INTEDG=1: Xảy ra ngắt khi có tín hiệu cạnh lên ở PORTB
INTEDG=0: Xảy ra ngắt khi có tín hiệu cạnh xuống ở PORTB
3.Các bước khởi tạo ngắt INT:
Bước 1: Khởi tạo RB0 là ngõ vào , tác động mức thấp:

TRISB0=1; RB0=1;
Bước 2: Khởi tạo ngắt ngoài ở chân RB0:
INTEDG=x; //x=1 Xảy ra ngắt khi có tín hiệu cạnh lên ;x=0 Xảy ra ngắt khi có tín hiệu cạnh xuống
INTE=1;
INTF=0;
GIE=1;
4. Code ngắt:
void main(){
ANSEL=ANSELH=0;
TRISB0=RB0=1;
INTEDG=?;
INTE=1;INTF=0;GIE=1;
while(1);
}

void interrupt isr(){

if(INTF){
//Enter your code here
INTF=0;// xóa cờ ngắt
}
}


5. Ví dụ: Nếu RB0 có cạnh xuống thì đảo trạng thái PORTC?
2.PNG

#include<htc.h>
__CONFIG(HS&WDTDIS&PWRTEN&MCLREN&UNPROTECT&DUNPROTECT&BORDIS&IESODIS&LVPDIS&FCMDIS);
#define _XTAL_FREQ 20000000
void main(){

ANSEL=ANSELH=0;
TRISB0=RB0=1;
TRISC=0x00;PORTC=0x00;
INTEDG=0;
INTF=0;
while(1);
}

void interrupt isr(){

if(INTF){
PORTC=~PORTC;
INTF=0;
}
}
Tài liệu tham khảo Datasheet PIC16F887
Chia sẻ - PIC16F887 #03: INTERRUPT ON CHANGE PORTB | Cộng đồng cơ điện tử Việt Nam | Mechatronics
 
Sửa lần cuối:

tregiengchan

Học sinh phổ thông
#2
Cám ơn bạn rất nhiều. Bọn mình mới học được vài hôm Thầy đã bắt lập trình Led dùng ngắt ngoài rồi. Haizz
Đoạn Code thứ 2 mình phải thêm lệnh GIE=1 như đoạn đầu mới chạy được :)
 

ngocanh94

Học sinh phổ thông
#4
sao mình build trong XC8 không được nhỉ.. coppy với thêm y nnguyên ở trên
 

levantien123

Học sinh phổ thông
#6
các bác xem giúp phần chương trình này mình thiếu cái gì mà phần while nó không chạy hàm if mak khi khởi động bay thẳng vào ham for lun vậy
const unsigned char code7seg[]={192,249,164,176,153,146,130,248,128,144};
void main()
{
unsigned char i;


PORTA=0xFF;

TRISC=0;

TRISD=0;
PORTD=0X00;


while(1)

{
if(Button(&PORTA,1,20,0)) //nut nhan o port a bit thu 1, chong doi phim 20ms, kich hoat o muc 0
{
for(i=9;i>0;i-- )
{
PORTC = code7seg;
delay_ms(1000);
}
PORTC=code7seg[0]; //hoac =code7seg
PORTD.B0=1; //PORTD bit thu1
while(1);
}

}
}
 

BinhLee

Học sinh phổ thông
#7
hi cả nhà, cho mình hỏi, code trên chỉ chạy mô phỏng tốt thoy.
Thế nếu trong mạch thật xài nút nhấn sẽ có rung, dội, muốn xử lý thì làm sao ạ.
Mình chỉ mới biết xử lý khi là IO port thôi, còn ngắt thì xét trạng thái thế nào để nhấn nút (có thể giữ nút), hắn vẫn chỉ thực hiện một (và chỉ một ) lệnh. :D
 

Quảng cáo Google