PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Vấn đề ngắt ngoại vi portb (http://www.picvietnam.com/forum/showthread.php?t=7803)

angel_i2k 15-02-2011 09:01 PM

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 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


Múi giờ GMT. Hiện tại là 08:14 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam