23 #include "DS1307RTC.h"
24 #include "../I2C/I2CMaster.h"
25 #if defined(ARDUINO) && ARDUINO >= 100
55 #define DS1307_I2C_ADDRESS 0x68
58 #define DS1307_SECOND 0x00
59 #define DS1307_MINUTE 0x01
60 #define DS1307_HOUR 0x02
61 #define DS1307_DAY_OF_WEEK 0x03
62 #define DS1307_DATE 0x04
63 #define DS1307_MONTH 0x05
64 #define DS1307_YEAR 0x06
65 #define DS1307_CONTROL 0x07
66 #define DS1307_NVRAM 0x08
69 #define DS1307_ALARM_SIZE 3
70 #define DS1307_ALARMS (64 - RTC::ALARM_COUNT * DS1307_ALARM_SIZE - 1)
71 #define DS1307_ALARM_MAGIC 63
91 _bus->
write(DS1307_SECOND);
92 if (_bus->
startRead(DS1307_I2C_ADDRESS, 1)) {
93 uint8_t value = _bus->
read();
94 if ((value & 0x80) != 0)
95 writeRegister(DS1307_SECOND, value & 0x7F);
102 if (oneHzPin != 255 && _isRealTime) {
103 pinMode(oneHzPin, INPUT);
104 digitalWrite(oneHzPin, HIGH);
105 writeRegister(DS1307_CONTROL, 0x10);
122 if (_oneHzPin == 255 || !_isRealTime)
127 bool value = digitalRead(_oneHzPin);
128 if (value && !prevOneHz) {
137 inline uint8_t fromBCD(uint8_t value)
139 return (value >> 4) * 10 + (value & 0x0F);
142 inline uint8_t fromHourBCD(uint8_t value)
144 if ((value & 0x40) != 0) {
146 uint8_t result = ((value >> 4) & 0x01) * 10 + (value & 0x0F);
147 if ((value & 0x20) != 0)
148 return (result == 12) ? 12 : (result + 12);
150 return (result == 12) ? 0 : result;
153 return fromBCD(value);
161 _bus->
write(DS1307_SECOND);
162 if (_bus->
startRead(DS1307_I2C_ADDRESS, 3)) {
165 value->
hour = fromHourBCD(_bus->
read());
184 _bus->
write(DS1307_DATE);
185 if (_bus->
startRead(DS1307_I2C_ADDRESS, 3)) {
186 value->
day = fromBCD(_bus->
read());
188 value->
year = fromBCD(_bus->
read()) + 2000;
197 inline uint8_t toBCD(uint8_t value)
199 return ((value / 10) << 4) + (value % 10);
206 _bus->
write(DS1307_SECOND);
220 _bus->
write(DS1307_DATE);
234 _bus->
write(DS1307_ALARMS + alarmNum * DS1307_ALARM_SIZE);
235 if (_bus->
startRead(DS1307_I2C_ADDRESS, 3)) {
236 value->
hour = fromBCD(_bus->
read());
254 _bus->
write(DS1307_ALARMS + alarmNum * DS1307_ALARM_SIZE);
266 return DS1307_ALARMS - DS1307_NVRAM;
272 return readRegister(DS1307_NVRAM + offset);
280 writeRegister(DS1307_NVRAM + offset, value);
285 void DS1307RTC::initAlarms()
287 uint8_t value = readRegister(DS1307_ALARM_MAGIC);
295 for (uint8_t index = 0; index <
ALARM_COUNT; ++index)
297 writeRegister(DS1307_ALARM_MAGIC, 0xB0 + ALARM_COUNT);
302 _bus->
write(DS1307_NVRAM);
303 for (uint8_t index = DS1307_NVRAM; index < DS1307_ALARMS; ++index)
309 uint8_t DS1307RTC::readRegister(uint8_t reg)
313 if (!_bus->
startRead(DS1307_I2C_ADDRESS, 1))
318 bool DS1307RTC::writeRegister(uint8_t reg, uint8_t value)