Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MMA8451Q TSI mbed
Fork of KL25Z-rtc_i2c-100 by
main.cpp@0:20719c1a48f7, 2014-03-03 (annotated)
- Committer:
- loopsva
- Date:
- Mon Mar 03 17:19:46 2014 +0000
- Revision:
- 0:20719c1a48f7
- Child:
- 1:c9bed9dbeed5
Sample test code for KL25Z RTC and I2C issues
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| loopsva | 0:20719c1a48f7 | 1 | #include "mbed.h" | 
| loopsva | 0:20719c1a48f7 | 2 | #include "TSISensor.h" //touch sensor | 
| loopsva | 0:20719c1a48f7 | 3 | #include "MMA8451Q.h" //accelerometer | 
| loopsva | 0:20719c1a48f7 | 4 | |
| loopsva | 0:20719c1a48f7 | 5 | int revision = 100; | 
| loopsva | 0:20719c1a48f7 | 6 | |
| loopsva | 0:20719c1a48f7 | 7 | Serial pc(USBTX, USBRX); //tx, rx | 
| loopsva | 0:20719c1a48f7 | 8 | |
| loopsva | 0:20719c1a48f7 | 9 | MMA8451Q acc(PTE25, PTE24, 0x3a); //accelerometer | 
| loopsva | 0:20719c1a48f7 | 10 | I2C i2c0(PTE0, PTE1); //i2c bus 0 | 
| loopsva | 0:20719c1a48f7 | 11 | I2C i2c1(PTE25, PTE24); //i2c bus 1 | 
| loopsva | 0:20719c1a48f7 | 12 | |
| loopsva | 0:20719c1a48f7 | 13 | #define LED_ON 0 | 
| loopsva | 0:20719c1a48f7 | 14 | #define LED_OFF 1 | 
| loopsva | 0:20719c1a48f7 | 15 | DigitalOut rled(LED_RED); //KL25Z red led | 
| loopsva | 0:20719c1a48f7 | 16 | DigitalOut gled(LED_GREEN); //KL25Z green led | 
| loopsva | 0:20719c1a48f7 | 17 | // DO NOT Use LED_BLUE - pin PTD1 already in use by WiFi chip | 
| loopsva | 0:20719c1a48f7 | 18 | |
| loopsva | 0:20719c1a48f7 | 19 | int gDebug = 1; //global debug print flag | 
| loopsva | 0:20719c1a48f7 | 20 | |
| loopsva | 0:20719c1a48f7 | 21 | //--------------------------------------------------------------------------------------------------------------------------------------// | 
| loopsva | 0:20719c1a48f7 | 22 | //RTC specific variables and constants | 
| loopsva | 0:20719c1a48f7 | 23 | |
| loopsva | 0:20719c1a48f7 | 24 | #define TBUFLEN 10 //size of smaller ascii time buffers | 
| loopsva | 0:20719c1a48f7 | 25 | time_t ctTime; //time structure | 
| loopsva | 0:20719c1a48f7 | 26 | int DST = 0; //Daylight Saving Time (or as defined in .ini file) | 
| loopsva | 0:20719c1a48f7 | 27 | int TZone = -8; //Time Zone from UTC (or as defined in .ini file) | 
| loopsva | 0:20719c1a48f7 | 28 | int NTPUpdateValue = 7200 ;//86400; //every 2 hours, this KL25Z has a FAST RTC //update RTC every 24 hours (or as defined in .ini file) | 
| loopsva | 0:20719c1a48f7 | 29 | char timebuf_hm[TBUFLEN]; //local time format buffer - 21:16 | 
| loopsva | 0:20719c1a48f7 | 30 | char timebuf_hms[TBUFLEN]; //local time format buffer - 21:16:43 | 
| loopsva | 0:20719c1a48f7 | 31 | char timebuf_mdy[TBUFLEN]; //local time format buffer - 04/01/14 | 
| loopsva | 0:20719c1a48f7 | 32 | char timebuf_dMyy[TBUFLEN + 4]; //local time format buffer - 01-Apr-2014 | 
| loopsva | 0:20719c1a48f7 | 33 | |
| loopsva | 0:20719c1a48f7 | 34 | int BootTime = 0; //RTC at boot up | 
| loopsva | 0:20719c1a48f7 | 35 | int StartTime = 0; //time we powered up | 
| loopsva | 0:20719c1a48f7 | 36 | int SysUpTime = 0; //time we've been alive | 
| loopsva | 0:20719c1a48f7 | 37 | int EventTime = 0; //for 143 debug, next time to save data in EVENTS.CSV | 
| loopsva | 0:20719c1a48f7 | 38 | int RTCupdate = 0; //time until next NTP update timer | 
| loopsva | 0:20719c1a48f7 | 39 | |
| loopsva | 0:20719c1a48f7 | 40 | //--------------------------------------------------------------------------------------------------------------------------------------// | 
| loopsva | 0:20719c1a48f7 | 41 | // Print build date / time Note: display is UTC, not local time | 
| loopsva | 0:20719c1a48f7 | 42 | // Adafruit CC3000 WiFi Shield with uFL Connector for Ext Antenna | 
| loopsva | 0:20719c1a48f7 | 43 | // http://www.adafruit.com/products/1534 | 
| loopsva | 0:20719c1a48f7 | 44 | |
| loopsva | 0:20719c1a48f7 | 45 | void printBuildDate() { | 
| loopsva | 0:20719c1a48f7 | 46 | pc.printf("KL25Z / WWVB Tests v%d build: " __DATE__ " " __TIME__ "(UTC) K Braun\n", revision); | 
| loopsva | 0:20719c1a48f7 | 47 | } | 
| loopsva | 0:20719c1a48f7 | 48 | |
| loopsva | 0:20719c1a48f7 | 49 | //--------------------------------------------------------------------------------------------------------------------------------------// | 
| loopsva | 0:20719c1a48f7 | 50 | // initial splash display | 
| loopsva | 0:20719c1a48f7 | 51 | |
| loopsva | 0:20719c1a48f7 | 52 | void initSplash() { | 
| loopsva | 0:20719c1a48f7 | 53 | pc.printf("\n\n"); | 
| loopsva | 0:20719c1a48f7 | 54 | pc.printf("-------------------------------------------------------------------\n"); | 
| loopsva | 0:20719c1a48f7 | 55 | printBuildDate(); | 
| loopsva | 0:20719c1a48f7 | 56 | } | 
| loopsva | 0:20719c1a48f7 | 57 | |
| loopsva | 0:20719c1a48f7 | 58 | //--------------------------------------------------------------------------------------------------------------------------------------// | 
| loopsva | 0:20719c1a48f7 | 59 | //Detect I2C device chain | 
| loopsva | 0:20719c1a48f7 | 60 | |
| loopsva | 0:20719c1a48f7 | 61 | extern I2C i2c0; | 
| loopsva | 0:20719c1a48f7 | 62 | extern I2C i2c1; | 
| loopsva | 0:20719c1a48f7 | 63 | |
| loopsva | 0:20719c1a48f7 | 64 | int dispI2C(int i2cchain) { | 
| loopsva | 0:20719c1a48f7 | 65 | int count = 0; | 
| loopsva | 0:20719c1a48f7 | 66 | for (int address = 2; address < 256; address +=2) { | 
| loopsva | 0:20719c1a48f7 | 67 | if(((i2cchain == 0) && (!i2c0.write(address, NULL, 0))) || ((i2cchain == 1) && (!i2c1.write(address, NULL, 0)))) { | 
| loopsva | 0:20719c1a48f7 | 68 | wait_us(50); | 
| loopsva | 0:20719c1a48f7 | 69 | pc.printf(" - i2c chain %d: device found at address 0x%02X \n", i2cchain, address); | 
| loopsva | 0:20719c1a48f7 | 70 | count++; | 
| loopsva | 0:20719c1a48f7 | 71 | } | 
| loopsva | 0:20719c1a48f7 | 72 | } | 
| loopsva | 0:20719c1a48f7 | 73 | return(count); | 
| loopsva | 0:20719c1a48f7 | 74 | } | 
| loopsva | 0:20719c1a48f7 | 75 | //--------------------------------------------------------------------------------------------------------------------------------------// | 
| loopsva | 0:20719c1a48f7 | 76 | //Detect I2C device chain | 
| loopsva | 0:20719c1a48f7 | 77 | |
| loopsva | 0:20719c1a48f7 | 78 | void find_i2c(int i2cbus) { | 
| loopsva | 0:20719c1a48f7 | 79 | pc.printf("Searching for devices on i2c bus %d ...\n", i2cbus); | 
| loopsva | 0:20719c1a48f7 | 80 | int count = dispI2C(i2cbus); | 
| loopsva | 0:20719c1a48f7 | 81 | pc.printf(" - %2d devices found on i2c bus %d\n", count, i2cbus); | 
| loopsva | 0:20719c1a48f7 | 82 | } | 
| loopsva | 0:20719c1a48f7 | 83 | |
| loopsva | 0:20719c1a48f7 | 84 | //--------------------------------------------------------------------------------------------------------------------------------------// | 
| loopsva | 0:20719c1a48f7 | 85 | // Update time | 
| loopsva | 0:20719c1a48f7 | 86 | |
| loopsva | 0:20719c1a48f7 | 87 | void UpdateTime() { | 
| loopsva | 0:20719c1a48f7 | 88 | ctTime = time(NULL) + ((TZone + DST) * 3600); //timezone and dst offsets | 
| loopsva | 0:20719c1a48f7 | 89 | SysUpTime = ctTime - StartTime; | 
| loopsva | 0:20719c1a48f7 | 90 | strftime(timebuf_mdy, TBUFLEN, "%m/%d/%y", localtime(&ctTime)); | 
| loopsva | 0:20719c1a48f7 | 91 | strftime(timebuf_dMyy, TBUFLEN * 2, "%d-%b-%Y", localtime(&ctTime)); | 
| loopsva | 0:20719c1a48f7 | 92 | strftime(timebuf_hm, TBUFLEN, "%H:%M", localtime(&ctTime)); | 
| loopsva | 0:20719c1a48f7 | 93 | strftime(timebuf_hms, TBUFLEN, "%H:%M:%S", localtime(&ctTime)); | 
| loopsva | 0:20719c1a48f7 | 94 | } | 
| loopsva | 0:20719c1a48f7 | 95 | |
| loopsva | 0:20719c1a48f7 | 96 | |
| loopsva | 0:20719c1a48f7 | 97 | //--------------------------------------------------------------------------------------------------------------------------------------// | 
| loopsva | 0:20719c1a48f7 | 98 | //general housekeeping items whilw waiting in loops | 
| loopsva | 0:20719c1a48f7 | 99 | |
| loopsva | 0:20719c1a48f7 | 100 | void HouseKeeping() { | 
| loopsva | 0:20719c1a48f7 | 101 | UpdateTime(); | 
| loopsva | 0:20719c1a48f7 | 102 | } | 
| loopsva | 0:20719c1a48f7 | 103 | |
| loopsva | 0:20719c1a48f7 | 104 | //--------------------------------------------------------------------------------------------------------------------------------------// | 
| loopsva | 0:20719c1a48f7 | 105 | //--------------------------------------------------------------------------------------------------------------------------------------// | 
| loopsva | 0:20719c1a48f7 | 106 | // * \brief HTTP client demo | 
| loopsva | 0:20719c1a48f7 | 107 | // * \param none | 
| loopsva | 0:20719c1a48f7 | 108 | // * \return int | 
| loopsva | 0:20719c1a48f7 | 109 | |
| loopsva | 0:20719c1a48f7 | 110 | int main() { | 
| loopsva | 0:20719c1a48f7 | 111 | rled = LED_OFF; | 
| loopsva | 0:20719c1a48f7 | 112 | gled = LED_OFF; | 
| loopsva | 0:20719c1a48f7 | 113 | ctTime = time(NULL); | 
| loopsva | 0:20719c1a48f7 | 114 | StartTime = ctTime; //get time we started up | 
| loopsva | 0:20719c1a48f7 | 115 | BootTime = ctTime; //save boot time for later (RTC debug) | 
| loopsva | 0:20719c1a48f7 | 116 | |
| loopsva | 0:20719c1a48f7 | 117 | pc.baud(230400); | 
| loopsva | 0:20719c1a48f7 | 118 | initSplash(); | 
| loopsva | 0:20719c1a48f7 | 119 | |
| loopsva | 0:20719c1a48f7 | 120 | //who caused the reset condition?? | 
| loopsva | 0:20719c1a48f7 | 121 | uint16_t resetReg = (RCM->SRS1 << 8) | RCM->SRS0; | 
| loopsva | 0:20719c1a48f7 | 122 | pc.printf("CPU Reset Source> 1: 0x%02x 0: 0x%02x\r\n", resetReg >> 8, resetReg & 255); | 
| loopsva | 0:20719c1a48f7 | 123 | |
| loopsva | 0:20719c1a48f7 | 124 | //initialize the USB serial port interrupt and thread pointer | 
| loopsva | 0:20719c1a48f7 | 125 | pc.printf("Initializing Serial Port Rx Interrupt... \r\n"); | 
| loopsva | 0:20719c1a48f7 | 126 | |
| loopsva | 0:20719c1a48f7 | 127 | //look for devices on i2c buses | 
| loopsva | 0:20719c1a48f7 | 128 | find_i2c(0); | 
| loopsva | 0:20719c1a48f7 | 129 | find_i2c(1); | 
| loopsva | 0:20719c1a48f7 | 130 | //enMMA8491 = 0; | 
| loopsva | 0:20719c1a48f7 | 131 | //get kl25z chip serial number and configuration ID registers | 
| loopsva | 0:20719c1a48f7 | 132 | uint32_t idRegH = SIM->UIDMH; | 
| loopsva | 0:20719c1a48f7 | 133 | uint32_t idRegM = SIM->UIDML; | 
| loopsva | 0:20719c1a48f7 | 134 | uint32_t idRegL = SIM->UIDL; | 
| loopsva | 0:20719c1a48f7 | 135 | pc.printf("KL25Z id: 0x%04x %08x %08x\r\n", idRegH, idRegM, idRegL); | 
| loopsva | 0:20719c1a48f7 | 136 | uint32_t isSDIR = SIM->SDID; | 
| loopsva | 0:20719c1a48f7 | 137 | if(gDebug > 1) pc.printf("CPU type: 0x%08x\r\n Family: %x\r\n SubFamily: %x\r\n Series: %x\r\n SRAM Size: %x\r\n Revision: %x\r\n Die: %02x\r\n Package: %x\r\n", | 
| loopsva | 0:20719c1a48f7 | 138 | isSDIR, isSDIR >> 28, (isSDIR >> 24) & 15, (isSDIR >> 20) & 15, (isSDIR >> 16) & 15, (isSDIR >> 12) & 15, (isSDIR >> 7) & 0x3f, (isSDIR >> 0) & 15); | 
| loopsva | 0:20719c1a48f7 | 139 | uint32_t isFCFG = SIM->FCFG1; | 
| loopsva | 0:20719c1a48f7 | 140 | if(gDebug > 1) pc.printf("Flash size: 0x%08x\r\n Size: %x\r\n", isFCFG, (isFCFG >> 24) & 15); | 
| loopsva | 0:20719c1a48f7 | 141 | |
| loopsva | 0:20719c1a48f7 | 142 | |
| loopsva | 0:20719c1a48f7 | 143 | //check to see if the RTC is operational. | 
| loopsva | 0:20719c1a48f7 | 144 | //NOTE: bootloader must be MBED, not FRDMKL25Z. Otherwise pin PTC1 (J10-12) will not have a clock signal for the RTC | 
| loopsva | 0:20719c1a48f7 | 145 | if(gDebug) pc.printf("Checking the RTC... "); | 
| loopsva | 0:20719c1a48f7 | 146 | wait_ms(1500); | 
| loopsva | 0:20719c1a48f7 | 147 | ctTime = time(NULL); | 
| loopsva | 0:20719c1a48f7 | 148 | if(gDebug) pc.printf("ctTime: %d StartTime: %d\r\n", ctTime, StartTime); | 
| loopsva | 0:20719c1a48f7 | 149 | if((StartTime == ctTime) || (ctTime <= 1000000)) { | 
| loopsva | 0:20719c1a48f7 | 150 | pc.printf("*** Local RTC stopped, initializing the RTC. !!CHECK BATTERY!!\r\n"); | 
| loopsva | 0:20719c1a48f7 | 151 | pc.printf("*** Note: Time is incorrect, needs to be updated!!!\r\n"); | 
| loopsva | 0:20719c1a48f7 | 152 | set_time(1357000000); //set time to something close, Jan01 2013 00:26:40, but still way off | 
| loopsva | 0:20719c1a48f7 | 153 | } else { | 
| loopsva | 0:20719c1a48f7 | 154 | if(gDebug) pc.printf("Local RTC is running\r\n"); | 
| loopsva | 0:20719c1a48f7 | 155 | } | 
| loopsva | 0:20719c1a48f7 | 156 | UpdateTime(); | 
| loopsva | 0:20719c1a48f7 | 157 | StartTime = ctTime; | 
| loopsva | 0:20719c1a48f7 | 158 | if(gDebug) pc.printf("Date: %s ", timebuf_dMyy); | 
| loopsva | 0:20719c1a48f7 | 159 | if(gDebug) pc.printf("Time: %s \n", timebuf_hms); | 
| loopsva | 0:20719c1a48f7 | 160 | |
| loopsva | 0:20719c1a48f7 | 161 | //set up the cc3000 paramaters | 
| loopsva | 0:20719c1a48f7 | 162 | TSISensor touchSensor; | 
| loopsva | 0:20719c1a48f7 | 163 | |
| loopsva | 0:20719c1a48f7 | 164 | float accels[3]; | 
| loopsva | 0:20719c1a48f7 | 165 | float resting,reading; | 
| loopsva | 0:20719c1a48f7 | 166 | float THRESHOLD = 0.15; | 
| loopsva | 0:20719c1a48f7 | 167 | float position; | 
| loopsva | 0:20719c1a48f7 | 168 | |
| loopsva | 0:20719c1a48f7 | 169 | wait_ms(500); | 
| loopsva | 0:20719c1a48f7 | 170 | acc.getAccAllAxis( accels ); | 
| loopsva | 0:20719c1a48f7 | 171 | resting = abs(accels[0]) + abs(accels[1]) + abs(accels[2]); | 
| loopsva | 0:20719c1a48f7 | 172 | pc.printf("Set up resting accelerometer - %.2f\r\n", resting); | 
| loopsva | 0:20719c1a48f7 | 173 | wait_ms(100); | 
| loopsva | 0:20719c1a48f7 | 174 | rled = LED_OFF; | 
| loopsva | 0:20719c1a48f7 | 175 | gled = LED_OFF; | 
| loopsva | 0:20719c1a48f7 | 176 | pc.printf("Ready\r\n"); | 
| loopsva | 0:20719c1a48f7 | 177 | int bumps = 0; | 
| loopsva | 0:20719c1a48f7 | 178 | while(1) { | 
| loopsva | 0:20719c1a48f7 | 179 | HouseKeeping(); | 
| loopsva | 0:20719c1a48f7 | 180 | acc.getAccAllAxis( accels ); | 
| loopsva | 0:20719c1a48f7 | 181 | reading = abs(accels[0]) + abs(accels[1]) + abs(accels[2]); | 
| loopsva | 0:20719c1a48f7 | 182 | if (abs(resting - reading) > THRESHOLD ){ | 
| loopsva | 0:20719c1a48f7 | 183 | rled = LED_ON; | 
| loopsva | 0:20719c1a48f7 | 184 | gled = LED_ON; | 
| loopsva | 0:20719c1a48f7 | 185 | wait_ms(100); | 
| loopsva | 0:20719c1a48f7 | 186 | bumps++; | 
| loopsva | 0:20719c1a48f7 | 187 | position = touchSensor.readPercentage(); | 
| loopsva | 0:20719c1a48f7 | 188 | //pc.printf( "BUMPED %d times, resting %.2f read %.2f position %.2f \r\n", bumps, resting, reading, position ); | 
| loopsva | 0:20719c1a48f7 | 189 | //pc.printf("Date: %s ", timebuf_dMyy); | 
| loopsva | 0:20719c1a48f7 | 190 | //pc.printf("Time: %s \n", timebuf_hms); | 
| loopsva | 0:20719c1a48f7 | 191 | rled = LED_OFF; | 
| loopsva | 0:20719c1a48f7 | 192 | wait_ms(200); | 
| loopsva | 0:20719c1a48f7 | 193 | gled = LED_OFF; | 
| loopsva | 0:20719c1a48f7 | 194 | wait_ms(200); | 
| loopsva | 0:20719c1a48f7 | 195 | } | 
| loopsva | 0:20719c1a48f7 | 196 | |
| loopsva | 0:20719c1a48f7 | 197 | } | 
| loopsva | 0:20719c1a48f7 | 198 | |
| loopsva | 0:20719c1a48f7 | 199 | } | 
| loopsva | 0:20719c1a48f7 | 200 | 
