![]() |
|
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 |
![]() |
#5 | |
Đệ tử 2 túi
Tham gia ngày: Jun 2006
Bài gửi: 27
: |
Trích:
Vấn đề tiếp theo ![]() Trở lại bài toán mà tôi đã đề cập ở trên, tuy nhiên khi này khoảng cách (thời gian) giữa 2 xung thay đổi trong một dải lớn, giả thiết là từ 100us đến 10ms. Vẫn sử dụng timer0 làm bộ định thời với clock nội = 1MHz, prescale = 1. Khi này không thể sử dụng cách mà tôi đã nêu ở bài trước (vì với những khoảng thời gian > 256us thì rõ ràng hàm get_timer0() sẽ trả về giá trị sai) Trong trường hợp này phương án giải quyết của tôi như sau: - ở phần khởi tạo, cho phép ngắt bởi bộ định thời 0. - phần chương trình thực hiện bởi ngắt định thời 0: tăng biến đếm i lên 1 (i là biến toàn cục) - ngắt ngoài khi có xung thứ nhất đến: gán i = 0; gọi hàm set_timer0(0); gọi hàm enable_interrupts(INT_TIMER0); - ngắt ngoài khi có xung thứ hai đến: diasble_interrupts(INT_TIMER0); Thời gian cần đo = i*256 + get_timer0(); [đơn vị us] Khi test chương trình trên proteus với khoảng cách xung lớn thì khá chính xác, nhưng khi khoảng cách nhỏ hơn 256 us thì kết quả ra không chính xác và thay đổi loạn cả lên, không hiểu vì sao ![]() Vậy mong mọi người xem qua phương án giải quyết bài toán của tôi và chỉ giùm tôi chỗ sai sót. To Namqn: Trên thực tế bài toán tôi cần giải quyết cho phép sai số 1 vài us khi đo. Cũng lâu rồi không vào diễn đàn, quả thật đã từng hỏi vấn đề này nhưng trước đó tôi hỏi theo khía cạnh khác có thể nói là không liên quan ![]() |
|
![]() |
![]() |
|
|