大家好,
我用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是有问题的。
有大神能帮助看看,这个初值计算是哪里有问题吗?感谢!
|