极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: Ansifa

Arduino学习笔记A8 - Arduino 连接 DS1302时钟模块

  [复制链接]
发表于 2012-4-1 16:51:56 | 显示全部楼层
弘毅 发表于 2012-4-1 16:48
0022 IDE中的。。如果用1.0 IDE不知道是否还有这个了

刚下的1.0的...刚开始玩这个....新版之后怎么办?
回复 支持 反对

使用道具 举报

发表于 2012-4-1 17:19:01 | 显示全部楼层
lionelg 发表于 2012-4-1 16:51
刚下的1.0的...刚开始玩这个....新版之后怎么办?

新版的。。。这个还没研究,1.0改动太大不好用,所以我们大部分还在用0022,0023
回复 支持 反对

使用道具 举报

发表于 2012-4-6 19:40:55 | 显示全部楼层
有个问题,显示的时间总是Friday 2165-25-44 27:00:24
也没办法设置,可以显示输入,但是时间还是不变,我已经换了5个芯片了,还是老样子,晶振6pF的,难道芯片是有问题?可是最后的秒数是在正常增加的。
没有外接后备电池,应该没有影响吧
回复 支持 反对

使用道具 举报

发表于 2012-4-18 23:38:32 | 显示全部楼层
悠然小调 发表于 2011-11-19 12:56
去掉了年月日部分

用这个库,改了改原版的代码,结果总是报错,能帮忙看看什么问题么?刚开始研究,比较小白,谢谢。
我的代码如下
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "DS1302.h"

  4. uint8_t CE_PIN   = 5;
  5. uint8_t IO_PIN   = 6;
  6. uint8_t SCLK_PIN = 7;


  7. char buf[31];
  8. int numdata[3] ={0}, j = 0, mark = 0;
  9. /* 创建 DS1302 对象 */
  10. DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);


  11. void print_time()
  12. {
  13.    /* 从 DS1302 获取当前时间 */
  14.     Time t = rtc.getTime();
  15.     snprintf(buf, sizeof(buf), "%02d:%02d:%02d", t.hour, t.min, t.sec);
  16.     Serial.println(buf);
  17. }


  18. void setup()
  19. {
  20.     Serial.begin(9600);
  21.     rtc.writeProtect(false);
  22.     rtc.halt(false);
  23. }

  24. void loop()
  25. {
  26.     print_time();
  27.     delay(1000);
  28. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2012-4-20 17:12:20 | 显示全部楼层
本帖最后由 悠然小调 于 2012-4-20 17:13 编辑
lionelg 发表于 2012-4-18 23:38
用这个库,改了改原版的代码,结果总是报错,能帮忙看看什么问题么?刚开始研究,比较小白,谢谢。
我的 ...


snprintf这个语句有问题吗?用的是1.0版不兼容?
回复 支持 反对

使用道具 举报

发表于 2012-4-20 18:14:45 | 显示全部楼层
忘记报什么错了,不过应该是库里面的错
回复 支持 反对

使用道具 举报

发表于 2012-4-30 22:42:52 | 显示全部楼层
  1.     while (Serial.available() > 0)
  2.     {
  3.         comdata += char(Serial.read());
  4.         delay(2);
  5.         mark = 1;
  6.     }
  7.     /* 以逗号分隔分解comdata的字符串,分解结果变成转换成数字到numdata[]数组 */
  8.     if(mark == 1)
  9.     {
复制代码
arduino的串口收数据是一次读一个字符,而不是一次整个字符串收的。那为什么上面的代码中,当Serial.available() > 0为真时,会一直往comdata上加字符,直到全部加完那执行下面的if(mark == 1)。
想不明白啊,为什么不是读了第一个字符后就直接继续执行下面的if语句呢
回复 支持 反对

使用道具 举报

发表于 2012-4-30 23:31:28 | 显示全部楼层
MicroCao 发表于 2012-4-30 22:42
arduino的串口收数据是一次读一个字符,而不是一次整个字符串收的。那为什么上面的代码中,当Serial.availa ...

哈哈,弄明白了。我把while看成if了.................
回复 支持 反对

使用道具 举报

发表于 2012-5-1 01:15:34 | 显示全部楼层
lionelg 发表于 2012-4-6 19:40
有个问题,显示的时间总是Friday 2165-25-44 27:00:24
也没办法设置,可以显示输入,但是时间还是不变,我 ...

这个我遇到过,如果和我情况一样的话,是程序中初始化的数据有误。
回复 支持 反对

使用道具 举报

发表于 2012-5-1 01:21:47 | 显示全部楼层
thomas 发表于 2012-5-1 01:15
这个我遇到过,如果和我情况一样的话,是程序中初始化的数据有误。

但闻其详,不吝赐教。
回复 支持 反对

使用道具 举报

发表于 2012-5-1 02:26:52 | 显示全部楼层
MicroCao 发表于 2012-5-1 01:21
但闻其详,不吝赐教。


用这个段代码刷一下看看行不行,如果不行,换下附件的库试试。

  1. /*
  2. Example sketch for interfacing with the DS1302 timekeeping chip.

  3. Copyright (c) 2009, Matt Sparks
  4. All rights reserved.

  5. http://quadpoint.org/projects/arduino-ds1302
  6. */
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <DS1302.h>

  10. /* Set the appropriate digital I/O pin connections */
  11. uint8_t CE_PIN   = 5;
  12. uint8_t IO_PIN   = 6;
  13. uint8_t SCLK_PIN = 7;

  14. /* Create buffers */
  15. char buf[50];
  16. char day[10];

  17. /* Create a DS1302 object */
  18. DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);

  19. void setup()
  20. {
  21.   Serial.begin(9600);

  22.   /* Initialize a new chip by turning off write protection and clearing the
  23.      clock halt flag. These methods needn't always be called. See the DS1302
  24.      datasheet for details. */
  25.   rtc.write_protect(false);
  26.   rtc.halt(false);

  27.   /* Make a new time object to set the date and time */
  28.   /*   Tuesday, May 19, 2009 at 21:16:37.            */
  29.   Time t(2012, 2, 24, 21, 16, 37, 3);

  30.   /* Set the time and date on the chip */
  31.   rtc.time(t);
  32. }

复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2012-5-2 00:09:53 | 显示全部楼层
报告 一个问题,arduino1.0 IDE环境,NANO328。使用1楼的代码
在ARDUINO IDE的串口窗口中输入"2012,5,1,23,55,23,2"加车或send后,查询DS1302时间时返回的结果中星期有问题(只显示年月日时分秒,没有星期),但若输入"2012,5,1,23,55,23,2,"(即设置时间的字符串结尾加上逗号)则星期能正常显示,说明目前代码中对串口字符串结束符的判断仍有问题,即如下这句代码还有待改善。
if(comdata[i] == ',' || comdata[i] == 0x10 || comdata[i] == 0x13)
回复 支持 反对

使用道具 举报

发表于 2012-5-2 00:39:42 | 显示全部楼层
thomas 发表于 2012-5-1 02:26
用这个段代码刷一下看看行不行,如果不行,换下附件的库试试。


一、
前面的代码中主要在于  rtc.write_protect(false);与  rtc.halt(false);试过后仍然无效

二、
使用这个26 Jan 2012最新2.2版的库,用DS1302_Serial_Easy与DS1302_Serial_Hard两个例子都试过,仍然不正常。
比如用DS1302_Serial_Easy显示的串口结果为
xxxxxxxxx 85.85.2165 -- 27:85:85
xxxxxxxxx 85.85.2165 -- 27:85:85
xxxxxxxxx 85.85.2165 -- 27:85:85
xxxxxxxxx 85.85.2165 -- 27:85:85
xxxxxxxxx 85.85.2165 -- 27:85:85

我的试验条件
DS1302 DIP,晶振不详(不知道是否6pf的32.768),NANO328。

三、
这几天试了多个从同卖家买的DS1302芯片,也试了从多家购买的晶振,仍然有问题。
奇怪的是其中一个DS1302与晶振在两年多前在自己搭建的最简系统里是正常的,只是两年时候,时间大概走快了3小时。可是如今怎么整都不正常,可惜的是这个最系统拆掉了,没法再去重复了。
最后试验了从其中一个DS1302卖家那买的DS1302成品模块(DS1302为贴片,晶振引脚等焊好,还带3V钮扣电池),结果正常了。
于是想不明白问题出在哪了
回复 支持 反对

使用道具 举报

发表于 2012-5-2 09:14:11 | 显示全部楼层
晶振外壳接地是个极为必要的问题。但要小心别焊坏
回复 支持 反对

使用道具 举报

发表于 2012-5-2 11:57:57 | 显示全部楼层
经过测试,不管是国产还是所谓进口的DS1302(价格几角至几元不等),不加0.1uF的电容在正负极之间能用的有限,我测了20多个芯片,就1个能不带电容直接用的,另外晶振接地影响时间的准确性,其他的倒是没什么影响,之前有人说加个二极管的问题,只在我使用5V2A的电源驱动的情况下发生过,1A一下的没问题。
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-16 16:00 , Processed in 0.047363 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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