PDA

View Full Version : help set timer 0


maino17771
22-07-2011, 12:57 PM
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)
{
}
}

pstin
22-07-2011, 05:59 PM
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!!!!!!!!!!!!!

dinhthem
11-08-2011, 12:19 PM
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à đủ)

onkhacdokh
15-03-2012, 02:33 PM
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ỉ