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

Thảo luận trong 'Họ PIC -> dsPIC'

Đang xem chủ đề này ( Thành viên: 0, Khách: 0)

  1. quachlenhho

    quachlenhho Sinh viên cao đẳng

    Tham gia ngày:
    14/11/13
    Bài viết:
    19
    Đã được thích:
    46
    Điểm thành tích:
    13
    Giới tính:
    Nam
    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
     
    Last edited: 2/6/14
    tregiengchan, xuanphu1993, quatmay2 others thích bài này.
  2. tregiengchan

    tregiengchan Học sinh phổ thông

    Tham gia ngày:
    24/9/14
    Bài viết:
    7
    Đã được thích:
    2
    Điểm thành tích:
    3
    Giới tính:
    Nam
    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 :)
     
  3. quachlenhho

    quachlenhho Sinh viên cao đẳng

    Tham gia ngày:
    14/11/13
    Bài viết:
    19
    Đã được thích:
    46
    Điểm thành tích:
    13
    Giới tính:
    Nam
    Oh, Trong code ví dụ mình thiếu GIE=1
     
  4. ngocanh94

    ngocanh94 Học sinh phổ thông

    Tham gia ngày:
    30/1/15
    Bài viết:
    1
    Đã được thích:
    0
    Điểm thành tích:
    1
    sao mình build trong XC8 không được nhỉ.. coppy với thêm y nnguyên ở trên
     
  5. vuongcuvo

    vuongcuvo Học sinh phổ thông

    Tham gia ngày:
    1/2/15
    Bài viết:
    1
    Đã được thích:
    0
    Điểm thành tích:
    1
    Giới tính:
    Nam
    mình cũng thế ~X(
     
  6. levantien123

    levantien123 Học sinh phổ thông

    Tham gia ngày:
    10/11/14
    Bài viết:
    14
    Đã được thích:
    1
    Điểm thành tích:
    3
    Giới tính:
    Nam
    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);
    }

    }
    }
     
  7. BinhLee

    BinhLee Học sinh phổ thông

    Tham gia ngày:
    18/9/15
    Bài viết:
    22
    Đã được thích:
    2
    Điểm thành tích:
    3
    Giới tính:
    Nam
    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
     

Chia sẻ trang này