kv2004 发表于 2022-1-7 14:19:35

读STC8位机的16位寄存器时,内部有缓冲吗?

如题,
举个例子:T0工作在1T模式下,想得到某一时刻的T0(TH0+TL0).
               如果没有缓冲,不管先读TL0还是TH0,再读另外一个时,值已经变了。有可能读出的数据本来应该是 0x00FF,或0x0100,结果,有可能会读成0x01FF。
记得AVR是有缓冲的:就是在读低字节时,高字节就立刻放到缓冲里。再读高字节时,读到的是缓冲中的数据,这样就不会出现上面的可能。不知道STC内部有没有这种机制。

ackyee 发表于 2022-1-7 14:24:41

你可以先停止计时器 再读   

kv2004 发表于 2022-1-7 15:35:37

ackyee 发表于 2022-1-7 14:24
你可以先停止计时器 再读

但这样会有点时间误差,虽然我现在做的东西不差这点精度。如果STC内部没有缓冲的话,我打算先读高字节,再读低字节,最后比较高字节没变化就继续;如果高字节有变化就重来。

modbus 发表于 2022-1-7 17:15:30

不可能用这么高级的玩意

youkebing 发表于 2022-1-7 17:24:47

我是这样读的
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;
      }
    }
}

add00 发表于 2022-1-7 17:25:16

STC没有影子寄存器的
先读高再读低,再回头读高比较,不同则再读低
程序的话用do...while 刚好

mPiDDR 发表于 2022-1-7 18:40:13

本帖最后由 mPiDDR 于 2022-1-7 18:41 编辑

原来我只会停止定时器,看到楼上的代码,受教了,

小李非刀 发表于 2022-1-7 21:31:38

没有锁存的,我一般读法:
H = TH0;
L = TL0;
if(H != TH0)    //刚好发生进位
{
    H = TH0;
    L = TL0;
i
}

Clamfly 发表于 2022-1-8 09:45:21

本帖最后由 Clamfly 于 2022-1-8 12:06 编辑

一般有软件解决办法的(3/5/6/8楼),硬件就不会做辅助的了. 不过事实上硬件做一下锁存也不复杂, 所以以前AVR算是厚道了.
LZ可以写一下测试代码, 一直循环读取TL+TH, 当遇到TH/TL合起来不是+1递增的异常跳变时(也就是你说的读异常), 就可以判定硬件没有锁存了(反之不成立). 以前无聊在3*的片子上试过.

-------------------------
另, 软件重读之类, 如果上OS的话, 还是锁一下调度为好, 免得中间被切走了, 再切回来时TH已经溢出了.

小李非刀 发表于 2022-1-8 11:33:36

Clamfly 发表于 2022-1-8 09:45
一般有软件解决办法的(5楼8楼),硬件就不会做辅助的了. 不过事实上硬件做一下锁存也不复杂, 所以以前AVR算是 ...

具体项目,具体处理。

Clamfly 发表于 2022-1-8 12:08:13

小李非刀 发表于 2022-1-8 11:33
具体项目,具体处理。

描述有不妥, 已改, 误会, 误会.
页: [1]
查看完整版本: 读STC8位机的16位寄存器时,内部有缓冲吗?