PDA

View Full Version : Vấn đề ngắt ngoại vi portb


angel_i2k
15-02-2011, 09:01 PM
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
24-08-2011, 07:02 PM
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