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.
Diff: main.cpp
- Revision:
- 3:3b45e830ebe1
- Parent:
- 2:f2583b56777e
- Child:
- 4:9e93bf4863cb
--- a/main.cpp Wed May 11 16:13:49 2016 +0000 +++ b/main.cpp Wed May 11 20:20:13 2016 +0000 @@ -1,42 +1,59 @@ -//Chesapeake Embedded code by Sami Kanderian. Date of last update (version) shown below. +/*TestAnalogInPins: written by Sami Kanderian, last updated on 11 May 2016. It continuously reads +and prints 16 Analog Input Pin voltages on the NPX Freescale FRDM-KL25Z microprocessor board 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 is defined by the variable updatePeriodMs. + +Serial inputs followed by Carriage Return: +'#00': print analog input voltages on all pins (deafault printout on startup) +'#01': print analog input voltage on pin PTE20 +'#02': print analog input voltage on pin PTB0 +'#03': print analog input voltage on pin PTE21 +'#04': print analog input voltage on pin PTB1 +'#05': print analog input voltage on pin PTE22 +'#06': print analog input voltage on pin PTB2 +'#07': print analog input voltage on pin PTE23 +'#08': print analog input voltage on pin PTB3 +'#09': print analog input voltage on pin PTE29 +'#10': print analog input voltage on pin PTC2 +'#11': print analog input voltage on pin PTE30 +'#12': print analog input voltage on pin PTC1 +'#13': print analog input voltage on pin PTC0 +'#14': print analog input voltage on pin PTD1 +'#15': print analog input voltage on pin PTD5 +'#16': print analog input voltage on pin PTD6 +*/ + #include "mbed.h" -#include "string" -#include "iostream" -#include "math.h" -//#include "stdio.h" -//#include "rtos.h" //Declare hardware inputs +Serial serial(USBTX, USBRX); Timer timer; -Serial serial(USBTX, USBRX); -//IMPORTANT NOTE: PTA1 and PTA2 ARE RESERVED FOR SERIAL COMMUNICATION!!! DO NOT USE FOR SENSOR/ACTUATOR I/O!!! +//IMPORTANT NOTE: PTA1 and PTA2 ARE RESERVED FOR SERIAL COMMUNICATION VIA SDA USB!!! DO NOT USE FOR SENSOR/ACTUATOR I/O!!! //Analog inputs : 0-3.3V -AnalogIn pin1(PTE20); -AnalogIn pin2(PTB0); -AnalogIn pin3(PTE21);//should be 16bit but doesnt work on mbed -AnalogIn pin4(PTB1); -AnalogIn pin5(PTE22); -AnalogIn pin6(PTB2); -AnalogIn pin7(PTE23); -AnalogIn pin8(PTB3); -AnalogIn pin9(PTE29); -AnalogIn pin10(PTC2); -AnalogIn pin11(PTE30); -AnalogIn pin12(PTC1); -AnalogIn pin13(PTC0); -AnalogIn pin14(PTD1);// doesnt work. Seems to be stuck at 3.3 -AnalogIn pin15(PTD5); -AnalogIn pin16(PTD6); +AnalogIn pin1(PTE20);//works as 16 bit ADC +AnalogIn pin2(PTB0); //works as 12 bit ADC +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 +AnalogIn pin4(PTB1); //works as 12 bit ADC +AnalogIn pin5(PTE22);//works as 12 bit ADC +AnalogIn pin6(PTB2);//works as 12 bit ADC +AnalogIn pin7(PTE23);//works as 12 bit ADC +AnalogIn pin8(PTB3); //works as 12 bit ADC +AnalogIn pin9(PTE29);//works as 12 bit ADC +AnalogIn pin10(PTC2);//works as 12 bit ADC +AnalogIn pin11(PTE30);//works as 12 bit ADC +AnalogIn pin12(PTC1);//works as 12 bit ADC +AnalogIn pin13(PTC0);//works as 12 bit ADC +AnalogIn pin14(PTD1);// doesnt work. Seems to be stuck at 3.3Vz +AnalogIn pin15(PTD5);//works as 12 bit ADC +AnalogIn pin16(PTD6);//works as 12 bit ADC //Built in LEDs PwmOut rLed(LED_RED); PwmOut gLed(LED_GREEN); PwmOut bLed(LED_BLUE); -//Date version as global -string dateVersion = "#Microcontroller Detected! uC code ver.: 04.12.2016"; - //New globals for RxInterrupt routine const int bufferSize = 256; char rxBuffer[bufferSize]; @@ -45,12 +62,10 @@ volatile int rxOut = 0; bool rxFlag = 0; -//Declare globals -char hexCCIn[2]; -char hexDDDDIn[4]; +//other globals +char charCCIn[2]; int decCCIn; -int decDDDDIn; - +int updatePeriodMs = 1000; void ledConfirmSent()//Light up blue LED 10% { @@ -66,153 +81,71 @@ bLed = 1; } -void sendAnalogIn(int pinNum) //send Analog input in V -{ - - //serial.printf("\r\n"); +void sendAnalogIn(int pinNum) //send Analog input in V. +//Pin inputs are normalized to have a max value of 1 so a 3.3 multiplier is used to convert back to voltage +{ if (pinNum == 0 || pinNum == 1) { - serial.printf("%s%03.1f%s\r\n", "#PTE20: ", 3.3f*pin1.read(), "V^"); + serial.printf("%s%03.1f%s\r\n", "#PTE20: ", 3.3f*pin1.read(), "V"); } if (pinNum == 0 || pinNum == 2) { - serial.printf("%s%03.1f%s\r\n", "#PTB0: ", 3.3f*pin2.read(), "V^"); + serial.printf("%s%03.1f%s\r\n", "#PTB0: ", 3.3f*pin2.read(), "V"); } if (pinNum == 0 || pinNum == 3) { - serial.printf("%s%03.1f%s\r\n", "#PTE21: ", 3.3f*pin3.read(), "V^"); + serial.printf("%s%03.1f%s\r\n", "#PTE21: ", 3.3f*pin3.read(), "V"); } if (pinNum == 0 || pinNum == 4) { - serial.printf("%s%03.1f%s\r\n", "#PTB1: ", 3.3f*pin4.read(), "V^"); + serial.printf("%s%03.1f%s\r\n", "#PTB1: ", 3.3f*pin4.read(), "V"); } if (pinNum == 0 || pinNum == 5) { - serial.printf("%s%03.1f%s\r\n", "#PTE22: ", 3.3f*pin5.read(), "V^"); + serial.printf("%s%03.1f%s\r\n", "#PTE22: ", 3.3f*pin5.read(), "V"); } if (pinNum == 0 || pinNum == 6) { - serial.printf("%s%03.1f%s\r\n", "#PTB2: ", 3.3f*pin6.read(), "V^"); + serial.printf("%s%03.1f%s\r\n", "#PTB2: ", 3.3f*pin6.read(), "V"); } if (pinNum == 0 || pinNum == 7) { - serial.printf("%s%03.1f%s\r\n", "#PTE23: ", 3.3f*pin7.read(), "V^"); + serial.printf("%s%03.1f%s\r\n", "#PTE23: ", 3.3f*pin7.read(), "V"); } if (pinNum == 0 || pinNum == 8) { - serial.printf("%s%03.1f%s\r\n", "#PTB3: ", 3.3f*pin8.read(), "V^"); + serial.printf("%s%03.1f%s\r\n", "#PTB3: ", 3.3f*pin8.read(), "V"); } if (pinNum == 0 || pinNum == 9) { - serial.printf("%s%03.1f%s\r\n", "#PTE29: ", 3.3f*pin9.read(), "V^"); + serial.printf("%s%03.1f%s\r\n", "#PTE29: ", 3.3f*pin9.read(), "V"); } if (pinNum == 0 || pinNum == 10) { - serial.printf("%s%03.1f%s\r\n", "#PTC2: ", 3.3f*pin10.read(), "V^"); + serial.printf("%s%03.1f%s\r\n", "#PTC2: ", 3.3f*pin10.read(), "V"); } if (pinNum == 0 || pinNum == 11) { - serial.printf("%s%03.1f%s\r\n", "#PTE30: ", 3.3f*pin11.read(), "V^"); + serial.printf("%s%03.1f%s\r\n", "#PTE30: ", 3.3f*pin11.read(), "V"); } if (pinNum == 0 || pinNum == 12) { - serial.printf("%s%03.1f%s\r\n", "#PTC1: ", 3.3f*pin12.read(), "V^"); + serial.printf("%s%03.1f%s\r\n", "#PTC1: ", 3.3f*pin12.read(), "V"); } if (pinNum == 0 || pinNum == 13) { - serial.printf("%s%03.1f%s\r\n", "#PTC0: ", 3.3f*pin13.read(), "V^"); + serial.printf("%s%03.1f%s\r\n", "#PTC0: ", 3.3f*pin13.read(), "V"); } if (pinNum == 0 || pinNum == 14) { - serial.printf("%s%03.1f%s\r\n", "#PTD1: ", 3.3f*pin14.read(), "V^"); + serial.printf("%s%03.1f%s\r\n", "#PTD1: ", 3.3f*pin14.read(), "V"); } if (pinNum == 0 || pinNum == 15) { - serial.printf("%s%03.1f%s\r\n", "#PTD5: ", 3.3f*pin15.read(), "V^"); + serial.printf("%s%03.1f%s\r\n", "#PTD5: ", 3.3f*pin15.read(), "V"); } if (pinNum == 0 || pinNum == 16) { - serial.printf("%s%03.1f%s\r\n", "#PTD6: ", 3.3f*pin16.read(), "V^"); + serial.printf("%s%03.1f%s\r\n", "#PTD6: ", 3.3f*pin16.read(), "V"); } - ledConfirmSent(); } -string decToHexDDDD(int i) { - //Do twos complement to handle negative numbers - if (i < 0) { - i = 32767 - i; - } - char hex_string[10]; - sprintf(hex_string, "0x%02X", i); - return string(hex_string); -} - -int hexDDDDToDec(char hex[]) { - int decValue = strtol(hex, NULL, 16); - if (decValue >= 32768) { //Do twos complement to handle negative numbers - decValue = 32767 - decValue; - } - return decValue; -} - -int hexToDec(char hex[]) { - int decValue = strtol(hex, NULL, 16); - return decValue; -} - -int hexToDecSub(char hex[], int st, int ed) { - int n = ed - st + 1; - char hexSubset[n]; - for (int i = st; i < ed + 1; i++) { - hexSubset[i - st] = hex[i]; - } - int decValue = strtol(hexSubset, NULL, 16); - return decValue; -} - -void sendHexDDDDValTimes100(float val) { - int valTimes100 = (int) ((100 * val)); - string hexDDDD = decToHexDDDD(valTimes100); - int nLeadingZeros = 4 - hexDDDD.length(); - - char hexDDDDout[hexDDDD.length()]; - for (int i = 0; i < hexDDDD.length(); i++) { - hexDDDDout[i] = hexDDDD[i]; - } - char leadingZeros[nLeadingZeros]; - for (int i = 0; i < nLeadingZeros; i++) { - leadingZeros[i] = '0'; +void runWhenNewSerialIn() { + if (rxBuffer[0] !='#') { + serial.printf("%s\r\n", "Input format should be '#XX'. First input character should be '#'"); + serial.printf("%s\r\n", "followed by XX where XX goes from '00' to '16'"); + } + for (int i = 0; i < 2; i++) { + charCCIn[i] = rxBuffer[i+1]; } - //serial.printf("#%s%saa^\r\n", leadingZeros, hexDDDDout); - serial.printf("#%s%saa", leadingZeros, hexDDDDout); - //ledConfirmSent(); -} - -void runSingleCommand(int comInd) { - int endBuffer = (comInd + 1)*8; - int startBuffer = endBuffer - 7; - - //get hexCCIn - for (int i = 0; i < 2; i++) { - hexCCIn[i] = rxBuffer[i + startBuffer]; - } - //serial.printf("hexCCIn= is %s\r\n", hexCCIn); - - for (int i = 0; i < 4; i++) { - hexDDDDIn[i] = rxBuffer[i + startBuffer + 2]; - } - - decCCIn = hexToDec(hexCCIn); - decDDDDIn = hexDDDDToDec(hexDDDDIn); - - //Make sure incoming checksum pans out: DO THIS LATER - - if (comInd == 0) { //include # if first command - startBuffer = startBuffer - 1; - } - int i2 = 0; - for (int i = startBuffer; i <= endBuffer; i++) { // duplicate bytes 0 to 9 for now; - txBuffer[i2] = rxBuffer[i]; - i2++; - } - - //Do action based on CC: already in while loop - - -} - -void runWhenNewSerialIn() { - int nCommands = (rxIn - 1) / 8; //find out how many commands are sent in one serial message - //serial.printf("%s%d%s\r\n", "#nCommands: ", nCommands, "commands"); - for (int comInd = 0; comInd < nCommands; comInd++) { // duplicate bytes 0 to 9 for now; - runSingleCommand(comInd); - } - serial.printf("^\r\n"); //end line after responses to all commands returned + decCCIn=strtol(charCCIn,NULL,10);// this line converts char to int + //decCCIn= 10*((int)(charCCIn[0])-48)+ ((int)(charCCIn[1])-48);// equivalent to line above + serial.printf("%s%d\r\n", "decCCIn= ",decCCIn); } void Rx_interrupt() { @@ -237,26 +170,19 @@ } int main() { - serial.baud(9600); serial.attach(&Rx_interrupt, Serial::RxIrq); - - //rLed.period(0.001f); - //gLed.period(0.001f); - //bLed.period(0.001f); - - - //flash LED blue then green on startup or system reset - //serial.printf("Before Blue on Startup^\r\n"); + timer.start(); + //flash LED blue then green on startup or system reset ledConfirmSent(); - ledConfirmReceive(); - //serial.printf("After Green on Startup^\r\n"); - timer.start(); + wait(0.2); + ledConfirmReceive(); while (1) { - //scanf("%10s", rxBuffer);// NO! Use Rx_interrupt instead! - //Always keep running computePressureCommand when pump is enabled (runPump=true) - sendAnalogIn(decDDDDIn); - wait(1); + timer.reset(); + //Run sendAnalogIn in a loop. New decCCIn is registered with new serial input + sendAnalogIn(decCCIn); + //wait for updatePeriodMs to go by before printing analog voltage(s) again + while(timer.read_ms()<updatePeriodMs); } } \ No newline at end of file