Midterm

Dependencies:   MMA8451Q8b SLCD mbed

Fork of KL46z_double_tap_2017 by Mark Turner

Committer:
kennylujan42
Date:
Wed Mar 15 09:41:20 2017 +0000
Revision:
14:ca20f659409a
Parent:
13:254e382efeab
KLUJA-SSD447-Midtermpt2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
scohennm 11:c842619c49a1 1 #include "mbed.h"
scohennm 11:c842619c49a1 2 #include "MMA8451Q8g.h"
scohennm 11:c842619c49a1 3 #include "SLCD.h"
kennylujan42 14:ca20f659409a 4
scohennm 12:4774c4fc718e 5 #define BLINKTIME 1.5
scohennm 11:c842619c49a1 6 #define RELAYON 0
scohennm 11:c842619c49a1 7 #define RELAYOFF 1
scohennm 11:c842619c49a1 8 #define LEDDELAY 0.4
scohennm 11:c842619c49a1 9 #define WAITDELAY 0.7
scohennm 11:c842619c49a1 10 #define LCDLEN 10
kennylujan42 14:ca20f659409a 11
scohennm 11:c842619c49a1 12 #define REG_WHO_AM_I 0x0D
scohennm 11:c842619c49a1 13 #define XYZ_DATA_CFG 0x0E
kennylujan42 14:ca20f659409a 14
scohennm 11:c842619c49a1 15 #define REG_OUT_X_MSB 0x01
scohennm 11:c842619c49a1 16 #define REG_OUT_Y_MSB 0x03
scohennm 11:c842619c49a1 17 #define REG_OUT_Z_MSB 0x05
scohennm 11:c842619c49a1 18 #define REG_PULSE_CFG 0x21
scohennm 11:c842619c49a1 19 #define REG_PULSE_SRC 0x22
scohennm 11:c842619c49a1 20 #define REG_PULSE_THSZ 0x25
scohennm 11:c842619c49a1 21 #define REH_PULSE_TMLT 0x26
scohennm 11:c842619c49a1 22 #define REG_CTRL_4 0x2D
scohennm 11:c842619c49a1 23 #define REG_CTRL_5 0x2E
kennylujan42 14:ca20f659409a 24
scohennm 11:c842619c49a1 25 #define MAX_2G 0x00
scohennm 11:c842619c49a1 26 #define MAX_4G 0x01
scohennm 11:c842619c49a1 27 #define MAX_8G 0x02
kennylujan42 14:ca20f659409a 28
kennylujan42 14:ca20f659409a 29
kennylujan42 14:ca20f659409a 30 #define SET_INTERRUPT 0x08 //using interrupt INT1 PTC5
mturner5 13:254e382efeab 31 #define SET_INT_LINE 0x00
kennylujan42 14:ca20f659409a 32
kennylujan42 14:ca20f659409a 33
mturner5 13:254e382efeab 34 #define SET_THZ 0x28 // See Table 49 in data sheet
scohennm 11:c842619c49a1 35 /***********
scohennm 12:4774c4fc718e 36 0b0010 0000
scohennm 11:c842619c49a1 37 2g/0.063g/count = 32 counts
scohennm 11:c842619c49a1 38 ************/
kennylujan42 14:ca20f659409a 39 #define SET_TMLT 0x1C // See Talbe 51 in data sheet
scohennm 11:c842619c49a1 40 /******
scohennm 12:4774c4fc718e 41 0b0001 1000
scohennm 11:c842619c49a1 42 24 = 0x18
scohennm 11:c842619c49a1 43 time step at 800Hz ODR = 0.625ms
scohennm 11:c842619c49a1 44 24x0.625 = 15 ms
scohennm 11:c842619c49a1 45 ******/
kennylujan42 14:ca20f659409a 46
scohennm 11:c842619c49a1 47 //#define PRINTDBUG
scohennm 11:c842619c49a1 48 // Accelerometer SPI pins
scohennm 11:c842619c49a1 49 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
scohennm 11:c842619c49a1 50 PinName const SDA = PTE25;
scohennm 11:c842619c49a1 51 PinName const SCL = PTE24;
scohennm 11:c842619c49a1 52 #elif defined (TARGET_KL05Z)
scohennm 11:c842619c49a1 53 PinName const SDA = PTB4;
scohennm 11:c842619c49a1 54 PinName const SCL = PTB3;
scohennm 11:c842619c49a1 55 #else
scohennm 11:c842619c49a1 56 #error TARGET NOT DEFINED
scohennm 11:c842619c49a1 57 #endif
kennylujan42 14:ca20f659409a 58
scohennm 11:c842619c49a1 59 #define MMA8451_I2C_ADDRESS (0x1d<<1)
scohennm 11:c842619c49a1 60
scohennm 11:c842619c49a1 61 Ticker ledBlink; // timinginterrupt for RED led
mturner5 13:254e382efeab 62 InterruptIn MMA8451QInt1(PTD1); //push botton with internal pullup
scohennm 11:c842619c49a1 63 DigitalOut myled(LED_RED); // red led
scohennm 11:c842619c49a1 64 DigitalOut relay(LED_GREEN); // green led
kennylujan42 14:ca20f659409a 65
scohennm 11:c842619c49a1 66 MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
scohennm 11:c842619c49a1 67
scohennm 11:c842619c49a1 68 float delay = WAITDELAY;
scohennm 11:c842619c49a1 69 int relayState = RELAYOFF;
scohennm 11:c842619c49a1 70 int outState = false;
scohennm 11:c842619c49a1 71 SLCD slcd; //define LCD display
scohennm 11:c842619c49a1 72 char LCDMessages[2][LCDLEN] = {"TRUE", "FALS"};
kennylujan42 14:ca20f659409a 73
kennylujan42 14:ca20f659409a 74
scohennm 11:c842619c49a1 75 void LCDMess(char *lMess, float dWait){
scohennm 11:c842619c49a1 76 slcd.Home();
scohennm 11:c842619c49a1 77 slcd.clear();
scohennm 11:c842619c49a1 78 slcd.printf(lMess);
scohennm 11:c842619c49a1 79 wait(dWait);
scohennm 11:c842619c49a1 80 }
scohennm 11:c842619c49a1 81 void LCDMessNoDwell(char *lMess){
scohennm 11:c842619c49a1 82 slcd.Home();
scohennm 11:c842619c49a1 83 slcd.clear();
scohennm 11:c842619c49a1 84 slcd.printf(lMess);
scohennm 11:c842619c49a1 85 }
kennylujan42 14:ca20f659409a 86
scohennm 11:c842619c49a1 87 // Interrupt routines
scohennm 11:c842619c49a1 88 void LEDBlinker(){ // RED LED interrupt
scohennm 11:c842619c49a1 89 outState = !outState;
scohennm 11:c842619c49a1 90 myled.write(outState);
scohennm 11:c842619c49a1 91 }
kennylujan42 14:ca20f659409a 92
scohennm 11:c842619c49a1 93 void GreenLEDBlinker(){ // Green LED interrupt
scohennm 11:c842619c49a1 94 //uint8_t i_regData;
scohennm 11:c842619c49a1 95 relayState = !relayState;
scohennm 11:c842619c49a1 96 relay.write(relayState);
scohennm 11:c842619c49a1 97 //acc.readRegs(REG_PULSE_SRC, &i_regData, 1); // Clear the tap event
scohennm 11:c842619c49a1 98 }
kennylujan42 14:ca20f659409a 99
scohennm 11:c842619c49a1 100 // end interrupt routines
kennylujan42 14:ca20f659409a 101
kennylujan42 14:ca20f659409a 102
scohennm 11:c842619c49a1 103 int main()
scohennm 11:c842619c49a1 104 {
mturner5 13:254e382efeab 105
scohennm 11:c842619c49a1 106 uint8_t regData;
kennylujan42 14:ca20f659409a 107 uint8_t latchData = 0x20; //0b01000000 64; //for pulse config register
kennylujan42 14:ca20f659409a 108 uint8_t axisData = 0x08; //0b00010000 16;
kennylujan42 14:ca20f659409a 109
scohennm 11:c842619c49a1 110 char lcdData[LCDLEN];
scohennm 11:c842619c49a1 111
scohennm 11:c842619c49a1 112 myled.write(outState);
scohennm 11:c842619c49a1 113 relay.write(relayState);
scohennm 11:c842619c49a1 114
scohennm 11:c842619c49a1 115 // set up interrrupts to be used later for taps
scohennm 11:c842619c49a1 116 MMA8451QInt1.rise(&GreenLEDBlinker);
scohennm 11:c842619c49a1 117 MMA8451QInt1.mode(PullNone);
scohennm 11:c842619c49a1 118
scohennm 11:c842619c49a1 119 // set up interrrupts to be used later for taps
scohennm 11:c842619c49a1 120 ledBlink.attach(&LEDBlinker, LEDDELAY);
scohennm 11:c842619c49a1 121
scohennm 11:c842619c49a1 122 // Read Pulse Source Data and check to see if things have been set
scohennm 11:c842619c49a1 123 acc.readRegs(REG_PULSE_CFG, &regData, 1); // check it
scohennm 11:c842619c49a1 124 sprintf (lcdData,"%x",regData);
scohennm 11:c842619c49a1 125 LCDMess(lcdData,BLINKTIME);
scohennm 11:c842619c49a1 126
scohennm 11:c842619c49a1 127 // *********** Initialize for tap tecognition ***********
scohennm 11:c842619c49a1 128 regData = latchData | axisData;
scohennm 11:c842619c49a1 129 acc.setRegisterInStandby(REG_PULSE_CFG, regData); // write the data
scohennm 11:c842619c49a1 130 acc.readRegs(REG_PULSE_CFG, &regData, 1); // check it
scohennm 11:c842619c49a1 131 sprintf (lcdData,"%x",regData);
scohennm 11:c842619c49a1 132 LCDMess(lcdData,BLINKTIME);
scohennm 11:c842619c49a1 133
scohennm 11:c842619c49a1 134 // Check to see if accerlometer is alive and well
scohennm 11:c842619c49a1 135 acc.setGLimit(MAX_4G); // For now set to 2g
scohennm 11:c842619c49a1 136 acc.readRegs(XYZ_DATA_CFG, &regData, 1);
scohennm 11:c842619c49a1 137 sprintf (lcdData,"%x",regData); // Note displaying in hexidecimal
scohennm 11:c842619c49a1 138 LCDMess(lcdData,BLINKTIME);
scohennm 11:c842619c49a1 139
scohennm 11:c842619c49a1 140 // Setup single-tap pulse prarameters.
scohennm 11:c842619c49a1 141 acc.setRegisterInStandby(REG_PULSE_THSZ, SET_THZ); // write the data
scohennm 11:c842619c49a1 142 acc.setRegisterInStandby(REH_PULSE_TMLT, SET_TMLT); // write the data
scohennm 11:c842619c49a1 143
scohennm 11:c842619c49a1 144 // Set up (pulse) interrupt to INT1 pin
scohennm 11:c842619c49a1 145 acc.setRegisterInStandby(REG_CTRL_4, SET_INTERRUPT); // write the data
scohennm 11:c842619c49a1 146 acc.setRegisterInStandby(REG_CTRL_5, SET_INT_LINE); // write the data
scohennm 11:c842619c49a1 147 // End or seetup
kennylujan42 14:ca20f659409a 148
scohennm 11:c842619c49a1 149 acc.readRegs(REG_WHO_AM_I, &regData, 1);
scohennm 11:c842619c49a1 150 sprintf (lcdData,"%x",regData);
scohennm 11:c842619c49a1 151 LCDMess(lcdData,BLINKTIME);
scohennm 11:c842619c49a1 152
scohennm 11:c842619c49a1 153
scohennm 11:c842619c49a1 154 while (true) {
scohennm 11:c842619c49a1 155 acc.readRegs(REG_PULSE_SRC, &regData, 1);
scohennm 11:c842619c49a1 156 sprintf (lcdData,"%x",regData);
scohennm 11:c842619c49a1 157 LCDMess(lcdData,BLINKTIME);
scohennm 11:c842619c49a1 158 LCDMessNoDwell(LCDMessages[relayState]);
scohennm 11:c842619c49a1 159 wait(delay);
scohennm 11:c842619c49a1 160 }
scohennm 11:c842619c49a1 161 }