a

Dependencies:   mbed

main.cpp

Committer:
bulmenwt
Date:
2015-01-28
Revision:
0:4c51ee480cf6

File content as of revision 0:4c51ee480cf6:

    

/*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"


 
#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
 
Serial pc(USBTX, USBRX); // tx, rx 


I2C i2c(p28, p27);
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() {

    pc.printf("RTC8564NB CLOCK" );
    wait(2.0);
    
   
    
    /* Set up NTP */
    pc.printf("Setting up NTP\n");

    
    //time_t seconds = time(NULL)+offset_JAPAN;
    
    time_t seconds = time(NULL);
    

    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);
  
        pc.printf("20%c%c/%c%c/%c%c %s\n",
            ((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]);
    
        pc.printf("%c%c:%c%c:%c%c\n",
            ((hour >> 4) & 0x03) + 0x30, (hour & 0x0F) + 0x30, 
                (minute >> 4) + 0x30, (minute & 0x0F) + 0x30, 
                    (sec >> 4) + 0x30, (sec & 0x0F) + 0x30 );
        wait(1.0);
    }
}