[51单片机] 问一个很原始的问题。TR0关闭的时候,计数是什么状态?

[复制链接]
1874|14
 楼主| tianqi911 发表于 2018-9-25 16:30 | 显示全部楼层 |阅读模式
不是溢出,而是运行的时候,中途关闭。

我上网查找,还有自己试验,看不出来。有人说清零,有人说是还有数值。

TR0关闭,再打开的时候,会清零吗?

(怎么才能看到有没有数值?)
xyz549040622 发表于 2018-9-25 16:37 | 显示全部楼层
这个问题,真心赞,确实没考虑到这个问题。因为我一般定时器不会关闭,即使关闭,也不会在意这点时间误差,所以从来没考虑到。
----------
但是我猜测,应该是不同的MCU,处理机制是不一样的。

评论

不是用来定时的,是做__无极变速__用的,就是_无级别调PWM_。  发表于 2018-9-26 13:45
ayb_ice 发表于 2018-9-25 16:39 | 显示全部楼层
不会清零的,只会暂停在停止前的状态
mcu5i51 发表于 2018-9-25 17:03 | 显示全部楼层
有些会清零,多数是暂停,芯片手册上没有说清零的就是暂停了;
airwill 发表于 2018-9-26 07:12 | 显示全部楼层
不应该清零, 暂停才是合理的.
不过软件中尽量不要关闭定时器, 那会导致没有办法保证系统时间基准的
ningling_21 发表于 2018-9-26 09:55 | 显示全部楼层
保持原来的数值,可以读取定时器的寄存器
 楼主| tianqi911 发表于 2018-9-26 13:43 | 显示全部楼层
这个问题的起因是,1T51,_无极调节PWM_的问题。          看到程序就是利用TR0的开和关实现的。计数是暂停的,再次打开,就是从暂停的地方继续计数的。         越来越感觉,写程序真的是只有想不到,没有做不到。  感谢楼上的各位高手。
coody 发表于 2018-9-26 14:27 | 显示全部楼层
TR0=0,定时器停止计数,原有计数值保持。
linqing171 发表于 2018-9-27 22:02 | 显示全部楼层
到目前为止,用了这么多单片机了,还没有见过暂停后会自动清零的。
因为你写入的pwm_high的值不会立即生效,需要溢出的瞬间生效,也就是硬件上有双缓冲同步,所以你不需要软件上做防止脉宽过窄等的处理。

很久前做CPLD的时候,没有加双缓冲。   计数器从0 ++ 到255,计数值和你设置的High=47相等的时候翻转输出为低,溢出变为0的时候翻转输出为高。当计数到45的时候,你填写了43进去,则 计数值=High 这个拍就不会出现,就一个整周期都无法发生低电平。导通角过大,马达监控逻辑报警。
 楼主| tianqi911 发表于 2018-9-28 09:16 | 显示全部楼层
linqing171 发表于 2018-9-27 22:02
到目前为止,用了这么多单片机了,还没有见过暂停后会自动清零的。
因为你写入的pwm_high的值不会立即生效 ...

啥叫“硬件上的双缓冲”?是类似51上面那个UART的缓存吗?
linqing171 发表于 2018-9-28 15:53 | 显示全部楼层
tianqi911 发表于 2018-9-28 09:16
啥叫“硬件上的双缓冲”?是类似51上面那个UART的缓存吗?

软件能看到的寄存器,和硬件比较真正用的寄存器,不是同一个。
硬件的在溢出的瞬间,把软件写入的那个复制到硬件里面,同时生效。
硬件的寄存器就和软件的寄存器的影子一样。

双字节定时器值的读也是,读一个,高低字节同时锁存了。读的另一个其实是锁存值,确保这两个读出来是一套的。而不是定时器内部当前计数的实际值。



评论

虽然不懂,但是我会去再查找下。感谢高人。  发表于 2018-9-28 17:23
gx_huang 发表于 2018-9-28 15:59 | 显示全部楼层
只要多看看数据手册,看看定时器的硬件框图,或者凭第六感觉,就知道了,TR0=0,停止给定时器提供时钟或者脉冲,暂停了,所有状态冻结了。

评论

哈哈。高人,灵异第6感。  发表于 2018-9-28 17:22
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

235

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部