hanliubin 发表于 2009-8-13 02:59:22

请教马老师:MI6定时器/计数器TCNT0的初值问题?

对定时器/计数器0的TCNT0赋初值(比如:TCNT0=0X93;)有什么意义????,我试验了,不管你赋初值多少,还是计数到TOP(定时器0是8位的,当然TOP=0XFF)值才更新从0X00开始,迷茫?????论坛中好多程序都赋了初值????谢谢马老师

hollymacs 发表于 2009-8-13 10:18:29

就是从1加到255,或从200加到255的区别了,(比如说你学要计数5个脉冲,益处中断)。

hanliubin 发表于 2009-8-13 12:40:59

谢谢一楼: hollymacs
我今天上午又弄了一下,试验是成功,我加了一个溢出中断,在溢出中断程序里面又从新给TCNT0赋值0X83,试验结果是计数器计数到OXFF时,又从新从0X83开始计数,不再是0X00,所以重新赋值很重要呀

snoopyzz 发表于 2009-8-13 12:45:33

CTC被无视了...

hanliubin 发表于 2009-8-13 14:35:43

也不是了,我只是实验了一下普通模式,CTC模式当然好,没的说,谢谢3楼的意见

machao 发表于 2009-8-16 14:46:05

谢谢一楼: hollymacs
我今天上午又弄了一下,试验是成功,我加了一个溢出中断,在溢出中断程序里面又从新给TCNT0赋值0X83,试验结果是计数器计数到OXFF时,又从新从0X83开始计数,不再是0X00,所以重新赋值很重要呀

========================================================================
还是理解的不正确。

AVR的定时器加到0XFF,并不产生溢出中断,而是到下一个计数脉冲到后,TCNT0变成0,同时产生溢出中断。因此,计数器还是到0x00了,甚至还会继续计到了1、2后,才由于你的中断服务中的重新赋值,才开始从0X83计数!!0开始的前面的几个计数被一般人忽视了。

如果你不使用或没有中断服务,那么定时器就一直是从0开始到255循环了。所以为了保证下一次定时的正确,需要在中断服务中首先赋初值。

但由于中断后,定时器仍然再继续工作,而中断响应需要时间,赋初值也需要时间,所以采用溢出中断附初值的方法,定时的时间是不精确的,要比理论的长一点。如果把赋初值放在中断的最后,定时时间还要不准,更加延长了。

所以CTC方式比溢出方式定时精确,使用也方便。

hanliubin 发表于 2009-8-17 01:56:58

谢谢敬爱的马老师,通过你的解释我彻底明白了定时器的用法,我会记住您的意见(用CTC模式)。

julou 发表于 2009-8-27 12:16:57

我现在也在弄定时器0,也出现了一些无法理解的事情,郁闷中,下午把程序贴上来,给大家看下

apple1007 发表于 2009-9-3 10:02:21

感谢马老师!
再一次加深了理解。
页: [1]
查看完整版本: 请教马老师:MI6定时器/计数器TCNT0的初值问题?