Contains all code needed for analog digital and oscope

Dependencies:   mbed

Committer:
EricGlunn
Date:
Wed Apr 22 20:19:52 2020 +0000
Revision:
5:6b72bf1da751
Parent:
4:374219f35b8e
Child:
6:f2c589ad6241
added oscope triggers with variable voltage levels

Who changed what in which revision?

UserRevisionLine numberNew contents of line
EricGlunn 0:f4b1c6a95f25 1 #include "mbed.h"
EricGlunn 2:9a88de905577 2
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 2:9a88de905577 78
EricGlunn 2:9a88de905577 79 void digital_sample_func(void) //sampling function, samples each pin specified and Ors it
EricGlunn 2:9a88de905577 80 {
EricGlunn 0:f4b1c6a95f25 81 DigitalSample = digital;
EricGlunn 2:9a88de905577 82
EricGlunn 2:9a88de905577 83 if( (command & pin1) == pin1) {
EricGlunn 0:f4b1c6a95f25 84 DigitalSample=DigitalSample + d1*pin1;
EricGlunn 0:f4b1c6a95f25 85 }
EricGlunn 2:9a88de905577 86 if( (command & pin2) == pin2) {
EricGlunn 0:f4b1c6a95f25 87 DigitalSample=DigitalSample + d2*pin2;
EricGlunn 0:f4b1c6a95f25 88 }
EricGlunn 2:9a88de905577 89 if( (command & pin3) == pin3) {
EricGlunn 0:f4b1c6a95f25 90 DigitalSample=DigitalSample + d3*pin3;
EricGlunn 0:f4b1c6a95f25 91 }
EricGlunn 2:9a88de905577 92 if( (command & pin4) == pin4) {
EricGlunn 0:f4b1c6a95f25 93 DigitalSample=DigitalSample + d4*pin4;
EricGlunn 0:f4b1c6a95f25 94 }
EricGlunn 2:9a88de905577 95 if( (command & pin5) == pin5) {
EricGlunn 0:f4b1c6a95f25 96 DigitalSample=DigitalSample + d5*pin5;
EricGlunn 0:f4b1c6a95f25 97 }
EricGlunn 0:f4b1c6a95f25 98 newDigital=true;
EricGlunn 0:f4b1c6a95f25 99 }
EricGlunn 0:f4b1c6a95f25 100
EricGlunn 0:f4b1c6a95f25 101
EricGlunn 2:9a88de905577 102 void analog_sample_func(void)
EricGlunn 2:9a88de905577 103 {
EricGlunn 2:9a88de905577 104 for(int i=0; i<5; i++) {
EricGlunn 2:9a88de905577 105 AnalogSample[i]=0;
EricGlunn 0:f4b1c6a95f25 106 }
EricGlunn 2:9a88de905577 107 if( (command & pin1) == pin1) {
EricGlunn 1:14e49afb1d7c 108 AnalogSample[0]=a1*254;
EricGlunn 0:f4b1c6a95f25 109 }
EricGlunn 2:9a88de905577 110 if( (command & pin2) == pin2) {
EricGlunn 1:14e49afb1d7c 111 AnalogSample[1]=a2 * 254;
EricGlunn 0:f4b1c6a95f25 112 }
EricGlunn 2:9a88de905577 113 if( (command & pin3) == pin3) {
EricGlunn 1:14e49afb1d7c 114 AnalogSample[2]=a3*254;
EricGlunn 0:f4b1c6a95f25 115 }
EricGlunn 2:9a88de905577 116 if( (command & pin4) == pin4) {
EricGlunn 1:14e49afb1d7c 117 AnalogSample[3]=a4*254;
EricGlunn 0:f4b1c6a95f25 118 }
EricGlunn 2:9a88de905577 119 if( (command & pin5) == pin5) {
EricGlunn 1:14e49afb1d7c 120 AnalogSample[4]=a5*254;
EricGlunn 0:f4b1c6a95f25 121 }
EricGlunn 2:9a88de905577 122 newAnalog=true;
EricGlunn 2:9a88de905577 123 }
EricGlunn 2:9a88de905577 124
EricGlunn 2:9a88de905577 125
EricGlunn 2:9a88de905577 126 void oScope_kill_func(void)
EricGlunn 2:9a88de905577 127 {
EricGlunn 2:9a88de905577 128 oScopeTicker.detach();
EricGlunn 2:9a88de905577 129 oScopeCut.detach();
EricGlunn 2:9a88de905577 130 newoScope=true;
EricGlunn 2:9a88de905577 131 oScopeStatus=0;
EricGlunn 2:9a88de905577 132 }
EricGlunn 2:9a88de905577 133
EricGlunn 2:9a88de905577 134 void oScope_sample_func(void){
EricGlunn 3:60f30ca6a65d 135 oScopeArray[oScopeCount++]=a1*254;
EricGlunn 2:9a88de905577 136 }
EricGlunn 2:9a88de905577 137
EricGlunn 2:9a88de905577 138 void oScope_poll_trig(){
EricGlunn 4:374219f35b8e 139 bool nTriggered = true;
EricGlunn 4:374219f35b8e 140 myled=1;
EricGlunn 4:374219f35b8e 141 unsigned char trig;
EricGlunn 4:374219f35b8e 142 int state =0;
EricGlunn 5:6b72bf1da751 143 if(oScopeTriggerVoltageBit == volt11){oScopeTriggerVoltageVal=85;}
EricGlunn 5:6b72bf1da751 144 else{oScopeTriggerVoltageVal=169;}
EricGlunn 2:9a88de905577 145
EricGlunn 4:374219f35b8e 146 while(nTriggered){
EricGlunn 4:374219f35b8e 147
EricGlunn 4:374219f35b8e 148 trig=a1*254;
EricGlunn 4:374219f35b8e 149 switch(state){
EricGlunn 4:374219f35b8e 150
EricGlunn 4:374219f35b8e 151 case 0:
EricGlunn 5:6b72bf1da751 152 if((trig < oScopeTriggerVoltageVal) & (oScopeTriggerType == rise) ){state = 1;}
EricGlunn 5:6b72bf1da751 153 else if((trig > oScopeTriggerVoltageVal) & (oScopeTriggerType == fall) ){state = 2;}
EricGlunn 4:374219f35b8e 154 else { state = 0;}
EricGlunn 4:374219f35b8e 155 break;
EricGlunn 4:374219f35b8e 156 case 1:
EricGlunn 5:6b72bf1da751 157 if(trig < oScopeTriggerVoltageVal){state=1;}
EricGlunn 5:6b72bf1da751 158 if(trig > oScopeTriggerVoltageVal){state=3;}
EricGlunn 4:374219f35b8e 159 break;
EricGlunn 4:374219f35b8e 160 case 2:
EricGlunn 5:6b72bf1da751 161 if(trig > oScopeTriggerVoltageVal){state = 2;}
EricGlunn 5:6b72bf1da751 162 if(trig < oScopeTriggerVoltageVal){state = 3;}
EricGlunn 4:374219f35b8e 163 break;
EricGlunn 4:374219f35b8e 164 case 3:
EricGlunn 4:374219f35b8e 165 nTriggered=false;
EricGlunn 4:374219f35b8e 166 break;
EricGlunn 4:374219f35b8e 167 }
EricGlunn 4:374219f35b8e 168 wait(.01);
EricGlunn 4:374219f35b8e 169 }
EricGlunn 4:374219f35b8e 170 myled=0;
EricGlunn 2:9a88de905577 171 switch(oScopeTime) {
EricGlunn 2:9a88de905577 172
EricGlunn 2:9a88de905577 173 case ms1:
EricGlunn 2:9a88de905577 174 oScopeCut.attach(oScope_kill_func, .001);
EricGlunn 2:9a88de905577 175 break;
EricGlunn 2:9a88de905577 176
EricGlunn 2:9a88de905577 177 case ms5:
EricGlunn 2:9a88de905577 178 oScopeCut.attach(oScope_kill_func, .005);
EricGlunn 2:9a88de905577 179 break;
EricGlunn 2:9a88de905577 180
EricGlunn 2:9a88de905577 181 case ms10:
EricGlunn 2:9a88de905577 182 oScopeCut.attach(oScope_kill_func, .01);
EricGlunn 2:9a88de905577 183 break;
EricGlunn 2:9a88de905577 184
EricGlunn 2:9a88de905577 185 case ms50:
EricGlunn 2:9a88de905577 186 oScopeCut.attach(oScope_kill_func, .05);
EricGlunn 2:9a88de905577 187 break;
EricGlunn 2:9a88de905577 188
EricGlunn 2:9a88de905577 189 case ms100:
EricGlunn 2:9a88de905577 190 oScopeCut.attach(oScope_kill_func, .1);
EricGlunn 2:9a88de905577 191 break;
EricGlunn 2:9a88de905577 192
EricGlunn 2:9a88de905577 193 case ms250:
EricGlunn 2:9a88de905577 194 oScopeCut.attach(oScope_kill_func, .25);
EricGlunn 2:9a88de905577 195 break;
EricGlunn 2:9a88de905577 196
EricGlunn 2:9a88de905577 197 case ms500:
EricGlunn 2:9a88de905577 198 oScopeCut.attach(oScope_kill_func, .5);
EricGlunn 2:9a88de905577 199 break;
EricGlunn 2:9a88de905577 200
EricGlunn 2:9a88de905577 201 case ms1000:
EricGlunn 2:9a88de905577 202 oScopeCut.attach(oScope_kill_func, 1);
EricGlunn 2:9a88de905577 203 break;
EricGlunn 3:60f30ca6a65d 204 default:
EricGlunn 3:60f30ca6a65d 205 oScopeCut.attach(oScope_kill_func, .01);
EricGlunn 3:60f30ca6a65d 206 break;
EricGlunn 2:9a88de905577 207 }
EricGlunn 2:9a88de905577 208
EricGlunn 2:9a88de905577 209 oScopeTicker.attach_us(oScope_sample_func, 50);
EricGlunn 0:f4b1c6a95f25 210
EricGlunn 0:f4b1c6a95f25 211 }
EricGlunn 0:f4b1c6a95f25 212
EricGlunn 0:f4b1c6a95f25 213
EricGlunn 2:9a88de905577 214 void SerialInterrupt(void)
EricGlunn 2:9a88de905577 215 {
EricGlunn 2:9a88de905577 216 command=PC.getc();
EricGlunn 2:9a88de905577 217 state= command & stateMask;
EricGlunn 2:9a88de905577 218
EricGlunn 2:9a88de905577 219 switch(state) {
EricGlunn 2:9a88de905577 220 case reset:
EricGlunn 2:9a88de905577 221 tickerboi.detach(); //detach Ticker
EricGlunn 2:9a88de905577 222 DigitalStatus=0; //turn off status LED
EricGlunn 2:9a88de905577 223 AnalogStatus=0;
EricGlunn 3:60f30ca6a65d 224
EricGlunn 2:9a88de905577 225 if(oScopeStatus){
EricGlunn 2:9a88de905577 226 oScope_kill_func();
EricGlunn 2:9a88de905577 227 }
EricGlunn 2:9a88de905577 228
EricGlunn 0:f4b1c6a95f25 229 break;
EricGlunn 2:9a88de905577 230
EricGlunn 2:9a88de905577 231 case digital:
EricGlunn 2:9a88de905577 232 tickerboi.attach(&digital_sample_func, .5);
EricGlunn 2:9a88de905577 233 DigitalStatus=1; // turn on status LED
EricGlunn 2:9a88de905577 234 break;
EricGlunn 2:9a88de905577 235
EricGlunn 2:9a88de905577 236 case analog:
EricGlunn 2:9a88de905577 237 tickerboi.attach(&analog_sample_func, .5);
EricGlunn 2:9a88de905577 238 AnalogStatus=1;
EricGlunn 2:9a88de905577 239
EricGlunn 2:9a88de905577 240 case oScope:
EricGlunn 2:9a88de905577 241 oScopeTime=command & timeMask;
EricGlunn 2:9a88de905577 242 oScope_poll=true;
EricGlunn 2:9a88de905577 243 oScopeStatus=1;
EricGlunn 5:6b72bf1da751 244 oScopeTriggerType= command & triggerType;
EricGlunn 5:6b72bf1da751 245 oScopeTriggerVoltageBit = command & triggerVolt;
EricGlunn 2:9a88de905577 246 break;
EricGlunn 2:9a88de905577 247 }
EricGlunn 0:f4b1c6a95f25 248 }
EricGlunn 0:f4b1c6a95f25 249
EricGlunn 2:9a88de905577 250 int main()
EricGlunn 2:9a88de905577 251 {
EricGlunn 2:9a88de905577 252 PC.attach(&SerialInterrupt, Serial::RxIrq);
EricGlunn 0:f4b1c6a95f25 253
EricGlunn 2:9a88de905577 254
EricGlunn 0:f4b1c6a95f25 255 while(1) {
EricGlunn 2:9a88de905577 256
EricGlunn 2:9a88de905577 257 if(newDigital) { //if digital sampling was run
EricGlunn 0:f4b1c6a95f25 258 PC.putc(DigitalSample);
EricGlunn 0:f4b1c6a95f25 259 newDigital=false;
EricGlunn 0:f4b1c6a95f25 260 }
EricGlunn 2:9a88de905577 261
EricGlunn 2:9a88de905577 262 if(newAnalog) { //if analog sampling was run
EricGlunn 2:9a88de905577 263 PC.putc(FULL); //First bit is 0b01000000
EricGlunn 2:9a88de905577 264 for(int i=0; i<5; i++) { //Send all of the analog bits
EricGlunn 2:9a88de905577 265 PC.putc(AnalogSample[i]);
EricGlunn 0:f4b1c6a95f25 266 }
EricGlunn 0:f4b1c6a95f25 267 PC.putc(command); //Last bit is command from PC
EricGlunn 0:f4b1c6a95f25 268 newAnalog=false;
EricGlunn 0:f4b1c6a95f25 269 }
EricGlunn 0:f4b1c6a95f25 270
EricGlunn 3:60f30ca6a65d 271 if(oScope_poll){
EricGlunn 3:60f30ca6a65d 272 oScope_poll=false;
EricGlunn 3:60f30ca6a65d 273 oScope_poll_trig(); }
EricGlunn 2:9a88de905577 274
EricGlunn 2:9a88de905577 275 if(newoScope){
EricGlunn 2:9a88de905577 276 PC.putc(FULL);
EricGlunn 3:60f30ca6a65d 277 for(int j=0; j<oScopeCount; j++){
EricGlunn 3:60f30ca6a65d 278 PC.putc(oScopeArray[j]);
EricGlunn 2:9a88de905577 279 }
EricGlunn 2:9a88de905577 280 oScopeCount=0;
EricGlunn 2:9a88de905577 281 newoScope=false;
EricGlunn 2:9a88de905577 282 }
EricGlunn 2:9a88de905577 283
EricGlunn 2:9a88de905577 284
EricGlunn 0:f4b1c6a95f25 285 myled = 1; //indicate main loop is running
EricGlunn 0:f4b1c6a95f25 286 wait(0.2);
EricGlunn 0:f4b1c6a95f25 287 myled = 0;
EricGlunn 2:9a88de905577 288 wait(0.2);
EricGlunn 0:f4b1c6a95f25 289 }
EricGlunn 0:f4b1c6a95f25 290 }
EricGlunn 0:f4b1c6a95f25 291
EricGlunn 0:f4b1c6a95f25 292
EricGlunn 0:f4b1c6a95f25 293