toilet

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)

Moderators: THUONGDTQB
  1. Đăng 1/6/14 #1

    quachlenhho Sinh viên cao đẳng

    Số bài viết: 20
    Đã được thích: 48
    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
    tregiengchan, xuanphu1993, quatmay2 others thích bài này.
    #1
  2. Đăng 29/1/15 #2

    tregiengchan Học sinh phổ thông

    Số bài viết: 7
    Đã được thích: 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 :)
    #2
  3. Đăng 30/1/15 #3

    quachlenhho Sinh viên cao đẳng

    Số bài viết: 20
    Đã được thích: 48
    Oh, Trong code ví dụ mình thiếu GIE=1
    #3
  4. Đăng 4/2/15 #4

    ngocanh94 Học sinh phổ thông

    Số bài viết: 1
    Đã được thích: 0
    sao mình build trong XC8 không được nhỉ.. coppy với thêm y nnguyên ở trên
    #4
  5. Đăng 5/2/15 #5

    vuongcuvo Học sinh phổ thông

    Số bài viết: 1
    Đã được thích: 0
    mình cũng thế ~X(
    #5
  6. Đăng 18/3/15 #6

    levantien123 Học sinh phổ thông

    Số bài viết: 14
    Đã được thích: 1
    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);
    }

    }
    }
    #6
  7. Đăng 21/11/15 #7

    BinhLee Học sinh phổ thông

    Số bài viết: 22
    Đã được thích: 2
    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
    #7
Moderators: THUONGDTQB

Chia sẻ trang này