PDA

View Full Version : Giúp đỡ về Timer1 ,Timer 2 ở chế độ counter


8xloverock
30-06-2009, 07:31 PM
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

8xloverock
01-07-2009, 05:34 PM
Sao chỉ có ngừoi đọc mà không có ai trả lời hết vầy nè ;(

newboystylew
01-07-2009, 09:28 PM
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 ,

8xloverock
02-07-2009, 12:28 AM
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

tdm
03-07-2009, 04:53 PM
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
tôi chỉ có c/t viết bằng asm thôi.

longphi54
09-06-2010, 03:48 PM
<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

0903579509
10-06-2010, 07:47 AM
Để 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.

longphi54
10-06-2010, 06:11 PM
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

manhdktd
15-06-2010, 03:55 AM
<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

khi bạn dùng lệnh output_c(0) thi nó đã bao hàm cả việc thiết lập cổng ra rồi.
để đếm xung thi ta cho RC0 là in put
lệnh OUTPUT_C(0x01)
speed=get_timer1();

manhdktd
15-06-2010, 03:56 AM
cậu xem lại đi nhé