Contains all code needed for analog digital and oscope

Dependencies:   mbed

Committer:
EricGlunn
Date:
Wed Apr 22 19:42:30 2020 +0000
Revision:
4:374219f35b8e
Parent:
3:60f30ca6a65d
Child:
5:6b72bf1da751
Oscope trigger works;

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