Eric Glunn
/
4180Project_Analog
Logic code
Diff: main.cpp
- Revision:
- 2:9a88de905577
- Parent:
- 1:14e49afb1d7c
- Child:
- 3:60f30ca6a65d
diff -r 14e49afb1d7c -r 9a88de905577 main.cpp --- a/main.cpp Tue Apr 21 00:07:44 2020 +0000 +++ b/main.cpp Tue Apr 21 03:31:20 2020 +0000 @@ -1,21 +1,38 @@ #include "mbed.h" -#define reset 0b00000000 //Define masks + +#define reset 0b00000000 //Define function masks #define digital 0b00100000 #define analog 0b01000000 #define I2C 0b01100000 -#define stateMask 0b11100000 +#define oScope 0b10000000 + +#define stateMask 0b11100000 //general masks #define pinMask 0b00011111 -#define pin1 0b00010000 +#define FULL 0b11111111 + +#define pin1 0b00010000 //digital and analog masks #define pin2 0b00001000 #define pin3 0b00000100 #define pin4 0b00000010 #define pin5 0b00000001 -#define FULL 0b11111111 +#define ms1 0b00000000 //Oscope masks +#define ms5 0b00000001 +#define ms10 0b00000010 +#define ms50 0b00000011 +#define ms100 0b00000100 +#define ms250 0b00000101 +#define ms500 0b00000110 +#define ms1000 0b00000111 +#define rise 0b00010000 +#define fall 0b00000000 +#define timeMask 0b00001111 +#define trigger 0b00010000 DigitalOut myled(LED1); DigitalOut DigitalStatus(LED2); //Led for when Digital read is running DigitalOut AnalogStatus(LED3); //LED for when Analog read is running +DigitalOut oScopeStatus(LED4); //LED for Oscilloscope DigitalIn d1(p21); //Always set these pins for digital in DigitalIn d2(p22); @@ -23,124 +40,216 @@ DigitalIn d4(p24); DigitalIn d5(p25); -AnalogIn a1(p16); //Always set these pins for analog in + +AnalogIn a1(p16); //Always set these pins for analog in AnalogIn a2(p17); AnalogIn a3(p18); AnalogIn a4(p19); AnalogIn a5(p20); -Serial PC(USBTX,USBRX); +Serial PC(USBTX,USBRX); Ticker tickerboi; //Initialize the ticker for Sampling +Ticker oScopeTicker; +Ticker oScopeCut; + volatile unsigned char DigitalSample; volatile unsigned char AnalogSample[5]; -volatile bool DigitalRunning; -volatile bool AnalogRunning; - volatile unsigned char command; volatile unsigned char state; volatile bool newDigital=false; volatile bool newAnalog=false; - - -void digital_sample_func(void){ //sampling function, samples each pin specified and Ors it +volatile unsigned char oScopeTime; +volatile bool oScope_poll; +volatile bool newoScope=false; +volatile unsigned char oScopeArray[20000]; +volatile int oScopeCount=0; + + +void digital_sample_func(void) //sampling function, samples each pin specified and Ors it +{ DigitalSample = digital; - - if( (command & pin1) == pin1){ + + if( (command & pin1) == pin1) { DigitalSample=DigitalSample + d1*pin1; } - if( (command & pin2) == pin2){ + if( (command & pin2) == pin2) { DigitalSample=DigitalSample + d2*pin2; } - if( (command & pin3) == pin3){ + if( (command & pin3) == pin3) { DigitalSample=DigitalSample + d3*pin3; } - if( (command & pin4) == pin4){ + if( (command & pin4) == pin4) { DigitalSample=DigitalSample + d4*pin4; } - if( (command & pin5) == pin5){ + if( (command & pin5) == pin5) { DigitalSample=DigitalSample + d5*pin5; } newDigital=true; } -void analog_sample_func(void){ - for(int i=0; i<5; i++){ - AnalogSample[i]=0; +void analog_sample_func(void) +{ + for(int i=0; i<5; i++) { + AnalogSample[i]=0; } - if( (command & pin1) == pin1){ + if( (command & pin1) == pin1) { AnalogSample[0]=a1*254; } - if( (command & pin2) == pin2){ + if( (command & pin2) == pin2) { AnalogSample[1]=a2 * 254; } - if( (command & pin3) == pin3){ + if( (command & pin3) == pin3) { AnalogSample[2]=a3*254; } - if( (command & pin4) == pin4){ + if( (command & pin4) == pin4) { AnalogSample[3]=a4*254; } - if( (command & pin5) == pin5){ + if( (command & pin5) == pin5) { AnalogSample[4]=a5*254; } - newAnalog=true; + newAnalog=true; +} + + +void oScope_kill_func(void) +{ + oScopeTicker.detach(); + oScopeCut.detach(); + newoScope=true; + oScopeStatus=0; +} + +void oScope_sample_func(void){ + oScopeArray[oScopeCount]=a1*254; + oScopeCount++; +} + +void oScope_poll_trig(){ + float first, second; + bool run_poll =true; + while(run_poll){ + first = a1; + wait (.001); + second=a1; + if( (second - first)>.1){run_poll = false;} + } + + switch(oScopeTime) { + + case ms1: + oScopeCut.attach(oScope_kill_func, .001); + break; + + case ms5: + oScopeCut.attach(oScope_kill_func, .005); + break; + + case ms10: + oScopeCut.attach(oScope_kill_func, .01); + break; + + case ms50: + oScopeCut.attach(oScope_kill_func, .05); + break; + + case ms100: + oScopeCut.attach(oScope_kill_func, .1); + break; + + case ms250: + oScopeCut.attach(oScope_kill_func, .25); + break; + + case ms500: + oScopeCut.attach(oScope_kill_func, .5); + break; + + case ms1000: + oScopeCut.attach(oScope_kill_func, 1); + break; + } + + oScopeTicker.attach_us(oScope_sample_func, 50); } -void SerialInterrupt(void){ - command=PC.getc(); - state= command & stateMask; - switch(state){ - case reset: - tickerboi.detach(); //detach Ticker - DigitalRunning=false; //turn off status LED - AnalogRunning=false; +void SerialInterrupt(void) +{ + command=PC.getc(); + state= command & stateMask; + + switch(state) { + case reset: + tickerboi.detach(); //detach Ticker + DigitalStatus=0; //turn off status LED + AnalogStatus=0; + if(oScopeStatus){ + oScope_kill_func(); + } + break; - - case digital: - tickerboi.attach(&digital_sample_func, .1); //Ticker will call digital read every 100 ms - DigitalRunning=true; // turn on status LED - break; - - case analog: - tickerboi.attach(&analog_sample_func, 1); //Ticker will call analog read every 10ms - AnalogRunning=true; - } + + case digital: + tickerboi.attach(&digital_sample_func, .5); + DigitalStatus=1; // turn on status LED + break; + + case analog: + tickerboi.attach(&analog_sample_func, .5); + AnalogStatus=1; + + case oScope: + oScopeTime=command & timeMask; + oScope_poll=true; + oScopeStatus=1; + break; + } } -int main() { - PC.attach(&SerialInterrupt, Serial::RxIrq); +int main() +{ + PC.attach(&SerialInterrupt, Serial::RxIrq); - + while(1) { - - DigitalStatus=DigitalRunning; //Indicate DigitalRead is running - AnalogStatus=AnalogRunning; //Indicate analogRead is running - - if(newDigital){ //if digital sampling was run + + if(newDigital) { //if digital sampling was run PC.putc(DigitalSample); newDigital=false; } - - if(newAnalog){ //if analog sampling was run - PC.putc(FULL); //First bit is 0b01000000 - for(int i=0; i<5; i++){ //Send all of the analog bits - PC.putc(AnalogSample[i]); + + if(newAnalog) { //if analog sampling was run + PC.putc(FULL); //First bit is 0b01000000 + for(int i=0; i<5; i++) { //Send all of the analog bits + PC.putc(AnalogSample[i]); } PC.putc(command); //Last bit is command from PC newAnalog=false; } + if(oScope_poll){ oScope_poll_trig(); } + + if(newoScope){ + PC.putc(FULL); + for(int j=0; j<=oScopeCount; j++){ + PC.putc(oScopeArray[oScopeCount]); + } + oScopeCount=0; + newoScope=false; + } + + myled = 1; //indicate main loop is running wait(0.2); myled = 0; - wait(0.2); + wait(0.2); } }