This is the clock which used highly quality RTC module RT8564NB. This module is I2C controllable. At the time of poweron/reset, the start time received from ntp server. See: http://blogs.yahoo.co.jp/jf1vrr_station/19895596.html (Japanese)
Dependencies: EthernetNetIf NTPClient_NetServices TextLCD mbed
Diff: main.cpp
- Revision:
- 0:50e7bcac5eb9
- Child:
- 1:7c1d3790f08d
diff -r 000000000000 -r 50e7bcac5eb9 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Apr 26 07:53:06 2011 +0000 @@ -0,0 +1,150 @@ +/*This is the clock which used highly quality RTC module RT8564NB. +This module is I2C controllable. At the time of poweron/reset, the start +time received from ntp server. + */ +#include "mbed.h" +#include "TextLCD.h" +#include "EthernetNetIf.h" +#include "NTPClient.h" + +#define RTC8564NB_ADR 0xA2 + +#define CONTROL1 0x00 +#define CONTROL2 0x01 +#define SECONDS 0x02 +#define MINUTES 0x03 +#define HOURS 0x04 +#define DAYS 0x05 +#define WEEKDAYS 0x06 +#define MONTHS 0x07 +#define YEARS 0x08 +#define MINUTE_ALARM 0x09 +#define HOUR_ALARM 0x0A +#define DAY_ALARM 0x0B +#define WEEKDAY_ALARM 0x0C +#define CLOCKOUT_FREQ 0x0D +#define TIMER_CINTROL 0x0E +#define TIMER 0x0F +#define _READ 0x01 + +TextLCD lcd(p24, p26, p27, p28, p29, p30); +EthernetNetIf eth; +NTPClient ntp; +I2C i2c(p9, p10); +int offset_JAPAN = 32400; + +char year, month, day, week; +char hour, minute, sec; +char ntp_year[3], ntp_month[3], ntp_day[3], ntp_week[4]; +char ntp_hour[3], ntp_minute[3], ntp_sec[3]; +char week_val; + +char week_chr[7][4] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; + +void rtc_write(char address, char value) +{ + i2c.start(); + i2c.write(RTC8564NB_ADR); + i2c.write(address); + i2c.write(value); + i2c.stop(); +} + +char rtc_read(char address) +{ + char value; + i2c.start(); + i2c.write(RTC8564NB_ADR); + i2c.write(address); + i2c.start(); + i2c.write(RTC8564NB_ADR | _READ); + value = i2c.read(0); + i2c.stop(); + + return value; +} + +int main() { + lcd.cls(); + lcd.printf("RTC8564NB CLOCK" ); + wait(2.0); + + /* Set up Ethernet */ + lcd.cls(); + lcd.printf("Setting up Eth\n"); + EthernetErr ethErr = eth.setup(); + if (ethErr) { + lcd.cls(); + lcd.printf("Error with Eth\nNum: %d", ethErr); + return -1; + } + + /* Set up NTP */ + lcd.printf("Setting up NTP\n"); + Host server(IpAddr(), 123, "ntp1.jst.mfeed.ad.jp"); + ntp.setTime(server); + + time_t seconds = time(NULL)+offset_JAPAN; + + lcd.cls(); + strftime(ntp_year, 16, "%y", localtime(&seconds)); + strftime(ntp_month, 16, "%m", localtime(&seconds)); + strftime(ntp_day, 16, "%d", localtime(&seconds)); + strftime(ntp_week, 16, "%a", localtime(&seconds)); + strftime(ntp_hour, 16, "%H", localtime(&seconds)); + strftime(ntp_minute, 16, "%M", localtime(&seconds)); + strftime(ntp_sec, 16, "%S", localtime(&seconds)); + + switch (ntp_week[0]){ + case 'S': + switch (ntp_week[1]) { + case 'u': week_val = 0x00; break; + case 'a': week_val = 0x06; break; + } + break; + case 'M': week_val = 0x01; break; + case 'T': + switch (ntp_week[1]) { + case 'u': week_val = 0x02; break; + case 'h': week_val = 0x04; break; + } + break; + case 'W': week_val = 0x03; break; + case 'F': week_val = 0x05; break; + } + + rtc_write(CONTROL1, 0x20); //stop + rtc_write(CONTROL2, 0x00); + rtc_write(YEARS, ((ntp_year[0]-0x30)<<4)+(ntp_year[1]-0x30)); + rtc_write(MONTHS, ((ntp_month[0]-0x30)<<4)+(ntp_month[1]-0x30)); + rtc_write(DAYS, ((ntp_day[0]-0x30)<<4)+(ntp_day[1]-0x30)); + rtc_write(HOURS, ((ntp_hour[0]-0x30)<<4)+(ntp_hour[1]-0x30)); + rtc_write(MINUTES, ((ntp_minute[0]-0x30)<<4)+(ntp_minute[1]-0x30)); + rtc_write(SECONDS, ((ntp_sec[0]-0x30)<<4)+(ntp_sec[1]-0x30)); + rtc_write(WEEKDAYS, week_val); + rtc_write(CLOCKOUT_FREQ, 0x00); // 0x83 = TE on & 1Hz + rtc_write(TIMER_CINTROL, 0x00); + rtc_write(CONTROL1, 0x00); //start + + while(1) { + year = rtc_read(YEARS); + month = rtc_read(MONTHS); + day = rtc_read(DAYS); + week = rtc_read(WEEKDAYS); + hour = rtc_read(HOURS); + minute = rtc_read(MINUTES); + sec = rtc_read(SECONDS); + lcd.locate(0,0); + lcd.printf("20%c%c/%c%c/%c%c %s", + ((year >> 4) & 0x03) + 0x30, (year & 0x0F) + 0x30, + ((month >> 4) & 0x01) + 0x30, (month & 0x0F) + 0x30, + ((day >> 4) & 0x03)+ 0x30, (day & 0x0F) + 0x30, + week_chr[week & 0x07]); + lcd.locate(0,1); + lcd.printf("%c%c:%c%c:%c%c", + ((hour >> 4) & 0x03) + 0x30, (hour & 0x0F) + 0x30, + (minute >> 4) + 0x30, (minute & 0x0F) + 0x30, + (sec >> 4) + 0x30, (sec & 0x0F) + 0x30 ); + wait(1.0); + } +}