极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 33587|回复: 8

DS1302停振的及时处理方法【转载】

[复制链接]
发表于 2012-10-19 13:09:42 | 显示全部楼层 |阅读模式
原帖地址:http://hi.baidu.com/bkchyxvgmblrwzr/item/6a53eb0ee080c5304bc4a364

我想现在应用的最多的时间模块就是DS1302吧,是不是大家都像我一样被国产DS1302坑得很惨呢,又是晶振问题,又是上拉电阻,等都搞定了却又发现经常停震,简直是一块魔鬼IC……既然硬件没办法再优化了,那就从软件上想办法吧,在网上搜到一个帖子,分享给大家:

以前做的项目中使用了时钟芯片DS1302,但是最近的产品中出现时钟停振现象。经过多次反复试验和考虑,决定使用以下方法及时发现和处理:

在读时间函数中,判断秒寄存器读出来的结果,如果 > 60,实际上是 0x80=128,就将秒寄存器的最高位.7写0,具体方法就是,每次将读出来的秒数据保存在临时变量  uchar Newtime 中,如果Newtime < 60 ,将其复制给static uchar Oldtime 变量;否则,就将Oldtime值重新写入秒寄存器,这样可以立即激活时钟芯片起振。最多误差为1秒(如果读时的频率为每秒的话)。同时累加这种处理的次数,如果次数达到50次(自己定义),可以立即停机,并报警,以保护设备;

在读DS1302函数中,添加以下程序段:

void DS1302_Sorting_BCDtoDEC(uchar *psetime)

{

      static uchar   Oldtime =0, SiCount=0;

      uchar  Newtime;   

......................

      Newtime = psetime[1];
       if(Newtime>60)
       {
                 DS1302_WriteAddrDat(0x8e,0x00);    //写打开
                 DS1302_WriteAddrDat(0x80, Oldtime);
                 DS1302_WriteAddrDat(0x8e,0x80);     //写禁止
                 if(++SiCount>=50)
                 {
                         SiCount =0;
                         flg_bit.TimeSi =1;                       //全局变量
                        psetime[1] = Oldtime;
                  }
                  else
                        Oldtime = Newtime;

}

       这种思路,可以延伸.........



还有一篇:时钟芯片VS1302使用经验(亦适用于DS1302)
时钟芯片VS1302简单易用,但是,实际上小问题也多,需要注意以下几点:

1、现象:正常使用时,经常莫名其妙的发生晶振停震或者31字节的RAM数据丢失错乱的现象。一般都是干扰造成的。改正方法:1)改软件,写操作前,要先把控制寄存器(地址为8Eh)的最高位(WP标志位)置0,允许写;写操作之后再置为1,禁止写操作,可防止外接电源等干扰。2)改硬件,如果电源使用有变压器请注意5V主电源(VCC2)的掉电脉冲干扰,可加100uF+104电容滤波,掉电时间要尽可能的缓长,以利于VCC1电池的切换。

2、现象:时钟时间不准确,差别大。晶振应使用6pF、40kOhm的,X1、X2走线尽可能的短,外壳要接地。

3、现象:初始化后发现时钟不走。初始化一定要把秒寄存器的最高位(CH标志位)置0。

4、现象:经常开关机,发现时间越来越慢。对于每次启动都要操作CH标志位的,请先读出来秒寄存器(地址为81h)的数值,将MSB清零后再写入秒寄存器(地址为80h)。

5、如果不使用涓流充电功能,请将寄存器(地址为90h)设置成0x00。

回复

使用道具 举报

发表于 2012-10-19 13:38:09 | 显示全部楼层
DS1307的问题也多多,现在好不容易总算找到一个稳定的DS1307模块了
回复 支持 反对

使用道具 举报

发表于 2012-10-19 16:28:46 | 显示全部楼层
MicroCao 发表于 2012-10-19 13:38
DS1307的问题也多多,现在好不容易总算找到一个稳定的DS1307模块了

那种带24C的DS1307,用LIR2032电池的,11元左右一个,搜一下就知道了
回复 支持 反对

使用道具 举报

发表于 2013-7-6 09:36:55 | 显示全部楼层
您好,我的晶振就一直不起震,该怎么解决呢
回复 支持 反对

使用道具 举报

发表于 2013-7-6 15:58:28 | 显示全部楼层
聪明小白 发表于 2013-7-6 09:36
您好,我的晶振就一直不起震,该怎么解决呢

晶振匹配电容可能不是6PF的,这个需要买6PF匹配电容的晶振才能正常使用。
回复 支持 反对

使用道具 举报

发表于 2013-11-30 19:43:12 | 显示全部楼层
真心不错,讲到了点子上
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-1 14:01:37 | 显示全部楼层
lzs2327 发表于 2013-11-30 19:43
真心不错,讲到了点子上

呵呵,能帮到大家最开心了~~
回复 支持 反对

使用道具 举报

发表于 2015-11-27 10:17:38 | 显示全部楼层
本帖最后由 执念未央 于 2015-11-27 10:43 编辑

       楼主,请教下如果我在主电源断电情况时出现了秒数超过60而停止的情况,主芯片不工作了,下次来电时,其实时间也一直停止在最后一次秒数不对的时间上,这会应该给他赋初始值比较好,还是把秒数清零让它继续走~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-17 09:49:25 | 显示全部楼层
执念未央 发表于 2015-11-27 10:17
楼主,请教下如果我在主电源断电情况时出现了秒数超过60而停止的情况,主芯片不工作了,下次来电时, ...

这么特殊的情况。。。我建议还是不要用DS1302了
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-3 15:18 , Processed in 0.040483 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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