![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Contains all code needed for analog digital and oscope
main.cpp@4:374219f35b8e, 2020-04-22 (annotated)
- 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?
User | Revision | Line number | New 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 |