找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10898|回复: 0
收起左侧

使用定时器必须弄清的几个概念! 技术问题

[复制链接]
ID:83710 发表于 2015-6-24 21:24 | 显示全部楼层 |阅读模式
使用定时器必须弄清的几个概念!
在MCU中(M16),定时器是独立的一个模块,M16有三个独立的定时器模块,即T/C0、T/C1和T/C2;其中T/C0和T/C2都是8位的定时器,而T/C1是一个16位的定时器。定时器的工作是独立于CPU之外自行运行的硬件模块。
1、定时器何时开始工作(或说计数)的?
  当TCCR0!=0x00任何模式下,只要MCU一上电,T/C就开始计时工作。其实TCCR0主要是定时器的预分频和波形模式、比较匹配模式的设置,说到预分频,不得不提一下这个模块,这个模块是T/C0、T/C1共用的一个模块,但可以有不同的分频设置。
2、定时器是如何进行工作的:说到定时器的工作,不得不说三个个重要参数:TCNT0、OCR0,TIMSK,TCNT0是设置定时器的计时初始值,定时器开始工作后立即从TCNT0一直累加到0XFF,累加过程所消耗的时间就是我们需要的定时时间;OCR0是一个比较设定值,当TCNT0的值累计到OCR0时(TNCT0==OCR0),如果有开启比较匹配中断功能,那么此时就会产生比较中断,所以,OCR0的值一般都是设置在TCNT0初始值和0XFF之间,之外的任何值都不会产生比较中断。TIMSK是一个中断使能位设置,就是我们需要计时器溢出中断或是比较匹配中断功能或两者都要时就对TIMSK的相应寄存器位进行设置。
3、定时器的中断使用,一个定时器可以有两个中断资源可利用,一个只溢出中断,另一个是比较匹配中断,如上面2所说的。想说明的溢出中断子程序内一般要有重载TCNT0的初始值,否则,TCNT0就会从0X00开始累加计数到0XFF,所耗费的时间就不我们想要的时间。比较中断就是当TCNT0==OCR0时,发生比较匹配中断;所以,中断子程序中一般只插入少量的处理代码,否则,会发生所谓的中断套嵌的现象,由于M16不支持中断套嵌,这样会使得中断子程序中的部分代码无法执行,严重时会造成系统崩溃。
4、TCNT0和OCR0的值换算:对于8bit的计时器,TCNT0一般可以由下面的公式换算:
  TCNT0=256-(TV*F)/N;
  TV: 所想要设定的定时时间,单位,us
      F: 晶振频率(MHz)
    N: 分频因子
为了更清楚了解定时器的工作原理,以下是本人与古老师的一段QQ对话,或许看了,你会更能理解定时器:

  天地(179748613) 10:33:21
想问一个定时器的问题:定时器的刚开始是从0x00开始累加直到TCNT0,还是从TCNT0开始直到0xFF的
天地(179748613) 10:34:40
铜河哥
万金油(158755213) 10:35:22
取决于定时器的工作方式
天地(179748613) 10:36:08
工作方式是由那个寄存器控制的
万金油(158755213) 10:36:35
你自己看看手册吧
天地(179748613) 10:37:46
没有的,找了手册,没有相关说明
]
古欣(286629322) 10:42:26
从TCNT0开始直到0xFF的
天地(179748613) 10:43:10
谢谢
铜河(69383181) 10:45:55
刚才不在哈
天地(179748613) 11:12:06
还想问一个问题:定时器支持中断套嵌吗?
古欣(286629322) 11:13:34
不支持
天地(179748613) 11:14:05
谢谢
天地(179748613) 11:17:55
定时器的下一次计时开始是从产生溢出中断后立即开始还是待中断子程序处理完成后开始计时,
天地(179748613) 11:19:28
老古,帮我一下,我正在论坛里写关于定时器的使用的帖子,必须摸清这些概念
古欣(286629322) 11:20:47
中断后立即开始
古欣(286629322) 11:21:31
也就是说 只要在中断中不更改TCNT的值,定时的精确度就只取决于晶振了
古欣(286629322) 11:21:55
因此可以使用TC2加一个外部32.768晶振来实现精确一秒定时
天地(179748613) 11:24:03
那溢出中断子程序中不是还要个TCNT0重载一下吗?中断发生后立即计时,TCNT0不是从0X00开始了
古欣(286629322) 11:24:38
是的 中断之后 TCNT从0开始
古欣(286629322) 11:25:14
如果中断程序中修改了TCNT 就会错过计时周期 造成误差
天地(179748613) 11:25:42
0X00到0XFF耗时不是我们需要的值呀
古欣(286629322) 11:25:47
因此 普通的定时方式 是不能用来做 精确的钟表的
天地(179748613) 11:25:58
我们需要的时间值

古欣(286629322) 11:26:47
这就是你需要解决的问题了 如果精度要求不高 可以在中断中修改TCNT的值
古欣(286629322) 11:27:12
如果精度要求高 可以采用比较匹配中断,在中断中向前加OCR即可
古欣(286629322) 11:27:41
或者采用特殊的晶振,特殊的分频,达到从0到0xFF的时间正好是你需要的时间
古欣(286629322) 11:28:04
我们的开发板上有32.768K晶振,256分频之后,恰好是一秒
古欣(286629322) 11:28:14
我们也提供了这个例子程序
天地(179748613) 11:29:32
那就是计时器第一个循环周期是从TCNT0累加到0XFF,从第2个周期开始,以后的循环周期都是从0X00累加到0XFF,是这样吧
古欣(286629322) 11:30:32
如果你不在定时器中断中重载TCNT
古欣(286629322) 11:30:35
就是这样的
天地(179748613) 11:32:09
你刚说溢出中断后立即开始重新计时,这与中断中是否重载TCNT没有任何关系呀
古欣(286629322) 11:33:35
你在定时器中断中重载是用户行为,你的程序来控制的
古欣(286629322) 11:33:52
自动从0开始,是定时器自身的工作
天地(179748613) 11:36:10
那就是说:溢出中断的定时并不是一个稳定的切精确的定时,反而比较匹配中断会相对稳定和精确,是这样吧
古欣(286629322) 11:38:31
不是
古欣(286629322) 11:38:44
是你在操作TNCT时 引入了误差
天地(179748613) 11:44:08
那就有一种现象:就是某个计时周期结束后,计时器立即开计时,是从0X00开始往上累加,当溢出中断子程序中有重载TCNT,一旦重载被执行完成,计时器就从TCNT开始计时,无论此时计时器的累计值大于TCNT,还是小于TCNT,是这样吗?
古欣(286629322) 11:47:23
是的 理解正确
天地(179748613) 11:48:37
那这样的工作方式误差是否会被累积?也就是误差会不会越来越大?
古欣(286629322) 11:49:26
当然会被累积 一年能有几分钟吧
古欣(286629322) 11:49:35
以往用51的时候就存在这个问题
古欣(286629322) 11:49:51
AVR 的TC2 可以外接 时钟 很好的解决了这个问题
天地(179748613) 11:51:26
如果系统复位,这些误差会不会回到初始状态?
古欣(286629322) 11:52:13
看来你还是没有理解 呵呵,这会儿在一边看笑话的人 也该不少吧
古欣(286629322) 11:52:56
每一个中断造成的误差是相同的
古欣(286629322) 11:53:31
你用的时间越长 误差累计的越多 过一段时间 你需要调一下你的表
天地(179748613) 11:54:14
我大概了解了
天地(179748613) 11:55:04
断电复位可以回复原有的误差吧
天地(179748613) 11:56:24
多谢古老大
古欣(286629322) 11:56:43
断电复位 一切重头开始了 那没有话说
天地(179748613) 11:58:27
几天的如覆大山的心情,这下轻松了,谢谢老古
天地(179748613) 11:59:19
  
古欣(286629322) 12:00:29
这段解释对初学者挺有意义 复制到论坛吧
天地(179748613) 12:00:50
我是准备这样做

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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