黑暗人才 发表于 2017-9-2 23:08 我是这样检测的,第一次上电后是我的初始化时间,但是第二次上电后时间从0开始,说明我的备用电源正常,应为向存储器写的内容没有丢失,但是时间为啥不对呢,请问遇到过同类型的问题吗,新手已被逼疯。 |
这个问题啊,时间初始化是程序的问题,要设置一下那个什么命令,不太记得了,我DS1302,都是直接调用程序,改一下IO口就可以用了,你找的程序不对,你这个是程序初始化的时候把时间给初始化了。 |
软件你已经写好了,而且是可以正常使用的,现在最简单的方法就是用一个IO口来判断是否需要初始化即可, 例如你的P55脚是空的,在初始化前面先判断P55,是0的话初始化,是1就不初始化,你烧录好程序,如果想要初始化就把P55接地再上电就会初始化了,不需要初始化时悬空即可,多简单啊 |
不明白你说的不成都什么不成 也没太看明白你要求什么 1302这东西 掉电就没时间了 必须要重新写入时间 往1302的RAM写校验标记是可以的 完全没问题 我正在用 写的是第一个地址 注意 因为1302是BCD格式写入 如果你写的值超过6位读出来就只有6位 比如写0xaa进去出来是0x2a 如果你的板子没设计后备电池 可以在供电线路上并联一个电池 电池的正极串联一个二极管 和后备电池意思一样 如果是片子断电后再上电 也不一定非要去读1302 写个预处理函数 在主循环的while之前执行 只要是第一次上电 都先从1302读时间到缓冲区 然后再到主循环里显示 当然 这样做的前提是1302不能断电 否则读出来的肯定是错误的时间 读1302的RAM方法只是为了判断是否执行调表 |
我以上方法都试了都不行 |
我还看到过说1302的vcc2连接一个10000uF的电容,就可以断电也能继续计时,说再加一个write1302_time(0x90,0xa6);就可以 这个说法是真的吗? 为什么我的板是连了一个10 0000uF的电容,试了,失败了,还是说一定要加一个3v的备用电池才能做到断电继续计时? |
DS1302掉电后内部RAM的值不等于3,可以判断后初始化时间,然后标记为3即可。 |
你们也太厉害了吧 |
jianwei2030 发表于 2017-9-7 21:53 换进口的DS1302,同样的程序,进口的芯片可以,有些国产的芯片就是不行 |
我修改了上电检测部分的程序(如下), 思路是:上电后检测RAM中存储的数据十位是否为7,如果是则跳过初始化程序(什么也不执行),如果不是则执行初始化子程序 可是不管我怎么修改,修改后的时间就是无法保存,每次上电后依然是初始化的时间 ![]() void init_1302() //初始化函数 设置时间 { write1302_time(write_control_add,0x00); //保护取消,可以进行读写操作 write1302_time(write_sec_add,0x30);//写入初始秒时间 0101 0110 write1302_time(write_min_add,0x05);//写入初始分时间 0101 0110 write1302_time(write_hr_add,0x21); //写入初始时时间 0101 0110 write1302_time(write_week_add,0x07); //写入初始周时间 0101 0110 write1302_time(write_month_add,0x09); //写入初始月时间 0101 0110 write1302_time(write_day_add,0x03); //写入初始日时间 0101 0110 write1302_time(write_year_add,0x17); //写入初始年时间 0101 0110 write1302_time(write_RAM0_add,0x17); //往RAM寄存器中写入0xf0数据,因为RAM有掉电丢失特点,所以进入初始化函数的时候首先判断这个寄存器是否还有数据 write1302_time(write_charger_add,0xab); //使能涓流充电,两个二极管+8k电阻 1010 1011 write1302_time(write_control_add,0x80); //保护启动,禁止对1302写操作 } void ram_flag() { read_ram_data = read1302_time(read_RAM0_add); ram_data = ((read_ram_data&0x70)>>4)*10+(read_ram_data&0x0f); if((ram_data%10) == 7) { write1302_time(write_control_add,0x80); //保护启动,禁止对1302写操作 } else if((ram_data%10) != 7) { init_1302(); } } |
黑暗人才 发表于 2017-9-2 23:08 网上也是这么说的,我是检测1302内部的31字节的第一位,初始化时给这一位写入一个数据,再上电时读取这一位是不是之前写入的值,但是根据网上的程序修改没有效果。 |
mengx 发表于 2017-9-5 10:48 换过了,前后都是用达拉斯的芯片 |
电路没问题,不同公司的1302驱动方法上可能存在不同,我也遇到过同样的问题,换个1302就好了 |
屏蔽掉初始化 |
cjjcjj1 发表于 2017-9-2 21:31 后备电池是有加3V纽扣电池的;删掉初始化函数后第一次上电就什么也不显示了,我希望第一次上电时显示一个初始时间,用户在这个时间的基础上再修改。 |
黑暗人才 发表于 2017-9-2 23:08 网上的说法也是这样做,初始化时在1302的ram中写入一个数值,以后每次上电都检测这个数值,如果检测到就不执行初始化程序,检测不到就执行初始化程序。但是我想知道怎么写这个检测程序。 |