|
原帖地址: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。
|
|