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.
main.cpp@3:3b45e830ebe1, 2016-05-11 (annotated)
- Committer:
- skanderian
- Date:
- Wed May 11 20:20:13 2016 +0000
- Revision:
- 3:3b45e830ebe1
- Parent:
- 2:f2583b56777e
- Child:
- 4:9e93bf4863cb
Cleaned up version, no hex. Serial input takes form '#XX' where XX goes from '00' to '16'
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
skanderian | 3:3b45e830ebe1 | 1 | /*TestAnalogInPins: written by Sami Kanderian, last updated on 11 May 2016. It continuously reads |
skanderian | 3:3b45e830ebe1 | 2 | and prints 16 Analog Input Pin voltages on the NPX Freescale FRDM-KL25Z microprocessor board via |
skanderian | 3:3b45e830ebe1 | 3 | Serial inputs registered via an RX Interrupt trigger that changes the value of charCCIn, where |
skanderian | 3:3b45e830ebe1 | 4 | charCCIn goes from '00' to '16'. charCCIn should be preceeded by a '#'. Serial baud rate is 9600. |
skanderian | 3:3b45e830ebe1 | 5 | The data acquisition rate is defined by the variable updatePeriodMs. |
skanderian | 3:3b45e830ebe1 | 6 | |
skanderian | 3:3b45e830ebe1 | 7 | Serial inputs followed by Carriage Return: |
skanderian | 3:3b45e830ebe1 | 8 | '#00': print analog input voltages on all pins (deafault printout on startup) |
skanderian | 3:3b45e830ebe1 | 9 | '#01': print analog input voltage on pin PTE20 |
skanderian | 3:3b45e830ebe1 | 10 | '#02': print analog input voltage on pin PTB0 |
skanderian | 3:3b45e830ebe1 | 11 | '#03': print analog input voltage on pin PTE21 |
skanderian | 3:3b45e830ebe1 | 12 | '#04': print analog input voltage on pin PTB1 |
skanderian | 3:3b45e830ebe1 | 13 | '#05': print analog input voltage on pin PTE22 |
skanderian | 3:3b45e830ebe1 | 14 | '#06': print analog input voltage on pin PTB2 |
skanderian | 3:3b45e830ebe1 | 15 | '#07': print analog input voltage on pin PTE23 |
skanderian | 3:3b45e830ebe1 | 16 | '#08': print analog input voltage on pin PTB3 |
skanderian | 3:3b45e830ebe1 | 17 | '#09': print analog input voltage on pin PTE29 |
skanderian | 3:3b45e830ebe1 | 18 | '#10': print analog input voltage on pin PTC2 |
skanderian | 3:3b45e830ebe1 | 19 | '#11': print analog input voltage on pin PTE30 |
skanderian | 3:3b45e830ebe1 | 20 | '#12': print analog input voltage on pin PTC1 |
skanderian | 3:3b45e830ebe1 | 21 | '#13': print analog input voltage on pin PTC0 |
skanderian | 3:3b45e830ebe1 | 22 | '#14': print analog input voltage on pin PTD1 |
skanderian | 3:3b45e830ebe1 | 23 | '#15': print analog input voltage on pin PTD5 |
skanderian | 3:3b45e830ebe1 | 24 | '#16': print analog input voltage on pin PTD6 |
skanderian | 3:3b45e830ebe1 | 25 | */ |
skanderian | 3:3b45e830ebe1 | 26 | |
skanderian | 0:ce79b04fc2ca | 27 | #include "mbed.h" |
skanderian | 1:610dc7763656 | 28 | |
skanderian | 0:ce79b04fc2ca | 29 | //Declare hardware inputs |
skanderian | 3:3b45e830ebe1 | 30 | Serial serial(USBTX, USBRX); |
skanderian | 0:ce79b04fc2ca | 31 | Timer timer; |
skanderian | 2:f2583b56777e | 32 | |
skanderian | 3:3b45e830ebe1 | 33 | //IMPORTANT NOTE: PTA1 and PTA2 ARE RESERVED FOR SERIAL COMMUNICATION VIA SDA USB!!! DO NOT USE FOR SENSOR/ACTUATOR I/O!!! |
skanderian | 2:f2583b56777e | 34 | //Analog inputs : 0-3.3V |
skanderian | 3:3b45e830ebe1 | 35 | AnalogIn pin1(PTE20);//works as 16 bit ADC |
skanderian | 3:3b45e830ebe1 | 36 | AnalogIn pin2(PTB0); //works as 12 bit ADC |
skanderian | 3:3b45e830ebe1 | 37 | AnalogIn pin3(PTE21);//should be 16 bit ADC but doesnt work as ADC on mbed. Instead PTE21 reads whatever analog reading is input to PTE29 |
skanderian | 3:3b45e830ebe1 | 38 | AnalogIn pin4(PTB1); //works as 12 bit ADC |
skanderian | 3:3b45e830ebe1 | 39 | AnalogIn pin5(PTE22);//works as 12 bit ADC |
skanderian | 3:3b45e830ebe1 | 40 | AnalogIn pin6(PTB2);//works as 12 bit ADC |
skanderian | 3:3b45e830ebe1 | 41 | AnalogIn pin7(PTE23);//works as 12 bit ADC |
skanderian | 3:3b45e830ebe1 | 42 | AnalogIn pin8(PTB3); //works as 12 bit ADC |
skanderian | 3:3b45e830ebe1 | 43 | AnalogIn pin9(PTE29);//works as 12 bit ADC |
skanderian | 3:3b45e830ebe1 | 44 | AnalogIn pin10(PTC2);//works as 12 bit ADC |
skanderian | 3:3b45e830ebe1 | 45 | AnalogIn pin11(PTE30);//works as 12 bit ADC |
skanderian | 3:3b45e830ebe1 | 46 | AnalogIn pin12(PTC1);//works as 12 bit ADC |
skanderian | 3:3b45e830ebe1 | 47 | AnalogIn pin13(PTC0);//works as 12 bit ADC |
skanderian | 3:3b45e830ebe1 | 48 | AnalogIn pin14(PTD1);// doesnt work. Seems to be stuck at 3.3Vz |
skanderian | 3:3b45e830ebe1 | 49 | AnalogIn pin15(PTD5);//works as 12 bit ADC |
skanderian | 3:3b45e830ebe1 | 50 | AnalogIn pin16(PTD6);//works as 12 bit ADC |
skanderian | 2:f2583b56777e | 51 | |
skanderian | 2:f2583b56777e | 52 | //Built in LEDs |
skanderian | 2:f2583b56777e | 53 | PwmOut rLed(LED_RED); |
skanderian | 2:f2583b56777e | 54 | PwmOut gLed(LED_GREEN); |
skanderian | 2:f2583b56777e | 55 | PwmOut bLed(LED_BLUE); |
skanderian | 2:f2583b56777e | 56 | |
skanderian | 2:f2583b56777e | 57 | //New globals for RxInterrupt routine |
skanderian | 2:f2583b56777e | 58 | const int bufferSize = 256; |
skanderian | 2:f2583b56777e | 59 | char rxBuffer[bufferSize]; |
skanderian | 2:f2583b56777e | 60 | char txBuffer[bufferSize]; |
skanderian | 2:f2583b56777e | 61 | volatile int rxIn = 0; |
skanderian | 2:f2583b56777e | 62 | volatile int rxOut = 0; |
skanderian | 2:f2583b56777e | 63 | bool rxFlag = 0; |
skanderian | 0:ce79b04fc2ca | 64 | |
skanderian | 3:3b45e830ebe1 | 65 | //other globals |
skanderian | 3:3b45e830ebe1 | 66 | char charCCIn[2]; |
skanderian | 1:610dc7763656 | 67 | int decCCIn; |
skanderian | 3:3b45e830ebe1 | 68 | int updatePeriodMs = 1000; |
skanderian | 2:f2583b56777e | 69 | |
skanderian | 2:f2583b56777e | 70 | void ledConfirmSent()//Light up blue LED 10% |
skanderian | 2:f2583b56777e | 71 | { |
skanderian | 2:f2583b56777e | 72 | rLed = 1; |
skanderian | 2:f2583b56777e | 73 | gLed = 1; |
skanderian | 2:f2583b56777e | 74 | bLed = 0.9; |
skanderian | 2:f2583b56777e | 75 | } |
skanderian | 2:f2583b56777e | 76 | |
skanderian | 2:f2583b56777e | 77 | void ledConfirmReceive()//Light up green LED 10% |
skanderian | 2:f2583b56777e | 78 | { |
skanderian | 2:f2583b56777e | 79 | rLed = 1; |
skanderian | 2:f2583b56777e | 80 | gLed = 0.9; |
skanderian | 2:f2583b56777e | 81 | bLed = 1; |
skanderian | 2:f2583b56777e | 82 | } |
skanderian | 0:ce79b04fc2ca | 83 | |
skanderian | 3:3b45e830ebe1 | 84 | void sendAnalogIn(int pinNum) //send Analog input in V. |
skanderian | 3:3b45e830ebe1 | 85 | //Pin inputs are normalized to have a max value of 1 so a 3.3 multiplier is used to convert back to voltage |
skanderian | 3:3b45e830ebe1 | 86 | { |
skanderian | 2:f2583b56777e | 87 | if (pinNum == 0 || pinNum == 1) { |
skanderian | 3:3b45e830ebe1 | 88 | serial.printf("%s%03.1f%s\r\n", "#PTE20: ", 3.3f*pin1.read(), "V"); |
skanderian | 2:f2583b56777e | 89 | } |
skanderian | 2:f2583b56777e | 90 | if (pinNum == 0 || pinNum == 2) { |
skanderian | 3:3b45e830ebe1 | 91 | serial.printf("%s%03.1f%s\r\n", "#PTB0: ", 3.3f*pin2.read(), "V"); |
skanderian | 2:f2583b56777e | 92 | } |
skanderian | 2:f2583b56777e | 93 | if (pinNum == 0 || pinNum == 3) { |
skanderian | 3:3b45e830ebe1 | 94 | serial.printf("%s%03.1f%s\r\n", "#PTE21: ", 3.3f*pin3.read(), "V"); |
skanderian | 2:f2583b56777e | 95 | } |
skanderian | 2:f2583b56777e | 96 | if (pinNum == 0 || pinNum == 4) { |
skanderian | 3:3b45e830ebe1 | 97 | serial.printf("%s%03.1f%s\r\n", "#PTB1: ", 3.3f*pin4.read(), "V"); |
skanderian | 2:f2583b56777e | 98 | } |
skanderian | 2:f2583b56777e | 99 | if (pinNum == 0 || pinNum == 5) { |
skanderian | 3:3b45e830ebe1 | 100 | serial.printf("%s%03.1f%s\r\n", "#PTE22: ", 3.3f*pin5.read(), "V"); |
skanderian | 2:f2583b56777e | 101 | } |
skanderian | 2:f2583b56777e | 102 | if (pinNum == 0 || pinNum == 6) { |
skanderian | 3:3b45e830ebe1 | 103 | serial.printf("%s%03.1f%s\r\n", "#PTB2: ", 3.3f*pin6.read(), "V"); |
skanderian | 2:f2583b56777e | 104 | } |
skanderian | 2:f2583b56777e | 105 | if (pinNum == 0 || pinNum == 7) { |
skanderian | 3:3b45e830ebe1 | 106 | serial.printf("%s%03.1f%s\r\n", "#PTE23: ", 3.3f*pin7.read(), "V"); |
skanderian | 2:f2583b56777e | 107 | } |
skanderian | 2:f2583b56777e | 108 | if (pinNum == 0 || pinNum == 8) { |
skanderian | 3:3b45e830ebe1 | 109 | serial.printf("%s%03.1f%s\r\n", "#PTB3: ", 3.3f*pin8.read(), "V"); |
skanderian | 2:f2583b56777e | 110 | } |
skanderian | 2:f2583b56777e | 111 | if (pinNum == 0 || pinNum == 9) { |
skanderian | 3:3b45e830ebe1 | 112 | serial.printf("%s%03.1f%s\r\n", "#PTE29: ", 3.3f*pin9.read(), "V"); |
skanderian | 2:f2583b56777e | 113 | } |
skanderian | 2:f2583b56777e | 114 | if (pinNum == 0 || pinNum == 10) { |
skanderian | 3:3b45e830ebe1 | 115 | serial.printf("%s%03.1f%s\r\n", "#PTC2: ", 3.3f*pin10.read(), "V"); |
skanderian | 2:f2583b56777e | 116 | } |
skanderian | 2:f2583b56777e | 117 | if (pinNum == 0 || pinNum == 11) { |
skanderian | 3:3b45e830ebe1 | 118 | serial.printf("%s%03.1f%s\r\n", "#PTE30: ", 3.3f*pin11.read(), "V"); |
skanderian | 2:f2583b56777e | 119 | } |
skanderian | 2:f2583b56777e | 120 | if (pinNum == 0 || pinNum == 12) { |
skanderian | 3:3b45e830ebe1 | 121 | serial.printf("%s%03.1f%s\r\n", "#PTC1: ", 3.3f*pin12.read(), "V"); |
skanderian | 2:f2583b56777e | 122 | } |
skanderian | 2:f2583b56777e | 123 | if (pinNum == 0 || pinNum == 13) { |
skanderian | 3:3b45e830ebe1 | 124 | serial.printf("%s%03.1f%s\r\n", "#PTC0: ", 3.3f*pin13.read(), "V"); |
skanderian | 2:f2583b56777e | 125 | } |
skanderian | 2:f2583b56777e | 126 | if (pinNum == 0 || pinNum == 14) { |
skanderian | 3:3b45e830ebe1 | 127 | serial.printf("%s%03.1f%s\r\n", "#PTD1: ", 3.3f*pin14.read(), "V"); |
skanderian | 2:f2583b56777e | 128 | } |
skanderian | 2:f2583b56777e | 129 | if (pinNum == 0 || pinNum == 15) { |
skanderian | 3:3b45e830ebe1 | 130 | serial.printf("%s%03.1f%s\r\n", "#PTD5: ", 3.3f*pin15.read(), "V"); |
skanderian | 2:f2583b56777e | 131 | } |
skanderian | 2:f2583b56777e | 132 | if (pinNum == 0 || pinNum == 16) { |
skanderian | 3:3b45e830ebe1 | 133 | serial.printf("%s%03.1f%s\r\n", "#PTD6: ", 3.3f*pin16.read(), "V"); |
skanderian | 2:f2583b56777e | 134 | } |
skanderian | 2:f2583b56777e | 135 | ledConfirmSent(); |
skanderian | 0:ce79b04fc2ca | 136 | } |
skanderian | 0:ce79b04fc2ca | 137 | |
skanderian | 3:3b45e830ebe1 | 138 | void runWhenNewSerialIn() { |
skanderian | 3:3b45e830ebe1 | 139 | if (rxBuffer[0] !='#') { |
skanderian | 3:3b45e830ebe1 | 140 | serial.printf("%s\r\n", "Input format should be '#XX'. First input character should be '#'"); |
skanderian | 3:3b45e830ebe1 | 141 | serial.printf("%s\r\n", "followed by XX where XX goes from '00' to '16'"); |
skanderian | 3:3b45e830ebe1 | 142 | } |
skanderian | 3:3b45e830ebe1 | 143 | for (int i = 0; i < 2; i++) { |
skanderian | 3:3b45e830ebe1 | 144 | charCCIn[i] = rxBuffer[i+1]; |
skanderian | 2:f2583b56777e | 145 | } |
skanderian | 3:3b45e830ebe1 | 146 | decCCIn=strtol(charCCIn,NULL,10);// this line converts char to int |
skanderian | 3:3b45e830ebe1 | 147 | //decCCIn= 10*((int)(charCCIn[0])-48)+ ((int)(charCCIn[1])-48);// equivalent to line above |
skanderian | 3:3b45e830ebe1 | 148 | serial.printf("%s%d\r\n", "decCCIn= ",decCCIn); |
skanderian | 2:f2583b56777e | 149 | } |
skanderian | 1:610dc7763656 | 150 | |
skanderian | 2:f2583b56777e | 151 | void Rx_interrupt() { |
skanderian | 2:f2583b56777e | 152 | // Loop just in case more than one character is in UART's receive FIFO buffer |
skanderian | 2:f2583b56777e | 153 | // Stop if buffer full |
skanderian | 2:f2583b56777e | 154 | //while ((serial.readable()) && (((rxIn + 1) % bufferSize) != 0)) { |
skanderian | 2:f2583b56777e | 155 | while (serial.readable()) { |
skanderian | 2:f2583b56777e | 156 | rxBuffer[rxIn] = serial.getc(); |
skanderian | 2:f2583b56777e | 157 | if (rxBuffer[rxIn] == '\r') { //looking for character not string (string is double quotes) \r is CR, \n is LF |
skanderian | 2:f2583b56777e | 158 | rxFlag = 1; |
skanderian | 2:f2583b56777e | 159 | //Turn built in LED blue (at half intensity) to confirm command recieved |
skanderian | 2:f2583b56777e | 160 | ledConfirmReceive(); |
skanderian | 2:f2583b56777e | 161 | //Execute runWhenNewSerialIn when new Rx recieved (ending with \r) |
skanderian | 2:f2583b56777e | 162 | runWhenNewSerialIn(); |
skanderian | 2:f2583b56777e | 163 | rxFlag = 0; //reset flag to listen for next message |
skanderian | 2:f2583b56777e | 164 | rxIn = 0; // reset position index to 0 |
skanderian | 1:610dc7763656 | 165 | |
skanderian | 2:f2583b56777e | 166 | } else { |
skanderian | 2:f2583b56777e | 167 | rxIn = (rxIn + 1) % bufferSize; |
skanderian | 1:610dc7763656 | 168 | } |
skanderian | 1:610dc7763656 | 169 | } |
skanderian | 1:610dc7763656 | 170 | } |
skanderian | 0:ce79b04fc2ca | 171 | |
skanderian | 2:f2583b56777e | 172 | int main() { |
skanderian | 2:f2583b56777e | 173 | serial.baud(9600); |
skanderian | 2:f2583b56777e | 174 | serial.attach(&Rx_interrupt, Serial::RxIrq); |
skanderian | 3:3b45e830ebe1 | 175 | timer.start(); |
skanderian | 3:3b45e830ebe1 | 176 | //flash LED blue then green on startup or system reset |
skanderian | 2:f2583b56777e | 177 | ledConfirmSent(); |
skanderian | 3:3b45e830ebe1 | 178 | wait(0.2); |
skanderian | 3:3b45e830ebe1 | 179 | ledConfirmReceive(); |
skanderian | 0:ce79b04fc2ca | 180 | |
skanderian | 2:f2583b56777e | 181 | while (1) { |
skanderian | 3:3b45e830ebe1 | 182 | timer.reset(); |
skanderian | 3:3b45e830ebe1 | 183 | //Run sendAnalogIn in a loop. New decCCIn is registered with new serial input |
skanderian | 3:3b45e830ebe1 | 184 | sendAnalogIn(decCCIn); |
skanderian | 3:3b45e830ebe1 | 185 | //wait for updatePeriodMs to go by before printing analog voltage(s) again |
skanderian | 3:3b45e830ebe1 | 186 | while(timer.read_ms()<updatePeriodMs); |
skanderian | 0:ce79b04fc2ca | 187 | } |
skanderian | 0:ce79b04fc2ca | 188 | } |