lab 6
Dependencies: ADXL362 mbed MPL3115A2
main.cpp
- Committer:
- htdoughe
- Date:
- 2018-03-09
- Revision:
- 33:5df68b9e96de
- Parent:
- 32:f6664eade7fe
File content as of revision 33:5df68b9e96de:
#include "mbed.h"
#include "ADXL362.h"
#include "string.h"
#include "MPL3115A2.h"
#include <stdio.h>
#include <time.h>
DigitalOut led3(LED3);
Serial pc(USBTX, USBRX);
//AnalogIn gpio(D9);
//map of register values and names for the adxl
int aregids[34];
char* aregnames[34];
//populating the map
void initmap()
{
aregids[0] = 0x00;
aregids[1] = 0x01;
aregids[2] = 0x02;
aregids[3] = 0x03;
aregids[4] = 0x08;
aregids[5] = 0x09;
aregids[6] = 0x0A;
aregids[7] = 0x0B;
aregids[8] = 0x0c;
aregids[9] = 0x0D;
aregids[10] = 0x0E;
aregids[11] = 0x0F;
aregids[12] = 0x10;
aregids[13] = 0x11;
aregids[14] = 0x12;
aregids[15] = 0x13;
aregids[16] = 0x14;
aregids[17] = 0x15;
aregids[18] = 0x1F;
aregids[19] = 0x20;
aregids[20] = 0x21;
aregids[21] = 0x22;
aregids[22] = 0x23;
aregids[23] = 0x24;
aregids[24] = 0x25;
aregids[25] = 0x26;
aregids[26] = 0x27;
aregids[27] = 0x28;
aregids[28] = 0x29;
aregids[29] = 0x2A;
aregids[30] = 0x2B;
aregids[31] = 0x2C;
aregids[32] = 0x2D;
aregids[33] = 0x2E;
aregnames[0] = "DEVID_AD";
aregnames[1] = "DEVID_MST";
aregnames[2] = "PARTID";
aregnames[3] = "REVID";
aregnames[4] = "XDATA";
aregnames[5] = "YDATA";
aregnames[6] = "ZDATA";
aregnames[7] = "STATUS";
aregnames[8] = "FIFO_ENTRIES_L";
aregnames[9] = "FIFO_ENTRIES_H";
aregnames[10] = "XDATA_L";
aregnames[11] = "XDATA_H";
aregnames[12] = "YDATA_L";
aregnames[13] = "YDATA_H";
aregnames[14] = "ZDATA_L";
aregnames[15] = "ZDATA_H";
aregnames[16] = "TEMP_L";
aregnames[17] = "TEMP_H";
aregnames[18] = "SOFT_RESET";
aregnames[19] = "THRESH_ACT_L";
aregnames[20] = "THRESH_ACT_H";
aregnames[21] = "TIME_ACT";
aregnames[22] = "THRESH_INACT_L";
aregnames[23] = "THRESH_INACT_H";
aregnames[24] = "TIME_INACT_L";
aregnames[25] = "TIME_INACT_H";
aregnames[26] = "ACT_INACT_CTL";
aregnames[27] = "FIFO_CONTROL";
aregnames[28] = "FIFO_SAMPLES";
aregnames[29] = "INTMAP1";
aregnames[30] = "INTMAP2";
aregnames[31] = "FILTER_CTL";
aregnames[32] = "POWER_CTL";
aregnames[33] = "SELF_TEST";
}
//map of register values and names for the adxl
char mregids[46];
char* mregnames[46];
//populating the map
void minitmap()
{
mregids[0] = 0x00;
mregids[1] = 0x01;
mregids[2] = 0x02;
mregids[3] = 0x03;
mregids[4] = 0x04;
mregids[5] = 0x05;
mregids[6] = 0x06;
mregids[7] = 0x07;
mregids[8] = 0x08;
mregids[9] = 0x09;
mregids[10] = 0x0A;
mregids[11] = 0x0B;
mregids[12] = 0x0C;
mregids[13] = 0x0D;
mregids[14] = 0x0E;
mregids[15] = 0x0F;
mregids[16] = 0x10;
mregids[17] = 0x11;
mregids[18] = 0x12;
mregids[19] = 0x13;
mregids[20] = 0x14;
mregids[21] = 0x15;
mregids[22] = 0x16;
mregids[23] = 0x17;
mregids[24] = 0x18;
mregids[25] = 0x19;
mregids[26] = 0x1A;
mregids[27] = 0x1B;
mregids[28] = 0x1C;
mregids[29] = 0x1D;
mregids[30] = 0x1E;
mregids[31] = 0x1F;
mregids[32] = 0x20;
mregids[33] = 0x21;
mregids[34] = 0x22;
mregids[35] = 0x23;
mregids[36] = 0x24;
mregids[37] = 0x25;
mregids[38] = 0x26;
mregids[39] = 0x27;
mregids[40] = 0x28;
mregids[41] = 0x29;
mregids[42] = 0x2A;
mregids[43] = 0x2B;
mregids[44] = 0x2C;
mregids[45] = 0x2D;
mregnames[0] = "STATUS";
mregnames[1] = "OUT_P_MSB";
mregnames[2] = "OUT_P_CSB";
mregnames[3] = "OUT_P_LSB";
mregnames[4] = "OUT_T_MSB";
mregnames[5] = "OUT_T_LSB";
mregnames[6] = "DR_STATUS";
mregnames[7] = "OUT_P_DELTA_MSB";
mregnames[8] = "OUT_P_DELTA_CSB";
mregnames[9] = "OUT_T_DELTA_MSB";
mregnames[10] = "OUT_T_DELTA_LSB";
mregnames[11] = "WHO_AM_I";
mregnames[12] = "F_STATUS";
mregnames[13] = "F_DATA";
mregnames[14] = "F_SETUP";
mregnames[15] = "TIME_DLY";
mregnames[16] = "SYSMOD";
mregnames[17] = "INT_SOURCE";
mregnames[18] = "SOFT_RESET";
mregnames[19] = "PT_DATA_CFG";
mregnames[20] = "BAR_IN_MSB";
mregnames[21] = "BAR_IN_LSB";
mregnames[22] = "P_TGT_MSB";
mregnames[23] = "P_TGT_LSB";
mregnames[24] = "T_TGT";
mregnames[25] = "P_WND_MSB";
mregnames[26] = "P_WND_LSB";
mregnames[27] = "T_WND";
mregnames[28] = "P_MIN_MSB";
mregnames[29] = "P_MIN_CSB";
mregnames[30] = "P_MIN_LSB";
mregnames[31] = "T_MIN_MSB";
mregnames[32] = "T_MIN_LSB";
mregnames[33] = "P_MAX_MSB";
mregnames[34] = "P_MAX_CSB";
mregnames[35] = "P_MAX_LSB";
mregnames[36] = "T_MAX_MSB";
mregnames[37] = "T_MAX_LSB";
mregnames[38] = "CTRL_REG1";
mregnames[39] = "CTRL_REG2";
mregnames[40] = "CTRL_REG3";
mregnames[41] = "CTRL_REG4";
mregnames[42] = "CTRL_REG5";
mregnames[43] = "OFF_P";
mregnames[44] = "OFF_T";
mregnames[45] = "OFF_H";
}
// Interface pulled from ADXL362.cpp
// ADXL362::ADXL362(PinName CS, PinName MOSI, PinName MISO, PinName SCK) :
ADXL362 adxl362(PA_0,PA_7,PA_6,PA_1);
// Selects SDA as I2C1_SDA on pin PB_7
// Selects SCL on I2C1_SCL on pin PB_6
// The I2C address of the pressure sensor is fixed at 0x60.
MPL3115A2 pressure(PB_7, PB_6, 0x60);
int adxl362_reg_print(int s, int l)
{
//check s is between 0x00 and 0x2E
if(s > 0x2E || s < 0x00) {
printf("adx: requires start between 0x00 and 0x2E; given %d (0x%01x)\n", s,s);
return -1;
} else if(l < 0) {
//check length > 0
printf("adx: requires length >= 0, given %d\n", l);
return -1;
} else {
// start sending stuff
//first check DEVID_AD == 0xAD
uint8_t devid = adxl362.read_reg(ADXL362::DEVID_AD);
//printf("devid = %d\n", devid);
if(devid != 0xAD) {
printf("error: DEVID_AD is not 0xAD; exiting\n");
return -1;
} else {
//now do stuff
//if length == 0, send everything from s to end of registers
//else print from s to l
// formula : range = end - start - length
// area = start + range
int stop = 0;
if(l == 0) {
stop = 34;
} else {
stop = s + l;
}
int in = s;
while(in < stop) {
//get register name
char * name = aregnames[in]; //GET NAME
ADXL362::ADXL362_register_t reg = (ADXL362::ADXL362_register_t) aregids[in];
uint8_t val = adxl362.read_reg(reg); //GET REG VAL
//print val
printf("0x%01x: %s=0x%01x\r\n", aregids[in], name, val);
in++;
}
}
}
return 0;
}
void knocks()
{
int8_t x,y,z, initx, inity, initz;
//initial values of x, y, and z.
//These values are the baseline for the accelerometer; knocks are detected
// in relation to these initial values
initx=adxl362.scanx_u8();
inity=adxl362.scany_u8();
initz=adxl362.scanz_u8();
int count = 0;
int bs = 7;
while(1) {
//get the values of x, y, and z to test for a knock
x=adxl362.scanx_u8();
y=adxl362.scany_u8();
z=adxl362.scanz_u8();
//if x, y, or z vary from baseline by at least bs, a knock has occured.
if(x > initx+bs || y > inity+bs || z > initz+bs || x < initx-bs || y < inity-bs || z < initz-bs) {
led3 = 1;
count++;
printf("number of knocks: %d\r\n", count);
wait_ms(2000);
led3 = 0;
}
//printf("x = %d y = %d z = %d\r\n",x,y,z);
wait_ms(100);
}
}
int mpl3115_reg_print(int s, int l)
{
if(s > 0x2D || s < 0x00) {
printf("mpl: requires start between 0x00 and 0x20; given %d (0x%01x)\n\r", s,s);
return -1;
} else if(l < 0) {
//check length > 0
printf("mpl: requires length >= 0, given %d\n\r", l);
return -1;
} else {
//else do stuff
uint8_t id = pressure.getID();
//printf("whoami = 0x%01x", id);
if(id != 0xC4) {
printf("error: WHO_AM_I is not 0xC4; exiting\n");
return -1;
} else {
//now do stuff
//if length == 0, send everything from s to end of registers
//else print from s to l
// formula : range = end - start - length
// area = start + range
int stop = 0;
if(l == 0) {
stop = 46;
} else {
stop = s + l;
}
int in = s;
while(in < stop) {
//get register name
char * name = mregnames[in]; //GET NAME
int reg = mregids[in];
uint8_t val;
pressure.readRegs(reg,&val,sizeof(uint8_t)); //GET REG VAL
//print val
printf("0x%01x: %s=0x%01x\r\n", mregids[in], name, val);
in++;
}//while
}//else
}//else
return 0;
}//print mpl
int measureAlt()
{
printf("measuring things\r\n");
uint8_t id = pressure.getID();
//printf("whoami = 0x%01x\r\n", id);
if(id != (uint8_t) 0xC4) {
printf("error: WHO_AM_I is not 0xC4; exiting\r\n");
return -1;
} else {
double data[900];
int ind = 0;
//set sample_time
wait_ms(100);
uint8_t st = pressure.getCTRL_REG1();
uint8_t msk = 0x8f;
//printf("CTL_REG1 = 0x%05x\r\n", st);
pressure.setCTRL_REG1(msk);
pressure.activate();
//printf("CTL_REG1 = 0x%05x\r\n", pressure.getCTRL_REG1());
//pressure stuff
uint8_t tmp[3] ;
uint32_t pres ;
//GPIO pin indicates sampling should begin -- if voltage == 3.3, start
while(ind < 900 && !pc.readable()) {
printf("measuring...\r\n");
//then we measure
//pressure and temperature sampled at 10times/second (10 hz)
//LED blinks during sampling at 1 hz (1 time/second)
led3 = 1;
for(int i = 0; i < 10; i++) {
pres = pressure.getPressure();
//pressure.readRegs(mregids[1], tmp, 3) ;
//pres = ((tmp[0]<<16)|(tmp[1]<<8)|(tmp[2])) >> 6;
data[ind++] = pres;
data[ind++] = pressure.getTemperature();
wait_ms(100);
}//for
led3 = 0;
for(int i = 0; i < 10; i++) {
pres = pressure.getPressure();
//pressure.readRegs(mregids[1], tmp, 3) ;
//pres = ((tmp[0]<<16)|(tmp[1]<<8)|(tmp[2])) >> 6;
data[ind++] = pres;
data[ind++] = pressure.getTemperature();
wait_ms(100);
}//for
}//while
int pind = 0;
int pend = ind;
char in;
int ch;
char p = 'p';
bool ex = false;
while(!ex) {
printf("p%% ");
while((ch = pc.getc()) != 13) {
pc.putc(ch);
in = ch;
}//while
if(in == p) {
while(pind < pend) {
pc.printf("\n\r%f\t%f", data[pind],data[pind+1]);
pind += 2;
ex = true;
}//while
} else {
in = 0;
}//if/else
}//while
pc.printf("\n\r");
return 0;
}//else
}//measureAlt
int main()
{
initmap();
minitmap();
adxl362.reset();
pressure.activate();
wait_ms(600); // we need to wait at least 500ms after ADXL362 reset
adxl362.set_mode(ADXL362::MEASUREMENT);
int start, length;
start = 0;
length = 0;
//while(1){
//adxl362_reg_print(start, length);
mpl3115_reg_print(start, length);
//}
//knocks();
measureAlt();
//while(1);
}