4141|3

180

帖子

0

TA的资源

五彩晶圆(中级)

楼主
 

mega8定时新问 [复制链接]

void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0x85; //reload counter high value
TCNT1L = 0xEE; //reload counter low value
count++;
if(count==60)
{PORTB |= BIT(4);
count=0;
}
}

      由于用定时器直接定时1分钟产生的误差很大,经同学介绍一种方法如上,让定时器计时一秒后溢出中断,执行count++(count初值为0),加满60就达到一分钟,然后把以点亮的led灭掉,由于cpu运行程序的速度很快,所以这样做误差不会很大。

       但是实际却不是这样的,误差达到200%(定时为10秒实际却定了20秒)多。不知道这是avr性能有问题还是程序设计的问题。

      另外, 大家有什么好的定时的方法可以分享一下吗。
此帖出自单片机论坛

最新回复

如果是实机调试误差这么大,那肯定是振荡频率搞错或分频设置错或别的哪儿程序写错了。请检查对timer的初始化部分,及确认TCNT的动作方向(计数值是小→大,还是大→小)。 第二点说的是:因为你每次进中断都要重新设置计数器TCNT,这样从中断请求到软件响应重置之间的时间就成了误差源。要消除这部分误差,设置计数器要让硬件自动做而不能是软件做。  详情 回复 发表于 2008-10-16 08:37
点赞 关注
 

回复
举报

3138

帖子

0

TA的资源

裸片初长成(初级)

沙发
 
大概是仿真状态下的“误差”吧?那是软件仿真的能力问题,硬件运行时的实际误差之微不是人能够感受到的。
程序设计造成的误差源于中断服务开始的那两条定时器重载语句,要想消除这点微小的误差,须采用自动重载方式。
此帖出自单片机论坛
 
 

回复

180

帖子

0

TA的资源

五彩晶圆(中级)

板凳
 

回楼上

这个程序我是写入了单片机后调试,然后用秒表计的时,并不是用仿真软件调试的。
此外,第二句能否说得在详细点,谢谢。
此帖出自单片机论坛
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

4
 
如果是实机调试误差这么大,那肯定是振荡频率搞错或分频设置错或别的哪儿程序写错了。请检查对timer的初始化部分,及确认TCNT的动作方向(计数值是小→大,还是大→小)。
第二点说的是:因为你每次进中断都要重新设置计数器TCNT,这样从中断请求到软件响应重置之间的时间就成了误差源。要消除这部分误差,设置计数器要让硬件自动做而不能是软件做。
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表