Arduino-RTC
Real-Time Clock (RTC) library for Arduino
DS1307.h
Go to the documentation of this file.
1 
19 #ifndef DS1307_H
20 #define DS1307_H
21 
22 #include "RTC.h"
23 #include "TWI.h"
24 
47 class DS1307 : protected TWI::Device {
48 public:
52  DS1307(TWI& twi) : TWI::Device(twi, 0x68) {}
53 
60  bool get_time(struct tm& now)
61  {
62  // Read clock/calender structure from device
63  rtc_t rtc;
64  if (!read_ram(0, &rtc, sizeof(rtc))) return (false);
65 
66  // Convert to time structure
67  now.tm_sec = rtc.seconds;
68  now.tm_min = rtc.minutes;
69  now.tm_hour = rtc.hours;
70  now.tm_mday = rtc.date;
71  now.tm_wday = rtc.day - 1;
72  now.tm_mon = rtc.month - 1;
73  now.tm_year = rtc.year + 100;
74  return (true);
75  }
76 
83  bool set_time(struct tm& now)
84  {
85  // Convert from time structure
86  rtc_t rtc;
87  rtc.seconds = now.tm_sec;
88  rtc.minutes = now.tm_min;
89  rtc.hours = now.tm_hour;
90  rtc.date = now.tm_mday;
91  rtc.day = now.tm_wday + 1;
92  rtc.month = now.tm_mon + 1;
93  rtc.year = now.tm_year - 100;
94 
95  // Write clock/calender structure to device
96  return (write_ram(0, &rtc, sizeof(rtc)));
97  }
98 
102  enum Rate {
103  RS_1_HZ = 0,
107  } __attribute__((packed));
108 
115  bool enable(Rate rs = RS_1_HZ)
116  {
117  control_t control;
118  control.rs = rs;
119  control.sqwe = 1;
120  control.out = 1;
121  uint8_t addr = offsetof(DS1307::timekeeper_t, control);
122  int count = write_ram(addr, &control, sizeof(control));
123  return (count == sizeof(control));
124  }
125 
131  bool disable()
132  {
133  control_t control;
134  uint8_t addr = offsetof(DS1307::timekeeper_t, control);
135  int count = write_ram(addr, &control, sizeof(control));
136  return (count == sizeof(control));
137  }
138 
140  const static uint8_t RAM_START = 0x08;
141 
143  const static uint8_t RAM_END = 0x3f;
144 
146  const static uint8_t RAM_MAX = RAM_END - RAM_START + 1;
155  bool read_ram(uint8_t addr, void* buf, size_t count)
156  {
157  if (!acquire()) return (false);
158  if (write(&addr, sizeof(addr)) != sizeof(addr)) return (false);
159  bool res = (read(buf, count) == (int) count);
160  if (!release()) return (false);
161  return (res);
162  }
163 
172  bool write_ram(uint8_t addr, const void* buf, size_t count)
173  {
174  if (count == 0) return (true);
175  iovec_t vec[3];
176  iovec_t* vp = vec;
177  iovec_arg(vp, &addr, sizeof(addr));
178  iovec_arg(vp, buf, count);
179  iovec_end(vp);
180  if (!acquire()) return (false);
181  bool res = (write(vec) == (int) count + 1);
182  if (!release()) return (false);
183  return (res);
184  }
185 
186 protected:
190  struct rtc_t {
198  } __attribute__((packed));
199 
203  union control_t {
204  uint8_t as_uint8;
205  struct {
206  uint8_t rs:2;
207  uint8_t reserved1:2;
208  uint8_t sqwe:1;
209  uint8_t reserved2:2;
210  uint8_t out:1;
211  };
212 
217  operator uint8_t() { return (as_uint8); }
218 
222  control_t() : as_uint8(0) {}
223  } __attribute__((packed));
224 
225 
229  struct timekeeper_t {
232  uint8_t ram[RAM_MAX];
233  } __attribute__((packed));
234 };
235 #endif
int8_t tm_mday
Day in Month [1-31].
Definition: time.h:40
int8_t tm_min
Minutes [0-59].
Definition: time.h:38
uint8_t rs
< Bitfield access.
Definition: DS1307.h:206
Rate
Definition: DS1307.h:102
uint8_t out
Output Control.
Definition: DS1307.h:210
bcd_t date
01-31 Date.
Definition: DS1307.h:195
bool disable()
Definition: DS1307.h:131
bool set_time(struct tm &now)
Definition: DS1307.h:83
rtc_t rtc
Clock/Calender Registers.
Definition: DS1307.h:230
static const uint8_t RAM_START
Definition: DS1307.h:140
static const uint8_t RAM_END
Definition: DS1307.h:143
bcd_t year
00-99 Year.
Definition: DS1307.h:197
bool enable(Rate rs=RS_1_HZ)
Definition: DS1307.h:115
int16_t tm_year
Years since 1900.
Definition: time.h:43
Definition: DS1307.h:47
uint8_t as_uint8
Unsigned byte access.
Definition: DS1307.h:204
static const uint8_t RAM_MAX
Definition: DS1307.h:146
int8_t tm_sec
Seconds [0-60].
Definition: time.h:37
DS1302< BOARD::D11, BOARD::D12, BOARD::D13 > rtc
Definition: RAM.ino:5
int8_t tm_hour
Hours [0-23].
Definition: time.h:39
bcd_t month
01-12 Month.
Definition: DS1307.h:196
int8_t tm_wday
Days since Sunday [0-6].
Definition: time.h:41
bcd_t day
01-07 Day.
Definition: DS1307.h:194
Definition: time.h:36
DS1307(TWI &twi)
Definition: DS1307.h:52
uint8_t sqwe
Square-Ware Enable.
Definition: DS1307.h:208
Hardware::TWI twi(100000UL)
bool write_ram(uint8_t addr, const void *buf, size_t count)
Definition: DS1307.h:172
bcd_t seconds
00-59 Seconds.
Definition: DS1307.h:191
bool read_ram(uint8_t addr, void *buf, size_t count)
Definition: DS1307.h:155
int8_t tm_mon
0-11 Months since January [0-11].
Definition: time.h:42
bool get_time(struct tm &now)
Definition: DS1307.h:60
bcd_t hours
00-23 Hours.
Definition: DS1307.h:193
bcd_t minutes
00-59 Minutes.
Definition: DS1307.h:192
Definition: bcd.h:25
control_t control
Control Register.
Definition: DS1307.h:231