给pcDuino加一个RTC模块

pc朵拉 发布于 2013/11/30 00:28
阅读 387
收藏 1

pcDuino没有板载的RTC。 当pcDuino启动的时候,它会自动通过网络来同步它的日期和时间。 如果pcDuino使用在没有网络连接的情况下, 我们怎么来获取正确的时间? 这个时候,我们就需要加一个RTC模块。 在这里,我们使用的RTC模块是Linker RTC 模块。

Linker RTC模块使用的时钟模块是 DS1307芯片, 它使用I2C接口和主机通讯

  • 连接图

RTC

  • GND of Linker RTC module -> GND of pcDuino
  • VCC of Linker RTC module -> 5V of pcDuino
  • SDA of Linker RTC module -> SDA of pcDuino
  • SCL of Linker RTC module -> SCL of pcDuino
  • 获得pcDuino上的Arduino风格的API

我们需要利用github来获得pcDuino上面的Arduino编程风格的API。

如果你使用的pcDuino没有安装过git, 我们需要安装git:

$sudo apt-get install git

然后,我们用刚刚安装的git来获取pcDuino上面的Arduino编程风格的API:

ubuntu@ubuntu:~$ git clone http://www.github.com/pcduino/c_enviroment
  • 测试Linker RTC模块的C代码

在“c_enviroment/sample”目录下,有一个文件名为“linker_rtc_test.c”。 它的可执行文件位于:“c_enviroment/output/test”.

我们可以用下面的命令在对RTC模块进行设置:

  1. $ ./linker_rtc_test [Year] [Month] [Date] [Hour] [Minute] [Second].
  2.  查看屏幕上的输出。

  [Year] [Month] [Date] [Hour] [Minute] [Second] 是可选择的参数。

  • 设置时间的C代码
pcDuino启动的时候, Ubuntu会自动地去执行 /etc/rc.local里面的脚本。 我们在里面加一个程序,用来从Linker RTC模块里面读取日期/时间,然后根据这个日期时间来设置系统的日期和时间。

完成以上动作的C代码如下(请拷贝复制,然后保存到一个名为 dataset_linker_rtc.c):

/*
* RTC test program
*/
#include <core.h>
#include  "Wire.h"
 
#define  DS1307_I2C_ADDRESS  0x68 // This is the I2C address
 
intcommand = 0;// This is the command char, in ascii form, sent from the serial port
intzero = 0;
//long previousMillis = 0; // will store last time Temp was updated byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; byte test;
//Convert normal decimal numbers to binary coded decimal
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
byte test;
 
byte decToBcd(byte val)
{
return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return( (val/16*10) + (val%16) );
}
 
voidsetDateDs1307()
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(zero);
Wire.write(decToBcd(second));    // 0 to bit 7 starts the clock
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));          // If you want 12 hour am/pm you need to set
// bit 6 (also need to change readDateDs1307)
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
 
}
 
//Gets the date and time from the ds1307 and prints result
voidgetDateDs1307()
{
charstr_cmd[1000];
 
// Reset the register pointer
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
// A few of these need masks because certain bits are control bits
second     = bcdToDec(Wire.read() &0x7f);
minute     = bcdToDec(Wire.read());
hour       = bcdToDec(Wire.read() &0x3f); // Need to change this if 12 hour am/pm
dayOfWeek  = bcdToDec(Wire.read());
dayOfMonth = bcdToDec(Wire.read());
month      = bcdToDec(Wire.read());
year       = bcdToDec(Wire.read());
 
sprintf(str_cmd, "sudo date -s  %d/%d/%d\n", month, dayOfMonth, year);
system(str_cmd);
sprintf(str_cmd, "sudo date -s  %d:%d:%d\n", hour, minute, second);
system(str_cmd);
}
 
voidsetup()
{
Wire.begin();
 
getDateDs1307();
 
}
 
voidloop()
{
exit(0);
}

以上代码,也可以在这里(dateset_linker_rtc)下载。

  • 编译


修改\test\Makefile:
					
      
      
      
      
LIBS=-L../../sample/core -larduino -lspi
INCS=-I../../sample/core/include
TARGET=../../sample/test
 
OBJS = io_test adc_test pwm_test spi_test adxl345_test dataset_linker_rtc
 
all: $(OBJS)
@mkdir -p $(TARGET)
@mv $(OBJS) $(TARGET)
 
io_test: io_test.c
$(CC) $(LIBS) $(INCS) $< -o $@
 
dataset_linker_rtc: dataset_linker_rtc.c
$(CC) $(LIBS) $(INCS) $< -o $@
 
adc_test: adc_test.c
$(CC) $(LIBS) $(INCS) $< -o $@
 
pwm_test: pwm_test.c
$(CC) $(LIBS) $(INCS) $< -o $@
 
spi_test: spi_test.c
$(CC) $(LIBS) $(INCS) $< -o $@
 
adxl345_test: adxl345_test.c
$(CC) $< -o $@
clean:
@for i in $(OBJS); do rm -f $(TARGET)/$$i; done

其中dataset_linker_rtc: dataset_linker_rtc.c是新加程序。

再打开命令终端编译库文件:

ubuntu@ubuntu:~$ cd c_enviroment

ubuntu@ubuntu:~/c_enviroment $ make

  • 加入到自我执行


我们需要把前面生成的可执行文件文件夹到 /etc/rc.local里面。

用以下命令:

$sudo vi /etc/rc.local

然后把下面一句加到 “exit 0”之前:

/home/ubuntu/c_enviroment/otuput/test/dateset_linker_rtc &

现在重启pcDuino即使没有网络连接,我们也同意得到正确的日期和时间。

帖子出自: http://cnlearn.linksprite.com/?p=377










加载中
返回顶部
顶部