From 49882b2eb671e01d30defc623319bce43f3ec49a Mon Sep 17 00:00:00 2001 From: Ogneyar Date: Sat, 31 Aug 2024 14:48:18 +0300 Subject: [PATCH] According to the datasheet, the bits in three registers are checked: 0x00, 0x02 and 0x07 --- libraries/Wire/examples/ds1307/ds1307.ino | 47 ++++++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/libraries/Wire/examples/ds1307/ds1307.ino b/libraries/Wire/examples/ds1307/ds1307.ino index cf8bd32..d1ff33a 100644 --- a/libraries/Wire/examples/ds1307/ds1307.ino +++ b/libraries/Wire/examples/ds1307/ds1307.ino @@ -19,10 +19,12 @@ void setup() // Initializing the device as a master on the I2C bus Wire.begin(); - + // Set new time if necessary - if (RTC_SET_NEW_TIME) + if (RTC_SET_NEW_TIME) { + initDS1307(); // Initialization of ds1307 writeTimeToRtc(); // setting time is written inside the function + } } void loop() @@ -33,6 +35,47 @@ void loop() } // ------------------- rtc ------------------- // +// Function for initializing the DS1307 chip +void initDS1307(void) +{ + /* According to the datasheet, the bits in three registers + are checked: 0x00, 0x02 and 0x07 + */ + uint8_t oneByte; + Wire.requestFrom(RTC_ADDR, 1, 0x00, 1, 1); + // Get data + if(Wire.available()) + oneByte = Wire.read(); + if (oneByte & 0x80) { + Wire.beginTransmission(RTC_ADDR); // Start of transaction + Wire.write(0x00); // Writing command for a transaction + Wire.write(oneByte & ~0x80); // Writing data for a transaction + Wire.endTransmission(); // Completing a transaction + } + + Wire.requestFrom(RTC_ADDR, 1, 0x02, 1, 1); + // Get data + if(Wire.available()) + oneByte = Wire.read(); + if (oneByte & 0x40) { + Wire.beginTransmission(RTC_ADDR); // Start of transaction + Wire.write(0x02); // Writing command for a transaction + Wire.write(oneByte & ~0x40); // Writing data for a transaction + Wire.endTransmission(); // Completing a transaction + } + + Wire.requestFrom(RTC_ADDR, 1, 0x07, 1, 1); + // Get data + if(Wire.available()) + oneByte = Wire.read(); + if ((oneByte & 0x03) || !(oneByte & 0x10)) { + Wire.beginTransmission(RTC_ADDR); // Start of transaction + Wire.write(0x07); // Writing command for a transaction + Wire.write(oneByte & ~0x03 | 0x10); // Writing data for a transaction + Wire.endTransmission(); // Completing a transaction + } +} + // Function to write new time to rtc void writeTimeToRtc(void) {