![]() |
help set timer 0
Mình muốn sao mỗi giây thì tăng giá trị của Port D lên 1 lần.
Sao mình mô phỏng trên protues thì lâu hơn 1 giây nó mới tăng lên 1 lần.Không lẽ mình giá trị của set_Timer0 không đúng. Ai giúp mình với. #include <16F877A.h> #include <DEF_877a.h> #fuses NOWDT,PUT,XT,NOPROTECT #use delay(clock=4000000) #byte PORTB = 0x06 int16 count; int8 a,b; int8 c; //Chuong trinh ngat TMR0 #int_timer0 void interrupt_timer0() { set_timer0(6); ++count; if(count == 2000) // 2000*500us = 500000us = 1s { count=0; a++; if(a ==10) { a=0; b++; if(b==6) b=0; } c=b<<4; c=c+a; PORTD = c; } } //Chuong trinh chinh void main(void) { set_tris_d(0); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); enable_interrupts(int_timer0|global); set_timer0(6);// T_dinhthi = 2*(256 - 6)*1us = 500us a=0; b=0; c=0; while(true) { } } |
Cái này trên mạch thật tui thấy cũng có sai chút ít về thời gian!!!!!!!!. Đoán là trong CCS nó bị trễ vài chu kỳ lệnh ở chổ nào đó!!!!!!!!!.
Chơi cùi là tính toán nhập lại giảm giá tri của count hoặc set lại giá trị ban đầu của timer0 sao cho nó đúng 1S là OK thôi!!!!!!!!!!!!! |
Không phải đâu, thời gian trong Protues bị sai đó!
Mình đã làm rồi, nếu không tin thì bạn xài realtime của nó, chạy chậm hơn 5 - 6s / 1 phút Góp ý thêm cho bạn là dùng timer1, 16bit + 3bit prescale = 19 bit rồi, sẽ hạn chế nhiều chu kì lệnh, thời gian sẽ chính xác hơn. (khi đó biến count của bạn = 2 là đủ) |
có bạn nào hiểu tường tận về timer và counter không giúp mình với và minh còn có một thắc mắc nữa là làm thế nào để tăng thêm cổng nhập dữ liệu cho pic nhỉ
|
Múi giờ GMT. Hiện tại là 05:11 AM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam