Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: DipCortex-EEprom RTC flw mbed
Diff: RTC/ds1302.cpp
- Revision:
- 0:f6e68b4ce169
diff -r 000000000000 -r f6e68b4ce169 RTC/ds1302.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RTC/ds1302.cpp Mon Feb 09 13:40:46 2015 +0000 @@ -0,0 +1,189 @@ +/* + * VFD Modular Clock - mbed + * (C) 2011-14 Akafugu Corporation + * + * This program is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + */ + +#include "global.h" +#include "ds1302.h" + +DS1302::DS1302(PinName sclk, PinName io, PinName rst) + : m_sclk(sclk) + , m_io(io) + , m_rst(rst) +{ +} + +void DS1302::begin() +{ + uint8_t x; + + m_rst = 0; + wait_us(2); + m_sclk = 0; + + write_byte(0x8e,0); + write_byte(0x90,0xa4); + + x=read_byte(0x81); + + if((x & 0x80) != 0) // start oscillator + write_byte(0x80,0); +} + + +time_t DS1302::time() +{ + return m_time; +} + +struct tm* DS1302::getTime() +{ + m_tm.tm_sec = bcd2dec(read_byte(0x81)); + m_tm.tm_min = bcd2dec(read_byte(0x83)); + m_tm.tm_hour = bcd2dec(read_byte(0x84)); + + return &m_tm; +} + +void DS1302::getTime(uint8_t* hour, uint8_t* min, uint8_t* sec) +{ + if (sec) *sec = bcd2dec(read_byte(0x81)); + if (min) *min = bcd2dec(read_byte(0x83)); + if (hour) *hour = bcd2dec(read_byte(0x84)); +} + +void DS1302::setTime(time_t t) +{ +} + +void DS1302::setTime(uint8_t hour, uint8_t min, uint8_t sec) +{ + write_byte(0x84, dec2bcd(hour)); + write_byte(0x82, dec2bcd(min)); + write_byte(0x80, dec2bcd(sec)); +} + +void DS1302::setTime(struct tm* tm) +{ +/* + write_byte(0x86, dec2bcd(day)); + write_byte(0x88, dec2bcd(month)); + write_byte(0x8c, dec2bcd(year)); + write_byte(0x8a, dec2bcd(dayofweek)); + write_byte(0x84, dec2bcd(hour)); + write_byte(0x82, dec2bcd(min)); + write_byte(0x80, dec2bcd(sec)); + +void ds1302::set_datetime(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min) +{ + write(0x86,get_bcd(day)); + write(0x88,get_bcd(mth)); + write(0x8c,get_bcd(year)); + write(0x8a,get_bcd(dow)); + write(0x84,get_bcd(hr)); + write(0x82,get_bcd(min)); + write(0x80,get_bcd(0)); +} +*/ +} + +void DS1302::setAlarm(time_t t) +{ +} + +void DS1302::setAlarm(uint8_t hour, uint8_t min, uint8_t sec) +{ +} + +struct tm* DS1302::getAlarm(void) +{ + return 0; +} + +void DS1302::getAlarm(uint8_t* hour, uint8_t* min, uint8_t* sec) +{ +} + +bool DS1302::checkAlarm(void) +{ + return false; +} + +void DS1302::SQWEnable(bool enable) +{ +} + +void DS1302::SQWSetFreq(enum RTC_SQW_FREQ freq) +{ +} + +uint8_t DS1302::read_byte(uint8_t cmd) +{ + uint8_t data=0; + + m_rst = 1; + write_byte(cmd); + + m_io.input(); + wait_us(1); + + for (uint8_t i = 0; i <= 7; i++) + { + data += m_io<<i; + m_sclk = 1; + wait_us(1); + m_sclk = 0; + wait_us(1); + } + + m_rst = 0; + + return data; +} + +void DS1302::write_byte(uint8_t cmd, uint8_t data) +{ + m_rst = 1; + wait_us(1); + + write_byte(cmd); + write_byte(data); + + m_rst = 0; +} + +void DS1302::write_byte(uint8_t cmd) +{ + m_io.output(); + + for (uint8_t i=0; i<=7; i++) + { + m_io = (cmd >> i) & 0x01; + wait_us(1); + m_sclk = 1; + wait_us(1); + m_sclk = 0; + } + + m_io.input(); +} + +void DS1302::writeRam(uint8_t addr, uint8_t data) +{ + write_byte(addr|0xC0, data); +} + +uint8_t DS1302::readRam(uint8_t addr) +{ + return read_byte(addr|0xC1); +}