KBrat-SSD645-Midterm_Part2

Dependencies:   MMA8451Q8g_Update SLCD mbed

Fork of KL46z_single_tap_2017 by Stanley Cohen

Committer:
tisbrat
Date:
Wed Mar 15 16:50:28 2017 +0000
Revision:
13:24d44a0a1307
Parent:
KL46z_single_tap_2016..cpp@12:4774c4fc718e
KBrat-SSD645-Midterm_Part2

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