Contains all code needed for analog digital and oscope

Dependencies:   mbed

Committer:
EricGlunn
Date:
Thu Apr 30 02:06:29 2020 +0000
Revision:
9:6ac5e49fe198
Parent:
7:60e993355f76
Fixed the project clone bug

Who changed what in which revision?

UserRevisionLine numberNew contents of line
EricGlunn 0:f4b1c6a95f25 1 #include "mbed.h"
EricGlunn 9:6ac5e49fe198 2 //Contains everything but I2C
EricGlunn 2:9a88de905577 3 #define reset 0b00000000 //Define function masks
EricGlunn 0:f4b1c6a95f25 4 #define digital 0b00100000
EricGlunn 0:f4b1c6a95f25 5 #define analog 0b01000000
EricGlunn 0:f4b1c6a95f25 6 #define I2C 0b01100000
EricGlunn 2:9a88de905577 7 #define oScope 0b10000000
EricGlunn 2:9a88de905577 8
EricGlunn 2:9a88de905577 9 #define stateMask 0b11100000 //general masks
EricGlunn 0:f4b1c6a95f25 10 #define pinMask 0b00011111
EricGlunn 2:9a88de905577 11 #define FULL 0b11111111
EricGlunn 2:9a88de905577 12
EricGlunn 2:9a88de905577 13 #define pin1 0b00010000 //digital and analog masks
EricGlunn 0:f4b1c6a95f25 14 #define pin2 0b00001000
EricGlunn 0:f4b1c6a95f25 15 #define pin3 0b00000100
EricGlunn 0:f4b1c6a95f25 16 #define pin4 0b00000010
EricGlunn 0:f4b1c6a95f25 17 #define pin5 0b00000001
EricGlunn 0:f4b1c6a95f25 18
EricGlunn 2:9a88de905577 19 #define ms1 0b00000000 //Oscope masks
EricGlunn 2:9a88de905577 20 #define ms5 0b00000001
EricGlunn 2:9a88de905577 21 #define ms10 0b00000010
EricGlunn 2:9a88de905577 22 #define ms50 0b00000011
EricGlunn 2:9a88de905577 23 #define ms100 0b00000100
EricGlunn 2:9a88de905577 24 #define ms250 0b00000101
EricGlunn 2:9a88de905577 25 #define ms500 0b00000110
EricGlunn 2:9a88de905577 26 #define ms1000 0b00000111
EricGlunn 2:9a88de905577 27 #define rise 0b00010000
EricGlunn 2:9a88de905577 28 #define fall 0b00000000
EricGlunn 5:6b72bf1da751 29 #define timeMask 0b00000111
EricGlunn 5:6b72bf1da751 30 #define triggerType 0b00010000
EricGlunn 5:6b72bf1da751 31 #define triggerVolt 0b00001000
EricGlunn 5:6b72bf1da751 32 #define volt11 0b00000000
EricGlunn 5:6b72bf1da751 33 #define volt22 0b00001000
EricGlunn 0:f4b1c6a95f25 34
EricGlunn 0:f4b1c6a95f25 35 DigitalOut myled(LED1);
EricGlunn 0:f4b1c6a95f25 36 DigitalOut DigitalStatus(LED2); //Led for when Digital read is running
EricGlunn 0:f4b1c6a95f25 37 DigitalOut AnalogStatus(LED3); //LED for when Analog read is running
EricGlunn 2:9a88de905577 38 DigitalOut oScopeStatus(LED4); //LED for Oscilloscope
EricGlunn 0:f4b1c6a95f25 39
EricGlunn 0:f4b1c6a95f25 40 DigitalIn d1(p21); //Always set these pins for digital in
EricGlunn 0:f4b1c6a95f25 41 DigitalIn d2(p22);
EricGlunn 0:f4b1c6a95f25 42 DigitalIn d3(p23);
EricGlunn 0:f4b1c6a95f25 43 DigitalIn d4(p24);
EricGlunn 0:f4b1c6a95f25 44 DigitalIn d5(p25);
EricGlunn 0:f4b1c6a95f25 45
EricGlunn 2:9a88de905577 46
EricGlunn 2:9a88de905577 47 AnalogIn a1(p16); //Always set these pins for analog in
EricGlunn 0:f4b1c6a95f25 48 AnalogIn a2(p17);
EricGlunn 0:f4b1c6a95f25 49 AnalogIn a3(p18);
EricGlunn 0:f4b1c6a95f25 50 AnalogIn a4(p19);
EricGlunn 0:f4b1c6a95f25 51 AnalogIn a5(p20);
EricGlunn 0:f4b1c6a95f25 52
EricGlunn 0:f4b1c6a95f25 53
EricGlunn 2:9a88de905577 54 Serial PC(USBTX,USBRX);
EricGlunn 0:f4b1c6a95f25 55 Ticker tickerboi; //Initialize the ticker for Sampling
EricGlunn 0:f4b1c6a95f25 56
EricGlunn 2:9a88de905577 57 Ticker oScopeTicker;
EricGlunn 2:9a88de905577 58 Ticker oScopeCut;
EricGlunn 2:9a88de905577 59
EricGlunn 0:f4b1c6a95f25 60 volatile unsigned char DigitalSample;
EricGlunn 0:f4b1c6a95f25 61 volatile unsigned char AnalogSample[5];
EricGlunn 0:f4b1c6a95f25 62
EricGlunn 0:f4b1c6a95f25 63 volatile unsigned char command;
EricGlunn 0:f4b1c6a95f25 64 volatile unsigned char state;
EricGlunn 0:f4b1c6a95f25 65
EricGlunn 0:f4b1c6a95f25 66 volatile bool newDigital=false;
EricGlunn 0:f4b1c6a95f25 67 volatile bool newAnalog=false;
EricGlunn 0:f4b1c6a95f25 68
EricGlunn 2:9a88de905577 69 volatile unsigned char oScopeTime;
EricGlunn 2:9a88de905577 70 volatile bool oScope_poll;
EricGlunn 2:9a88de905577 71 volatile bool newoScope=false;
EricGlunn 2:9a88de905577 72 volatile unsigned char oScopeArray[20000];
EricGlunn 2:9a88de905577 73 volatile int oScopeCount=0;
EricGlunn 4:374219f35b8e 74 volatile unsigned char oScopeTriggerType;
EricGlunn 5:6b72bf1da751 75 volatile unsigned char oScopeTriggerVoltageBit;
EricGlunn 5:6b72bf1da751 76 volatile unsigned char oScopeTriggerVoltageVal;
EricGlunn 2:9a88de905577 77
EricGlunn 6:f2c589ad6241 78 volatile bool analogRunning;
EricGlunn 6:f2c589ad6241 79 volatile bool oScopeRunning;
EricGlunn 6:f2c589ad6241 80 volatile bool digitalRunning;
EricGlunn 6:f2c589ad6241 81
EricGlunn 2:9a88de905577 82
EricGlunn 2:9a88de905577 83 void digital_sample_func(void) //sampling function, samples each pin specified and Ors it
EricGlunn 2:9a88de905577 84 {
EricGlunn 0:f4b1c6a95f25 85 DigitalSample = digital;
EricGlunn 2:9a88de905577 86
EricGlunn 2:9a88de905577 87 if( (command & pin1) == pin1) {
EricGlunn 0:f4b1c6a95f25 88 DigitalSample=DigitalSample + d1*pin1;
EricGlunn 0:f4b1c6a95f25 89 }
EricGlunn 2:9a88de905577 90 if( (command & pin2) == pin2) {
EricGlunn 0:f4b1c6a95f25 91 DigitalSample=DigitalSample + d2*pin2;
EricGlunn 0:f4b1c6a95f25 92 }
EricGlunn 2:9a88de905577 93 if( (command & pin3) == pin3) {
EricGlunn 0:f4b1c6a95f25 94 DigitalSample=DigitalSample + d3*pin3;
EricGlunn 0:f4b1c6a95f25 95 }
EricGlunn 2:9a88de905577 96 if( (command & pin4) == pin4) {
EricGlunn 0:f4b1c6a95f25 97 DigitalSample=DigitalSample + d4*pin4;
EricGlunn 0:f4b1c6a95f25 98 }
EricGlunn 2:9a88de905577 99 if( (command & pin5) == pin5) {
EricGlunn 0:f4b1c6a95f25 100 DigitalSample=DigitalSample + d5*pin5;
EricGlunn 0:f4b1c6a95f25 101 }
EricGlunn 0:f4b1c6a95f25 102 newDigital=true;
EricGlunn 0:f4b1c6a95f25 103 }
EricGlunn 0:f4b1c6a95f25 104
EricGlunn 0:f4b1c6a95f25 105
EricGlunn 2:9a88de905577 106 void analog_sample_func(void)
EricGlunn 2:9a88de905577 107 {
EricGlunn 2:9a88de905577 108 for(int i=0; i<5; i++) {
EricGlunn 2:9a88de905577 109 AnalogSample[i]=0;
EricGlunn 0:f4b1c6a95f25 110 }
EricGlunn 2:9a88de905577 111 if( (command & pin1) == pin1) {
EricGlunn 1:14e49afb1d7c 112 AnalogSample[0]=a1*254;
EricGlunn 0:f4b1c6a95f25 113 }
EricGlunn 2:9a88de905577 114 if( (command & pin2) == pin2) {
EricGlunn 1:14e49afb1d7c 115 AnalogSample[1]=a2 * 254;
EricGlunn 0:f4b1c6a95f25 116 }
EricGlunn 2:9a88de905577 117 if( (command & pin3) == pin3) {
EricGlunn 1:14e49afb1d7c 118 AnalogSample[2]=a3*254;
EricGlunn 0:f4b1c6a95f25 119 }
EricGlunn 2:9a88de905577 120 if( (command & pin4) == pin4) {
EricGlunn 1:14e49afb1d7c 121 AnalogSample[3]=a4*254;
EricGlunn 0:f4b1c6a95f25 122 }
EricGlunn 2:9a88de905577 123 if( (command & pin5) == pin5) {
EricGlunn 1:14e49afb1d7c 124 AnalogSample[4]=a5*254;
EricGlunn 0:f4b1c6a95f25 125 }
EricGlunn 2:9a88de905577 126 newAnalog=true;
EricGlunn 2:9a88de905577 127 }
EricGlunn 2:9a88de905577 128
EricGlunn 2:9a88de905577 129
EricGlunn 2:9a88de905577 130 void oScope_kill_func(void)
EricGlunn 2:9a88de905577 131 {
EricGlunn 2:9a88de905577 132 oScopeTicker.detach();
EricGlunn 2:9a88de905577 133 oScopeCut.detach();
EricGlunn 2:9a88de905577 134 newoScope=true;
EricGlunn 6:f2c589ad6241 135 oScopeRunning=0;
EricGlunn 2:9a88de905577 136 }
EricGlunn 2:9a88de905577 137
EricGlunn 2:9a88de905577 138 void oScope_sample_func(void){
EricGlunn 3:60f30ca6a65d 139 oScopeArray[oScopeCount++]=a1*254;
EricGlunn 2:9a88de905577 140 }
EricGlunn 2:9a88de905577 141
EricGlunn 2:9a88de905577 142 void oScope_poll_trig(){
EricGlunn 4:374219f35b8e 143 bool nTriggered = true;
EricGlunn 4:374219f35b8e 144 myled=1;
EricGlunn 4:374219f35b8e 145 unsigned char trig;
EricGlunn 4:374219f35b8e 146 int state =0;
EricGlunn 5:6b72bf1da751 147 if(oScopeTriggerVoltageBit == volt11){oScopeTriggerVoltageVal=85;}
EricGlunn 5:6b72bf1da751 148 else{oScopeTriggerVoltageVal=169;}
EricGlunn 2:9a88de905577 149
EricGlunn 4:374219f35b8e 150 while(nTriggered){
EricGlunn 4:374219f35b8e 151
EricGlunn 4:374219f35b8e 152 trig=a1*254;
EricGlunn 4:374219f35b8e 153 switch(state){
EricGlunn 4:374219f35b8e 154
EricGlunn 4:374219f35b8e 155 case 0:
EricGlunn 5:6b72bf1da751 156 if((trig < oScopeTriggerVoltageVal) & (oScopeTriggerType == rise) ){state = 1;}
EricGlunn 5:6b72bf1da751 157 else if((trig > oScopeTriggerVoltageVal) & (oScopeTriggerType == fall) ){state = 2;}
EricGlunn 4:374219f35b8e 158 else { state = 0;}
EricGlunn 4:374219f35b8e 159 break;
EricGlunn 4:374219f35b8e 160 case 1:
EricGlunn 5:6b72bf1da751 161 if(trig < oScopeTriggerVoltageVal){state=1;}
EricGlunn 5:6b72bf1da751 162 if(trig > oScopeTriggerVoltageVal){state=3;}
EricGlunn 4:374219f35b8e 163 break;
EricGlunn 4:374219f35b8e 164 case 2:
EricGlunn 5:6b72bf1da751 165 if(trig > oScopeTriggerVoltageVal){state = 2;}
EricGlunn 5:6b72bf1da751 166 if(trig < oScopeTriggerVoltageVal){state = 3;}
EricGlunn 4:374219f35b8e 167 break;
EricGlunn 4:374219f35b8e 168 case 3:
EricGlunn 4:374219f35b8e 169 nTriggered=false;
EricGlunn 4:374219f35b8e 170 break;
EricGlunn 4:374219f35b8e 171 }
EricGlunn 4:374219f35b8e 172 wait(.01);
EricGlunn 4:374219f35b8e 173 }
EricGlunn 4:374219f35b8e 174 myled=0;
EricGlunn 2:9a88de905577 175 switch(oScopeTime) {
EricGlunn 2:9a88de905577 176
EricGlunn 2:9a88de905577 177 case ms1:
EricGlunn 2:9a88de905577 178 oScopeCut.attach(oScope_kill_func, .001);
EricGlunn 2:9a88de905577 179 break;
EricGlunn 2:9a88de905577 180
EricGlunn 2:9a88de905577 181 case ms5:
EricGlunn 2:9a88de905577 182 oScopeCut.attach(oScope_kill_func, .005);
EricGlunn 2:9a88de905577 183 break;
EricGlunn 2:9a88de905577 184
EricGlunn 2:9a88de905577 185 case ms10:
EricGlunn 2:9a88de905577 186 oScopeCut.attach(oScope_kill_func, .01);
EricGlunn 2:9a88de905577 187 break;
EricGlunn 2:9a88de905577 188
EricGlunn 2:9a88de905577 189 case ms50:
EricGlunn 2:9a88de905577 190 oScopeCut.attach(oScope_kill_func, .05);
EricGlunn 2:9a88de905577 191 break;
EricGlunn 2:9a88de905577 192
EricGlunn 2:9a88de905577 193 case ms100:
EricGlunn 2:9a88de905577 194 oScopeCut.attach(oScope_kill_func, .1);
EricGlunn 2:9a88de905577 195 break;
EricGlunn 2:9a88de905577 196
EricGlunn 2:9a88de905577 197 case ms250:
EricGlunn 2:9a88de905577 198 oScopeCut.attach(oScope_kill_func, .25);
EricGlunn 2:9a88de905577 199 break;
EricGlunn 2:9a88de905577 200
EricGlunn 2:9a88de905577 201 case ms500:
EricGlunn 2:9a88de905577 202 oScopeCut.attach(oScope_kill_func, .5);
EricGlunn 2:9a88de905577 203 break;
EricGlunn 2:9a88de905577 204
EricGlunn 2:9a88de905577 205 case ms1000:
EricGlunn 2:9a88de905577 206 oScopeCut.attach(oScope_kill_func, 1);
EricGlunn 2:9a88de905577 207 break;
EricGlunn 3:60f30ca6a65d 208 default:
EricGlunn 3:60f30ca6a65d 209 oScopeCut.attach(oScope_kill_func, .01);
EricGlunn 3:60f30ca6a65d 210 break;
EricGlunn 2:9a88de905577 211 }
EricGlunn 2:9a88de905577 212
EricGlunn 2:9a88de905577 213 oScopeTicker.attach_us(oScope_sample_func, 50);
EricGlunn 0:f4b1c6a95f25 214
EricGlunn 0:f4b1c6a95f25 215 }
EricGlunn 0:f4b1c6a95f25 216
EricGlunn 0:f4b1c6a95f25 217
EricGlunn 2:9a88de905577 218 void SerialInterrupt(void)
EricGlunn 2:9a88de905577 219 {
EricGlunn 2:9a88de905577 220 command=PC.getc();
EricGlunn 2:9a88de905577 221 state= command & stateMask;
EricGlunn 2:9a88de905577 222
EricGlunn 2:9a88de905577 223 switch(state) {
EricGlunn 2:9a88de905577 224 case reset:
EricGlunn 2:9a88de905577 225 tickerboi.detach(); //detach Ticker
EricGlunn 6:f2c589ad6241 226 digitalRunning=0; //turn off status LED
EricGlunn 6:f2c589ad6241 227 analogRunning=0;
EricGlunn 3:60f30ca6a65d 228
EricGlunn 6:f2c589ad6241 229 if(oScopeRunning){
EricGlunn 2:9a88de905577 230 oScope_kill_func();
EricGlunn 2:9a88de905577 231 }
EricGlunn 2:9a88de905577 232
EricGlunn 0:f4b1c6a95f25 233 break;
EricGlunn 2:9a88de905577 234
EricGlunn 2:9a88de905577 235 case digital:
EricGlunn 2:9a88de905577 236 tickerboi.attach(&digital_sample_func, .5);
EricGlunn 6:f2c589ad6241 237 digitalRunning=1; // turn on status LED
EricGlunn 2:9a88de905577 238 break;
EricGlunn 2:9a88de905577 239
EricGlunn 2:9a88de905577 240 case analog:
EricGlunn 2:9a88de905577 241 tickerboi.attach(&analog_sample_func, .5);
EricGlunn 6:f2c589ad6241 242 analogRunning=1;
EricGlunn 7:60e993355f76 243 break;
EricGlunn 2:9a88de905577 244
EricGlunn 2:9a88de905577 245 case oScope:
EricGlunn 2:9a88de905577 246 oScopeTime=command & timeMask;
EricGlunn 2:9a88de905577 247 oScope_poll=true;
EricGlunn 6:f2c589ad6241 248 oScopeRunning=1;
EricGlunn 5:6b72bf1da751 249 oScopeTriggerType= command & triggerType;
EricGlunn 5:6b72bf1da751 250 oScopeTriggerVoltageBit = command & triggerVolt;
EricGlunn 2:9a88de905577 251 break;
EricGlunn 2:9a88de905577 252 }
EricGlunn 0:f4b1c6a95f25 253 }
EricGlunn 0:f4b1c6a95f25 254
EricGlunn 2:9a88de905577 255 int main()
EricGlunn 2:9a88de905577 256 {
EricGlunn 2:9a88de905577 257 PC.attach(&SerialInterrupt, Serial::RxIrq);
EricGlunn 0:f4b1c6a95f25 258
EricGlunn 2:9a88de905577 259
EricGlunn 0:f4b1c6a95f25 260 while(1) {
EricGlunn 2:9a88de905577 261
EricGlunn 6:f2c589ad6241 262 DigitalStatus=digitalRunning;
EricGlunn 6:f2c589ad6241 263 AnalogStatus=analogRunning;
EricGlunn 6:f2c589ad6241 264 oScopeStatus=oScopeRunning;
EricGlunn 6:f2c589ad6241 265
EricGlunn 2:9a88de905577 266 if(newDigital) { //if digital sampling was run
EricGlunn 0:f4b1c6a95f25 267 PC.putc(DigitalSample);
EricGlunn 0:f4b1c6a95f25 268 newDigital=false;
EricGlunn 0:f4b1c6a95f25 269 }
EricGlunn 2:9a88de905577 270
EricGlunn 2:9a88de905577 271 if(newAnalog) { //if analog sampling was run
EricGlunn 2:9a88de905577 272 PC.putc(FULL); //First bit is 0b01000000
EricGlunn 2:9a88de905577 273 for(int i=0; i<5; i++) { //Send all of the analog bits
EricGlunn 2:9a88de905577 274 PC.putc(AnalogSample[i]);
EricGlunn 0:f4b1c6a95f25 275 }
EricGlunn 0:f4b1c6a95f25 276 PC.putc(command); //Last bit is command from PC
EricGlunn 0:f4b1c6a95f25 277 newAnalog=false;
EricGlunn 0:f4b1c6a95f25 278 }
EricGlunn 0:f4b1c6a95f25 279
EricGlunn 3:60f30ca6a65d 280 if(oScope_poll){
EricGlunn 3:60f30ca6a65d 281 oScope_poll=false;
EricGlunn 3:60f30ca6a65d 282 oScope_poll_trig(); }
EricGlunn 2:9a88de905577 283
EricGlunn 2:9a88de905577 284 if(newoScope){
EricGlunn 2:9a88de905577 285 PC.putc(FULL);
EricGlunn 3:60f30ca6a65d 286 for(int j=0; j<oScopeCount; j++){
EricGlunn 3:60f30ca6a65d 287 PC.putc(oScopeArray[j]);
EricGlunn 2:9a88de905577 288 }
EricGlunn 2:9a88de905577 289 oScopeCount=0;
EricGlunn 2:9a88de905577 290 newoScope=false;
EricGlunn 2:9a88de905577 291 }
EricGlunn 2:9a88de905577 292
EricGlunn 2:9a88de905577 293
EricGlunn 0:f4b1c6a95f25 294 myled = 1; //indicate main loop is running
EricGlunn 0:f4b1c6a95f25 295 wait(0.2);
EricGlunn 0:f4b1c6a95f25 296 myled = 0;
EricGlunn 2:9a88de905577 297 wait(0.2);
EricGlunn 0:f4b1c6a95f25 298 }
EricGlunn 0:f4b1c6a95f25 299 }
EricGlunn 0:f4b1c6a95f25 300
EricGlunn 0:f4b1c6a95f25 301
EricGlunn 0:f4b1c6a95f25 302