问题描述: 有部分用户在进行PCF8563实验时,会遇到如下实验现象:当时间值运行到某一特定区间时,时间显示错误。例如每当每分钟运行到第40秒时,时间的小时显示开始异常。以下为ACX720开发板运行该案例时的效果图,其他运行类似案例的开发板也会有该现象。
上面的两幅图是连续2秒时间内抓拍的结果,可以看到:在11时18分39秒后,下一秒钟却显示51时18分40秒,当时间显示到达51时18分59秒后,下一秒又回归正常,显示11时19分00秒。同时,随着秒数的变化,年,月,日的显示,也会呈现时间区间显示异常和正常交替进行的问题。
问题原因: 经过仔细分析,发现该现象的原因如下: PCF8563的时间寄存器表如下:
由于PCF8563的生产厂家以及生产批次和版本不同,该芯片在生产出厂时对时间无效位的输出处理,并不是统一按给0进行处理。而我们在读取时间寄存器时,却默认相信读出的每一个8位寄存器都是时间值的真实反映,因此,出现了违背国际标准计时规则的时间输出显示结果。 比如,在秒值(BCD)为0~39秒时,04h号寄存器的bit[6]这一位为0,在40~59秒时,04h号寄存器的bit[6]这一位为1,导致出现前述内容的时间显示异常。 当然,因为这个原因,导致了读出的年,月,日也有类似情况发生,究其根本,都是无效位处理不当造成的结果。
解决方案:
解决这个问题,可以将读到的时间日期值无效位强制置0来处理。具体来说,就是在我们提供案例的pcf8563_ctrl.v文件中,对每个读取到的值进行无效位强制置0的屏蔽处理,如下图所示。
通过将读到的时间日期值和对应需要生效的位取1作按位与,读到的时间日期值和对应无效需要屏蔽的位取0作按位与,即可将无效位强制置0,以避免前述分析的无效位干扰了时间日期的显示。这样处理以后,无论rddata读到什么值,都实现了无效位强制置0。处理后效果如下:显示正常。
注意事项:
进行程序设计时,从外部接收或者从存储器读出的值,无关位的处理也很重要,不能完全寄希望于从外部接收或者从寄存器中读出的值都是理想值0或1,实际应用中应在设计策略上尽可能保证读到的值精确可控。
|