查看: 6948|回复: 5

在pcDuino上添加实时时钟(RTC)

[复制链接]
  • TA的每日心情
    郁闷
    2013-6-3 09:22
  • 签到天数: 29 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-5-7 09:24:48 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 pcduino 于 2013-5-7 09:39 编辑

    pcDuino板子上没有设计RTC,当连接了网络时可以自动同步时间,但是没联网时又想让pcDuino能够时间和日期同步的话就要考虑给pcDuino添加一个实时时钟。

    pcDuino通过连接 Linker RTC 模块 可以实现时间日期的自动同步功能,这个模块使用了DS1307芯片,连接pcDuino时使用的是I2C接口。

    接线图如下:


    • GND of Linker RTC   -> GND of pcDuino
    • VCC of Linker RTC   -> 5V of pcDuino
    • SDA of Linker RTC   -> SDA of pcDuino
    • SCL of Linker RTC   -> SCL of pcDuino



    00A1FD1694514835A259A15601227214.png

    获取pcDuinoArduio-ish C 环境:
    如果没有安装git
    1. $sudo apt-get install git
    复制代码
    用以下命令获取:
    1. #git clone https://github.com/pcduino/c_enviroment
    复制代码
    用代码测试Link RTC模块:
    在目录 c_enviroment/sample下找到 “linker_rtc_test.c”文件,可执行文件位于 “c_enviroment/output/test”。

    设置日期/时间:
    a   ./linker_rtc_test [Year] [Month] [Date] [Hour] [Minute] [Second].
    b   在终端检查输出
    注意: [Year] [Month] [Date] [Hour] [Minute] [Second] 是可选参数

    用代码来设置日期/时间:
    pcDuino启动时,会自动运行 script /etc/rc.local,从 Linker RTC调用读取日期/时间的程序并设置系统日期。
    1. ubuntu@ubuntu:~/c_enviroment/sample$ more dateset_linker_rtc.c
    2. /*
    3. * RTC test program
    4. */
    5. #include
    6. #include "Wire.h"

    7. #define DS1307_I2C_ADDRESS 0x68 // This is the I2C address

    8. int command = 0; // This is the command char, in ascii form, sent from the seria
    9. l port
    10. int zero = 0;
    11. //long previousMillis = 0; // will store last time Temp was updated byte second,
    12. minute, hour, dayOfWeek, dayOfMonth, month, year; byte test;
    13. //Convert normal decimal numbers to binary coded decimal
    14. byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    15. byte test;

    16. byte decToBcd(byte val)
    17. {
    18. return ( (val/10*16) + (val%10) );
    19. }
    20. // Convert binary coded decimal to normal decimal numbers
    21. byte bcdToDec(byte val)
    22. {
    23. return ( (val/16*10) + (val%16) );
    24. }

    25. void setDateDs1307()
    26. {
    27. Wire.beginTransmission(DS1307_I2C_ADDRESS);
    28. Wire.write(zero);
    29. Wire.write(decToBcd(second)); // 0 to bit 7 starts the clock
    30. Wire.write(decToBcd(minute));
    31. Wire.write(decToBcd(hour)); // If you want 12 hour am/pm you need to set
    32. // bit 6 (also need to change readDateDs1307)
    33. Wire.write(decToBcd(dayOfWeek));
    34. Wire.write(decToBcd(dayOfMonth));
    35. Wire.write(decToBcd(month));
    36. Wire.write(decToBcd(year));
    37. Wire.endTransmission();

    38. }

    39. //Gets the date and time from the ds1307 and prints result
    40. void getDateDs1307()
    41. {
    42. char str_cmd[1000];

    43. // Reset the register pointer
    44. Wire.beginTransmission(DS1307_I2C_ADDRESS);
    45. Wire.write(zero);
    46. Wire.endTransmission();
    47. Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
    48. // A few of these need masks because certain bits are control bits
    49. second = bcdToDec(Wire.read() & 0x7f);
    50. minute = bcdToDec(Wire.read());
    51. hour = bcdToDec(Wire.read() & 0x3f); // Need to change this if 12 hour am/pm
    52. dayOfWeek = bcdToDec(Wire.read());
    53. dayOfMonth = bcdToDec(Wire.read());
    54. month = bcdToDec(Wire.read());
    55. year = bcdToDec(Wire.read());

    56. sprintf(str_cmd, "sudo date -s %d/%d/%d\n", month, dayOfMonth, year);
    57. system(str_cmd);
    58. sprintf(str_cmd, "sudo date -s %d:%d:%d\n", hour, minute, second);
    59. system(str_cmd);
    60. }

    61. void setup()
    62. {
    63. Wire.begin();

    64. getDateDs1307();

    65. }

    66. void loop()
    67. {
    68. exit(0);
    69. }
    复制代码
    可执行文件要添加到 /etc/rc.local

    使用“sudo vi /etc/rc.local”,在 “exit 0″前插入下面这行
    1. /home/ubuntu/c_enviroment/otuput/test/dateset_linker_rtc &
    复制代码
    这样就完成了,在不联网时也可以获取正确的日期时间。

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2014-5-20 10:01
  • 签到天数: 41 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2013-5-7 14:46:41 | 显示全部楼层
    pcDuino是个新鲜玩意,不过为啥都要接模块呢?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2013-6-3 09:22
  • 签到天数: 29 天

    连续签到: 1 天

    [LV.4]偶尔看看III

     楼主| 发表于 2013-5-7 15:21:45 | 显示全部楼层
    xxxyyy 发表于 2013-5-7 14:46
    pcDuino是个新鲜玩意,不过为啥都要接模块呢?

    软件应用也相当多,接模块也是扩展功能嘛
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-1-28 16:20
  • 签到天数: 980 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2013-5-7 15:41:42 | 显示全部楼层
    扩展功能                    
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-4 13:19
  • 签到天数: 14 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2013-7-27 18:31:48 | 显示全部楼层
    楼主时钟芯片可以用其它型号的代替吗?我有一个DS13027N不知道可以不?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2013-6-3 09:22
  • 签到天数: 29 天

    连续签到: 1 天

    [LV.4]偶尔看看III

     楼主| 发表于 2013-7-29 10:20:52 | 显示全部楼层
    尕磊丶彡 发表于 2013-7-27 18:31
    楼主时钟芯片可以用其它型号的代替吗?我有一个DS13027N不知道可以不?

    你说的是DS1307N吗,一个系列的话可以替换
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 17:22 , Processed in 0.163664 second(s), 26 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.