极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 23291|回复: 6

发现极客知识库提供的arduino ds3231库函数似乎有点问题,请大侠指教。

[复制链接]
发表于 2014-9-25 18:27:09 | 显示全部楼层 |阅读模式
最近迷上了单片机,我用ds3231作了一个时钟,用gettime函数提取时间,但偶然发现时间到了16点以后就变成10点,用gethour却没有问题,把自己的程序看了很多遍都没有发现问题,不得不怀疑库函数是不是有问题,由于是菜鸟一个,壮着胆子打开ds3231.cpp看了一下相关函数,果然发现库函数gettime多转了一次码,红色部分:
void DS3231::getTime(byte& year, byte& month, byte& date, byte& DoW, byte& hour, byte& minute, byte& second) {
        byte tempBuffer;
        bool PM;
        bool h12;

        Wire.beginTransmission(CLOCK_ADDRESS);
        Wire.write(uint8_t(0x00));
        Wire.endTransmission();
       
        Wire.requestFrom(CLOCK_ADDRESS, 7);

        second = bcdToDec(Wire.read());
        minute = bcdToDec(Wire.read());
        tempBuffer = bcdToDec(Wire.read());
        h12 = tempBuffer & 0b01000000;
        if (h12) {
                PM = tempBuffer & 0b00100000;
                hour = bcdToDec(tempBuffer & 0b00011111);
        } else {
                hour = bcdToDec(tempBuffer & 0b00111111);
        }
回复

使用道具 举报

 楼主| 发表于 2014-9-25 23:35:28 | 显示全部楼层
的确是BCD码解码重复了,导致通过gettime函数得到的小时数出现问题,我将红色部分的代码做了修改,问题解决:
tempBuffer = (Wire.read();
回复 支持 反对

使用道具 举报

发表于 2014-9-26 08:43:22 | 显示全部楼层
不错啊,支持一下!!!
回复 支持 反对

使用道具 举报

发表于 2015-8-10 21:19:09 | 显示全部楼层
初学者学习
回复 支持 反对

使用道具 举报

发表于 2015-12-12 12:00:10 | 显示全部楼层
既然发现了这个BUG,库函数是不是要更改一下,我发现现在库函数还是错的。
回复 支持 反对

使用道具 举报

发表于 2015-12-14 10:50:15 | 显示全部楼层
是啊,DS3231口可像有问题的,在20:00以后,十位数“2”变为“0”,无法显示20:00,21:00,23:00时间!
回复 支持 反对

使用道具 举报

发表于 2016-3-25 08:15:44 | 显示全部楼层
求一个arduino DS3231的库
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 20:03 , Processed in 0.041717 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表