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: -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? #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
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
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); } } }
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.