DS1307 can not read and write time in arduino. - Page 1
Forum section: electronics / projects

author: dreamtale
author_rank: Newbie
timestamp: December 03, 2014, 07:51:42 am
content: hello everyoneIn mid-November, I have designed a shield based on arduino. I have to debug a week.However, it does not work.The OLED display and bluetooth is ok.Here is my schHere is my pcbYou can see in my schematic?I use IIC to connects two devices,they are not wroking properly.First, I tested the DS1307.I found the DS1307 has no answer.Here is my code base on arduino.Code:#include <Wire.h>int clockAddress = 0x68; // This is the I2C addressint command = 0; // This is the command char, in ascii form, sent from the serial portlong previousMillis = 0; // will store last time Temp was updatedbyte second, minute, hour, dayOfWeek, dayOfMonth, month, year;byte test;// Convert normal decimal numbers to binary coded decimalbyte decToBcd(byte val){return ( (val/10*16) + (val%10) );}// Convert binary coded decimal to normal decimal numbersbyte bcdToDec(byte val){return ( (val/16*10) + (val%16) );}// 1) Sets the date and time on the ds1307// 2) Starts the clock// 3) Sets hour mode to 24 hour clock// Assumes you're passing in valid numbers,// Probably need to put in checks for valid numbers.void setDateDs1307(){// Use of (byte) type casting and ascii math to achieve result.second = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48));minute = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48));hour = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48));dayOfWeek = (byte) (Serial.read() - 48);dayOfMonth = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48));month = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48));year= (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48));/*second = 50;minute = 56;hour = 9;dayOfWeek = 2;dayOfMonth = 2;month = 12;year= 14;*/Wire.beginTransmission(clockAddress);Wire.write(byte(0x00));Wire.write(decToBcd(second)); // 0 to bit 7 starts the clockWire.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 resultvoid getDateDs1307() {// Reset the register pointerWire.beginTransmission(clockAddress);Wire.write(byte(0x00));Wire.endTransmission();Wire.requestFrom(clockAddress, 7);// A few of these need masks because certain bits are control bitssecond = bcdToDec(Wire.read() & 0x7f);minute = bcdToDec(Wire.read());// Need to change this if 12 hour am/pmhour = bcdToDec(Wire.read() & 0x3f);dayOfWeek = bcdToDec(Wire.read());dayOfMonth = bcdToDec(Wire.read());month = bcdToDec(Wire.read());year = bcdToDec(Wire.read());Serial.print(hour, DEC);Serial.print(":");Serial.print(minute, DEC);Serial.print(":");Serial.print(second, DEC);Serial.print(" ");Serial.print(month, DEC);Serial.print("/");Serial.print(dayOfMonth, DEC);Serial.print("/");Serial.print(year, DEC);}void setup() {Wire.begin();Serial.begin(57600);}void loop() {if (Serial.available()) { // Look for char in serial que and process if foundcommand = Serial.read();if (command == 84) { //If command = "T" Set DatesetDateDs1307();getDateDs1307();Serial.println(" ");}else if (command == 81) { //If command = "Q" RTC1307 Memory Functionsdelay(100);if (Serial.available()) {command = Serial.read();// If command = "1" RTC1307 Initialize Memory - All Data will be set to 255 (0xff).// Therefore 255 or 0 will be an invalid value.if (command == 49) {// 255 will be the init value and 0 will be cosidered an error that// occurs when the RTC is in Battery mode.Wire.beginTransmission(clockAddress);// Set the register pointer to be just past the date/time registers.Wire.write(byte(0x08));for (int i = 1; i <= 27; i++) {Wire.write(byte(0xff));delay(100);}Wire.endTransmission();getDateDs1307();Serial.println(": RTC1307 Initialized Memory");}else if (command == 50) { //If command = "2" RTC1307 Memory DumpgetDateDs1307();Serial.println(": RTC 1307 Dump Begin");Wire.beginTransmission(clockAddress);Wire.write(byte(0x00));Wire.endTransmission();Wire.requestFrom(clockAddress, 64);for (int i = 1; i <= 64; i++) {test = Wire.read();Serial.print(i);Serial.print(":");Serial.println(test, DEC);}Serial.println(" RTC1307 Dump end");}}}Serial.print("Command: ");Serial.println(command); // Echo command CHAR in ascii that was sent}command = 0; // reset commanddelay(100);}Time is always parked in the 45:85:85,I know this is the wrong data.I use two leonardo to test.Unfortunately, I still did not get the correct data.Then,I suspect that the IIC on my leonardo is broken.I've used other IIC devices, I put GY-30 connected to leonardo, and the code I've been used,it can't work.I borrowed a Duemilanove from others.The GY-30 can work,and the DS1307 in my shield doesn't work.Now I have no idea.anyone can help me,and anyone can upload code about DS1307 base on arduino,In order to confirm the problem in my code or on my PCB.Thanks

author: mij59
author_rank: Frequent Contributor
timestamp: December 03, 2014, 08:29:58 am
content: In the schematic the pins 5..8 of the DS1307 are wrong labeled , check the data sheet.