|
11-10-2011, 02:37 AM | #1 |
Nhập môn đệ tử
Tham gia ngày: Feb 2010
Bài gửi: 2
: |
Đo tần số bằng timer1 chế độ counter
Các anh ơi cho em hỏi, em dùng Timer 1 đo tần số bộ dao động ngoài tạo bởi con IC Timer 555 ,đo số xung bởi timer1 chế độ counter trong thời gian 1s tạo bởi timer0 nhưng kết quả đo được không chính xác.Ban đầu proteus mô phỏng là 0 Hz (cảnh báo "Simulation is not running in real time due to excessive cpu load" ), đợi 1 lúc lâu sau thì đạt tầm >34kHz mà theo lý thuyết tính tần số ra của 555 với mạch của em,thì chỉ đạt tầm 6->7kHz thôi. Code của em như sau ạ :
#include <16F877A.h> #include <DEFS_16F877A.h> #fuses NOWDT,PUT,XT,NOPROTECT #use delay(clock=4000000)//Fosc=1us #byte T1CON =0x10//dia chi thanh ghi dieu khien cua timer1 #use fast_io(c) #use fast_io(d) #include <lcd.c> int16 count; int16 uiTimer1Ctr;//so xung lay ra tu timer 1 ~ tan so ra cua pin 3 of IC555 static void initCPU(void); void main() { initCPU(); while(1) { lcd_gotoxy(1,1); printf(lcd_putc,"\rTan so:%Lu",uiTimer1Ctr); } } #INT_timer0 //Chuong trinh ngat timer0 void Timer0_isr() //Ham duoc goi khi timer 0 bi tran (255->0) { int16 t0ctr;//bien dem so lan tran cua timer0 set_timer0(56);//Tdinhthi=2*(256-56)*1us=400us ++t0ctr; if(t0ctr==2500)//1s { bit_clear(T1CON,0);//stop bo dem timer1 uiTimer1Ctr=count*65535+get_Timer1(); t0ctr=0; bit_set(T1CON,0); set_TIMER1(0); } } #INT_timer1 void Timer1_isr() { count++; } static void initCPU() { set_tris_d(0); set_tris_c(0b00000001); setup_TIMER_1(T1_EXTERNAL|T1_DIV_BY_1); set_TIMER1(0); setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_2); set_timer0 (56); enable_interrupts (INT_timer0) ; enable_interrupts (INT_timer1); enable_interrupts (global) ; count=0; lcd_init () ; } |
11-10-2011, 03:18 PM | #2 |
Đệ tử 2 túi
Tham gia ngày: May 2009
Bài gửi: 41
: |
đo tần số ngoài bạn thử dùng ngắt ngoài RB0 xem!
xem qua code bạn thấy đã dùng chế độ counter cho Timer0 rồi mà vẫn dùng ngắt timer0 là ý gì nhỉ???
__________________
Các loại module, linh kiện tại http://dientuso1.com/ |
12-10-2011, 12:38 AM | #3 |
Nhập môn đệ tử
Tham gia ngày: Feb 2010
Bài gửi: 2
: |
Nếu dùng ngắt ngoài RB0 thì vẫn cần dùng timer0 để định thời gian 1s rồi tính ra tần số hả bạn? Ở đây mình dùng timer1 ở chế độ counter đếm xung ngoài vào RC0 của pic và dùng timer0 định thời gian 1s thì cũng thế mà .Nhưng tại sao mô phỏng thì kết quả sai tùm lum, lớn hơn lý thuyết rất nhiều :|
|
|
|