找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1307|回复: 2
收起左侧

AVR单片机定时器重装初值如何计算?

[复制链接]
ID:997026 发表于 2022-2-14 16:36 | 显示全部楼层 |阅读模式
大家好,

我用Atmel的ATMEGA328PB 单片机,之前用定时器时,基本都是1s进一次溢出中断,1s的初值计算,我是这么算的:

用ATMEGA328PB内部时钟8M,分配给定时器的时钟也是8M,内部预分频256后,定时器时钟为8M/256= 31250Hz

这意味着1s内定时器会计数31250次,所以16位的定时器,定时1s进一次中断的初值为:65536(2的16次方)- 31250=34280

34280对应的十六进制为85EE,对应的定时器初值高八位为TCNT1H=0x85, 对应的定时器初值低八位为TCNT1L=0xEE.

通过这样计算,我经过测试,确实可以产生1s进一次中断的效果,说明没什么问题,我也一直在这么用。


但是我现在想产生1ms进一次中断的效果,根据上面的思路,1s定时器要计数31250次,所以推导1ms定时器要计数31250/1000ms=31.25次,四舍五入取个31次。

计算初值为65536-31=65505,得到初值的十六进制为FFE1, TCNT1H=FF, TCNT1L=E1.
但实际情况是,这似乎是错的,我写了一段测试代码进行测试,发现这个初值并不能产生1ms进一次中断,实际好像比1ms低很多,可能是微秒级。我写了段数码管显示代码来显示一串数字3秒钟,变量设置的是3000ms, 但实际开机时,数字一闪就没了,根本显示不到3s, 说明这个初值可能是不对的。

我的整个程序中开了三个定时器中断,其中一个是1ms, 另外两个是1s, 我把测试代码放到1s中断中没问题,但是1ms是有问题的。

有大神能帮助看看,这个初值计算是哪里有问题吗?感谢!
回复

使用道具 举报

ID:96682 发表于 2022-2-15 05:43 来自触屏版 | 显示全部楼层
说得云里雾里的直上代码更直白些,另外开三个定时器中断它是需要时间来处理的
回复

使用道具 举报

ID:8222 发表于 2022-2-15 08:48 | 显示全部楼层
为什么要用到三个定时器?并且有两个1秒的?
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表