a copy of PCF8583_rtc lib with some modification

Fork of PCF8583_rtc by Dennis Smith

Committer:
dennyem
Date:
Fri Feb 14 00:21:38 2014 +0000
Revision:
0:7b654820260e
Child:
1:eaba89d6e5d8
Made into a library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dennyem 0:7b654820260e 1 #include <mbed.h>
dennyem 0:7b654820260e 2
dennyem 0:7b654820260e 3 #define PCF8583_addr_1 0xA0 // PCF8583 Write address,
dennyem 0:7b654820260e 4 #define PCF8583_addr_2 0xA2 // PCF8583 Write address,
dennyem 0:7b654820260e 5 #define ON 1
dennyem 0:7b654820260e 6 #define OFF 0
dennyem 0:7b654820260e 7
dennyem 0:7b654820260e 8 //Configuration Alarm Control Register
dennyem 0:7b654820260e 9 #define alarm_enable_bit 0x04
dennyem 0:7b654820260e 10 #define alarm_flag 0x02;
dennyem 0:7b654820260e 11 #define timer_hundsek 0x01
dennyem 0:7b654820260e 12 #define timer_seconds 0x02
dennyem 0:7b654820260e 13 #define timer_minutes 0x03
dennyem 0:7b654820260e 14 #define timer_hours 0x04
dennyem 0:7b654820260e 15 #define timer_days 0x05
dennyem 0:7b654820260e 16 #define timer_int_enable 0x08
dennyem 0:7b654820260e 17 #define daily_alarm 0x10
dennyem 0:7b654820260e 18 #define weekday_alarm 0x20
dennyem 0:7b654820260e 19 #define dated_alarm 0x30
dennyem 0:7b654820260e 20 #define timer_alarm_enable 0x40
dennyem 0:7b654820260e 21 #define alarm_int_enable 0x80
dennyem 0:7b654820260e 22 #define timer_alarm_enable 0x40
dennyem 0:7b654820260e 23 #define alarm_int_enable 0x80
dennyem 0:7b654820260e 24
dennyem 0:7b654820260e 25 // Use the first 2 NVRAM addresses for the century and year bytes.
dennyem 0:7b654820260e 26 #define CENTURY_REG 0x10
dennyem 0:7b654820260e 27 #define YEAR_REG 0x11
dennyem 0:7b654820260e 28 #define USER_REG 0x12
dennyem 0:7b654820260e 29
dennyem 0:7b654820260e 30 #define TIME 1
dennyem 0:7b654820260e 31 #define ALARM 9
dennyem 0:7b654820260e 32
dennyem 0:7b654820260e 33 struct Time_t {
dennyem 0:7b654820260e 34 bool fmt_hours;
dennyem 0:7b654820260e 35 bool am_pm_flag;
dennyem 0:7b654820260e 36 char hours;
dennyem 0:7b654820260e 37 char minutes;
dennyem 0:7b654820260e 38 char seconds;
dennyem 0:7b654820260e 39 char hundreds;
dennyem 0:7b654820260e 40 };
dennyem 0:7b654820260e 41
dennyem 0:7b654820260e 42 struct Date_t {
dennyem 0:7b654820260e 43 char day;
dennyem 0:7b654820260e 44 char month;
dennyem 0:7b654820260e 45 char year;
dennyem 0:7b654820260e 46 char century;
dennyem 0:7b654820260e 47 char weekday;
dennyem 0:7b654820260e 48 };
dennyem 0:7b654820260e 49
dennyem 0:7b654820260e 50 struct DateTime_t {
dennyem 0:7b654820260e 51 struct Date_t date;
dennyem 0:7b654820260e 52 struct Time_t time;
dennyem 0:7b654820260e 53 };
dennyem 0:7b654820260e 54
dennyem 0:7b654820260e 55 class PCF8583rtc {
dennyem 0:7b654820260e 56 I2C *_i2c;
dennyem 0:7b654820260e 57
dennyem 0:7b654820260e 58 public:
dennyem 0:7b654820260e 59
dennyem 0:7b654820260e 60 /**
dennyem 0:7b654820260e 61 * Set these public variables according to your locale, default is Australian English. Default in brackets.
dennyem 0:7b654820260e 62 * char *ShortDateFormat; ("d,m,yy")
dennyem 0:7b654820260e 63 * char *LongDateFormat; ("dddd dd mmmm yyyy")
dennyem 0:7b654820260e 64 * char *ShortTimeFormat; ("d:m:yy")
dennyem 0:7b654820260e 65 * char *LongTimeFormat; ("dd:nn:yyyy")
dennyem 0:7b654820260e 66 *
dennyem 0:7b654820260e 67 * char DateSeparator; ("\")
dennyem 0:7b654820260e 68 * char TimeSeparator; (":")
dennyem 0:7b654820260e 69 *
dennyem 0:7b654820260e 70 * char *ShortDayNames[7]; ({"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"})
dennyem 0:7b654820260e 71 * char *LongDayNames[7]; ({"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"})
dennyem 0:7b654820260e 72 * char *ShortMonthNames[12]; ({"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"})
dennyem 0:7b654820260e 73 * char *LongMonthNames[12]; ({"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"})
dennyem 0:7b654820260e 74 *
dennyem 0:7b654820260e 75 * Example:
dennyem 0:7b654820260e 76 * @code
dennyem 0:7b654820260e 77 * #include <mbed.h>
dennyem 0:7b654820260e 78 * #include "PCF8583_rtc.h"
dennyem 0:7b654820260e 79 *
dennyem 0:7b654820260e 80 * I2C i2c(P0_10, P0_11); // sda, scl
dennyem 0:7b654820260e 81 * PCF8583rtc rtc(&i2c, PCF8583_addr_2);
dennyem 0:7b654820260e 82 *
dennyem 0:7b654820260e 83 * struct DateTime_t dtl;
dennyem 0:7b654820260e 84 *
dennyem 0:7b654820260e 85 * //Set the time
dennyem 0:7b654820260e 86 * dtl = rtc.read(TIME);
dennyem 0:7b654820260e 87 * dtl.time.hours = rtc.bin2bcd(11);
dennyem 0:7b654820260e 88 * dtl.time.minutes = rtc.bin2bcd(43);
dennyem 0:7b654820260e 89 * rtc.write(TIME, dtl);
dennyem 0:7b654820260e 90 *
dennyem 0:7b654820260e 91 * //Read and display the time on the nixie display
dennyem 0:7b654820260e 92 * dtl = rtc.read(TIME);
dennyem 0:7b654820260e 93 * i2c.write(ADDR_8574_1, &dtl.time.hours, 1);
dennyem 0:7b654820260e 94 * i2c.write(ADDR_8574_2, &dtl.time.minutes, 1);
dennyem 0:7b654820260e 95 *
dennyem 0:7b654820260e 96 * @endcode
dennyem 0:7b654820260e 97
dennyem 0:7b654820260e 98 PCF8583rtc(I2C *i2c, char I2cAddress);
dennyem 0:7b654820260e 99
dennyem 0:7b654820260e 100 DateTime_t read(const char address);
dennyem 0:7b654820260e 101 void write(const char address, DateTime_t dti);
dennyem 0:7b654820260e 102 void FormatDateTime(char *dest, char *format);
dennyem 0:7b654820260e 103 bool WriteNVram(char address, char * value, char num);
dennyem 0:7b654820260e 104 bool ReadNVram(char address, char * dest, char num);
dennyem 0:7b654820260e 105 void SetDateTime(DateTime_t dti);
dennyem 0:7b654820260e 106 struct DateTime_t GetDateTimeBCD(void);
dennyem 0:7b654820260e 107
dennyem 0:7b654820260e 108 */
dennyem 0:7b654820260e 109
dennyem 0:7b654820260e 110 char *ShortDateFormat;
dennyem 0:7b654820260e 111 char *LongDateFormat;
dennyem 0:7b654820260e 112 char *ShortTimeFormat;
dennyem 0:7b654820260e 113 char *LongTimeFormat;
dennyem 0:7b654820260e 114
dennyem 0:7b654820260e 115 char DateSeparator;
dennyem 0:7b654820260e 116 char TimeSeparator;
dennyem 0:7b654820260e 117
dennyem 0:7b654820260e 118 char *ShortDayNames[7];
dennyem 0:7b654820260e 119 char *LongDayNames[7];
dennyem 0:7b654820260e 120 char *ShortMonthNames[12];
dennyem 0:7b654820260e 121 char *LongMonthNames[12];
dennyem 0:7b654820260e 122
dennyem 0:7b654820260e 123 PCF8583rtc(I2C *i2c, char I2cAddress);
dennyem 0:7b654820260e 124
dennyem 0:7b654820260e 125 /** read the current Time or Alarm
dennyem 0:7b654820260e 126 *
dennyem 0:7b654820260e 127 * @param address "TIME" = read the time, "ALARM" = read the alarm
dennyem 0:7b654820260e 128 * @returns
dennyem 0:7b654820260e 129 * a DateTime_t structure
dennyem 0:7b654820260e 130 */
dennyem 0:7b654820260e 131 DateTime_t read(const char address);
dennyem 0:7b654820260e 132
dennyem 0:7b654820260e 133 /** write the current Time or Alarm
dennyem 0:7b654820260e 134 *
dennyem 0:7b654820260e 135 * @param address "TIME" = read the time, "ALARM" = read the alarm
dennyem 0:7b654820260e 136 * @param dti a DateTime_t structure containing the time or alarm data
dennyem 0:7b654820260e 137 */
dennyem 0:7b654820260e 138 void write(const char address, DateTime_t dti);
dennyem 0:7b654820260e 139
dennyem 0:7b654820260e 140 void FormatDateTime(char *dest, char *format);
dennyem 0:7b654820260e 141
dennyem 0:7b654820260e 142 bool WriteNVram(char address, char * value, char num);
dennyem 0:7b654820260e 143
dennyem 0:7b654820260e 144 bool ReadNVram(char address, char * dest, char num);
dennyem 0:7b654820260e 145
dennyem 0:7b654820260e 146 void SetDateTime(DateTime_t dti);
dennyem 0:7b654820260e 147
dennyem 0:7b654820260e 148 char bin2bcd(char value);
dennyem 0:7b654820260e 149
dennyem 0:7b654820260e 150 private:
dennyem 0:7b654820260e 151 struct DateTime_t dt;
dennyem 0:7b654820260e 152 char _I2cAddress;
dennyem 0:7b654820260e 153
dennyem 0:7b654820260e 154 char Bcd2Char(char *d, char val, char WantLeadZero);
dennyem 0:7b654820260e 155 void enableCounting(void);
dennyem 0:7b654820260e 156 void pauseCounting(void);
dennyem 0:7b654820260e 157 char readByte(char address);
dennyem 0:7b654820260e 158 void writeByte(char address, char d);
dennyem 0:7b654820260e 159 void configureAlarmReg(char alarm);
dennyem 0:7b654820260e 160 void configureControlReg(char control);
dennyem 0:7b654820260e 161 };
dennyem 0:7b654820260e 162
dennyem 0:7b654820260e 163 /** PCF8583_rtc class.
dennyem 0:7b654820260e 164 *
dennyem 0:7b654820260e 165 * Example:
dennyem 0:7b654820260e 166 * @code
dennyem 0:7b654820260e 167 * #include <mbed.h>
dennyem 0:7b654820260e 168 * #include <PCF8583_rtc.h>
dennyem 0:7b654820260e 169 *
dennyem 0:7b654820260e 170 * I2C i2c(P0_10, P0_11); // sda, scl
dennyem 0:7b654820260e 171 * PCF8583rtc rtc(&i2c);
dennyem 0:7b654820260e 172 *
dennyem 0:7b654820260e 173 * int main() {
dennyem 0:7b654820260e 174 *
dennyem 0:7b654820260e 175 * rtc.read(TIME);
dennyem 0:7b654820260e 176 * i2c.write(ADDR_8574_1, &rtc.HoursBCD, 1); //write hours to display
dennyem 0:7b654820260e 177 * i2c.write(ADDR_8574_2, &rtc.MinsBCD, 1); //write minutes to display
dennyem 0:7b654820260e 178 * }
dennyem 0:7b654820260e 179 * @endcode
dennyem 0:7b654820260e 180 */
dennyem 0:7b654820260e 181
dennyem 0:7b654820260e 182 /** Create a PCF8583rtc object using a pointer to the given I2C object.
dennyem 0:7b654820260e 183 *
dennyem 0:7b654820260e 184 * @param i2c pointer to an I2C object to which the PCF8583 device is connected.
dennyem 0:7b654820260e 185 */
dennyem 0:7b654820260e 186 //PCF8583rtc(I2C *i2c);
dennyem 0:7b654820260e 187
dennyem 0:7b654820260e 188 /** the Read_DateTime function.
dennyem 0:7b654820260e 189 *
dennyem 0:7b654820260e 190 * @param address Determines whether to read the date/time or alarm registers
dennyem 0:7b654820260e 191 * Values are retrieved from the internal datetime structure
dennyem 0:7b654820260e 192 */
dennyem 0:7b654820260e 193 //void read(const char address);
dennyem 0:7b654820260e 194
dennyem 0:7b654820260e 195 /** the Write_DateTime function.
dennyem 0:7b654820260e 196 *
dennyem 0:7b654820260e 197 * @param address Determines whether to set the date/time or alarm registers
dennyem 0:7b654820260e 198 * Values are first set into the internal datetime structure prior to calling
dennyem 0:7b654820260e 199 */
dennyem 0:7b654820260e 200 //void write(const char address);
dennyem 0:7b654820260e 201
dennyem 0:7b654820260e 202 /** the FormatDateTime function.
dennyem 0:7b654820260e 203 *
dennyem 0:7b654820260e 204 * @param dest a pointer to a char array where formatted values are to be placed
dennyem 0:7b654820260e 205 * @param format a pointer to a string describing how to format the values
dennyem 0:7b654820260e 206 */
dennyem 0:7b654820260e 207 //void FormatDateTime(char *dest, char *format);
dennyem 0:7b654820260e 208
dennyem 0:7b654820260e 209 /** the WriteNVram function.
dennyem 0:7b654820260e 210 *
dennyem 0:7b654820260e 211 * @param address address where value is to be placed
dennyem 0:7b654820260e 212 * @param value pointer to char array containing the value(s) to be stored
dennyem 0:7b654820260e 213 * @param num the number bytes to store
dennyem 0:7b654820260e 214 */
dennyem 0:7b654820260e 215 //void WriteNVram(char address, char *value, char num);
dennyem 0:7b654820260e 216
dennyem 0:7b654820260e 217 //#endif