|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
|
Ðiều Chỉnh | Xếp Bài |
12-12-2012, 11:43 AM | #1 |
Nhập môn đệ tử
Tham gia ngày: Apr 2010
Bài gửi: 6
: |
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); } } } } } } |
|
|