View Single Post
Old 12-12-2012, 11:43 AM   #1
muatuyet_2012
Nhập môn đệ tử
 
Tham gia ngày: Apr 2010
Bài gửi: 6
:
Exclamation Giúp đỡ về ngắt với pic16f877a

Mình đã đọc nhiều luồng về ngắt timer nhưng vẫn chưa áp dụng đúng vào chương trình của mình,mong các bạn góp ý giúp mình với.
Mình dùng Pic16f877a , crystal: 20Mhz hiển thị led 7 đoạn

Mô tả một chút về công việc mình làm như sau:
1. Đọc ADC ( h= read_analog(0) )
2. Có 4 nút nhấn : UP,DOWN,SET,ENTER để đặt giá trị ban đầu set_high,wd_high,time
Các giá trị set_high,wd_high,time là các giá trị đặt trước.
3. Mình muốn điều khiển như sau:
ta có: c1= set_high/time;
y1= h - set_high;
z1= y1/c1; (z1 ,time : theo đơn vị tính là thời gian (giây))
Led sẽ sáng với thời gian z1 (giây) sau đó tắt với thời gian tắt là (time - z1) (giây)

Khi không dùng ngắt thì code chạy đúng nhưng có vấn đề nhỏ như sau: Khi led đang sáng hay đang tắt thì led 7 đoạn ko hoạt động và không thể sử dụng nút nhấn vì mình sử dụng hàm delay_ms() để điều khiển.Mình muốn dùng ngắt trong trường hợp này thì phải làm sao.Mong các bạn giúp đỡ .
Code của mình khi ko dùng ngắt như sau:

while(1)
{
a=read_analog(0);
a= a/div ;
h=a;
SET_ENTER(); // hàm đặt giá trị ban đầu
if(setenter==5) //kiểm tra kết thúc quá trình đặt giá trị
{
if(h > (set_high + wd_high))
{ LED=1; p=1;}

if(p==1)
{
if(h <= (set_high + wd_high))
{
if(h<= set_high)
{
p=0;
LED=0;
}
else
{
c1 = wd_high / time;
y1 = h - set_high;
z1 = y1/c1;

//Mình đang cần dùng ngắt để xử lý đoạn này:
for(k=0;k<z1;k++)
{
LED=1;
delay_ms(1000);
}
for(l=0;l<(time - z1);l++)
{
LED=0;
delay_ms(1000);
}
}
}
}
}
}
muatuyet_2012 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn