RTC中的寄存器读/写的原子性.
在手册中没有提及怎么保证读/写24位寄存器的原子性. 如果单片机是参考atmal的话,是否是有不可见的临时寄存器存放高位的寄存器值? 仁兄说24bit寄存器的RTC,貌似没有。 the usual solution is to continue to read the rtc until two consecutive reads return the same value. 没有读取24位寄存器的指令吧? 或者读的时候停止计数一下?V1.1 P79:
$D3 RTCTOPH RTC 定时寄存器中间字节
错了吧? 本帖最后由 LGT 于 2012-4-20 00:41 编辑
RTC中没有实现LZ所说的shadow registers. 安全的做法如3、4楼所言:
1. 连续读2次, 相同为有效
2. 读之前关闭RTC
建议操作之前关闭系统中断使能 (CLI)
因为系统RTC的时钟为1KHz左右, 远远低于系统时钟, 所以以上两种做法都是可行的。
另外, RTC的时钟精度并不高, 不建议用于精确定时。
to 楼上, 请参考V1.2, 已经修正。 RTC 1K HZ,正好把寄存器的值作为时钟节拍。
不过就是24位有点难操作,换成32位更好。 不过就是24位有点难操作,换成32位更好。
agreed. with 32-bit rtc registers, you can use the standard timing functions in time.h, making the code infinitely more portable.
logicgreen 发表于 2012-4-19 23:49 static/image/common/back.gif
仁兄说24bit寄存器的RTC,貌似没有。
没有吗?我看到编程手册上有描述. v1.2版的 81页. bank741236 发表于 2012-4-20 09:25 static/image/common/back.gif
没有吗?我看到编程手册上有描述. v1.2版的 81页.
可用于定时唤醒功能,不过精度有待测试。 另外文档中有些内容貌似前后矛盾. 引脚说明中PB3-0,PC3-0,PD5-0, 但是在封装图上却看到 PC6(5) PD6(16) PD7(15)
还有个问题,当作为通用输出时,引脚最大输出电流有多大?
CC: LGT
没有shadow register?那么读取T1值就必须暂停然后才读取或者设置了,而且这个是唯一的可靠方法了,因为在Fsys/1的情况下,读2次比较相同行不通. 我的理解对吗? bank741236 发表于 2012-4-20 10:27 static/image/common/back.gif
另外文档中有些内容貌似前后矛盾. 引脚说明中PB3-0,PC3-0,PD5-0, 但是在封装图上却看到 PC6(5) PD6(16) PD7 ...
读两次相同 行得通。
关闭中断,读两次,两次相同,就为 寄存器的值。
如果两次的值不同,再度一次,就为 寄存器的值。
1. 多谢提醒, 引脚说明部分是有遗漏, 请以封装图为准。 我们将在下一版本中改正。
在手册V1.2的19页, PMCR寄存器描述中, 参考CFDS控制位的介绍。
2. 可以连续读两次,比较高位(高16位)相同即有效。 即使在Fsys/1的情况下, 也是可以的。 不用关闭RTC
3. 此RTC设计的目的是用于Power/off之后的定时唤醒, 不建议将RTC时钟用于系统工作。
LGT 发表于 2012-4-20 10:43 static/image/common/back.gif
1. 多谢提醒, 引脚说明部分是有遗漏, 请以封装图为准。 我们将在下一版本中改正。
在手册V1.2的19页 ...
我看到了谢谢,最大输出是25mA.
关于第二点,你应该指的是不用关TIMER1吗?
另外精调内部时钟,有什么方案可以在量产时快速调整时钟? 恩, 是指的不用关闭Timer1/0
我们量产的芯片都是经过校准的, 用户不需要自己校准。
用户通过读取OSCCAL ($66), 可以得到这个出厂的校准值。
通用输出脚能并联起来输出以增加驱动能力吗?
页:
[1]