/* * DS1307RTC.h - library for DS1307 RTC Copyright (c) Michael Margolis 2009 This library is intended to be uses with Arduino Time.h library functions The library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 30 Dec 2009 - Initial release */ #include "DS1307RTC.h" #define DS1307_CTRL_ID 0x68 DS1307RTC::DS1307RTC() { Wire.begin(); } // PUBLIC FUNCTIONS time_t DS1307RTC::get() // Aquire data from buffer and convert to time_t { tmElements_t tm; read(tm); return(makeTime(tm)); } void DS1307RTC::set(time_t t) { tmElements_t tm; breakTime(t, tm); //tm.Second |= 0x80; // stop the clock //write(tm); //tm.Second &= 0x7f; // start the clock write(tm); } // Aquire data from the RTC chip in BCD format void DS1307RTC::read( tmElements_t &tm) { Wire.beginTransmission(DS1307_CTRL_ID); #if ARDUINO >= 100 Wire.write((byte)0x00); #else Wire.send(0x00); #endif Wire.endTransmission(); // request the 7 data fields (secs, min, hr, dow, date, mth, yr) Wire.requestFrom(DS1307_CTRL_ID, tmNbrFields); #if ARDUINO >= 100 tm.Second = bcd2dec(Wire.read() & 0x7f); tm.Minute = bcd2dec(Wire.read() ); tm.Hour = bcd2dec(Wire.read() & 0x3f); // mask assumes 24hr clock tm.Wday = bcd2dec(Wire.read() ); tm.Day = bcd2dec(Wire.read() ); tm.Month = bcd2dec(Wire.read() ); tm.Year = y2kYearToTm((bcd2dec(Wire.read()))); #else tm.Second = bcd2dec(Wire.receive() & 0x7f); tm.Minute = bcd2dec(Wire.receive() ); tm.Hour = bcd2dec(Wire.receive() & 0x3f); // mask assumes 24hr clock tm.Wday = bcd2dec(Wire.receive() ); tm.Day = bcd2dec(Wire.receive() ); tm.Month = bcd2dec(Wire.receive() ); tm.Year = y2kYearToTm((bcd2dec(Wire.receive()))); #endif } void DS1307RTC::write(tmElements_t &tm) { Wire.beginTransmission(DS1307_CTRL_ID); #if ARDUINO >= 100 Wire.write((byte)0x00); Wire.write(dec2bcd(tm.Second)) ; Wire.write(dec2bcd(tm.Minute)); Wire.write(dec2bcd(tm.Hour)); // sets 24 hour format Wire.write(dec2bcd(tm.Wday)); Wire.write(dec2bcd(tm.Day)); Wire.write(dec2bcd(tm.Month)); Wire.write(dec2bcd(tmYearToY2k(tm.Year))); #else Wire.send(0x00); Wire.send(dec2bcd(tm.Second)) ; Wire.send(dec2bcd(tm.Minute)); Wire.send(dec2bcd(tm.Hour)); // sets 24 hour format Wire.send(dec2bcd(tm.Wday)); Wire.send(dec2bcd(tm.Day)); Wire.send(dec2bcd(tm.Month)); Wire.send(dec2bcd(tmYearToY2k(tm.Year))); #endif Wire.endTransmission(); } // PRIVATE FUNCTIONS // Convert Decimal to Binary Coded Decimal (BCD) uint8_t DS1307RTC::dec2bcd(uint8_t num) { return ((num/10 * 16) + (num % 10)); } // Convert Binary Coded Decimal (BCD) to Decimal uint8_t DS1307RTC::bcd2dec(uint8_t num) { return ((num/16 * 10) + (num % 16)); } #if defined(__SAM3X8E__) DS1307RTC I2CRTC = DS1307RTC(); // create an instance for the user #else // defined(__SAM3X8E__) DS1307RTC RTC = DS1307RTC(); // create an instance for the user #endif // defined(__SAM3X8E__)