This program is for mbed-Geiger counter system. It use OLED module, GPS module (with RTC), TextLCD, SD FileSystem and some Interrupt pin.
gpsrtc.cpp@0:97f8ed953c0d, 2011-07-02 (annotated)
- Committer:
- y_notsu
- Date:
- Sat Jul 02 22:05:27 2011 +0000
- Revision:
- 0:97f8ed953c0d
rev.0.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
y_notsu | 0:97f8ed953c0d | 1 | //========================================================= |
y_notsu | 0:97f8ed953c0d | 2 | // LPC1114 Project |
y_notsu | 0:97f8ed953c0d | 3 | //========================================================= |
y_notsu | 0:97f8ed953c0d | 4 | // File Name : gpsrtc.c |
y_notsu | 0:97f8ed953c0d | 5 | // Function : GPS&RTC Control |
y_notsu | 0:97f8ed953c0d | 6 | //--------------------------------------------------------- |
y_notsu | 0:97f8ed953c0d | 7 | // Rev.01 2010.08.29 Munetomo Maruyama |
y_notsu | 0:97f8ed953c0d | 8 | //--------------------------------------------------------- |
y_notsu | 0:97f8ed953c0d | 9 | // Copyright (C) 2010-2011 Munetomo Maruyama |
y_notsu | 0:97f8ed953c0d | 10 | //========================================================= |
y_notsu | 0:97f8ed953c0d | 11 | // ---- License Information ------------------------------- |
y_notsu | 0:97f8ed953c0d | 12 | // Anyone can FREELY use this code fully or partially |
y_notsu | 0:97f8ed953c0d | 13 | // under conditions shown below. |
y_notsu | 0:97f8ed953c0d | 14 | // 1. You may use this code only for individual purpose, |
y_notsu | 0:97f8ed953c0d | 15 | // and educational purpose. |
y_notsu | 0:97f8ed953c0d | 16 | // Do not use this code for business even if partially. |
y_notsu | 0:97f8ed953c0d | 17 | // 2. You should use this code under the GNU GPL. |
y_notsu | 0:97f8ed953c0d | 18 | // 3. You should remain this header text in your codes |
y_notsu | 0:97f8ed953c0d | 19 | // including Copyright credit and License Information. |
y_notsu | 0:97f8ed953c0d | 20 | // 4. Your codes should inherit this license information. |
y_notsu | 0:97f8ed953c0d | 21 | //========================================================= |
y_notsu | 0:97f8ed953c0d | 22 | // ---- Patent Notice ------------------------------------- |
y_notsu | 0:97f8ed953c0d | 23 | // I have not cared whether this system (hw + sw) causes |
y_notsu | 0:97f8ed953c0d | 24 | // infringement on the patent, copyright, trademark, |
y_notsu | 0:97f8ed953c0d | 25 | // or trade secret rights of others. You have all |
y_notsu | 0:97f8ed953c0d | 26 | // responsibilities for determining if your designs |
y_notsu | 0:97f8ed953c0d | 27 | // and products infringe on the intellectual property |
y_notsu | 0:97f8ed953c0d | 28 | // rights of others, when you use technical information |
y_notsu | 0:97f8ed953c0d | 29 | // included in this system for your business. |
y_notsu | 0:97f8ed953c0d | 30 | //========================================================= |
y_notsu | 0:97f8ed953c0d | 31 | // ---- Disclaimers --------------------------------------- |
y_notsu | 0:97f8ed953c0d | 32 | // The function and reliability of this system are not |
y_notsu | 0:97f8ed953c0d | 33 | // guaranteed. They may cause any damages to loss of |
y_notsu | 0:97f8ed953c0d | 34 | // properties, data, money, profits, life, or business. |
y_notsu | 0:97f8ed953c0d | 35 | // By adopting this system even partially, you assume |
y_notsu | 0:97f8ed953c0d | 36 | // all responsibility for its use. |
y_notsu | 0:97f8ed953c0d | 37 | //========================================================= |
y_notsu | 0:97f8ed953c0d | 38 | |
y_notsu | 0:97f8ed953c0d | 39 | //#ifdef __USE_CMSIS |
y_notsu | 0:97f8ed953c0d | 40 | //#include "LPC11xx.h" |
y_notsu | 0:97f8ed953c0d | 41 | //#endif |
y_notsu | 0:97f8ed953c0d | 42 | |
y_notsu | 0:97f8ed953c0d | 43 | //#include "gpio.h" |
y_notsu | 0:97f8ed953c0d | 44 | #include "gpsrtc.h" |
y_notsu | 0:97f8ed953c0d | 45 | //#include "i2c.h" |
y_notsu | 0:97f8ed953c0d | 46 | //#include "systick.h |
y_notsu | 0:97f8ed953c0d | 47 | #include "type.h" |
y_notsu | 0:97f8ed953c0d | 48 | //#include "uart.h" |
y_notsu | 0:97f8ed953c0d | 49 | //#include "utility.h" |
y_notsu | 0:97f8ed953c0d | 50 | #include "mbed.h" |
y_notsu | 0:97f8ed953c0d | 51 | |
y_notsu | 0:97f8ed953c0d | 52 | Serial device(p9,p10); //tx,rx |
y_notsu | 0:97f8ed953c0d | 53 | I2C i2c(p28,p27); //sda.scl |
y_notsu | 0:97f8ed953c0d | 54 | |
y_notsu | 0:97f8ed953c0d | 55 | //====================== |
y_notsu | 0:97f8ed953c0d | 56 | // Time Zone Difference |
y_notsu | 0:97f8ed953c0d | 57 | //====================== |
y_notsu | 0:97f8ed953c0d | 58 | #define TZD (+9) // Japan |
y_notsu | 0:97f8ed953c0d | 59 | |
y_notsu | 0:97f8ed953c0d | 60 | //==================== |
y_notsu | 0:97f8ed953c0d | 61 | // RTC Device Address |
y_notsu | 0:97f8ed953c0d | 62 | //==================== |
y_notsu | 0:97f8ed953c0d | 63 | #define RTC_DEV_ADDR 0xa2 |
y_notsu | 0:97f8ed953c0d | 64 | #define RTC_WADDR 0xa2 |
y_notsu | 0:97f8ed953c0d | 65 | #define RTC_RADDR 0xa3 |
y_notsu | 0:97f8ed953c0d | 66 | |
y_notsu | 0:97f8ed953c0d | 67 | //======================= |
y_notsu | 0:97f8ed953c0d | 68 | // RTC Register Address |
y_notsu | 0:97f8ed953c0d | 69 | //======================= |
y_notsu | 0:97f8ed953c0d | 70 | #define RTC_CONTROL1 0x00 |
y_notsu | 0:97f8ed953c0d | 71 | #define RTC_CONTROL2 0x01 |
y_notsu | 0:97f8ed953c0d | 72 | #define RTC_SECONDS 0x02 |
y_notsu | 0:97f8ed953c0d | 73 | #define RTC_MINUTES 0x03 |
y_notsu | 0:97f8ed953c0d | 74 | #define RTC_HOURS 0x04 |
y_notsu | 0:97f8ed953c0d | 75 | #define RTC_DAYS 0x05 |
y_notsu | 0:97f8ed953c0d | 76 | #define RTC_WEEKDAYS 0x06 |
y_notsu | 0:97f8ed953c0d | 77 | #define RTC_C_MONTHS 0x07 |
y_notsu | 0:97f8ed953c0d | 78 | #define RTC_YEARS 0x08 |
y_notsu | 0:97f8ed953c0d | 79 | #define RTC_MINUTE_ALARM 0x09 |
y_notsu | 0:97f8ed953c0d | 80 | #define RTC_HOUR_ALARM 0x0a |
y_notsu | 0:97f8ed953c0d | 81 | #define RTC_DAY_ALARM 0x0b |
y_notsu | 0:97f8ed953c0d | 82 | #define RTC_WEEKDAY_ALARM 0x0c |
y_notsu | 0:97f8ed953c0d | 83 | #define RTC_CLKOUT_FREQ 0x0d |
y_notsu | 0:97f8ed953c0d | 84 | #define RTC_TIMER_CONTROL 0x0e |
y_notsu | 0:97f8ed953c0d | 85 | #define RTC_TIMER 0x0f |
y_notsu | 0:97f8ed953c0d | 86 | |
y_notsu | 0:97f8ed953c0d | 87 | //============ |
y_notsu | 0:97f8ed953c0d | 88 | // Globals |
y_notsu | 0:97f8ed953c0d | 89 | //============ |
y_notsu | 0:97f8ed953c0d | 90 | extern volatile unsigned int I2CCount; |
y_notsu | 0:97f8ed953c0d | 91 | //extern volatile uint8_t I2CMasterBuffer[BUFSIZE]; |
y_notsu | 0:97f8ed953c0d | 92 | //extern volatile uint8_t I2CSlaveBuffer[BUFSIZE]; |
y_notsu | 0:97f8ed953c0d | 93 | extern volatile unsigned int I2CMasterState; |
y_notsu | 0:97f8ed953c0d | 94 | extern volatile unsigned int I2CReadLength, I2CWriteLength; |
y_notsu | 0:97f8ed953c0d | 95 | // |
y_notsu | 0:97f8ed953c0d | 96 | extern volatile unsigned int UARTCount; |
y_notsu | 0:97f8ed953c0d | 97 | |
y_notsu | 0:97f8ed953c0d | 98 | //======================== |
y_notsu | 0:97f8ed953c0d | 99 | // Get Number from GPS |
y_notsu | 0:97f8ed953c0d | 100 | //======================== |
y_notsu | 0:97f8ed953c0d | 101 | unsigned char* Get_Number_from_GPS(unsigned char *pStr, |
y_notsu | 0:97f8ed953c0d | 102 | signed int *pInteger, signed int *pIntrnd, signed int *pDecimal, unsigned int *pDeclen) |
y_notsu | 0:97f8ed953c0d | 103 | { |
y_notsu | 0:97f8ed953c0d | 104 | unsigned char ch; |
y_notsu | 0:97f8ed953c0d | 105 | signed int found_decimal; |
y_notsu | 0:97f8ed953c0d | 106 | signed int pol; |
y_notsu | 0:97f8ed953c0d | 107 | signed int decimal_1st; |
y_notsu | 0:97f8ed953c0d | 108 | |
y_notsu | 0:97f8ed953c0d | 109 | found_decimal = 0; |
y_notsu | 0:97f8ed953c0d | 110 | *pInteger = 0; |
y_notsu | 0:97f8ed953c0d | 111 | *pDecimal = 0; |
y_notsu | 0:97f8ed953c0d | 112 | *pDeclen = 0; |
y_notsu | 0:97f8ed953c0d | 113 | pol = 1; |
y_notsu | 0:97f8ed953c0d | 114 | while ((ch = *pStr++) != ',') |
y_notsu | 0:97f8ed953c0d | 115 | { |
y_notsu | 0:97f8ed953c0d | 116 | if (ch == '.') |
y_notsu | 0:97f8ed953c0d | 117 | { |
y_notsu | 0:97f8ed953c0d | 118 | found_decimal = 1; |
y_notsu | 0:97f8ed953c0d | 119 | } |
y_notsu | 0:97f8ed953c0d | 120 | else if (ch == '-') |
y_notsu | 0:97f8ed953c0d | 121 | { |
y_notsu | 0:97f8ed953c0d | 122 | pol = -1; |
y_notsu | 0:97f8ed953c0d | 123 | } |
y_notsu | 0:97f8ed953c0d | 124 | else |
y_notsu | 0:97f8ed953c0d | 125 | { |
y_notsu | 0:97f8ed953c0d | 126 | if (found_decimal == 0) |
y_notsu | 0:97f8ed953c0d | 127 | { |
y_notsu | 0:97f8ed953c0d | 128 | *pInteger = (*pInteger) * 10 + (ch - '0'); |
y_notsu | 0:97f8ed953c0d | 129 | } |
y_notsu | 0:97f8ed953c0d | 130 | else |
y_notsu | 0:97f8ed953c0d | 131 | { |
y_notsu | 0:97f8ed953c0d | 132 | *pDecimal = (*pDecimal) * 10 + (ch - '0'); |
y_notsu | 0:97f8ed953c0d | 133 | *pDeclen = *pDeclen + 1; |
y_notsu | 0:97f8ed953c0d | 134 | } |
y_notsu | 0:97f8ed953c0d | 135 | } |
y_notsu | 0:97f8ed953c0d | 136 | } |
y_notsu | 0:97f8ed953c0d | 137 | decimal_1st = (*pDeclen > 0)? *pDecimal / power(10, *pDeclen - 1) : 0; |
y_notsu | 0:97f8ed953c0d | 138 | *pIntrnd = (decimal_1st < 5)? *pInteger : *pInteger + 1; |
y_notsu | 0:97f8ed953c0d | 139 | // |
y_notsu | 0:97f8ed953c0d | 140 | *pInteger = *pInteger * pol; |
y_notsu | 0:97f8ed953c0d | 141 | *pIntrnd = *pIntrnd * pol; |
y_notsu | 0:97f8ed953c0d | 142 | *pDecimal = *pDecimal * pol; |
y_notsu | 0:97f8ed953c0d | 143 | return pStr; |
y_notsu | 0:97f8ed953c0d | 144 | } |
y_notsu | 0:97f8ed953c0d | 145 | |
y_notsu | 0:97f8ed953c0d | 146 | //=========================== |
y_notsu | 0:97f8ed953c0d | 147 | // Get_GPGGA Data from GPS |
y_notsu | 0:97f8ed953c0d | 148 | //=========================== |
y_notsu | 0:97f8ed953c0d | 149 | void Get_GPGGA_Data(sGPSRTC *pG) |
y_notsu | 0:97f8ed953c0d | 150 | { |
y_notsu | 0:97f8ed953c0d | 151 | unsigned char ch; |
y_notsu | 0:97f8ed953c0d | 152 | unsigned char str[256]; |
y_notsu | 0:97f8ed953c0d | 153 | unsigned char *pStr; |
y_notsu | 0:97f8ed953c0d | 154 | unsigned int quit = 0; |
y_notsu | 0:97f8ed953c0d | 155 | signed int integer; |
y_notsu | 0:97f8ed953c0d | 156 | signed int intrnd; |
y_notsu | 0:97f8ed953c0d | 157 | signed int decimal; |
y_notsu | 0:97f8ed953c0d | 158 | unsigned int declen; |
y_notsu | 0:97f8ed953c0d | 159 | device.baud(9600); |
y_notsu | 0:97f8ed953c0d | 160 | |
y_notsu | 0:97f8ed953c0d | 161 | //------------------------- |
y_notsu | 0:97f8ed953c0d | 162 | // Get String after $GPGGA |
y_notsu | 0:97f8ed953c0d | 163 | //------------------------- |
y_notsu | 0:97f8ed953c0d | 164 | while(quit == 0) |
y_notsu | 0:97f8ed953c0d | 165 | { |
y_notsu | 0:97f8ed953c0d | 166 | //-------------------------- |
y_notsu | 0:97f8ed953c0d | 167 | // Retry from 1st String |
y_notsu | 0:97f8ed953c0d | 168 | //-------------------------- |
y_notsu | 0:97f8ed953c0d | 169 | while(quit == 0) |
y_notsu | 0:97f8ed953c0d | 170 | { |
y_notsu | 0:97f8ed953c0d | 171 | //---------------- |
y_notsu | 0:97f8ed953c0d | 172 | // Check "$GPGGA," |
y_notsu | 0:97f8ed953c0d | 173 | //---------------- |
y_notsu | 0:97f8ed953c0d | 174 | if (device.getc() != '$') break; |
y_notsu | 0:97f8ed953c0d | 175 | if (device.getc() != 'G') break; |
y_notsu | 0:97f8ed953c0d | 176 | if (device.getc() != 'P') break; |
y_notsu | 0:97f8ed953c0d | 177 | if (device.getc() != 'G') break; |
y_notsu | 0:97f8ed953c0d | 178 | if (device.getc() != 'G') break; |
y_notsu | 0:97f8ed953c0d | 179 | if (device.getc() != 'A') break; |
y_notsu | 0:97f8ed953c0d | 180 | if (device.getc() != ',') break; |
y_notsu | 0:97f8ed953c0d | 181 | //----------------- |
y_notsu | 0:97f8ed953c0d | 182 | // Get String |
y_notsu | 0:97f8ed953c0d | 183 | //----------------- |
y_notsu | 0:97f8ed953c0d | 184 | pStr = str; |
y_notsu | 0:97f8ed953c0d | 185 | while ((ch = device.getc()) != '\r') // LF |
y_notsu | 0:97f8ed953c0d | 186 | { |
y_notsu | 0:97f8ed953c0d | 187 | *pStr++ = ch; |
y_notsu | 0:97f8ed953c0d | 188 | } |
y_notsu | 0:97f8ed953c0d | 189 | quit = 1; |
y_notsu | 0:97f8ed953c0d | 190 | } |
y_notsu | 0:97f8ed953c0d | 191 | } |
y_notsu | 0:97f8ed953c0d | 192 | pStr = str; |
y_notsu | 0:97f8ed953c0d | 193 | //------------- |
y_notsu | 0:97f8ed953c0d | 194 | // UTC |
y_notsu | 0:97f8ed953c0d | 195 | //------------- |
y_notsu | 0:97f8ed953c0d | 196 | pStr = Get_Number_from_GPS(pStr, &integer, &intrnd, &decimal, &declen); |
y_notsu | 0:97f8ed953c0d | 197 | pG->bGPS_UTC_hour = (unsigned char) (integer / 10000); |
y_notsu | 0:97f8ed953c0d | 198 | pG->bGPS_UTC_min = (unsigned char) ((integer % 10000) / 100); |
y_notsu | 0:97f8ed953c0d | 199 | pG->bGPS_UTC_sec = (unsigned char) (integer % 100); |
y_notsu | 0:97f8ed953c0d | 200 | //--------------- |
y_notsu | 0:97f8ed953c0d | 201 | // Latitude |
y_notsu | 0:97f8ed953c0d | 202 | //--------------- |
y_notsu | 0:97f8ed953c0d | 203 | pStr = Get_Number_from_GPS(pStr, &integer, &intrnd, &decimal, &declen); |
y_notsu | 0:97f8ed953c0d | 204 | pG->bGPS_LAT_deg = (unsigned char) (integer / 100); |
y_notsu | 0:97f8ed953c0d | 205 | pG->bGPS_LAT_min = (unsigned char) (integer % 100); |
y_notsu | 0:97f8ed953c0d | 206 | pG->bGPS_LAT_sec = (unsigned char) ((60 * decimal) / power(10, declen)); |
y_notsu | 0:97f8ed953c0d | 207 | pG->cGPS_LAT = (*pStr != ',')? *pStr++ : ' '; |
y_notsu | 0:97f8ed953c0d | 208 | ch = *pStr++; // ',' |
y_notsu | 0:97f8ed953c0d | 209 | //--------------- |
y_notsu | 0:97f8ed953c0d | 210 | // Longitude |
y_notsu | 0:97f8ed953c0d | 211 | //--------------- |
y_notsu | 0:97f8ed953c0d | 212 | pStr = Get_Number_from_GPS(pStr, &integer, &intrnd, &decimal, &declen); |
y_notsu | 0:97f8ed953c0d | 213 | pG->bGPS_LNG_deg = (unsigned char) (integer / 100); |
y_notsu | 0:97f8ed953c0d | 214 | pG->bGPS_LNG_min = (unsigned char) (integer % 100); |
y_notsu | 0:97f8ed953c0d | 215 | pG->bGPS_LNG_sec = (unsigned char) ((60 * decimal) / power(10, declen)); |
y_notsu | 0:97f8ed953c0d | 216 | pG->cGPS_LNG = (*pStr != ',')? *pStr++ : ' '; |
y_notsu | 0:97f8ed953c0d | 217 | ch = *pStr++; // ',' |
y_notsu | 0:97f8ed953c0d | 218 | //-------------- |
y_notsu | 0:97f8ed953c0d | 219 | // GPS Quality |
y_notsu | 0:97f8ed953c0d | 220 | //-------------- |
y_notsu | 0:97f8ed953c0d | 221 | pG->cGPS_Quality = *pStr++; |
y_notsu | 0:97f8ed953c0d | 222 | ch = *pStr++; // ',' |
y_notsu | 0:97f8ed953c0d | 223 | //----------------- |
y_notsu | 0:97f8ed953c0d | 224 | // Satellite Count |
y_notsu | 0:97f8ed953c0d | 225 | //----------------- |
y_notsu | 0:97f8ed953c0d | 226 | pStr = Get_Number_from_GPS(pStr, &integer, &intrnd, &decimal, &declen); |
y_notsu | 0:97f8ed953c0d | 227 | pG->bGPS_Sat = (unsigned char) integer; |
y_notsu | 0:97f8ed953c0d | 228 | //----------------- |
y_notsu | 0:97f8ed953c0d | 229 | // HDOP |
y_notsu | 0:97f8ed953c0d | 230 | //----------------- |
y_notsu | 0:97f8ed953c0d | 231 | pStr = Get_Number_from_GPS(pStr, &integer, &intrnd, &decimal, &declen); |
y_notsu | 0:97f8ed953c0d | 232 | pG->bGPS_HDOP_I = (unsigned char) integer; |
y_notsu | 0:97f8ed953c0d | 233 | pG->bGPS_HDOP_D = (unsigned char) ((decimal + power(10, declen) / 2) / power(10, declen)); |
y_notsu | 0:97f8ed953c0d | 234 | //------------------------- |
y_notsu | 0:97f8ed953c0d | 235 | // Altitude above Sea Level |
y_notsu | 0:97f8ed953c0d | 236 | //------------------------- |
y_notsu | 0:97f8ed953c0d | 237 | pStr = Get_Number_from_GPS(pStr, &integer, &intrnd, &decimal, &declen); |
y_notsu | 0:97f8ed953c0d | 238 | pG->wGPS_ASL_m = intrnd; |
y_notsu | 0:97f8ed953c0d | 239 | ch = *pStr++; // 'M' |
y_notsu | 0:97f8ed953c0d | 240 | ch = *pStr++; // ',' |
y_notsu | 0:97f8ed953c0d | 241 | //------------------------- |
y_notsu | 0:97f8ed953c0d | 242 | // Geoid Separation |
y_notsu | 0:97f8ed953c0d | 243 | //------------------------- |
y_notsu | 0:97f8ed953c0d | 244 | pStr = Get_Number_from_GPS(pStr, &integer, &intrnd, &decimal, &declen); |
y_notsu | 0:97f8ed953c0d | 245 | pG->wGPS_GEO_m = intrnd; |
y_notsu | 0:97f8ed953c0d | 246 | ch = *pStr++; // 'M' |
y_notsu | 0:97f8ed953c0d | 247 | ch = *pStr++; // ',' |
y_notsu | 0:97f8ed953c0d | 248 | } |
y_notsu | 0:97f8ed953c0d | 249 | |
y_notsu | 0:97f8ed953c0d | 250 | //================== |
y_notsu | 0:97f8ed953c0d | 251 | // Initialize RTC |
y_notsu | 0:97f8ed953c0d | 252 | //================== |
y_notsu | 0:97f8ed953c0d | 253 | void Init_RTC(unsigned int do_adj, unsigned char year, unsigned char month, unsigned char day, |
y_notsu | 0:97f8ed953c0d | 254 | unsigned char week, unsigned char hour, unsigned char minute, unsigned char second) |
y_notsu | 0:97f8ed953c0d | 255 | { |
y_notsu | 0:97f8ed953c0d | 256 | |
y_notsu | 0:97f8ed953c0d | 257 | wait(1); // wait 1000ms |
y_notsu | 0:97f8ed953c0d | 258 | // |
y_notsu | 0:97f8ed953c0d | 259 | RTC_Write_Reg(RTC_CONTROL1, 0x20); // STOP |
y_notsu | 0:97f8ed953c0d | 260 | RTC_Write_Reg(RTC_CONTROL2, 0x00); |
y_notsu | 0:97f8ed953c0d | 261 | // |
y_notsu | 0:97f8ed953c0d | 262 | RTC_Write_Reg(RTC_HOURS, BCD_INT(hour)); |
y_notsu | 0:97f8ed953c0d | 263 | RTC_Write_Reg(RTC_MINUTES, BCD_INT(minute)); |
y_notsu | 0:97f8ed953c0d | 264 | RTC_Write_Reg(RTC_SECONDS, BCD_INT(second)); |
y_notsu | 0:97f8ed953c0d | 265 | // |
y_notsu | 0:97f8ed953c0d | 266 | RTC_Write_Reg(RTC_YEARS, BCD_INT(year)); |
y_notsu | 0:97f8ed953c0d | 267 | RTC_Write_Reg(RTC_C_MONTHS, BCD_INT(month)); |
y_notsu | 0:97f8ed953c0d | 268 | RTC_Write_Reg(RTC_DAYS, BCD_INT(day)); |
y_notsu | 0:97f8ed953c0d | 269 | RTC_Write_Reg(RTC_WEEKDAYS, BCD_INT(week)); |
y_notsu | 0:97f8ed953c0d | 270 | // |
y_notsu | 0:97f8ed953c0d | 271 | RTC_Write_Reg(RTC_MINUTE_ALARM, 0x00); |
y_notsu | 0:97f8ed953c0d | 272 | RTC_Write_Reg(RTC_HOUR_ALARM, 0x00); |
y_notsu | 0:97f8ed953c0d | 273 | RTC_Write_Reg(RTC_DAY_ALARM, 0x00); |
y_notsu | 0:97f8ed953c0d | 274 | RTC_Write_Reg(RTC_WEEKDAY_ALARM, 0x00); |
y_notsu | 0:97f8ed953c0d | 275 | // |
y_notsu | 0:97f8ed953c0d | 276 | RTC_Write_Reg(RTC_CLKOUT_FREQ, 0x00); |
y_notsu | 0:97f8ed953c0d | 277 | RTC_Write_Reg(RTC_TIMER_CONTROL,0x00); |
y_notsu | 0:97f8ed953c0d | 278 | RTC_Write_Reg(RTC_TIMER, 0x00); |
y_notsu | 0:97f8ed953c0d | 279 | // |
y_notsu | 0:97f8ed953c0d | 280 | RTC_Write_Reg(RTC_CONTROL1, 0x00); // START |
y_notsu | 0:97f8ed953c0d | 281 | } |
y_notsu | 0:97f8ed953c0d | 282 | |
y_notsu | 0:97f8ed953c0d | 283 | //==================== |
y_notsu | 0:97f8ed953c0d | 284 | // Get RTC Data |
y_notsu | 0:97f8ed953c0d | 285 | //==================== |
y_notsu | 0:97f8ed953c0d | 286 | void Get_RTC_Data(sGPSRTC *psGPSRTC) |
y_notsu | 0:97f8ed953c0d | 287 | { |
y_notsu | 0:97f8ed953c0d | 288 | psGPSRTC->bRTC_year = INT_BCD(RTC_Read_Reg(RTC_YEARS)); |
y_notsu | 0:97f8ed953c0d | 289 | psGPSRTC->bRTC_mon = INT_BCD(RTC_Read_Reg(RTC_C_MONTHS) & 0x1f); |
y_notsu | 0:97f8ed953c0d | 290 | psGPSRTC->bRTC_day = INT_BCD(RTC_Read_Reg(RTC_DAYS) & 0x3f); |
y_notsu | 0:97f8ed953c0d | 291 | psGPSRTC->bRTC_week = RTC_Read_Reg(RTC_WEEKDAYS) & 0x07; |
y_notsu | 0:97f8ed953c0d | 292 | psGPSRTC->bRTC_hour = INT_BCD(RTC_Read_Reg(RTC_HOURS) & 0x3f); |
y_notsu | 0:97f8ed953c0d | 293 | psGPSRTC->bRTC_min = INT_BCD(RTC_Read_Reg(RTC_MINUTES) & 0x7f); |
y_notsu | 0:97f8ed953c0d | 294 | psGPSRTC->bRTC_sec = INT_BCD(RTC_Read_Reg(RTC_SECONDS) & 0x7f); |
y_notsu | 0:97f8ed953c0d | 295 | } |
y_notsu | 0:97f8ed953c0d | 296 | |
y_notsu | 0:97f8ed953c0d | 297 | //=================== |
y_notsu | 0:97f8ed953c0d | 298 | // Get Week String |
y_notsu | 0:97f8ed953c0d | 299 | //=================== |
y_notsu | 0:97f8ed953c0d | 300 | unsigned char *Get_Week_String(unsigned int week) |
y_notsu | 0:97f8ed953c0d | 301 | { |
y_notsu | 0:97f8ed953c0d | 302 | static const char *WEEK[] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"}; |
y_notsu | 0:97f8ed953c0d | 303 | |
y_notsu | 0:97f8ed953c0d | 304 | return (unsigned char*) WEEK[week]; |
y_notsu | 0:97f8ed953c0d | 305 | } |
y_notsu | 0:97f8ed953c0d | 306 | |
y_notsu | 0:97f8ed953c0d | 307 | //===================== |
y_notsu | 0:97f8ed953c0d | 308 | // RTC Write Register |
y_notsu | 0:97f8ed953c0d | 309 | //===================== |
y_notsu | 0:97f8ed953c0d | 310 | void RTC_Write_Reg(unsigned int addr, unsigned int data) |
y_notsu | 0:97f8ed953c0d | 311 | { |
y_notsu | 0:97f8ed953c0d | 312 | char cmd[2]; |
y_notsu | 0:97f8ed953c0d | 313 | cmd[0]=addr; |
y_notsu | 0:97f8ed953c0d | 314 | cmd[1]=data; |
y_notsu | 0:97f8ed953c0d | 315 | const int addrw=0xA2; |
y_notsu | 0:97f8ed953c0d | 316 | i2c.write(addrw,cmd,2); |
y_notsu | 0:97f8ed953c0d | 317 | } |
y_notsu | 0:97f8ed953c0d | 318 | |
y_notsu | 0:97f8ed953c0d | 319 | //==================== |
y_notsu | 0:97f8ed953c0d | 320 | // RTC Read Register |
y_notsu | 0:97f8ed953c0d | 321 | //==================== |
y_notsu | 0:97f8ed953c0d | 322 | unsigned int RTC_Read_Reg(unsigned int addr) |
y_notsu | 0:97f8ed953c0d | 323 | { |
y_notsu | 0:97f8ed953c0d | 324 | char read_buf[2]; |
y_notsu | 0:97f8ed953c0d | 325 | const int addrw=0xa2; |
y_notsu | 0:97f8ed953c0d | 326 | const int addrr=0xa3; |
y_notsu | 0:97f8ed953c0d | 327 | char write_cmd[1]; |
y_notsu | 0:97f8ed953c0d | 328 | write_cmd[0]=char(addr); |
y_notsu | 0:97f8ed953c0d | 329 | i2c.write(addrw,write_cmd,1); |
y_notsu | 0:97f8ed953c0d | 330 | wait(0.01); |
y_notsu | 0:97f8ed953c0d | 331 | i2c.read(addrr,read_buf,1); |
y_notsu | 0:97f8ed953c0d | 332 | // |
y_notsu | 0:97f8ed953c0d | 333 | return read_buf[0]; |
y_notsu | 0:97f8ed953c0d | 334 | } |
y_notsu | 0:97f8ed953c0d | 335 | |
y_notsu | 0:97f8ed953c0d | 336 | //===================== |
y_notsu | 0:97f8ed953c0d | 337 | // BCD from Integer |
y_notsu | 0:97f8ed953c0d | 338 | //===================== |
y_notsu | 0:97f8ed953c0d | 339 | unsigned char BCD_INT(unsigned char num) |
y_notsu | 0:97f8ed953c0d | 340 | { |
y_notsu | 0:97f8ed953c0d | 341 | return ((num / 10) << 4) + (num % 10); |
y_notsu | 0:97f8ed953c0d | 342 | } |
y_notsu | 0:97f8ed953c0d | 343 | |
y_notsu | 0:97f8ed953c0d | 344 | //======================== |
y_notsu | 0:97f8ed953c0d | 345 | // Calculate x^n |
y_notsu | 0:97f8ed953c0d | 346 | //======================== |
y_notsu | 0:97f8ed953c0d | 347 | signed int power(signed int x, signed int n) |
y_notsu | 0:97f8ed953c0d | 348 | { |
y_notsu | 0:97f8ed953c0d | 349 | unsigned int i; |
y_notsu | 0:97f8ed953c0d | 350 | signed int y; |
y_notsu | 0:97f8ed953c0d | 351 | |
y_notsu | 0:97f8ed953c0d | 352 | y = 1; |
y_notsu | 0:97f8ed953c0d | 353 | for (i = 0; i < n; i++) |
y_notsu | 0:97f8ed953c0d | 354 | { |
y_notsu | 0:97f8ed953c0d | 355 | y = y * x; |
y_notsu | 0:97f8ed953c0d | 356 | } |
y_notsu | 0:97f8ed953c0d | 357 | return y; |
y_notsu | 0:97f8ed953c0d | 358 | } |
y_notsu | 0:97f8ed953c0d | 359 | |
y_notsu | 0:97f8ed953c0d | 360 | //===================== |
y_notsu | 0:97f8ed953c0d | 361 | // Integer from BCD |
y_notsu | 0:97f8ed953c0d | 362 | //===================== |
y_notsu | 0:97f8ed953c0d | 363 | unsigned char INT_BCD(unsigned char bcd) |
y_notsu | 0:97f8ed953c0d | 364 | { |
y_notsu | 0:97f8ed953c0d | 365 | return (((bcd >> 4) * 10) + (bcd & 0x0f)); |
y_notsu | 0:97f8ed953c0d | 366 | } |
y_notsu | 0:97f8ed953c0d | 367 | |
y_notsu | 0:97f8ed953c0d | 368 | //========================================================= |
y_notsu | 0:97f8ed953c0d | 369 | // End of Program |
y_notsu | 0:97f8ed953c0d | 370 | //========================================================= |