void DS1307RTC::write(tmElements_t &tm) { Wire.beginTransmission(DS1307_CTRL_ID); Wire.send(0x00); // reset register pointer 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))); Wire.endTransmission(); }
void ntp_get(uint8_t data[6]) // for the log function { tm_t t; ntp_sec2tm(ntp_sec, &t); data[0] = dec2bcd(t.tm_year); data[1] = dec2bcd(t.tm_mon); data[2] = dec2bcd(t.tm_mday); data[3] = dec2bcd(t.tm_hour); data[4] = dec2bcd(t.tm_min); data[5] = dec2bcd(t.tm_sec); }
void MCP7940RTC::set(time_t t) { tmElements_t tm; breakTime(t, tm); tm.Second &= 0x7f; // stop the oscillator and write the data write(tm); uint8_t s = (tm.Second | 0x80); // assert oscillator start bit // Start the oscillator Wire.beginTransmission(MCP7940_CTRL_ID); #if ARDUINO >= 100 Wire.write((uint8_t)0x00); Wire.write((dec2bcd(tm.Second) | 0x80)); // Seconds #else Wire.send(0x00); Wire.send(s); #endif Wire.endTransmission(); }
/*----------------------------------------------------------------------* * Set the RTC's time from a tmElements_t structure. * * Returns the I2C status (zero if successful). * *----------------------------------------------------------------------*/ byte DS3232RTC::write(tmElements_t &tm) { i2cBeginTransmission(RTC_ADDR); i2cWrite((uint8_t)RTC_SECONDS); i2cWrite(dec2bcd(tm.Second)); i2cWrite(dec2bcd(tm.Minute)); i2cWrite(dec2bcd(tm.Hour)); //sets 24 hour format (Bit 6 == 0) i2cWrite(tm.Wday); i2cWrite(dec2bcd(tm.Day)); i2cWrite(dec2bcd(tm.Month)); i2cWrite(dec2bcd(tmYearToY2k(tm.Year))); return i2cEndTransmission(); }
bool DS1307RTC::write(tmElements_t &tm) { Wire.beginTransmission(DS1307_CTRL_ID); Wire.write((uint8_t) 0x00); // reset register pointer 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))); if (Wire.endTransmission() != 0) { exists = false; return false; } exists = true; return true; }
bool DS1307RTC::write(tmElements_t &tm) { uint8_t message[7]; message[0]=(dec2bcd(tm.Second)) ; message[1]=(dec2bcd(tm.Minute)); message[2]=(dec2bcd(tm.Hour)); // sets 24 hour format message[3]=(dec2bcd(tm.Wday)); message[4]=(dec2bcd(tm.Day)); message[5]=(dec2bcd(tm.Month)); message[6]=(dec2bcd(tmYearToY2k(tm.Year))); if(I2c.write(DS1307_CTRL_ID, 0x00, message, 7) != 0) { exists = false; return false; } exists = true; return true; }
/*----------------------------------------------------------------------* * Sets the RTC's time from a tmElements_t structure and clears the * * oscillator stop flag (OSF) in the Control/Status register. * * Returns the I2C status (zero if successful). * *----------------------------------------------------------------------*/ byte DS3232RTC::write(tmElements_t &tm) { i2cBeginTransmission(RTC_ADDR); i2cWrite((uint8_t)RTC_SECONDS); i2cWrite(dec2bcd(tm.Second)); i2cWrite(dec2bcd(tm.Minute)); i2cWrite(dec2bcd(tm.Hour)); //sets 24 hour format (Bit 6 == 0) i2cWrite(tm.Wday); i2cWrite(dec2bcd(tm.Day)); i2cWrite(dec2bcd(tm.Month)); i2cWrite(dec2bcd(tmYearToY2k(tm.Year))); byte ret = i2cEndTransmission(); uint8_t s = readRTC(RTC_STATUS); //read the status register writeRTC( RTC_STATUS, s & ~_BV(OSF) ); //clear the Oscillator Stop Flag return ret; }
// Save time void ds3231_save(timeDate_s* timeData) { // Month is stored starting at 0 in program, but RTC starts at 1 // byte month = timeData->month + 1; // if(month == 0b00001010) // invalid BCD, added 1 to 9 = 10 = bad // month = 0b00010000; // add 6 to fix, but that increases program size, so just set manually // TODO: write in one go instead of individually write(DS3231_ADDR_SECS, dec2bcd(timeData->time.secs)); write(DS3231_ADDR_MINS, dec2bcd(timeData->time.mins)); write(DS3231_ADDR_HRS, dec2bcd(timeData->time.hour)); write(DS3231_ADDR_DAY, timeData->date.day + 1); // Don't need to convert to BCD since it only stores 0 - 6, Day is also stored starting at 0 in program, but RTC starts at 1 write(DS3231_ADDR_DATE, dec2bcd(timeData->date.date)); write(DS3231_ADDR_MONTH, dec2bcd(timeData->date.month + 1)); write(DS3231_ADDR_YEAR, dec2bcd(timeData->date.year)); }
static void setrtc(Rtc *rtc) { struct RTCdev *dev; dev = nvr.rtc; dev->control |= RTCWRITE; wbflush(); dev->year = dec2bcd(rtc->year % 100); dev->mon = dec2bcd(rtc->mon); dev->mday = dec2bcd(rtc->mday); dev->hour = dec2bcd(rtc->hour); dev->min = dec2bcd(rtc->min); dev->sec = dec2bcd(rtc->sec); wbflush(); dev->control &= ~RTCWRITE; wbflush(); }
int ds1307_clock_set(const struct tm * const tm) { int ret; struct ds1307_raw raw; // Sanity check ret = tm_valid(tm); if (ret) { return -1; } // We also check the year 2000 <= x < 2100 if (tm->tm_year < 100 || tm->tm_year >= 200) { return -1; } // Read the current seconds value ret = read((uint8_t *)&raw, ADDR_SEC, 1); // just the first byte is enough if (ret) { return ret; } // Update the values, keeping the CH bit intact raw.sec = dec2bcd(tm->tm_sec); raw.min = dec2bcd(tm->tm_min); raw.hour = dec2bcd(tm->tm_hour); raw.wday = dec2bcd(tm->tm_wday + 1); raw.mday = dec2bcd(tm->tm_mday); raw.mon = dec2bcd(tm->tm_mon + 1); raw.year = dec2bcd(tm->tm_year % 100); // Write the values back ret = write((uint8_t *)&raw, ADDR_SEC, sizeof(raw)); if (ret) { return ret; } return 0; }
//-------------------------------------------------------------------------------- // Sets time of RTC device and returns whether the operation was successful. bool DS3232Controller::setDeviceTime(byte dayOfWeek, byte day, byte month, byte y2kYear, byte hour, byte minute, byte second) { Wire.beginTransmission(RTC_ADDR); Wire.write((uint8_t) RTC_SECONDS); Wire.write(dec2bcd(second)); Wire.write(dec2bcd(minute)); Wire.write(dec2bcd(hour)); //sets 24 hour format (Bit 6 == 0) Wire.write(dayOfWeek); Wire.write(dec2bcd(day)); Wire.write(dec2bcd(month)); Wire.write(dec2bcd(y2kYear + 30)); // convert Y2K year to year from 1970 byte i2cStatus = Wire.endTransmission(); uint8_t s = readRTC(RTC_STATUS); //read the status register writeRTC(RTC_STATUS, s & ~_BV(OSF)); //clear the Oscillator Stop Flag readCurrentTimeFromDevice(); // sync time with device return (i2cStatus == 0); }
// -------------------------------------------------------- // Set the RTC's time from a tmElements_t structure. // Returns the bus status (zero if successful). uint8_t DS1302RTC::write(tmElements_t &tm) { uint8_t buff[8]; writeEN(true); if(!writeEN()) return 255; // Error! Write-protect not disabled buff[0] = dec2bcd(tm.Second); // Disable Clock halt flag buff[1] = dec2bcd(tm.Minute); buff[2] = dec2bcd(tm.Hour); // 24-hour mode buff[3] = dec2bcd(tm.Day); buff[4] = dec2bcd(tm.Month); buff[5] = tm.Wday; buff[6] = dec2bcd(tmYearToY2k(tm.Year)); buff[7] = B10000000; // Write protect enable writeRTC(buff); return writeEN(); }
void RTCCValue::dayOfWeek(unsigned char dow) { a_date = (a_date & 0xFFFFFF00) | dec2bcd(dow); }
void RTCCValue::day(unsigned char day) { a_date = (a_date & 0xFFFF00FF) | (dec2bcd(day)<<8); }
void RTCCValue::month(unsigned char month) { a_date = (a_date & 0xFF00FFFF) | (dec2bcd(month)<<16); }
void RTCCValue::year(unsigned char year) { a_date = (a_date & 0x00FFFFFF) | (dec2bcd(year)<<24); }
void RTCCValue::date(unsigned char year, unsigned char month, unsigned char day) { a_date = (a_date & 0xFF) | (dec2bcd(year)<<24) | (dec2bcd(month)<<16) | (dec2bcd(day)<<8); }
void RTCCValue::hours(unsigned char hours) { a_time = (a_time & 0x00FFFFFF) | (dec2bcd(hours)<<24); }
void setTimeHour(uint8_t hour){ DS1307Write(0x02,dec2bcd(hour) & 0x3F); //set hours }
void setTimeMinute(uint8_t minute){ DS1307Write(0x01,dec2bcd(minute)); //set minutes }
void rtc_write_alarm(RTC_TIME *alarm) { write_rtcv(SEC_ALARM, dec2bcd(alarm->sec)); write_rtcv(MIN_ALARM, dec2bcd(alarm->min)); write_rtcv(HOUR_ALARM, dec2bcd(alarm->hour)); }
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(); }
void setTimeSecond(uint8_t second){ DS1307Write(0x00,dec2bcd(second)); //set seconds }
void RTCCValue::minutes(unsigned char minutes) { a_time = (a_time & 0xFF00FFFF) | (dec2bcd(minutes)<<16); }
void DS1307RTC::write(tmElements_t &tm) { if (ctrl_id == DS1307_CTRL_ID) { Wire.beginTransmission(ctrl_id); Wire.write((uint8_t)0x00); // reset register pointer Wire.write(dec2bcd(tm.Second) & 0x7f); // ray: start clock by setting CH bit low 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))); Wire.endTransmission(); } else if (ctrl_id == MCP7940_CTRL_ID) { Wire.beginTransmission(ctrl_id); Wire.write((uint8_t)0x00); // reset register pointer Wire.write(dec2bcd(tm.Second) | 0x80); // ray: start clock by setting ST bit high Wire.write(dec2bcd(tm.Minute)); Wire.write(dec2bcd(tm.Hour)); // sets 24 hour format Wire.write(dec2bcd(tm.Wday) | 0x08); // ray: turn on battery backup by setting VBATEN bit high Wire.write(dec2bcd(tm.Day)); Wire.write(dec2bcd(tm.Month)); Wire.write(dec2bcd(tmYearToY2k(tm.Year))); Wire.endTransmission(); } else { // undefined RTC type } }
void RTCCValue::seconds(unsigned char seconds) { a_time = (a_time & 0xFFFF00FF) | (dec2bcd(seconds)<<8); }
bool DS1307RTC::write(tmElements_t &tm) { #ifdef __STM32F1__ DS1307RTC_INIT_WIRE(); #endif Wire.beginTransmission(DS1307_CTRL_ID); #if ARDUINO >= 100 Wire.write((uint8_t)0x00); // reset register pointer 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); // reset register pointer 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 if (Wire.endTransmission() != 0) { exists = false; return false; } exists = true; return true; }
void startClock(void){ DS1307Write(0x00,dec2bcd(getTimeSecond()) | 0x7F); //set seconds }
static void convert_decimal_to_bcd(u8 *buf, u8 len) { int i = 0; for (i = 0; i < len; i++) buf[i] = dec2bcd(buf[i]); }
void RTCCValue::time(unsigned char hours, unsigned char minutes, unsigned char seconds) { a_time = (a_time & 0xFF) | (dec2bcd(hours)<<24) | (dec2bcd(minutes)<<16) | (dec2bcd(seconds)<<8); }