By Michael Wasko and Haoran Xiao
Dependencies: MAG3110 MMA8451Q SLCD TSI mbed
Revision 0:792bc968c89f, committed 2014-02-12
- Comitter:
- HaoranX
- Date:
- Wed Feb 12 22:11:23 2014 +0000
- Commit message:
- v1
Changed in this revision
diff -r 000000000000 -r 792bc968c89f MAG3110.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MAG3110.lib Wed Feb 12 22:11:23 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/SomeRandomBloke/code/MAG3110/#cf40601402b7
diff -r 000000000000 -r 792bc968c89f MMA8451Q.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MMA8451Q.lib Wed Feb 12 22:11:23 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/JoKer/code/MMA8451Q/#2d14600116fc
diff -r 000000000000 -r 792bc968c89f SLCD.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SLCD.lib Wed Feb 12 22:11:23 2014 +0000 @@ -0,0 +1,1 @@ +https://mbed.org/users/Sissors/code/SLCD/#f70873bc6121
diff -r 000000000000 -r 792bc968c89f TSI.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TSI.lib Wed Feb 12 22:11:23 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/vsluiter/code/TSI/#4dc2f5a3a731
diff -r 000000000000 -r 792bc968c89f main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Feb 12 22:11:23 2014 +0000 @@ -0,0 +1,190 @@ +#include "mbed.h" +#include "MMA8451Q.h" +#include "MAG3110.h" +#include "TSISensor.h" +#include "SLCD.h" + +#define ACC_ID 0 +#define MAG_ID 1 +#define ADC_ID 2 +#define TSI_ID 3 +#define NUM_OF_SENSOR 4 + +union Serial_Float{ + float f; + char bt[4]; +}; + +union Serial_Int{ + int i; + char bt[4]; +}; + +typedef union _data { + float f; + char s[4]; +} myData; + +Serial pc(USBTX, USBRX); +MMA8451Q acc(PTE25,PTE24,0x1d<<1); +MAG3110 mag(PTE25,PTE24); +AnalogIn adc(PTE30); +TSISensor tsi; +SLCD slcd; +DigitalOut led2(LED2); +bool sirq_flags[NUM_OF_SENSOR] = {0}; // interrupt flags +int SR = 0; // total sampling rate + +void send(float data, int id); +void send(int data, int id); +void read_cmd(); +void display(int val); + +Ticker acc_timer; +Ticker mag_timer; +Ticker adc_timer; +Ticker tsi_timer; +void acc_timer_irq(); +void mag_timer_irq(); +void adc_timer_irq(); +void tsi_timer_irq(); + +// initial sampling frequency: +float sp_freq[NUM_OF_SENSOR] = {1,1,1,1}; +// current sensor states: +int sp_flag[NUM_OF_SENSOR] = {0}; + +int main(){ + // Initialize sampling rate for display + SR = 3*sp_freq[0]*sp_flag[0]+sp_freq[1]*sp_flag[1]+sp_freq[2]*sp_flag[2]+sp_freq[3]*sp_flag[3]; + led2 = 1; + // set baud rate to 460800 + pc.baud(460800); + // display current sampling rate on LCD + display(SR); + while(1){ + // check requests, execute and clear + if(sirq_flags[ACC_ID]){ + send(acc.getAccX(),0); + send(acc.getAccY(),1); + send(acc.getAccZ(),2); + sirq_flags[ACC_ID] = 0; + } + if(sirq_flags[MAG_ID]){ + send(mag.readVal(0x1d),3); + sirq_flags[MAG_ID] = 0; + } + if(sirq_flags[ADC_ID]){ + send(float(adc.read()*3.3),4); + sirq_flags[ADC_ID] = 0; + } + if(sirq_flags[TSI_ID]){ + send(tsi.readPercentage(),5); + sirq_flags[TSI_ID] = 0; + } + if(pc.readable()){ + read_cmd(); + // refresh current sampling rate after the command is read: + SR = 3*sp_freq[0]*sp_flag[0]+sp_freq[1]*sp_flag[1]+sp_freq[2]*sp_flag[2]+sp_freq[3]*sp_flag[3]; + display(SR); + } + } +} + +// interrupt functions for each ticker +void acc_timer_irq(){ + sirq_flags[ACC_ID] = 1; +} +void mag_timer_irq(){ + sirq_flags[MAG_ID] = 1; +} +void adc_timer_irq(){ + sirq_flags[ADC_ID] = 1; +} +void tsi_timer_irq(){ + sirq_flags[TSI_ID] = 1; +} + +// serial write (overloaded with different data type) +void send(float data,int id){ + Serial_Float srdata; + srdata.f = data; + for(int i = 0; i < 4; i++) + pc.putc(srdata.bt[i]); + pc.putc('0'+id); +} +void send(int data, int id){ + Serial_Int srdata; + srdata.i = data; + for(int i = 0; i < 4; i++) + pc.putc(srdata.bt[i]); + pc.putc('0'+id); +} + +// read command +void read_cmd(){ + __disable_irq(); + led2 = !led2; + char op; char id; myData freq; + while(pc.readable()){//Flush input + pc.getc(); + } + pc.putc('r'); //confirm ready + op = pc.getc(); // get operation + id = pc.getc(); // get sensor id + if(op == 'c') { + if (id == '0'){ + acc_timer.detach(); + sp_flag[ACC_ID] = 0; + } + else if (id == '1'){ + mag_timer.detach(); + sp_flag[MAG_ID] = 0; + } + else if (id == '2'){ + adc_timer.detach(); + sp_flag[ADC_ID] = 0; + } + else if (id == '3'){ + tsi_timer.detach(); + sp_flag[TSI_ID] = 0; + } + } + if(op == 'o') { + for (int i=0; i<4; i++) { + freq.s[i] = pc.getc(); + } + switch(id){ + case '0': + sp_freq[0] = freq.f; + acc_timer.attach(&acc_timer_irq, 1.0/freq.f); + sp_flag[ACC_ID] = 1; + break; + case '1': + sp_freq[1] = freq.f; + mag_timer.attach(&mag_timer_irq, 1.0/freq.f); + sp_flag[MAG_ID] = 1; + break; + case '2': + sp_freq[2] = freq.f; + adc_timer.attach(&adc_timer_irq, 1.0/freq.f); + sp_flag[ADC_ID] = 1; + break; + case '3': + sp_freq[3] = freq.f; + tsi_timer.attach(&tsi_timer_irq, 1.0/freq.f); + sp_flag[TSI_ID] = 1; + break; + } + } + led2 = !led2; + __enable_irq(); +} + +// LCD function +void display(int val){ + char buf[16]; + sprintf(buf,"%d%d%d",val/100,(val%100)/10,val%10); + slcd.printf(buf); + slcd.Home(); +} \ No newline at end of file
diff -r 000000000000 -r 792bc968c89f mbed.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.lib Wed Feb 12 22:11:23 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/#824293ae5e43