[AVR单片机] 定时时间为什么不准咧??

[复制链接]
1706|8
 楼主| huhaomcu 发表于 2014-1-8 16:16 | 显示全部楼层 |阅读模式
想用Timer0定时1s,可定时时间总是不准确,不知什么原因,希望大家帮忙看看!!
用的是TIMER0比较匹配,这是我的定时计算式:定时器时钟为1Mhz/64,指令周期为1/(1MHZ/64)=0.064ms,0.064*125*125=1000ms
#define FOSC 1000000UL
int cnt;

int main(void)
{
    DDRD = 0x03;
    PORTD = 0x00;

    ATmega88P_Timer0_Init();
    SREG |= 0x80;
    while(1);
}

void ATmega88P_Timer0_Init()
{
    TCCR0A = 0x02;
    TCCR0B = 0x03;
    TIMSK0 = 0x02;
    OCR0A = 124;
}

ISR(TIMER0_COMPA_vect)
{
    cnt++;
    if(cnt >= 124)
    {
        cnt = 0;
        PORTD ^= 0x03;
    }
}

airwill 发表于 2014-1-8 18:02 | 显示全部楼层
是什么时钟源, 如果是内部 RC 振荡器的话, 本身就由误差的. 不准是正常的.
huangxz 发表于 2014-1-9 11:22 | 显示全部楼层
计算方法没有问题,有多不准啊,
 楼主| huhaomcu 发表于 2014-1-9 11:59 | 显示全部楼层
airwill 发表于 2014-1-8 18:02
是什么时钟源, 如果是内部 RC 振荡器的话, 本身就由误差的. 不准是正常的.

用的是它默认的时钟,ATmega88P,也就是1MHZ的时钟,但它定的是1000ms,但却只有800ms,应该是程序有问题!
 楼主| huhaomcu 发表于 2014-1-9 11:59 | 显示全部楼层
huangxz 发表于 2014-1-9 11:22
计算方法没有问题,有多不准啊,

用的是它默认的时钟,ATmega88P,也就是1MHZ的时钟,但它定的是1000ms,但却只有800ms,应该是程序有问题!
huangxz 发表于 2014-1-9 19:03 | 显示全部楼层
huhaomcu 发表于 2014-1-9 11:59
用的是它默认的时钟,ATmega88P,也就是1MHZ的时钟,但它定的是1000ms,但却只有800ms,应该是程序有问题 ...

建议楼主先排除晶振问题,用外部的,首先要保证源是正确的,再来分析别的。
qin552011373 发表于 2014-1-11 22:19 | 显示全部楼层
楼主的供电电压是多少的?如果用的是内部晶振,电压不同的话,频率不一样的,datasheet有详细写,楼主可以看看的
 楼主| huhaomcu 发表于 2014-1-12 14:39 | 显示全部楼层
qin552011373 发表于 2014-1-11 22:19
楼主的供电电压是多少的?如果用的是内部晶振,电压不同的话,频率不一样的,datasheet有详细写,楼主可以 ...

我用的Protues仿真的,串口通信也是用的如此1MHz,能正常通信!我觉得还是我定时器那部分设置有问题!!
qin552011373 发表于 2014-1-12 22:14 | 显示全部楼层
huhaomcu 发表于 2014-1-12 14:39
我用的Protues仿真的,串口通信也是用的如此1MHz,能正常通信!我觉得还是我定时器那部分设置有问题!! ...

用实物吧,仿真不准确
您需要登录后才可以回帖 登录 | 注册

本版积分规则

190

主题

509

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部