This program continuously reads and prints any or all of the 16 Analog Input Pin voltages on the NPX Freescale FRDM-KL25Z microprocessor board. Pins on which to display voltages are determined via serial inputs registered via an RX Interrupt trigger that changes the value of charCCIn, where charCCIn goes from '00' to '16'. charCCIn should be preceeded by a '#'. Serial baud rate is 9600. The data acquisition rate whereby voltage readings are updated is defined by the variable updatePeriodMs.

Dependencies:   mbed

Committer:
skanderian
Date:
Thu Jan 19 15:32:08 2017 +0000
Revision:
9:4b45cc112a16
Parent:
8:c06ce18ad746
Fixed pin#s

Who changed what in which revision?

UserRevisionLine numberNew 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 5:b98a0f60f700 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 4:9e93bf4863cb 5 The data acquisition rate whereby voltage readings are updated 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 7:78e7984909f4 10 '#02': print analog input voltage on pin PTB0
skanderian 8:c06ce18ad746 11 '#03': print analog input voltage on pin PTB1
skanderian 8:c06ce18ad746 12 '#04': print analog input voltage on pin PTE22
skanderian 8:c06ce18ad746 13 '#05': print analog input voltage on pin PTB2
skanderian 8:c06ce18ad746 14 '#06': print analog input voltage on pin PTE23
skanderian 8:c06ce18ad746 15 '#07': print analog input voltage on pin PTB3
skanderian 8:c06ce18ad746 16 '#08': print analog input voltage on pin PTE29
skanderian 8:c06ce18ad746 17 '#09': print analog input voltage on pin PTC2
skanderian 8:c06ce18ad746 18 '#10': print analog input voltage on pin PTE30
skanderian 8:c06ce18ad746 19 '#11': print analog input voltage on pin PTC1
skanderian 8:c06ce18ad746 20 '#12': print analog input voltage on pin PTC0
skanderian 8:c06ce18ad746 21 '#13': print analog input voltage on pin PTD5
skanderian 8:c06ce18ad746 22 '#14': print analog input voltage on pin PTD6
skanderian 3:3b45e830ebe1 23 */
skanderian 3:3b45e830ebe1 24
skanderian 0:ce79b04fc2ca 25 #include "mbed.h"
skanderian 6:214e2180c586 26 #define MAXINT 2147483647
skanderian 0:ce79b04fc2ca 27 //Declare hardware inputs
skanderian 3:3b45e830ebe1 28 Serial serial(USBTX, USBRX);
skanderian 0:ce79b04fc2ca 29 Timer timer;
skanderian 2:f2583b56777e 30
skanderian 8:c06ce18ad746 31 //IMPORTANT NOTE: PTA1 and PTA2 ARE RESERVED FOR SERIAL COMMUNICATION VIA SDA USB!!! DO NOT USE FOR SENSOR/ACTUATOR I/O!!! PTD1 IS USED FOR ON BOARD LED
skanderian 8:c06ce18ad746 32 //PTE21 should be 16 bit ADC but doesnt work as ADC on mbed. Instead PTE21 reads whatever analog reading is input to PTE29
skanderian 2:f2583b56777e 33 //Analog inputs : 0-3.3V
skanderian 3:3b45e830ebe1 34 AnalogIn pin1(PTE20);//works as 16 bit ADC
skanderian 3:3b45e830ebe1 35 AnalogIn pin2(PTB0); //works as 12 bit ADC
skanderian 8:c06ce18ad746 36 AnalogIn pin3(PTB1); //works as 12 bit ADC
skanderian 8:c06ce18ad746 37 AnalogIn pin4(PTE22);//works as 12 bit ADC
skanderian 8:c06ce18ad746 38 AnalogIn pin5(PTB2);//works as 12 bit ADC
skanderian 8:c06ce18ad746 39 AnalogIn pin6(PTE23);//works as 12 bit ADC
skanderian 8:c06ce18ad746 40 AnalogIn pin7(PTB3); //works as 12 bit ADC
skanderian 8:c06ce18ad746 41 AnalogIn pin8(PTE29);//works as 12 bit ADC
skanderian 8:c06ce18ad746 42 AnalogIn pin9(PTC2);//works as 12 bit ADC
skanderian 8:c06ce18ad746 43 AnalogIn pin10(PTE30);//works as 12 bit ADC
skanderian 8:c06ce18ad746 44 AnalogIn pin11(PTC1);//works as 12 bit ADC
skanderian 8:c06ce18ad746 45 AnalogIn pin12(PTC0);//works as 12 bit ADC
skanderian 8:c06ce18ad746 46 AnalogIn pin13(PTD5);//works as 12 bit ADC
skanderian 8:c06ce18ad746 47 AnalogIn pin14(PTD6);//works as 12 bit ADC
skanderian 2:f2583b56777e 48
skanderian 2:f2583b56777e 49 //Built in LEDs
skanderian 2:f2583b56777e 50 PwmOut rLed(LED_RED);
skanderian 2:f2583b56777e 51 PwmOut gLed(LED_GREEN);
skanderian 2:f2583b56777e 52 PwmOut bLed(LED_BLUE);
skanderian 2:f2583b56777e 53
skanderian 2:f2583b56777e 54 //New globals for RxInterrupt routine
skanderian 2:f2583b56777e 55 const int bufferSize = 256;
skanderian 2:f2583b56777e 56 char rxBuffer[bufferSize];
skanderian 2:f2583b56777e 57 char txBuffer[bufferSize];
skanderian 2:f2583b56777e 58 volatile int rxIn = 0;
skanderian 2:f2583b56777e 59 volatile int rxOut = 0;
skanderian 2:f2583b56777e 60 bool rxFlag = 0;
skanderian 0:ce79b04fc2ca 61
skanderian 3:3b45e830ebe1 62 //other globals
skanderian 6:214e2180c586 63 char charCCIn[3];
skanderian 8:c06ce18ad746 64 int decCCIn=0; //by default, output all analog pins on startup
skanderian 3:3b45e830ebe1 65 int updatePeriodMs = 1000;
skanderian 2:f2583b56777e 66
skanderian 2:f2583b56777e 67 void ledConfirmSent()//Light up blue LED 10%
skanderian 2:f2583b56777e 68 {
skanderian 2:f2583b56777e 69 rLed = 1;
skanderian 2:f2583b56777e 70 gLed = 1;
skanderian 2:f2583b56777e 71 bLed = 0.9;
skanderian 2:f2583b56777e 72 }
skanderian 2:f2583b56777e 73
skanderian 2:f2583b56777e 74 void ledConfirmReceive()//Light up green LED 10%
skanderian 2:f2583b56777e 75 {
skanderian 2:f2583b56777e 76 rLed = 1;
skanderian 2:f2583b56777e 77 gLed = 0.9;
skanderian 2:f2583b56777e 78 bLed = 1;
skanderian 2:f2583b56777e 79 }
skanderian 0:ce79b04fc2ca 80
skanderian 3:3b45e830ebe1 81 void sendAnalogIn(int pinNum) //send Analog input in V.
skanderian 3:3b45e830ebe1 82 //Pin inputs are normalized to have a max value of 1 so a 3.3 multiplier is used to convert back to voltage
skanderian 6:214e2180c586 83 {
skanderian 2:f2583b56777e 84 if (pinNum == 0 || pinNum == 1) {
skanderian 3:3b45e830ebe1 85 serial.printf("%s%03.1f%s\r\n", "#PTE20: ", 3.3f*pin1.read(), "V");
skanderian 2:f2583b56777e 86 }
skanderian 2:f2583b56777e 87 if (pinNum == 0 || pinNum == 2) {
skanderian 3:3b45e830ebe1 88 serial.printf("%s%03.1f%s\r\n", "#PTB0: ", 3.3f*pin2.read(), "V");
skanderian 8:c06ce18ad746 89 }
skanderian 2:f2583b56777e 90 if (pinNum == 0 || pinNum == 3) {
skanderian 9:4b45cc112a16 91 serial.printf("%s%03.1f%s\r\n", "#PTB1: ", 3.3f*pin3.read(), "V");
skanderian 2:f2583b56777e 92 }
skanderian 2:f2583b56777e 93 if (pinNum == 0 || pinNum == 4) {
skanderian 9:4b45cc112a16 94 serial.printf("%s%03.1f%s\r\n", "#PTE22: ", 3.3f*pin4.read(), "V");
skanderian 2:f2583b56777e 95 }
skanderian 8:c06ce18ad746 96 if (pinNum == 0 || pinNum == 5) {
skanderian 9:4b45cc112a16 97 serial.printf("%s%03.1f%s\r\n", "#PTB2: ", 3.3f*pin5.read(), "V");
skanderian 8:c06ce18ad746 98 }
skanderian 2:f2583b56777e 99 if (pinNum == 0 || pinNum == 6) {
skanderian 9:4b45cc112a16 100 serial.printf("%s%03.1f%s\r\n", "#PTE23: ", 3.3f*pin6.read(), "V");
skanderian 2:f2583b56777e 101 }
skanderian 2:f2583b56777e 102 if (pinNum == 0 || pinNum == 7) {
skanderian 9:4b45cc112a16 103 serial.printf("%s%03.1f%s\r\n", "#PTB3: ", 3.3f*pin7.read(), "V");
skanderian 2:f2583b56777e 104 }
skanderian 2:f2583b56777e 105 if (pinNum == 0 || pinNum == 8) {
skanderian 9:4b45cc112a16 106 serial.printf("%s%03.1f%s\r\n", "#PTE29: ", 3.3f*pin8.read(), "V");
skanderian 2:f2583b56777e 107 }
skanderian 8:c06ce18ad746 108 if (pinNum == 0 || pinNum == 9) {
skanderian 9:4b45cc112a16 109 serial.printf("%s%03.1f%s\r\n", "#PTC2: ", 3.3f*pin9.read(), "V");
skanderian 8:c06ce18ad746 110 }
skanderian 2:f2583b56777e 111 if (pinNum == 0 || pinNum == 10) {
skanderian 9:4b45cc112a16 112 serial.printf("%s%03.1f%s\r\n", "#PTE30: ", 3.3f*pin10.read(), "V");
skanderian 2:f2583b56777e 113 }
skanderian 2:f2583b56777e 114 if (pinNum == 0 || pinNum == 11) {
skanderian 9:4b45cc112a16 115 serial.printf("%s%03.1f%s\r\n", "#PTC1: ", 3.3f*pin11.read(), "V");
skanderian 2:f2583b56777e 116 }
skanderian 2:f2583b56777e 117 if (pinNum == 0 || pinNum == 12) {
skanderian 9:4b45cc112a16 118 serial.printf("%s%03.1f%s\r\n", "#PTC0: ", 3.3f*pin12.read(), "V");
skanderian 2:f2583b56777e 119 }
skanderian 2:f2583b56777e 120 if (pinNum == 0 || pinNum == 13) {
skanderian 9:4b45cc112a16 121 serial.printf("%s%03.1f%s\r\n", "#PTD5: ", 3.3f*pin13.read(), "V");
skanderian 2:f2583b56777e 122 }
skanderian 2:f2583b56777e 123 if (pinNum == 0 || pinNum == 14) {
skanderian 9:4b45cc112a16 124 serial.printf("%s%03.1f%s\r\n", "#PTD6: ", 3.3f*pin14.read(), "V");
skanderian 8:c06ce18ad746 125 }
skanderian 2:f2583b56777e 126 ledConfirmSent();
skanderian 0:ce79b04fc2ca 127 }
skanderian 0:ce79b04fc2ca 128
skanderian 6:214e2180c586 129 void runWhenNewSerialIn()
skanderian 6:214e2180c586 130 {
skanderian 3:3b45e830ebe1 131 if (rxBuffer[0] !='#') {
skanderian 3:3b45e830ebe1 132 serial.printf("%s\r\n", "Input format should be '#XX'. First input character should be '#'");
skanderian 8:c06ce18ad746 133 serial.printf("%s\r\n", "followed by XX where XX goes from '00' to '14'");
skanderian 6:214e2180c586 134 }
skanderian 3:3b45e830ebe1 135 for (int i = 0; i < 2; i++) {
skanderian 6:214e2180c586 136 charCCIn[i] = rxBuffer[i+1];
skanderian 2:f2583b56777e 137 }
skanderian 6:214e2180c586 138 decCCIn=strtol(charCCIn,NULL,10);// this line converts char to int
skanderian 3:3b45e830ebe1 139 //decCCIn= 10*((int)(charCCIn[0])-48)+ ((int)(charCCIn[1])-48);// equivalent to line above
skanderian 3:3b45e830ebe1 140 serial.printf("%s%d\r\n", "decCCIn= ",decCCIn);
skanderian 2:f2583b56777e 141 }
skanderian 1:610dc7763656 142
skanderian 6:214e2180c586 143 void Rx_interrupt()
skanderian 6:214e2180c586 144 {
skanderian 2:f2583b56777e 145 // Loop just in case more than one character is in UART's receive FIFO buffer
skanderian 2:f2583b56777e 146 // Stop if buffer full
skanderian 2:f2583b56777e 147 //while ((serial.readable()) && (((rxIn + 1) % bufferSize) != 0)) {
skanderian 2:f2583b56777e 148 while (serial.readable()) {
skanderian 2:f2583b56777e 149 rxBuffer[rxIn] = serial.getc();
skanderian 2:f2583b56777e 150 if (rxBuffer[rxIn] == '\r') { //looking for character not string (string is double quotes) \r is CR, \n is LF
skanderian 2:f2583b56777e 151 rxFlag = 1;
skanderian 2:f2583b56777e 152 //Turn built in LED blue (at half intensity) to confirm command recieved
skanderian 2:f2583b56777e 153 ledConfirmReceive();
skanderian 2:f2583b56777e 154 } else {
skanderian 2:f2583b56777e 155 rxIn = (rxIn + 1) % bufferSize;
skanderian 1:610dc7763656 156 }
skanderian 1:610dc7763656 157 }
skanderian 1:610dc7763656 158 }
skanderian 0:ce79b04fc2ca 159
skanderian 6:214e2180c586 160 int main()
skanderian 6:214e2180c586 161 {
skanderian 2:f2583b56777e 162 serial.baud(9600);
skanderian 2:f2583b56777e 163 serial.attach(&Rx_interrupt, Serial::RxIrq);
skanderian 6:214e2180c586 164 timer.start();
skanderian 6:214e2180c586 165 int startFnTimeUs;
skanderian 6:214e2180c586 166 int lastActionTimeUs=timer.read_us();
skanderian 6:214e2180c586 167
skanderian 6:214e2180c586 168 int updatePeriodUs = updatePeriodMs*1000;
skanderian 0:ce79b04fc2ca 169
skanderian 2:f2583b56777e 170 while (1) {
skanderian 6:214e2180c586 171 startFnTimeUs = timer.read_us();
skanderian 6:214e2180c586 172 if (rxFlag==1) {
skanderian 6:214e2180c586 173 runWhenNewSerialIn();
skanderian 6:214e2180c586 174 rxFlag = 0; //reset flag to listen for next message
skanderian 6:214e2180c586 175 rxIn = 0; //reset position index to 0
skanderian 6:214e2180c586 176 }
skanderian 6:214e2180c586 177 int timeChangeUs = (startFnTimeUs - lastActionTimeUs);
skanderian 6:214e2180c586 178 if (timeChangeUs<0) { //IMPOTRANT!! This handles wrapping of timer when it exceeds MAXINT and goes slightly above zero resulting in a negative timeChangeUs
skanderian 6:214e2180c586 179 timeChangeUs=timeChangeUs + MAXINT +1;
skanderian 6:214e2180c586 180 }
skanderian 6:214e2180c586 181 if (timeChangeUs >= updatePeriodUs) {//Prefer never to use wait in loop in priciple as it hangs processor from doing other tasks when necessary
skanderian 6:214e2180c586 182 //Run sendAnalogIn if elapsed time has passed. New decCCIn is registered with new serial input
skanderian 6:214e2180c586 183 sendAnalogIn(decCCIn);
skanderian 6:214e2180c586 184 lastActionTimeUs=startFnTimeUs;
skanderian 6:214e2180c586 185 }
skanderian 0:ce79b04fc2ca 186 }
skanderian 0:ce79b04fc2ca 187 }