读STC8位机的16位寄存器时,内部有缓冲吗?
如题,举个例子:T0工作在1T模式下,想得到某一时刻的T0(TH0+TL0).
如果没有缓冲,不管先读TL0还是TH0,再读另外一个时,值已经变了。有可能读出的数据本来应该是 0x00FF,或0x0100,结果,有可能会读成0x01FF。
记得AVR是有缓冲的:就是在读低字节时,高字节就立刻放到缓冲里。再读高字节时,读到的是缓冲中的数据,这样就不会出现上面的可能。不知道STC内部有没有这种机制。
你可以先停止计时器 再读 ackyee 发表于 2022-1-7 14:24
你可以先停止计时器 再读
但这样会有点时间误差,虽然我现在做的东西不差这点精度。如果STC内部没有缓冲的话,我打算先读高字节,再读低字节,最后比较高字节没变化就继续;如果高字节有变化就重来。 不可能用这么高级的玩意 我是这样读的
u16t time_now(void) {
u8t h;
u8t l;
u16t cc;
while (1) {
h = CH;
l = CL;
if (h == CH) {
cc = h;
cc <<= 8;
cc = cc | l;
return cc;
}
}
} STC没有影子寄存器的
先读高再读低,再回头读高比较,不同则再读低
程序的话用do...while 刚好 本帖最后由 mPiDDR 于 2022-1-7 18:41 编辑
原来我只会停止定时器,看到楼上的代码,受教了, 没有锁存的,我一般读法:
H = TH0;
L = TL0;
if(H != TH0) //刚好发生进位
{
H = TH0;
L = TL0;
i
} 本帖最后由 Clamfly 于 2022-1-8 12:06 编辑
一般有软件解决办法的(3/5/6/8楼),硬件就不会做辅助的了. 不过事实上硬件做一下锁存也不复杂, 所以以前AVR算是厚道了.
LZ可以写一下测试代码, 一直循环读取TL+TH, 当遇到TH/TL合起来不是+1递增的异常跳变时(也就是你说的读异常), 就可以判定硬件没有锁存了(反之不成立). 以前无聊在3*的片子上试过.
-------------------------
另, 软件重读之类, 如果上OS的话, 还是锁一下调度为好, 免得中间被切走了, 再切回来时TH已经溢出了. Clamfly 发表于 2022-1-8 09:45
一般有软件解决办法的(5楼8楼),硬件就不会做辅助的了. 不过事实上硬件做一下锁存也不复杂, 所以以前AVR算是 ...
具体项目,具体处理。 小李非刀 发表于 2022-1-8 11:33
具体项目,具体处理。
描述有不妥, 已改, 误会, 误会.
页:
[1]