Giúp đỡ về Timer1 ,Timer 2 ở chế độ counter
Counter của timer0 thì mình hiểu rồi , còn counter của timer1 và timer2 thì sao? Mình tra hoài ko thấy. Trường hợp phải đếm 2 nguồn xung thì phải dùng 2 counter chứ . Các bạn có thể giúp mình dc không? Nếu có ví dụ cụ thể thì càng hay :) .Thanks các bạn nhiều
|
Sao chỉ có ngừoi đọc mà không có ai trả lời hết vầy nè ;(
|
timer1
ban can dem xung thi can phai dung ngat timer,ban gan gia tri cho timer1 va cho no bat dau dem thi ban co the lam viec khac va cho cho den khi no dem xong thi se xay ra ngat,timer1 co 16bit ,
|
Trong Pic16f877a có 3 timer :
+ Timer0 : 8 bit + Timer1 : 16 bit + Timer2 : 8 bit Timer dùng cho nhiều ứng dụng : định thời, capture, pwm, ... 1.Timer0 Thanh ghi tác động: Các lệnh: Code: setup_TIMER_0(mode); setup_COUNTERS (rtcc_state, ps_state); // hay setup_WDT() set_TIMER0(value); // hay set_RTCC(value) :xác định giá trị ban đầu (8bit) cho Timer0 get_TIMER0(); // hay get_RTCC() :trả về số nguyên (8bit) của Timer0 Trong đó mode là một hoặc hai constant (nếu dùng hai thì chèn dấu "|"ở giữa) được định nghĩa trong file 16F877A.h gồm : RTCC_INTERNAL : chọn xung clock nội RTCC_EXT_L_TO_H : chọn bit cạnh lên trên chân RA4 RTCC_EXT_H_TO_L : chọn bit cạnh xuống trên chân RA4 RTCC_DIV_2 :chia prescaler 1:2 RTCC_DIV_4 1:4 RTCC_DIV_8 1:8 RTCC_DIV_16 1:16 RTCC_DIV_32 1:32 RTCC_DIV_64 1:64 RTCC_DIV_128 1:128 RTCC_DIV_256 1:256 rtcc_state là một trong những constant sau: RTCC_INTERNAL RTCC_EXT_L_TO_H RTCC_EXT_H_TO_L ps_state là một trong những constant sau: RTCC_DIV_2 RTCC_DIV_4 RTCC_DIV_8 RTCC_DIV_16 RTCC_DIV_32 RTCC_DIV_64 RTCC_DIV_128 RTCC_DIV_256 WDT_18MS WDT_36MS WDT_72MS WDT_144MS WDT_288MS WDT_576MS WDT_1152MS WDT_2304MS Mình cũng chưa hiểu ý nghĩa của hàm WDT_..., ko biết có phải khai báo như trên thì sau khoảng thời gian ms bao nhiêu đó đặt sau WDT_ thì sẽ reset lại Pic ????? 2.Timer1 Thanh ghi tác động: Các lệnh: Code: setup_TIMER_1(mode); set_TIMER1(value); // xác định giá trị ban đầu (16bit) cho Timer1 get_TIMER1(); // trả về số nguyên (16bit) của Timer1 mode gồm (có thể kết hợp bằng dấu "|"): T1_DISABLED : tắt Timer1 T1_INTERNAL : xung clock nội (Fosc/4) T1_EXTERNAL : xung clock ngoài trên chân RC0 T1_EXTERNAL_SYNC : xung clock ngoài đồng bộ T1_CLK_OUT T1_DIV_BY_1 T1_DIV_BY_2 T1_DIV_BY_4 T1_DIV_BY_8 3.Timer2 Thanh ghi tác động: Các lệnh: Code: setup_TIMER_2(mode, period, postscale); set_TIMER2(value); // xác định giá trị ban đầu (8bit) cho Timer2 get_TIMER2(); // trả về số nguyên 8bit Với mode gồm (co the ket hop bang dau "|"): T2_DISABLED T2_DIV_BY_1 T2_DIV_BY_4 T2_DIV_BY_16 period là số nguyên từ 0-255, xác định giá trị xung reset postscale là số nguyên 1-16, xác định reset bao nhiêu lần trước khi ngắt. Đọc đi đọc lại chả thấy hướng dẫn gì về counter cho timer1 và 2 cả. Hàm setup_COUNTERS (rtcc_state, ps_state); là dành riêng cho timer0 .Nếu timer1 và 2 cũng có hàm đại loại như là setup_counters_1 hay gì gì đó thì đỡ biết mấy |
1 Attachment(s)
Trích:
|
<code>
#include <16f877a.h> #fuses noprotect,nowdt,nolvp,xt,put #use delay(clock=4000000) #use fast_io(a) #use fast_io(c) #use fast_io(b) #use fast_io(d) #use fast_io(e) #byte porta=0x05 #byte portb=0x06 #byte portc=0x07 #byte portd=0x08 #byte porte=0x09 #bit d0=portd.0 #bit d1=portd.1 #bit d2=portd.2 #bit d3=portd.3 #bit d4=portd.4 #bit d5=portd.5 #bit d6=portd.6 #bit d7=portd.7 #bit b0=portb.0 #bit b1=portb.1 #bit b2=portb.2 #bit b3=portb.3 #bit b5=portb.4 #bit b4=portb.5 #bit b6=portb.6 #bit b7=portb.7 #bit a0=porta.0 #bit a1=porta.1 #bit a2=porta.2 #bit a3=porta.3 #bit a4=porta.4 #bit a5=porta.5 #bit c0=portc.0 #bit c4=portc.4 #bit c6=portc.6 #bit e0=porte.0 #bit e1=porte.1 #bit e2=porte.2 int8 speed=0; void main() { set_tris_c(0b00000001); output_c(0); set_tris_a(0b010000); output_a(0); set_tris_d(0b00000000); output_d(0); set_tris_e(0b000); output_e(0); set_tris_b(0b00000000); output_b(0); ///////////////////////////////////// while(1) { setup_TIMER_1(T1_EXTERNAL|T1_DIV_BY_1); set_TIMER1(0); get_TIMER1(); delay_ms(1000); setup_timer_1(T1_DISABLED); speed=get_timer1(); portb=speed; } } </code> mình viết theo hướng dẫn ở trên. Đọc xung từ RC0 ở timer1 mà sao làm hoài ko chạy vậy ai giúp mình với |
Để sử dụng Timer1 làm counter chỉ cần dùng lệnh setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1) là counter của T1 sẽ hoạt động
Để lấy data từ T1 :A = getTimer_1() Để bắt đầu : set_timer1(0) @ philong54: Bạn chú ý đoạn này: set_tris_c(0b00000001); output_c(0); Khi output_C(0) thì portC trở thành cổng ra do đó không thể nhận được xung vào. Bạn nên có giải pháp khác. Thân. |
thế bạn có cách nào ko tại chân c1 và c2 mình điều chế xung điều khiển động cơ nên phải cho nó ouput
|
Trích:
để đếm xung thi ta cho RC0 là in put lệnh OUTPUT_C(0x01) speed=get_timer1(); |
cậu xem lại đi nhé
|
Múi giờ GMT. Hiện tại là 12:34 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