09-06-2009, 10:46 PM | #1 |
Nhập môn đệ tử
Tham gia ngày: Jun 2009
Bài gửi: 6
: |
đếm ngoài dùng timer0
Em mới n/cứu về PIC, khi viết c.trình dùng timer để đếm nhưng không được, em cũng không biết code sai ở đâu nữa. Các bác chỉ giúp em với, các bác thông cảm em vẫn còn gà lắm.
Code em viết như sau: Code:
#include <16F877A.h> #fuses NOWDT,PUT,XT,NOPROTECT #use delay(clock=4000000) #byte PORTB = 0x06 int8 leds; #int_timer0 void interrupt_timer0() { set_timer0(0); ++leds; if(leds == 255) { leds=1; } } void main(void) { enable_interrupts(global); enable_interrupts(int_timer0); setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_2); set_timer0(0); leds=1; while (1) { PORTB=leds; } } thay đổi nội dung bởi: namqn, 10-06-2009 lúc 12:10 AM. Lý do: định dạng code |
10-06-2009, 09:02 AM | #2 |
Đệ tử 7 túi
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
: |
u nhầm oy , khai báo trên của u là timer0 làm bộ counter . Có phải í u là
+ vô ngắt timer0 thì biến leds tăng + ra hàm chính sẽ lấy giá trị leds đó xuất ra PORTB ? Nếu vậy thì phải khai báo lại chỗ này setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_2); |
10-06-2009, 11:54 AM | #3 |
Nhập môn đệ tử
Tham gia ngày: Oct 2007
Bài gửi: 6
: |
u sai chổ này nè ! biến led của em chỉ tăng sau 256 second ! Có phải khi có 1 clock vào thì giá trị bộ counter của timer0 tăng lên 1. Nhưng khi giá trị bộ counter là 256 thì interrupt_timer mới thực hiện => portB tăng theo chu kỳ 1/256 Hz
|
10-06-2009, 02:08 PM | #4 |
Nhập môn đệ tử
Tham gia ngày: Jun 2009
Bài gửi: 6
: |
Cám ơn bác Mr.Bi và bác phamhoangthong nhưng em sửa vẫn không được. Ý của em như bác Mr.Bi đã nói nhưng bác bảo sửa setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_2); thành gì? Còn như bác phamhoangthong nói vậy thì sau 256 second thì led phải sáng nhưng ở đây không thấy gì các bác ạ.
Các bác giúp em nhé vì em thực hiện trên cả mô phỏng và mạch đều không được. |
10-06-2009, 07:32 PM | #5 |
Đệ tử 6 túi
Tham gia ngày: Oct 2008
Nơi Cư Ngụ: HCM
Bài gửi: 137
: |
xung 1hz thì cần gì phải dùng tới timer0 hả bạn?dùng đại chân io bình thường là tốt rùi!
bạn thử thêm: set_tris_a(0xff); set_tris_b(0x00); thử coi. set_timer_0(0); xung vào *2 vậy là có 128 xung 1hz (tương đương 128s)vào chân ra4 thì xảy ra ngắt. còn không được thì bỏ quách thằng |RTCC_DIV_2 đi(hình như là dùng ở chế độ counter không có tiết mục này). bạn muốn cứ có 1 xung thì xảy ra ngắt thì bạn phải set_timer_0(255); chứ bạn!
__________________
A&A thay đổi nội dung bởi: lequocbao, 10-06-2009 lúc 07:42 PM. |
11-06-2009, 12:02 AM | #6 |
Nhập môn đệ tử
Tham gia ngày: Jun 2009
Bài gửi: 6
: |
Cám ơn bác lequocbao nhiều, em đã làm được rồi, nguyên do đúng như bác, nói do em thiếu: set_tris_a(0xff); set_tris_b(0x00); phải set_timer_0(255); để đúng 1 second thì phải set_timer_0(255);
Trước đó em đã thử ngắt trên R0 thì đã OK rồi. |
11-06-2009, 12:03 AM | #7 |
Nhập môn đệ tử
Tham gia ngày: Jun 2009
Bài gửi: 6
: |
Cám ơn bác lequocbao nhiều, em đã làm được rồi, nguyên do đúng như bác nói do em thiếu: set_tris_a(0xff); set_tris_b(0x00); phải set_timer_0(255); để đúng 1 second thì phải set_timer_0(255);
Trước đó em đã thử ngắt trên R0 thì đã OK rồi. |
|
|