PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Câu hỏi dsPIC thường gặp (http://www.picvietnam.com/forum/forumdisplay.php?f=69)
-   -   Xác định thời gian cho thanh ghi định thời (http://www.picvietnam.com/forum/showthread.php?t=974)

vtt 14-03-2007 07:13 PM

Xác định thời gian cho thanh ghi định thời
 
Chào bác namqn!
Em có tìm hiểu vidu2_x.c của bác nhưng em không hiểu làm sao bác xác định được thời gian cần ghi vào thanh ghi của bộ định thời. Như ở Vidu2_2.c bác bảo để trễ 1s thì nạp vào thanh ghi của bộ định thời 1 giá trị 0x7A12 (không biết em có nhớ chính xác không). Bác có thể nói rõ cách tính thời gian để ghi vào thanh ghi cho bộ định thời được không!
Cảm ơn bác trước!

namqn 14-03-2007 08:54 PM

Một sự thực mà tôi đã không chú ý đến là các công thức tính toán cho các bộ định thời của dsPIC không được đề cập đến trong datasheet cũng như trong Family Reference Manual. Nhân câu hỏi của bạn vtt, tôi sẽ trình bày chi tiết luôn để các bạn khỏi phải hỏi lại nhiều lần.

Các timer trong dsPIC được chia thành 3 loại chính: loại A, B, và C. Ngoài chức năng như một timer bình thường 16-bit, mỗi loại còn có các chức năng đặc biệt khác. Chẳng hạn, loại A có thể dùng clock của bộ dao động công suất thấp 32 kHz trên chip (cho đồng hồ thời gian thực chẳng hạn), và có thể dùng clock ngoài. Một timer loại B có thể nối với một timer loại C để tạo thành timer 32-bit, ngoài ra một số timer loại C có thể dùng để kích hoạt sự chuyển đổi A/D.

Nếu chỉ dùng như các timer bình thường 16-bit thì các công thức dưới đây áp dụng cho tất cả các loại timer nói trên (chúng ta chỉ quan tâm đến các khối Prescaler, TMRx, Comparator, và PRx trong sơ đồ khối của các timer). Tất nhiên tôi đang xét trường hợp dùng clock của chip đưa vào timer.

Tdelay = (Prescaler)x(PRx)x(Tcy) = (Prescaler)x(PRx)/(fcy)

Tdelay: thời gian cần làm trễ
Prescaler: giá trị nạp vào bộ chia trước (= 1, 4, 64, hay 256)
PRx: giá trị nạp vào thanh ghi PRx, x là số hiệu timer (x = 1 - 5)
Tcy: thời gian của một chu kỳ máy (thực thi lệnh)
fcy: tần số thực thi lệnh

Như vậy, nếu biết/chọn trước thời gian làm trễ thì có thể tính giá trị cần nạp vào thanh ghi PRx như sau:

PRx = (Tdelay)x(Fcy)/(Prescaler)

Lấy ví dụ bằng số, trong tập tin nguồn Vidu2-2.c, tôi dùng fcy = 8 MIPS = 8000000, và Prescaler = 1:256, do đó để có thời gian làm trễ là 1 giây thì cần nạp giá trị sau vào PRx:

PRx = (1)x(8000000)/(256) = 31250 = 0x7A12

Hy vọng các bạn đã rõ cách tính.

Thân,


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

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam