This program is for mbed-Geiger counter system. It use OLED module, GPS module (with RTC), TextLCD, SD FileSystem and some Interrupt pin.

Dependencies:   TextLCD mbed

Committer:
y_notsu
Date:
Sat Jul 02 22:05:27 2011 +0000
Revision:
0:97f8ed953c0d
rev.0.0

Who changed what in which revision?

UserRevisionLine numberNew 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 //=========================================================