This short program illustrates how to use the DS130x_I2C library. My objective is to share the same RTC with Microchip 18F MCU.

Dependencies:   mbed DebugLibrary

Committer:
Yann
Date:
Fri Feb 11 10:17:20 2011 +0000
Revision:
1:995212d326ca
Parent:
0:f30e2135b0db
V0.0.0.2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Yann 0:f30e2135b0db 1 #include <string>
Yann 0:f30e2135b0db 2 #include <iostream>
Yann 0:f30e2135b0db 3 #include <iomanip>
Yann 0:f30e2135b0db 4
Yann 0:f30e2135b0db 5 #include "DS130x_I2C.h"
Yann 0:f30e2135b0db 6 #include "EthernetNetIf.h"
Yann 0:f30e2135b0db 7 #include "NTPClient.h"
Yann 0:f30e2135b0db 8
Yann 0:f30e2135b0db 9 /*
Yann 0:f30e2135b0db 10 * Declare functions
Yann 0:f30e2135b0db 11 */
Yann 0:f30e2135b0db 12 void AvailableIndicator(); // LED1 flashing for program while program is alive
Yann 0:f30e2135b0db 13 void TimeUpdate(); // Update time from SNTP server
Yann 0:f30e2135b0db 14 void RtcClockEvent(); // Event rise on each RTC.SQW/OUT change
Yann 0:f30e2135b0db 15 char DisplayMenuAndGetChoice(); // Display and get the user choice
Yann 1:995212d326ca 16 // Time functions
Yann 0:f30e2135b0db 17 void SetTimeFromSNTP();
Yann 0:f30e2135b0db 18 void ForceTime();
Yann 0:f30e2135b0db 19 void GetTime();
Yann 0:f30e2135b0db 20 void GetTimeFieldByFiled();
Yann 1:995212d326ca 21 // Memory functions
Yann 0:f30e2135b0db 22 void WriteStdStringValue(const unsigned char p_address, const std::string & p_string); // Write a string
Yann 0:f30e2135b0db 23 void ReadStdStringValue(const unsigned char p_address); // Read a string
Yann 1:995212d326ca 24 void WriteShortValue(const unsigned char p_address, const short p_short, CDS130X_I2C::Mode p_mode); // Write a short value
Yann 1:995212d326ca 25 void ReadShortValue(const unsigned char p_address, CDS130X_I2C::Mode p_mode); // Read a short value
Yann 1:995212d326ca 26 void WriteIntegerValue(const unsigned char p_address, const int p_int, CDS130X_I2C::Mode p_mode); // Write an integer value
Yann 1:995212d326ca 27 void ReadIntegerValue(const unsigned char p_address, CDS130X_I2C::Mode p_mode); // Read an integer value
Yann 0:f30e2135b0db 28
Yann 0:f30e2135b0db 29 /*
Yann 0:f30e2135b0db 30 * Declare statics
Yann 0:f30e2135b0db 31 */
Yann 0:f30e2135b0db 32 EthernetNetIf g_eth;
Yann 0:f30e2135b0db 33 Host g_ntpServer(IpAddr(), 123, "ntp.unice.fr");
Yann 0:f30e2135b0db 34 NTPClient g_ntp;
Yann 0:f30e2135b0db 35
Yann 0:f30e2135b0db 36 DigitalOut g_availableLed(LED1); // To verify if program in running
Yann 0:f30e2135b0db 37 InterruptIn g_rtcClock(p5); // Used to trigger event from RTC.SQW/OUT
Yann 0:f30e2135b0db 38 Ticker g_available; // LED1 will flash with a period of 2s
Yann 0:f30e2135b0db 39 Ticker g_timeUpdate; // Update time from SNTP server
Yann 0:f30e2135b0db 40
Yann 0:f30e2135b0db 41 CDS130X_I2C g_myRTC(0xd0, p28, p27, CDS130X_I2C::One_Hz); // Create an instance of the class C24LCXX_I2C, p28: SDA, p29:SDL, Oscillator mode: 1Hz, on 5V I2C bus
Yann 0:f30e2135b0db 42
Yann 0:f30e2135b0db 43 int main() {
Yann 0:f30e2135b0db 44
Yann 0:f30e2135b0db 45 // Launch available indicator
Yann 0:f30e2135b0db 46 g_available.attach(&AvailableIndicator, 2.0);
Yann 0:f30e2135b0db 47 // Initialize the module
Yann 0:f30e2135b0db 48 if (!g_myRTC.Initialize()) {
Yann 0:f30e2135b0db 49 error("Module initialization failed");
Yann 0:f30e2135b0db 50 }
Yann 0:f30e2135b0db 51 // Initialize Ethernet
Yann 1:995212d326ca 52 std::cout << "Getting IP address..." << "\r" << std::endl;
Yann 0:f30e2135b0db 53 g_eth.setup();
Yann 0:f30e2135b0db 54 wait(1); // Needed after Ethernet startup
Yann 0:f30e2135b0db 55 IpAddr ip = g_eth.getIp();
Yann 0:f30e2135b0db 56 std::cout << "IP address: " << (int)ip[0] << "." << (int)ip[1] << "." << (int)ip[2] << "." << (int)ip[3] << "\r" << std::endl;
Yann 0:f30e2135b0db 57 // Update current time
Yann 0:f30e2135b0db 58 g_ntp.setTime(g_ntpServer);
Yann 0:f30e2135b0db 59 time_t ctTime = time(NULL);
Yann 0:f30e2135b0db 60 std::cout << "Time is now: " << ctime(&ctTime) << " UTC\r" << std::endl;
Yann 0:f30e2135b0db 61 // Start ticker
Yann 0:f30e2135b0db 62 g_timeUpdate.attach(&TimeUpdate, 60.0);
Yann 0:f30e2135b0db 63
Yann 0:f30e2135b0db 64 // Start RTC.SQW/OUT trigger
Yann 0:f30e2135b0db 65 g_rtcClock.rise(&RtcClockEvent);
Yann 0:f30e2135b0db 66
Yann 0:f30e2135b0db 67 while (true) {
Yann 0:f30e2135b0db 68 switch (DisplayMenuAndGetChoice()) {
Yann 0:f30e2135b0db 69 case 'a':
Yann 0:f30e2135b0db 70 SetTimeFromSNTP();
Yann 0:f30e2135b0db 71 break;
Yann 0:f30e2135b0db 72 case 'b':
Yann 0:f30e2135b0db 73 GetTime();
Yann 0:f30e2135b0db 74 break;
Yann 0:f30e2135b0db 75 case 'c':
Yann 0:f30e2135b0db 76 ForceTime();
Yann 0:f30e2135b0db 77 break;
Yann 0:f30e2135b0db 78 case 'd':
Yann 0:f30e2135b0db 79 GetTimeFieldByFiled();
Yann 0:f30e2135b0db 80 break;
Yann 0:f30e2135b0db 81
Yann 1:995212d326ca 82 case 'j': {
Yann 0:f30e2135b0db 83 std::string str("Wellcome to Evil...");
Yann 0:f30e2135b0db 84 WriteStdStringValue(0x04, str);
Yann 1:995212d326ca 85 #if defined(__DEBUG)
Yann 1:995212d326ca 86 g_myRTC.DumpMemoryArea(0x04, str.length() + 4);
Yann 1:995212d326ca 87 #else // __DEBUG
Yann 1:995212d326ca 88 std::cout << "DEBUG mode is not set, nothing to do!\r" << std::endl;
Yann 1:995212d326ca 89 #endif // __DEBUG
Yann 0:f30e2135b0db 90 }
Yann 0:f30e2135b0db 91 break;
Yann 1:995212d326ca 92 case 'k':
Yann 1:995212d326ca 93 ReadStdStringValue(0x04);
Yann 1:995212d326ca 94 break;
Yann 1:995212d326ca 95 case 'l':
Yann 1:995212d326ca 96 WriteShortValue(0x21, (short)0xbeef, CDS130X_I2C::BigEndian);
Yann 1:995212d326ca 97 break;
Yann 0:f30e2135b0db 98 case 'm':
Yann 1:995212d326ca 99 ReadShortValue(0x21, CDS130X_I2C::BigEndian);
Yann 1:995212d326ca 100 break;
Yann 1:995212d326ca 101 case 'n':
Yann 1:995212d326ca 102 WriteIntegerValue(0x23, (int)0xcafedeca, CDS130X_I2C::BigEndian);
Yann 1:995212d326ca 103 break;
Yann 1:995212d326ca 104 case 'o':
Yann 1:995212d326ca 105 ReadIntegerValue(0x23, CDS130X_I2C::BigEndian);
Yann 1:995212d326ca 106 break;
Yann 1:995212d326ca 107 case 'p':
Yann 0:f30e2135b0db 108 #if defined(__DEBUG)
Yann 1:995212d326ca 109 std::cout << "Enter the addess to dump: " << std::flush;
Yann 1:995212d326ca 110 int address;
Yann 1:995212d326ca 111 scanf("%d", &address);
Yann 1:995212d326ca 112 std::cout << "\r\r" << std::endl;
Yann 1:995212d326ca 113 g_myRTC.DumpMemoryArea((unsigned char)address, 16);
Yann 0:f30e2135b0db 114 #else // __DEBUG
Yann 0:f30e2135b0db 115 std::cout << "DEBUG mode is not set, nothing to do!\r" << std::endl;
Yann 0:f30e2135b0db 116 #endif // __DEBUG
Yann 0:f30e2135b0db 117 break;
Yann 1:995212d326ca 118 case 'q':
Yann 1:995212d326ca 119 g_myRTC.EraseMemoryArea(0x21, 16);
Yann 0:f30e2135b0db 120 break;
Yann 0:f30e2135b0db 121 default:
Yann 0:f30e2135b0db 122 std::cout << "Invalid user choice\r" << std::endl;
Yann 0:f30e2135b0db 123 break;
Yann 0:f30e2135b0db 124 } // End of 'switch' statement
Yann 0:f30e2135b0db 125 } // End of 'while' statement
Yann 0:f30e2135b0db 126 } // End of program - nerver reached
Yann 0:f30e2135b0db 127
Yann 0:f30e2135b0db 128 void AvailableIndicator()
Yann 0:f30e2135b0db 129 {
Yann 0:f30e2135b0db 130 g_availableLed = !g_availableLed;
Yann 0:f30e2135b0db 131 } // End of AvailableIndicator
Yann 0:f30e2135b0db 132
Yann 0:f30e2135b0db 133 void TimeUpdate()
Yann 0:f30e2135b0db 134 {
Yann 0:f30e2135b0db 135 // Update current time
Yann 0:f30e2135b0db 136 g_ntp.setTime(g_ntpServer);
Yann 0:f30e2135b0db 137 } // End of TimeUpdate funtion
Yann 0:f30e2135b0db 138
Yann 0:f30e2135b0db 139 void RtcClockEvent() { /* Www Mmm dd hh:mm:ss yyyy */
Yann 0:f30e2135b0db 140 struct tm t = g_myRTC.GetTime();
Yann 0:f30e2135b0db 141 char buffer[32];
Yann 0:f30e2135b0db 142 strftime(buffer, 32, "%a %m %d %H:%M:%S %Y", &t);
Yann 0:f30e2135b0db 143 DEBUG("RtcClockEvent: '%s'", buffer)
Yann 0:f30e2135b0db 144 } // End of RtcClockEvent() funtion
Yann 0:f30e2135b0db 145
Yann 0:f30e2135b0db 146 char DisplayMenuAndGetChoice()
Yann 0:f30e2135b0db 147 {
Yann 1:995212d326ca 148 char value;
Yann 1:995212d326ca 149 std::cout << "\r" << std::endl << "\r" << std::endl << "DS13X_I2C v0.2\r" << std::endl;
Yann 1:995212d326ca 150 std::cout << "\tSet time from SNTP server:\t\ta\r" << std::endl;
Yann 1:995212d326ca 151 std::cout << "\tRead time from RTC:\t\t\tb\r" << std::endl;
Yann 1:995212d326ca 152 std::cout << "\tForce time:\t\t\t\tc\r" << std::endl;
Yann 1:995212d326ca 153 std::cout << "\tRead time field:\t\t\td\r" << std::endl;
Yann 1:995212d326ca 154 std::cout << "\tSet second:\t\t\t\te\r" << std::endl;
Yann 1:995212d326ca 155 std::cout << "\tInc hour:\t\t\t\tf\r" << std::endl;
Yann 1:995212d326ca 156 std::cout << "\tDec hour:\t\t\t\tg\r" << std::endl;
Yann 1:995212d326ca 157 std::cout << "\tInc month:\t\t\t\th\r" << std::endl;
Yann 1:995212d326ca 158 std::cout << "\tDec month:\t\t\t\ti\r" << std::endl;
Yann 1:995212d326ca 159 std::cout << "\tWrite a string at address 0x04:\t\tj\r" << std::endl;
Yann 1:995212d326ca 160 std::cout << "\tRead a string at address 0x04:\t\tk\r" << std::endl;
Yann 1:995212d326ca 161 std::cout << "\tWrite a short value at address 0x21:\tl\r" << std::endl;
Yann 1:995212d326ca 162 std::cout << "\tRead a short value at address 0x21:\tm\r" << std::endl;
Yann 1:995212d326ca 163 std::cout << "\tWrite an int value at address 0x23:\tn\r" << std::endl;
Yann 1:995212d326ca 164 std::cout << "\tRead an int value at address 0x23:\to\r" << std::endl;
Yann 1:995212d326ca 165 std::cout << "\tHexadump from address 0x21:\t\tp\r" << std::endl;
Yann 1:995212d326ca 166 std::cout << "\tErase from address 0x21:\t\tq\r" << std::endl;
Yann 0:f30e2135b0db 167 std::cout << "Enter your choice: " << std::flush;
Yann 1:995212d326ca 168 value = getchar();
Yann 1:995212d326ca 169 std::cout << "\r" << std::endl;
Yann 1:995212d326ca 170 return value;
Yann 0:f30e2135b0db 171 }
Yann 0:f30e2135b0db 172
Yann 0:f30e2135b0db 173 void SetTimeFromSNTP() {
Yann 0:f30e2135b0db 174 DEBUG_ENTER("SetTimeFromSNTP")
Yann 0:f30e2135b0db 175
Yann 0:f30e2135b0db 176 char buffer[32];
Yann 0:f30e2135b0db 177 time_t seconds = time(NULL);
Yann 0:f30e2135b0db 178 strftime(buffer, 32, "%a %m %d %H:%M:%S %Y", localtime(&seconds)); /* Www Mmm dd hh:mm:ss yyyy */
Yann 0:f30e2135b0db 179 DEBUG("GetTime: Current date is '%s'", buffer)
Yann 0:f30e2135b0db 180
Yann 0:f30e2135b0db 181 std::string str(buffer);
Yann 0:f30e2135b0db 182 g_myRTC.SetTime(str);
Yann 0:f30e2135b0db 183
Yann 0:f30e2135b0db 184 DEBUG_LEAVE("SetTimeFromSNTP")
Yann 0:f30e2135b0db 185 }
Yann 0:f30e2135b0db 186
Yann 0:f30e2135b0db 187 void ForceTime() {
Yann 0:f30e2135b0db 188 DEBUG_ENTER("ForceTime")
Yann 0:f30e2135b0db 189
Yann 0:f30e2135b0db 190 // Get time frome user
Yann 0:f30e2135b0db 191 std::cout << "Enter the new date using the format 'Www Mmm dd hh:mm:ss yyyy': ";
Yann 0:f30e2135b0db 192 std::string line;
Yann 0:f30e2135b0db 193 std::cin >> line;
Yann 0:f30e2135b0db 194 int removeCR;
Yann 0:f30e2135b0db 195 if ((removeCR = line.rfind("\r")) != -1) {
Yann 0:f30e2135b0db 196 line.erase(removeCR);
Yann 0:f30e2135b0db 197 }
Yann 0:f30e2135b0db 198 // Set it
Yann 0:f30e2135b0db 199 g_myRTC.SetTime(line);
Yann 0:f30e2135b0db 200
Yann 0:f30e2135b0db 201 DEBUG_LEAVE("ForceTime")
Yann 0:f30e2135b0db 202 }
Yann 0:f30e2135b0db 203
Yann 0:f30e2135b0db 204 void GetTime() {
Yann 0:f30e2135b0db 205 struct tm t = g_myRTC.GetTime();
Yann 1:995212d326ca 206 DEBUG("GetTime: %d %d %d %d:%d:%d %d", /* ww mm dd hh:mm:ss yyyy */
Yann 1:995212d326ca 207 t.tm_wday,
Yann 1:995212d326ca 208 t.tm_mon,
Yann 1:995212d326ca 209 t.tm_mday,
Yann 1:995212d326ca 210 t.tm_hour,
Yann 1:995212d326ca 211 t.tm_min,
Yann 1:995212d326ca 212 t.tm_sec,
Yann 1:995212d326ca 213 t.tm_year);
Yann 0:f30e2135b0db 214 char buffer[32];
Yann 0:f30e2135b0db 215 strftime(buffer, 32, "%a %m %d %H:%M:%S %Y", &t);
Yann 0:f30e2135b0db 216 DEBUG("GetTime: Current date is '%s'", buffer)
Yann 0:f30e2135b0db 217 }
Yann 0:f30e2135b0db 218
Yann 0:f30e2135b0db 219 void GetTimeFieldByFiled() {
Yann 0:f30e2135b0db 220 unsigned char value = 0xff;
Yann 0:f30e2135b0db 221
Yann 0:f30e2135b0db 222 // Get seconds in BCD format
Yann 0:f30e2135b0db 223 g_myRTC.Read(CDS130X_I2C::SecondsAddress, &value);
Yann 1:995212d326ca 224 DEBUG("\tSeconds in BCD: 0x%02x", value)
Yann 1:995212d326ca 225 std::cout << "\tSeconds in BCD: 0x" << std::setw(2) << std::setfill('0') << std::ios::hex << (unsigned char)value << "\r" << std::endl;
Yann 0:f30e2135b0db 226 // Get seconds in BCD format
Yann 0:f30e2135b0db 227 g_myRTC.Read(CDS130X_I2C::MinutesAddress, &value);
Yann 1:995212d326ca 228 DEBUG("\tMinutes in BCD: 0x%02x", value)
Yann 1:995212d326ca 229 std::cout << "\tMinutes in BCD: 0x" << std::setw(2) << std::setfill('0') << std::ios::hex << (unsigned char)value << "\r" << std::endl;
Yann 0:f30e2135b0db 230 // Get seconds in BCD format
Yann 0:f30e2135b0db 231 g_myRTC.Read(CDS130X_I2C::HoursAddress, &value);
Yann 1:995212d326ca 232 DEBUG("\tHours in BCD: 0x%02x", value)
Yann 1:995212d326ca 233 std::cout << "\tHours in BCD: 0x" << std::setw(2) << std::setfill('0') << std::ios::hex << (unsigned char)value << "\r" << std::endl;
Yann 0:f30e2135b0db 234 // Get seconds in BCD format
Yann 0:f30e2135b0db 235 g_myRTC.Read(CDS130X_I2C::DayAddress, &value);
Yann 1:995212d326ca 236 DEBUG("\tDay in BCD: 0x%02x", value)
Yann 1:995212d326ca 237 std::cout << "\tDay in BCD: 0x" << std::setw(2) << std::setfill('0') << std::ios::hex << (unsigned char)value << "\r" << std::endl;
Yann 0:f30e2135b0db 238 }
Yann 0:f30e2135b0db 239
Yann 0:f30e2135b0db 240 void WriteStdStringValue(const unsigned char p_address, const std::string & p_string) {
Yann 1:995212d326ca 241 std::cout << "Write string '" << p_string << "' at address 0x" << std::setw(2) << std::setfill('0') << std::ios::hex << p_address << "\r" << std::endl;
Yann 0:f30e2135b0db 242 g_myRTC.WriteMemory(p_address, p_string);
Yann 0:f30e2135b0db 243 }
Yann 0:f30e2135b0db 244
Yann 0:f30e2135b0db 245 void ReadStdStringValue(const unsigned char p_address) {
Yann 1:995212d326ca 246 std::string str;
Yann 1:995212d326ca 247 g_myRTC.ReadMemory(p_address, str);
Yann 1:995212d326ca 248 std::cout << "String at address 0x" << std::setw(2) << std::setfill('0') << std::ios::hex << p_address << " is: " << str << "\r" << std::endl;
Yann 0:f30e2135b0db 249 }
Yann 1:995212d326ca 250
Yann 1:995212d326ca 251 void WriteShortValue(const unsigned char p_address, const short p_short, CDS130X_I2C::Mode p_mode) {
Yann 1:995212d326ca 252 std::cout << "Write short '" << p_short << "' at address 0x" << std::setw(2) << std::setfill('0') << std::ios::hex << p_address << "\r" << std::endl;
Yann 1:995212d326ca 253 if (p_mode == CDS130X_I2C::BigEndian) {
Yann 1:995212d326ca 254 g_myRTC.WriteMemory(p_address, p_short);
Yann 1:995212d326ca 255 } else {
Yann 1:995212d326ca 256 g_myRTC.WriteMemory(p_address, p_short, p_mode);
Yann 1:995212d326ca 257 }
Yann 1:995212d326ca 258 }
Yann 1:995212d326ca 259
Yann 1:995212d326ca 260 void ReadShortValue(const unsigned char p_address, CDS130X_I2C::Mode p_mode) {
Yann 1:995212d326ca 261 short value;
Yann 1:995212d326ca 262 if (p_mode == CDS130X_I2C::BigEndian) {
Yann 1:995212d326ca 263 g_myRTC.ReadMemory(p_address, (short *)&value);
Yann 1:995212d326ca 264 } else {
Yann 1:995212d326ca 265 g_myRTC.ReadMemory(p_address, (short *)&value, p_mode);
Yann 1:995212d326ca 266 }
Yann 1:995212d326ca 267 std::cout << "Short at address 0x" << std::setw(2) << std::setfill('0') << std::ios::hex << p_address << " is: " << std::setw(4) << value << "\r" << std::endl;
Yann 1:995212d326ca 268 }
Yann 1:995212d326ca 269
Yann 1:995212d326ca 270 void WriteIntegerValue(const unsigned char p_address, const int p_int, CDS130X_I2C::Mode p_mode) {
Yann 1:995212d326ca 271 std::cout << "Write integer '" << p_int << "' at address 0x" << std::setw(2) << std::setfill('0') << std::ios::hex << p_address << "\r" << std::endl;
Yann 1:995212d326ca 272 g_myRTC.WriteMemory(p_address, p_int, p_mode);
Yann 1:995212d326ca 273 }
Yann 1:995212d326ca 274
Yann 1:995212d326ca 275 void ReadIntegerValue(const unsigned char p_address, CDS130X_I2C::Mode p_mode) {
Yann 1:995212d326ca 276 int value;
Yann 1:995212d326ca 277 if (p_mode == CDS130X_I2C::BigEndian) {
Yann 1:995212d326ca 278 g_myRTC.ReadMemory(p_address, (int *)&value);
Yann 1:995212d326ca 279 } else {
Yann 1:995212d326ca 280 g_myRTC.ReadMemory(p_address, (int *)&value, p_mode);
Yann 1:995212d326ca 281 }
Yann 1:995212d326ca 282 std::cout << "Integer at address 0x" << std::setw(2) << std::setfill('0') << std::ios::hex << p_address << " is: " << std::setw(8) << value << "\r" << std::endl;
Yann 1:995212d326ca 283 }
Yann 1:995212d326ca 284