PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

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
Prev Previous Post   Next Post Next
Old 19-07-2008, 12:01 PM   #5
bachelor
Đệ tử 2 túi
 
Tham gia ngày: Jun 2006
Bài gửi: 27
:
Trích:
Nguyên văn bởi namqn View Post
Về nguyên tắc, cách làm của bạn là ổn. Nếu bạn dùng hàm set_timer0(0) khi phát hiện xung thứ nhất, số đếm của timer0 sẽ được đặt là 0, và timer sẽ tiếp tục chạy nếu nó được kích hoạt (enabled). Ở xung thứ hai, bạn dùng hàm get_timer0() để lấy số đếm thì có thể đo được khoảng thời gian giữa hai xung.

Tuy nhiên, bạn cần chú ý là tồn tại thời gian trễ giữa thời điểm xuất hiện xung thứ nhất và tác động xóa số đếm của timer0 bằng lệnh set_timer0(0), cũng như giữa thời điểm xuất hiện xung thứ hai và lệnh get_timer0(). Nếu bạn cần độ chính xác cỡ 1 us, bạn cần phải xem xét kỹ lưỡng những yếu tố này, tốt nhất là dùng thực nghiệm để xác định độ lệch nếu có.

Có vẻ như bạn đã từng hỏi vấn đề này trên diễn đàn cách đây một dạo?

Thân,
Thanhks, như vậy là đã rõ về hàm set_timerX();
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 . Thanks !
bachelor vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 07:31 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam