Ðăng Nhập

View Full Version : đếm ngoài dùng timer0


p2009kc
09-06-2009, 10:46 PM
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:
#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;
}
}
Mạch điện có 8 leds đấu vào cổng B, xung 1Hz bên ngoài đưa vào RA4.

Mr.Bi
10-06-2009, 09:02 AM
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);

phamhoangthong
10-06-2009, 11:54 AM
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

p2009kc
10-06-2009, 02:08 PM
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.

lequocbao
10-06-2009, 07:32 PM
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!

p2009kc
11-06-2009, 12:02 AM
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.

p2009kc
11-06-2009, 12:03 AM
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.