1
#include <../Wire/Wire.h>
13
// Aquire data from the RTC chip in BCD format
15
void DS1307::read(void)
17
// use the Wire lib to connect to tho rtc
18
// reset the resgiter pointer to zero
19
Wire.beginTransmission(DS1307_CTRL_ID);
20
Wire.write( (unsigned char )0 );
21
Wire.endTransmission();
23
// request the 7 bytes of data (secs, min, hr, dow, day, mth, yr)
24
Wire.requestFrom(DS1307_CTRL_ID, 7);
25
for(int i=0; i<7; i++)
27
// store data in raw bcd format
28
rtc_bcd[i]=Wire.read();
32
// update the data on the IC from the bcd formatted data in the buffer
33
void DS1307::save(void)
35
Wire.beginTransmission(DS1307_CTRL_ID);
36
Wire.write( (unsigned char)0 ); // reset register pointer
37
for(int i=0; i<7; i++)
39
Wire.write(rtc_bcd[i]);
41
Wire.endTransmission();
46
void DS1307::get(int *rtc, boolean refresh) // Aquire data from buffer and convert to int, refresh buffer if required
49
for(int i=0;i<7;i++) // cycle through each component, create array of data
55
int DS1307::get(int c, boolean refresh) // aquire individual RTC item from buffer, return as int, refresh buffer if required
62
v=(10*((rtc_bcd[DS1307_SEC] & DS1307_HI_SEC)>>4))+(rtc_bcd[DS1307_SEC] & DS1307_LO_BCD);
65
v=(10*((rtc_bcd[DS1307_MIN] & DS1307_HI_MIN)>>4))+(rtc_bcd[DS1307_MIN] & DS1307_LO_BCD);
68
v=(10*((rtc_bcd[DS1307_HR] & DS1307_HI_HR)>>4))+(rtc_bcd[DS1307_HR] & DS1307_LO_BCD);
71
v=rtc_bcd[DS1307_DOW] & DS1307_LO_DOW;
74
v=(10*((rtc_bcd[DS1307_DAY] & DS1307_HI_DAY)>>4))+(rtc_bcd[DS1307_DAY] & DS1307_LO_BCD);
77
v=(10*((rtc_bcd[DS1307_MTH] & DS1307_HI_MTH)>>4))+(rtc_bcd[DS1307_MTH] & DS1307_LO_BCD);
80
v=(10*((rtc_bcd[DS1307_YR] & DS1307_HI_YR)>>4))+(rtc_bcd[DS1307_YR] & DS1307_LO_BCD)+DS1307_BASE_YR;
86
void DS1307::set(int c, int v) // Update buffer, then update the chip
93
//preserve existing clock state (running/stopped)
94
int state=rtc_bcd[DS1307_SEC] & DS1307_CLOCKHALT;
95
rtc_bcd[DS1307_SEC]=state | (((v / 10)<<4) + (v % 10));
101
rtc_bcd[DS1307_MIN]=((v / 10)<<4) + (v % 10);
105
// TODO : AM/PM 12HR/24HR
108
rtc_bcd[DS1307_HR]=((v / 10)<<4) + (v % 10);
114
rtc_bcd[DS1307_DOW]=v;
120
rtc_bcd[DS1307_DAY]=((v / 10)<<4) + (v % 10);
126
rtc_bcd[DS1307_MTH]=((v / 10)<<4) + (v % 10);
132
rtc_bcd[DS1307_YR]=((v / 10)<<4) + (v % 10);
139
void DS1307::stop(void)
141
// set the ClockHalt bit high to stop the rtc
142
// this bit is part of the seconds byte
143
rtc_bcd[DS1307_SEC]=rtc_bcd[DS1307_SEC] | DS1307_CLOCKHALT;
147
void DS1307::start(void)
149
// unset the ClockHalt bit to start the rtc
150
// this bit is part of the seconds byte
151
rtc_bcd[DS1307_SEC]=rtc_bcd[DS1307_SEC] & ~DS1307_CLOCKHALT;