Vấn đề ngắt ngoại vi portb

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • angel_i2k
    Nhập môn đệ tử
    • Aug 2010
    • 8

    #1

    Vấn đề ngắt ngoại vi portb

    Chào các Pro!
    Mình mới học pic nên có chút khó hiểu về ngắt ngoại vi port b. Chương trình của mình là dùng timer 0 để đếm đồng hồ hiển thị led 7 đoạn. Mình đã test ok. Nhưng khi mình thêm phần ngắt chân RB7 thì có vấn đề. Mình nối rb7 với 1 switch. Mình muốn khi rb7 mức 1 thì đồng hồ led 7 đoạn chạy bình thường. Còn khi rb7 mức 0 thì đồng hồ ngừng chạy. Nhưng khi mình test thì khi rb7 xuống mức 0 đồng hồ đứng luôn. Mặc dù mình điều khiển switch làm rb7 lên mức 1 lại vẫn không chạy lại được. Đây là chương trình. Mong các Pro quan tâm. Thanks nhiều.

    #include<stdlib.h>
    #include<math.h>
    #use delay(clock= 20000000)
    #byte portb=0x06
    #byte portc=0x07
    #byte portd=0x08
    #int_rb
    int gio,phut,giay;
    int gio_chuc,gio_donvi;
    int phut_chuc,phut_donvi;
    int giay_chuc,giay_donvi;
    int16 count;
    // CHUONG TRINH NGAT PORT B
    RB_ISR()
    {
    IF (pin_b7 ==0 )
    {
    disable_interrupts(int_timer0);
    break;
    }
    if (pin_b7 ==1)
    {
    enable_interrupts(int_timer0);
    break;
    }

    }
    // CHUONG TRINH DEM THOI GIAN
    void dem_thoi_gian (int &gio, int &phut, int &giay)
    {
    giay++;
    if (giay==60)
    {
    giay = 0;
    phut++;
    }
    if (phut == 60)
    {
    phut = 0;
    gio++;
    }
    if (gio==24)
    {
    gio = 0;
    phut=0 ;
    giay=0 ;
    }
    }

    // CHUONG TRINH XUAT LED 7 DOAN
    int xuat_led(int x)
    {
    int value;
    switch(x)
    {
    case 0:
    value = 0x03;
    break;
    case 1:
    value = 0x9F;
    break;
    case 2:
    value = 0x25;
    break;
    case 3:
    value = 0x0D;
    break;
    case 4:
    value = 0x99;
    break;
    case 5:
    value = 0x49;
    break;
    case 6:
    value = 0x41;
    break;
    case 7:
    value = 0x1f;
    break;
    case 8:
    value = 0x01;
    break;
    case 9:
    value = 0x09;
    break;
    }
    return value;
    }

    // CHUONG TRINH NGAT TIMER 0
    #int_timer0
    void interrupts_timer0()
    {
    count++;
    if(count ==10000)
    {
    count = 0;
    dem_thoi_gian(gio,phut,giay);
    }
    }


    void main()
    {
    set_tris_b(0xff);
    set_tris_c(0);
    set_tris_d(0);
    gio=0;
    phut=0;
    giay=0;
    enable_interrupts(int_rb);
    enable_interrupts(global);
    enable_interrupts(int_timer0);
    setup_timer_0(RTCC_DIV_2|RTCC_INTERNAL);
    set_timer0(6);
    while (1)
    {
    gio_chuc = gio/10;
    gio_donvi= gio%10;
    phut_chuc = phut/10;
    phut_donvi= phut%10;
    giay_chuc = giay/10;
    giay_donvi= giay%10;

    portc=0xfb;
    portd=xuat_led(giay_donvi);
    delay_ms(1);

    portc=0xf7;
    portd=xuat_led(giay_chuc);
    delay_ms(1);

    portc=0xef;
    portd=xuat_led(phut_donvi);
    delay_ms(1);

    portc=0xdf;
    portd=xuat_led(phut_chuc);
    delay_ms(1);

    portc=0xbf;
    portd=xuat_led(gio_donvi);
    delay_ms(1);

    portc=0x7f;
    portd=xuat_led(gio_chuc);
    delay_ms(1);
    }
    }
  • duongvanthuy_qt
    Nhập môn đệ tử
    • Sep 2009
    • 3

    #2
    lổi ở đây có thể do bạn chưa đặt điều kiện nhận dữ liệu cho Port B
    set_tris B(0xFF);
    thử xem

    Comment

    Working...