Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of TestAnalogInPins by
main.cpp@2:f2583b56777e, 2016-05-11 (annotated)
- Committer:
- skanderian
- Date:
- Wed May 11 16:13:49 2016 +0000
- Revision:
- 2:f2583b56777e
- Parent:
- 1:610dc7763656
- Child:
- 3:3b45e830ebe1
Sens desired pin # as hex. Example: #FE000100 gives readout for pin 1, #FE000F00 gives readout for pin 15
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| skanderian | 2:f2583b56777e | 1 | //Chesapeake Embedded code by Sami Kanderian. Date of last update (version) shown below. |
| skanderian | 0:ce79b04fc2ca | 2 | #include "mbed.h" |
| skanderian | 2:f2583b56777e | 3 | #include "string" |
| skanderian | 2:f2583b56777e | 4 | #include "iostream" |
| skanderian | 2:f2583b56777e | 5 | #include "math.h" |
| skanderian | 2:f2583b56777e | 6 | //#include "stdio.h" |
| skanderian | 1:610dc7763656 | 7 | //#include "rtos.h" |
| skanderian | 1:610dc7763656 | 8 | |
| skanderian | 0:ce79b04fc2ca | 9 | //Declare hardware inputs |
| skanderian | 0:ce79b04fc2ca | 10 | Timer timer; |
| skanderian | 2:f2583b56777e | 11 | Serial serial(USBTX, USBRX); |
| skanderian | 2:f2583b56777e | 12 | //IMPORTANT NOTE: PTA1 and PTA2 ARE RESERVED FOR SERIAL COMMUNICATION!!! DO NOT USE FOR SENSOR/ACTUATOR I/O!!! |
| skanderian | 2:f2583b56777e | 13 | |
| skanderian | 2:f2583b56777e | 14 | //Analog inputs : 0-3.3V |
| skanderian | 2:f2583b56777e | 15 | AnalogIn pin1(PTE20); |
| skanderian | 2:f2583b56777e | 16 | AnalogIn pin2(PTB0); |
| skanderian | 2:f2583b56777e | 17 | AnalogIn pin3(PTE21);//should be 16bit but doesnt work on mbed |
| skanderian | 2:f2583b56777e | 18 | AnalogIn pin4(PTB1); |
| skanderian | 2:f2583b56777e | 19 | AnalogIn pin5(PTE22); |
| skanderian | 2:f2583b56777e | 20 | AnalogIn pin6(PTB2); |
| skanderian | 2:f2583b56777e | 21 | AnalogIn pin7(PTE23); |
| skanderian | 2:f2583b56777e | 22 | AnalogIn pin8(PTB3); |
| skanderian | 2:f2583b56777e | 23 | AnalogIn pin9(PTE29); |
| skanderian | 2:f2583b56777e | 24 | AnalogIn pin10(PTC2); |
| skanderian | 2:f2583b56777e | 25 | AnalogIn pin11(PTE30); |
| skanderian | 2:f2583b56777e | 26 | AnalogIn pin12(PTC1); |
| skanderian | 2:f2583b56777e | 27 | AnalogIn pin13(PTC0); |
| skanderian | 2:f2583b56777e | 28 | AnalogIn pin14(PTD1);// doesnt work. Seems to be stuck at 3.3 |
| skanderian | 2:f2583b56777e | 29 | AnalogIn pin15(PTD5); |
| skanderian | 2:f2583b56777e | 30 | AnalogIn pin16(PTD6); |
| skanderian | 2:f2583b56777e | 31 | |
| skanderian | 2:f2583b56777e | 32 | //Built in LEDs |
| skanderian | 2:f2583b56777e | 33 | PwmOut rLed(LED_RED); |
| skanderian | 2:f2583b56777e | 34 | PwmOut gLed(LED_GREEN); |
| skanderian | 2:f2583b56777e | 35 | PwmOut bLed(LED_BLUE); |
| skanderian | 2:f2583b56777e | 36 | |
| skanderian | 2:f2583b56777e | 37 | //Date version as global |
| skanderian | 2:f2583b56777e | 38 | string dateVersion = "#Microcontroller Detected! uC code ver.: 04.12.2016"; |
| skanderian | 2:f2583b56777e | 39 | |
| skanderian | 2:f2583b56777e | 40 | //New globals for RxInterrupt routine |
| skanderian | 2:f2583b56777e | 41 | const int bufferSize = 256; |
| skanderian | 2:f2583b56777e | 42 | char rxBuffer[bufferSize]; |
| skanderian | 2:f2583b56777e | 43 | char txBuffer[bufferSize]; |
| skanderian | 2:f2583b56777e | 44 | volatile int rxIn = 0; |
| skanderian | 2:f2583b56777e | 45 | volatile int rxOut = 0; |
| skanderian | 2:f2583b56777e | 46 | bool rxFlag = 0; |
| skanderian | 0:ce79b04fc2ca | 47 | |
| skanderian | 0:ce79b04fc2ca | 48 | //Declare globals |
| skanderian | 1:610dc7763656 | 49 | char hexCCIn[2]; |
| skanderian | 1:610dc7763656 | 50 | char hexDDDDIn[4]; |
| skanderian | 1:610dc7763656 | 51 | int decCCIn; |
| skanderian | 1:610dc7763656 | 52 | int decDDDDIn; |
| skanderian | 1:610dc7763656 | 53 | |
| skanderian | 2:f2583b56777e | 54 | |
| skanderian | 2:f2583b56777e | 55 | void ledConfirmSent()//Light up blue LED 10% |
| skanderian | 2:f2583b56777e | 56 | { |
| skanderian | 2:f2583b56777e | 57 | rLed = 1; |
| skanderian | 2:f2583b56777e | 58 | gLed = 1; |
| skanderian | 2:f2583b56777e | 59 | bLed = 0.9; |
| skanderian | 2:f2583b56777e | 60 | } |
| skanderian | 2:f2583b56777e | 61 | |
| skanderian | 2:f2583b56777e | 62 | void ledConfirmReceive()//Light up green LED 10% |
| skanderian | 2:f2583b56777e | 63 | { |
| skanderian | 2:f2583b56777e | 64 | rLed = 1; |
| skanderian | 2:f2583b56777e | 65 | gLed = 0.9; |
| skanderian | 2:f2583b56777e | 66 | bLed = 1; |
| skanderian | 2:f2583b56777e | 67 | } |
| skanderian | 0:ce79b04fc2ca | 68 | |
| skanderian | 2:f2583b56777e | 69 | void sendAnalogIn(int pinNum) //send Analog input in V |
| skanderian | 2:f2583b56777e | 70 | { |
| skanderian | 2:f2583b56777e | 71 | |
| skanderian | 2:f2583b56777e | 72 | //serial.printf("\r\n"); |
| skanderian | 2:f2583b56777e | 73 | if (pinNum == 0 || pinNum == 1) { |
| skanderian | 2:f2583b56777e | 74 | serial.printf("%s%03.1f%s\r\n", "#PTE20: ", 3.3f*pin1.read(), "V^"); |
| skanderian | 2:f2583b56777e | 75 | } |
| skanderian | 2:f2583b56777e | 76 | if (pinNum == 0 || pinNum == 2) { |
| skanderian | 2:f2583b56777e | 77 | serial.printf("%s%03.1f%s\r\n", "#PTB0: ", 3.3f*pin2.read(), "V^"); |
| skanderian | 2:f2583b56777e | 78 | } |
| skanderian | 2:f2583b56777e | 79 | if (pinNum == 0 || pinNum == 3) { |
| skanderian | 2:f2583b56777e | 80 | serial.printf("%s%03.1f%s\r\n", "#PTE21: ", 3.3f*pin3.read(), "V^"); |
| skanderian | 2:f2583b56777e | 81 | } |
| skanderian | 2:f2583b56777e | 82 | if (pinNum == 0 || pinNum == 4) { |
| skanderian | 2:f2583b56777e | 83 | serial.printf("%s%03.1f%s\r\n", "#PTB1: ", 3.3f*pin4.read(), "V^"); |
| skanderian | 2:f2583b56777e | 84 | } |
| skanderian | 2:f2583b56777e | 85 | if (pinNum == 0 || pinNum == 5) { |
| skanderian | 2:f2583b56777e | 86 | serial.printf("%s%03.1f%s\r\n", "#PTE22: ", 3.3f*pin5.read(), "V^"); |
| skanderian | 2:f2583b56777e | 87 | } |
| skanderian | 2:f2583b56777e | 88 | if (pinNum == 0 || pinNum == 6) { |
| skanderian | 2:f2583b56777e | 89 | serial.printf("%s%03.1f%s\r\n", "#PTB2: ", 3.3f*pin6.read(), "V^"); |
| skanderian | 2:f2583b56777e | 90 | } |
| skanderian | 2:f2583b56777e | 91 | if (pinNum == 0 || pinNum == 7) { |
| skanderian | 2:f2583b56777e | 92 | serial.printf("%s%03.1f%s\r\n", "#PTE23: ", 3.3f*pin7.read(), "V^"); |
| skanderian | 2:f2583b56777e | 93 | } |
| skanderian | 2:f2583b56777e | 94 | if (pinNum == 0 || pinNum == 8) { |
| skanderian | 2:f2583b56777e | 95 | serial.printf("%s%03.1f%s\r\n", "#PTB3: ", 3.3f*pin8.read(), "V^"); |
| skanderian | 2:f2583b56777e | 96 | } |
| skanderian | 2:f2583b56777e | 97 | if (pinNum == 0 || pinNum == 9) { |
| skanderian | 2:f2583b56777e | 98 | serial.printf("%s%03.1f%s\r\n", "#PTE29: ", 3.3f*pin9.read(), "V^"); |
| skanderian | 2:f2583b56777e | 99 | } |
| skanderian | 2:f2583b56777e | 100 | if (pinNum == 0 || pinNum == 10) { |
| skanderian | 2:f2583b56777e | 101 | serial.printf("%s%03.1f%s\r\n", "#PTC2: ", 3.3f*pin10.read(), "V^"); |
| skanderian | 2:f2583b56777e | 102 | } |
| skanderian | 2:f2583b56777e | 103 | if (pinNum == 0 || pinNum == 11) { |
| skanderian | 2:f2583b56777e | 104 | serial.printf("%s%03.1f%s\r\n", "#PTE30: ", 3.3f*pin11.read(), "V^"); |
| skanderian | 2:f2583b56777e | 105 | } |
| skanderian | 2:f2583b56777e | 106 | if (pinNum == 0 || pinNum == 12) { |
| skanderian | 2:f2583b56777e | 107 | serial.printf("%s%03.1f%s\r\n", "#PTC1: ", 3.3f*pin12.read(), "V^"); |
| skanderian | 2:f2583b56777e | 108 | } |
| skanderian | 2:f2583b56777e | 109 | if (pinNum == 0 || pinNum == 13) { |
| skanderian | 2:f2583b56777e | 110 | serial.printf("%s%03.1f%s\r\n", "#PTC0: ", 3.3f*pin13.read(), "V^"); |
| skanderian | 2:f2583b56777e | 111 | } |
| skanderian | 2:f2583b56777e | 112 | if (pinNum == 0 || pinNum == 14) { |
| skanderian | 2:f2583b56777e | 113 | serial.printf("%s%03.1f%s\r\n", "#PTD1: ", 3.3f*pin14.read(), "V^"); |
| skanderian | 2:f2583b56777e | 114 | } |
| skanderian | 2:f2583b56777e | 115 | if (pinNum == 0 || pinNum == 15) { |
| skanderian | 2:f2583b56777e | 116 | serial.printf("%s%03.1f%s\r\n", "#PTD5: ", 3.3f*pin15.read(), "V^"); |
| skanderian | 2:f2583b56777e | 117 | } |
| skanderian | 2:f2583b56777e | 118 | if (pinNum == 0 || pinNum == 16) { |
| skanderian | 2:f2583b56777e | 119 | serial.printf("%s%03.1f%s\r\n", "#PTD6: ", 3.3f*pin16.read(), "V^"); |
| skanderian | 2:f2583b56777e | 120 | } |
| skanderian | 0:ce79b04fc2ca | 121 | |
| skanderian | 2:f2583b56777e | 122 | ledConfirmSent(); |
| skanderian | 0:ce79b04fc2ca | 123 | } |
| skanderian | 0:ce79b04fc2ca | 124 | |
| skanderian | 2:f2583b56777e | 125 | string decToHexDDDD(int i) { |
| skanderian | 2:f2583b56777e | 126 | //Do twos complement to handle negative numbers |
| skanderian | 2:f2583b56777e | 127 | if (i < 0) { |
| skanderian | 2:f2583b56777e | 128 | i = 32767 - i; |
| skanderian | 2:f2583b56777e | 129 | } |
| skanderian | 2:f2583b56777e | 130 | char hex_string[10]; |
| skanderian | 2:f2583b56777e | 131 | sprintf(hex_string, "0x%02X", i); |
| skanderian | 2:f2583b56777e | 132 | return string(hex_string); |
| skanderian | 2:f2583b56777e | 133 | } |
| skanderian | 2:f2583b56777e | 134 | |
| skanderian | 2:f2583b56777e | 135 | int hexDDDDToDec(char hex[]) { |
| skanderian | 2:f2583b56777e | 136 | int decValue = strtol(hex, NULL, 16); |
| skanderian | 2:f2583b56777e | 137 | if (decValue >= 32768) { //Do twos complement to handle negative numbers |
| skanderian | 2:f2583b56777e | 138 | decValue = 32767 - decValue; |
| skanderian | 2:f2583b56777e | 139 | } |
| skanderian | 2:f2583b56777e | 140 | return decValue; |
| skanderian | 2:f2583b56777e | 141 | } |
| skanderian | 2:f2583b56777e | 142 | |
| skanderian | 2:f2583b56777e | 143 | int hexToDec(char hex[]) { |
| skanderian | 2:f2583b56777e | 144 | int decValue = strtol(hex, NULL, 16); |
| skanderian | 2:f2583b56777e | 145 | return decValue; |
| skanderian | 2:f2583b56777e | 146 | } |
| skanderian | 2:f2583b56777e | 147 | |
| skanderian | 2:f2583b56777e | 148 | int hexToDecSub(char hex[], int st, int ed) { |
| skanderian | 2:f2583b56777e | 149 | int n = ed - st + 1; |
| skanderian | 2:f2583b56777e | 150 | char hexSubset[n]; |
| skanderian | 2:f2583b56777e | 151 | for (int i = st; i < ed + 1; i++) { |
| skanderian | 2:f2583b56777e | 152 | hexSubset[i - st] = hex[i]; |
| skanderian | 2:f2583b56777e | 153 | } |
| skanderian | 2:f2583b56777e | 154 | int decValue = strtol(hexSubset, NULL, 16); |
| skanderian | 2:f2583b56777e | 155 | return decValue; |
| skanderian | 0:ce79b04fc2ca | 156 | } |
| skanderian | 0:ce79b04fc2ca | 157 | |
| skanderian | 2:f2583b56777e | 158 | void sendHexDDDDValTimes100(float val) { |
| skanderian | 2:f2583b56777e | 159 | int valTimes100 = (int) ((100 * val)); |
| skanderian | 2:f2583b56777e | 160 | string hexDDDD = decToHexDDDD(valTimes100); |
| skanderian | 2:f2583b56777e | 161 | int nLeadingZeros = 4 - hexDDDD.length(); |
| skanderian | 1:610dc7763656 | 162 | |
| skanderian | 2:f2583b56777e | 163 | char hexDDDDout[hexDDDD.length()]; |
| skanderian | 2:f2583b56777e | 164 | for (int i = 0; i < hexDDDD.length(); i++) { |
| skanderian | 2:f2583b56777e | 165 | hexDDDDout[i] = hexDDDD[i]; |
| skanderian | 2:f2583b56777e | 166 | } |
| skanderian | 2:f2583b56777e | 167 | char leadingZeros[nLeadingZeros]; |
| skanderian | 2:f2583b56777e | 168 | for (int i = 0; i < nLeadingZeros; i++) { |
| skanderian | 2:f2583b56777e | 169 | leadingZeros[i] = '0'; |
| skanderian | 2:f2583b56777e | 170 | } |
| skanderian | 2:f2583b56777e | 171 | //serial.printf("#%s%saa^\r\n", leadingZeros, hexDDDDout); |
| skanderian | 2:f2583b56777e | 172 | serial.printf("#%s%saa", leadingZeros, hexDDDDout); |
| skanderian | 2:f2583b56777e | 173 | //ledConfirmSent(); |
| skanderian | 0:ce79b04fc2ca | 174 | } |
| skanderian | 0:ce79b04fc2ca | 175 | |
| skanderian | 2:f2583b56777e | 176 | void runSingleCommand(int comInd) { |
| skanderian | 2:f2583b56777e | 177 | int endBuffer = (comInd + 1)*8; |
| skanderian | 2:f2583b56777e | 178 | int startBuffer = endBuffer - 7; |
| skanderian | 2:f2583b56777e | 179 | |
| skanderian | 2:f2583b56777e | 180 | //get hexCCIn |
| skanderian | 2:f2583b56777e | 181 | for (int i = 0; i < 2; i++) { |
| skanderian | 2:f2583b56777e | 182 | hexCCIn[i] = rxBuffer[i + startBuffer]; |
| skanderian | 2:f2583b56777e | 183 | } |
| skanderian | 2:f2583b56777e | 184 | //serial.printf("hexCCIn= is %s\r\n", hexCCIn); |
| skanderian | 2:f2583b56777e | 185 | |
| skanderian | 2:f2583b56777e | 186 | for (int i = 0; i < 4; i++) { |
| skanderian | 2:f2583b56777e | 187 | hexDDDDIn[i] = rxBuffer[i + startBuffer + 2]; |
| skanderian | 0:ce79b04fc2ca | 188 | } |
| skanderian | 0:ce79b04fc2ca | 189 | |
| skanderian | 2:f2583b56777e | 190 | decCCIn = hexToDec(hexCCIn); |
| skanderian | 2:f2583b56777e | 191 | decDDDDIn = hexDDDDToDec(hexDDDDIn); |
| skanderian | 2:f2583b56777e | 192 | |
| skanderian | 2:f2583b56777e | 193 | //Make sure incoming checksum pans out: DO THIS LATER |
| skanderian | 2:f2583b56777e | 194 | |
| skanderian | 2:f2583b56777e | 195 | if (comInd == 0) { //include # if first command |
| skanderian | 2:f2583b56777e | 196 | startBuffer = startBuffer - 1; |
| skanderian | 2:f2583b56777e | 197 | } |
| skanderian | 2:f2583b56777e | 198 | int i2 = 0; |
| skanderian | 2:f2583b56777e | 199 | for (int i = startBuffer; i <= endBuffer; i++) { // duplicate bytes 0 to 9 for now; |
| skanderian | 2:f2583b56777e | 200 | txBuffer[i2] = rxBuffer[i]; |
| skanderian | 2:f2583b56777e | 201 | i2++; |
| skanderian | 2:f2583b56777e | 202 | } |
| skanderian | 2:f2583b56777e | 203 | |
| skanderian | 2:f2583b56777e | 204 | //Do action based on CC: already in while loop |
| skanderian | 2:f2583b56777e | 205 | |
| skanderian | 0:ce79b04fc2ca | 206 | |
| skanderian | 0:ce79b04fc2ca | 207 | } |
| skanderian | 0:ce79b04fc2ca | 208 | |
| skanderian | 2:f2583b56777e | 209 | void runWhenNewSerialIn() { |
| skanderian | 2:f2583b56777e | 210 | int nCommands = (rxIn - 1) / 8; //find out how many commands are sent in one serial message |
| skanderian | 2:f2583b56777e | 211 | //serial.printf("%s%d%s\r\n", "#nCommands: ", nCommands, "commands"); |
| skanderian | 2:f2583b56777e | 212 | for (int comInd = 0; comInd < nCommands; comInd++) { // duplicate bytes 0 to 9 for now; |
| skanderian | 2:f2583b56777e | 213 | runSingleCommand(comInd); |
| skanderian | 2:f2583b56777e | 214 | } |
| skanderian | 2:f2583b56777e | 215 | serial.printf("^\r\n"); //end line after responses to all commands returned |
| skanderian | 2:f2583b56777e | 216 | } |
| skanderian | 1:610dc7763656 | 217 | |
| skanderian | 2:f2583b56777e | 218 | void Rx_interrupt() { |
| skanderian | 2:f2583b56777e | 219 | // Loop just in case more than one character is in UART's receive FIFO buffer |
| skanderian | 2:f2583b56777e | 220 | // Stop if buffer full |
| skanderian | 2:f2583b56777e | 221 | //while ((serial.readable()) && (((rxIn + 1) % bufferSize) != 0)) { |
| skanderian | 2:f2583b56777e | 222 | while (serial.readable()) { |
| skanderian | 2:f2583b56777e | 223 | rxBuffer[rxIn] = serial.getc(); |
| skanderian | 2:f2583b56777e | 224 | if (rxBuffer[rxIn] == '\r') { //looking for character not string (string is double quotes) \r is CR, \n is LF |
| skanderian | 2:f2583b56777e | 225 | rxFlag = 1; |
| skanderian | 2:f2583b56777e | 226 | //Turn built in LED blue (at half intensity) to confirm command recieved |
| skanderian | 2:f2583b56777e | 227 | ledConfirmReceive(); |
| skanderian | 2:f2583b56777e | 228 | //Execute runWhenNewSerialIn when new Rx recieved (ending with \r) |
| skanderian | 2:f2583b56777e | 229 | runWhenNewSerialIn(); |
| skanderian | 2:f2583b56777e | 230 | rxFlag = 0; //reset flag to listen for next message |
| skanderian | 2:f2583b56777e | 231 | rxIn = 0; // reset position index to 0 |
| skanderian | 1:610dc7763656 | 232 | |
| skanderian | 2:f2583b56777e | 233 | } else { |
| skanderian | 2:f2583b56777e | 234 | rxIn = (rxIn + 1) % bufferSize; |
| skanderian | 1:610dc7763656 | 235 | } |
| skanderian | 1:610dc7763656 | 236 | } |
| skanderian | 1:610dc7763656 | 237 | } |
| skanderian | 0:ce79b04fc2ca | 238 | |
| skanderian | 2:f2583b56777e | 239 | int main() { |
| skanderian | 2:f2583b56777e | 240 | |
| skanderian | 2:f2583b56777e | 241 | serial.baud(9600); |
| skanderian | 2:f2583b56777e | 242 | serial.attach(&Rx_interrupt, Serial::RxIrq); |
| skanderian | 0:ce79b04fc2ca | 243 | |
| skanderian | 2:f2583b56777e | 244 | //rLed.period(0.001f); |
| skanderian | 2:f2583b56777e | 245 | //gLed.period(0.001f); |
| skanderian | 2:f2583b56777e | 246 | //bLed.period(0.001f); |
| skanderian | 2:f2583b56777e | 247 | |
| skanderian | 0:ce79b04fc2ca | 248 | |
| skanderian | 2:f2583b56777e | 249 | //flash LED blue then green on startup or system reset |
| skanderian | 2:f2583b56777e | 250 | //serial.printf("Before Blue on Startup^\r\n"); |
| skanderian | 2:f2583b56777e | 251 | ledConfirmSent(); |
| skanderian | 2:f2583b56777e | 252 | ledConfirmReceive(); |
| skanderian | 2:f2583b56777e | 253 | //serial.printf("After Green on Startup^\r\n"); |
| skanderian | 2:f2583b56777e | 254 | timer.start(); |
| skanderian | 0:ce79b04fc2ca | 255 | |
| skanderian | 2:f2583b56777e | 256 | while (1) { |
| skanderian | 2:f2583b56777e | 257 | //scanf("%10s", rxBuffer);// NO! Use Rx_interrupt instead! |
| skanderian | 2:f2583b56777e | 258 | //Always keep running computePressureCommand when pump is enabled (runPump=true) |
| skanderian | 2:f2583b56777e | 259 | sendAnalogIn(decDDDDIn); |
| skanderian | 2:f2583b56777e | 260 | wait(1); |
| skanderian | 0:ce79b04fc2ca | 261 | } |
| skanderian | 0:ce79b04fc2ca | 262 | } |
