Giúp đỡ về ngắt với pic16f877a

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • muatuyet_2012
    Nhập môn đệ tử
    • Apr 2010
    • 6

    #1

    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);
    }
    }
    }
    }
    }
    }
Working...