PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   Giúp đỡ về Timer1 ,Timer 2 ở chế độ counter (http://www.picvietnam.com/forum/showthread.php?t=4404)

8xloverock 30-06-2009 07:31 PM

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

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

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 ,

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

1 Attachment(s)
Trích:

Nguyên văn bởi 8xloverock (Post 27273)
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

Trích:

Nguyên văn bởi longphi54 (Post 36625)
<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é


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