Library to make use of the DS1302 timekeeping IC. The functions are identical to those used by the mbed RTC's
Dependents: temp_humid_time_DS1302_LM35_DHT11 temp_humid_light_time_DS1302_LM35_DHT11_LDR DSKY DS1302_HelloWorld ... more
HelloWorld program: https://mbed.org/users/Sissors/code/DS1302_HelloWorld/
For usage of the returned UNIX time code, see for example https://mbed.org/handbook/Time, http://www.cplusplus.com/reference/ctime/strftime/?kw=strftime and http://mbed.org/handbook/Time?action=view&revision=11592
DS1302.cpp@0:c7cea2a415c3, 2014-03-31 (annotated)
- Committer:
- Sissors
- Date:
- Mon Mar 31 20:53:13 2014 +0000
- Revision:
- 0:c7cea2a415c3
v1.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Sissors | 0:c7cea2a415c3 | 1 | #include "DS1302.h" |
Sissors | 0:c7cea2a415c3 | 2 | |
Sissors | 0:c7cea2a415c3 | 3 | DS1302::DS1302(PinName SCLK, PinName IO, PinName CE) : _SCLK(SCLK), _IO(IO), _CE(CE) |
Sissors | 0:c7cea2a415c3 | 4 | { |
Sissors | 0:c7cea2a415c3 | 5 | _CE = 0; |
Sissors | 0:c7cea2a415c3 | 6 | _SCLK = 0; |
Sissors | 0:c7cea2a415c3 | 7 | _IO.input(); |
Sissors | 0:c7cea2a415c3 | 8 | writeProtect = true; |
Sissors | 0:c7cea2a415c3 | 9 | } |
Sissors | 0:c7cea2a415c3 | 10 | |
Sissors | 0:c7cea2a415c3 | 11 | void DS1302::set_time(time_t t) |
Sissors | 0:c7cea2a415c3 | 12 | { |
Sissors | 0:c7cea2a415c3 | 13 | struct tm *_t = localtime(&t); |
Sissors | 0:c7cea2a415c3 | 14 | writeReg(Seconds, (_t->tm_sec % 10) + ((_t->tm_sec / 10) << 4)); |
Sissors | 0:c7cea2a415c3 | 15 | writeReg(Minutes, (_t->tm_min % 10) + ((_t->tm_min / 10) << 4)); |
Sissors | 0:c7cea2a415c3 | 16 | writeReg(Hours, (_t->tm_hour % 10) + ((_t->tm_hour / 10) << 4)); |
Sissors | 0:c7cea2a415c3 | 17 | writeReg(Dates, (_t->tm_mday % 10) + ((_t->tm_mday / 10) << 4)); |
Sissors | 0:c7cea2a415c3 | 18 | writeReg(Months, ((_t->tm_mon + 1) % 10) + (((_t->tm_mon + 1) / 10) << 4)); |
Sissors | 0:c7cea2a415c3 | 19 | writeReg(Days, _t->tm_wday + 1); |
Sissors | 0:c7cea2a415c3 | 20 | writeReg(Years, ((_t->tm_year - 100) % 10) + (((_t->tm_year - 100) / 10) << 4)); |
Sissors | 0:c7cea2a415c3 | 21 | } |
Sissors | 0:c7cea2a415c3 | 22 | |
Sissors | 0:c7cea2a415c3 | 23 | time_t DS1302::time(time_t *t) |
Sissors | 0:c7cea2a415c3 | 24 | { |
Sissors | 0:c7cea2a415c3 | 25 | char regs[7]; |
Sissors | 0:c7cea2a415c3 | 26 | _CE = 1; |
Sissors | 0:c7cea2a415c3 | 27 | wait_us(4); |
Sissors | 0:c7cea2a415c3 | 28 | writeByte(ClockBurst | 1); |
Sissors | 0:c7cea2a415c3 | 29 | for (int i = 0; i<7; i++) |
Sissors | 0:c7cea2a415c3 | 30 | regs[i] = readByte(); |
Sissors | 0:c7cea2a415c3 | 31 | _CE = 0; |
Sissors | 0:c7cea2a415c3 | 32 | |
Sissors | 0:c7cea2a415c3 | 33 | struct tm _t; |
Sissors | 0:c7cea2a415c3 | 34 | _t.tm_sec = (regs[0] & 0xF) + (regs[0] >> 4) * 10; |
Sissors | 0:c7cea2a415c3 | 35 | _t.tm_min = (regs[1] & 0xF) + (regs[1] >> 4) * 10; |
Sissors | 0:c7cea2a415c3 | 36 | _t.tm_hour = (regs[2] & 0xF) + (regs[2] >> 4) * 10; |
Sissors | 0:c7cea2a415c3 | 37 | _t.tm_mday = (regs[3] & 0xF) + (regs[3] >> 4) * 10; |
Sissors | 0:c7cea2a415c3 | 38 | _t.tm_mon = (regs[4] & 0xF) + (regs[4] >> 4) * 10 - 1; |
Sissors | 0:c7cea2a415c3 | 39 | _t.tm_year = (regs[6] & 0xF) + (regs[6] >> 4) * 10 + 100; |
Sissors | 0:c7cea2a415c3 | 40 | |
Sissors | 0:c7cea2a415c3 | 41 | // convert to timestamp and display (1256729737) |
Sissors | 0:c7cea2a415c3 | 42 | return mktime(&_t); |
Sissors | 0:c7cea2a415c3 | 43 | } |
Sissors | 0:c7cea2a415c3 | 44 | |
Sissors | 0:c7cea2a415c3 | 45 | void DS1302::storeByte(char address, char data) |
Sissors | 0:c7cea2a415c3 | 46 | { |
Sissors | 0:c7cea2a415c3 | 47 | if (address > 30) |
Sissors | 0:c7cea2a415c3 | 48 | return; |
Sissors | 0:c7cea2a415c3 | 49 | char command = RAMBase + (address << 1); |
Sissors | 0:c7cea2a415c3 | 50 | writeReg(command, data); |
Sissors | 0:c7cea2a415c3 | 51 | } |
Sissors | 0:c7cea2a415c3 | 52 | |
Sissors | 0:c7cea2a415c3 | 53 | char DS1302::recallByte(char address) |
Sissors | 0:c7cea2a415c3 | 54 | { |
Sissors | 0:c7cea2a415c3 | 55 | if (address > 30) |
Sissors | 0:c7cea2a415c3 | 56 | return 0; |
Sissors | 0:c7cea2a415c3 | 57 | char command = RAMBase + (address << 1) + 1; |
Sissors | 0:c7cea2a415c3 | 58 | return readReg(command); |
Sissors | 0:c7cea2a415c3 | 59 | } |
Sissors | 0:c7cea2a415c3 | 60 | |
Sissors | 0:c7cea2a415c3 | 61 | char DS1302::readReg(char reg) |
Sissors | 0:c7cea2a415c3 | 62 | { |
Sissors | 0:c7cea2a415c3 | 63 | char retval; |
Sissors | 0:c7cea2a415c3 | 64 | |
Sissors | 0:c7cea2a415c3 | 65 | _CE = 1; |
Sissors | 0:c7cea2a415c3 | 66 | wait_us(4); |
Sissors | 0:c7cea2a415c3 | 67 | writeByte(reg); |
Sissors | 0:c7cea2a415c3 | 68 | retval = readByte(); |
Sissors | 0:c7cea2a415c3 | 69 | wait_us(4); |
Sissors | 0:c7cea2a415c3 | 70 | _CE = 0; |
Sissors | 0:c7cea2a415c3 | 71 | return retval; |
Sissors | 0:c7cea2a415c3 | 72 | } |
Sissors | 0:c7cea2a415c3 | 73 | |
Sissors | 0:c7cea2a415c3 | 74 | void DS1302::writeReg(char reg, char val) |
Sissors | 0:c7cea2a415c3 | 75 | { |
Sissors | 0:c7cea2a415c3 | 76 | if (writeProtect) { |
Sissors | 0:c7cea2a415c3 | 77 | writeProtect = false; |
Sissors | 0:c7cea2a415c3 | 78 | writeReg(WriteProtect, 0); |
Sissors | 0:c7cea2a415c3 | 79 | } |
Sissors | 0:c7cea2a415c3 | 80 | _CE = 1; |
Sissors | 0:c7cea2a415c3 | 81 | wait_us(4); |
Sissors | 0:c7cea2a415c3 | 82 | writeByte(reg); |
Sissors | 0:c7cea2a415c3 | 83 | writeByte(val); |
Sissors | 0:c7cea2a415c3 | 84 | wait_us(4); |
Sissors | 0:c7cea2a415c3 | 85 | _CE = 0; |
Sissors | 0:c7cea2a415c3 | 86 | } |
Sissors | 0:c7cea2a415c3 | 87 | |
Sissors | 0:c7cea2a415c3 | 88 | |
Sissors | 0:c7cea2a415c3 | 89 | /*********************PRIVATE***********************/ |
Sissors | 0:c7cea2a415c3 | 90 | void DS1302::writeByte(char data) |
Sissors | 0:c7cea2a415c3 | 91 | { |
Sissors | 0:c7cea2a415c3 | 92 | _IO.output(); |
Sissors | 0:c7cea2a415c3 | 93 | for (int i = 0; i<8; i++) { |
Sissors | 0:c7cea2a415c3 | 94 | _IO = data & 0x01; |
Sissors | 0:c7cea2a415c3 | 95 | wait_us(1); |
Sissors | 0:c7cea2a415c3 | 96 | _SCLK = 1; |
Sissors | 0:c7cea2a415c3 | 97 | wait_us(1); |
Sissors | 0:c7cea2a415c3 | 98 | _SCLK = 0; |
Sissors | 0:c7cea2a415c3 | 99 | data >>= 1; |
Sissors | 0:c7cea2a415c3 | 100 | } |
Sissors | 0:c7cea2a415c3 | 101 | _IO.input(); |
Sissors | 0:c7cea2a415c3 | 102 | } |
Sissors | 0:c7cea2a415c3 | 103 | |
Sissors | 0:c7cea2a415c3 | 104 | char DS1302::readByte(void) |
Sissors | 0:c7cea2a415c3 | 105 | { |
Sissors | 0:c7cea2a415c3 | 106 | char retval = 0; |
Sissors | 0:c7cea2a415c3 | 107 | |
Sissors | 0:c7cea2a415c3 | 108 | _IO.input(); |
Sissors | 0:c7cea2a415c3 | 109 | for (int i = 0; i<8; i++) { |
Sissors | 0:c7cea2a415c3 | 110 | retval |= _IO << i; |
Sissors | 0:c7cea2a415c3 | 111 | wait_us(1); |
Sissors | 0:c7cea2a415c3 | 112 | _SCLK = 1; |
Sissors | 0:c7cea2a415c3 | 113 | wait_us(1); |
Sissors | 0:c7cea2a415c3 | 114 | _SCLK = 0; |
Sissors | 0:c7cea2a415c3 | 115 | } |
Sissors | 0:c7cea2a415c3 | 116 | return retval; |
Sissors | 0:c7cea2a415c3 | 117 | } |