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:
- 6:214e2180c586
- Parent:
- 5:b98a0f60f700
- Child:
- 7:78e7984909f4
diff -r b98a0f60f700 -r 214e2180c586 main.cpp
--- a/main.cpp Wed May 11 20:24:18 2016 +0000
+++ b/main.cpp Wed Nov 09 17:43:31 2016 +0000
@@ -25,7 +25,7 @@
*/
#include "mbed.h"
-
+#define MAXINT 2147483647
//Declare hardware inputs
Serial serial(USBTX, USBRX);
Timer timer;
@@ -45,7 +45,7 @@
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 pin14(PTD1);// doesnt work. Seems to be stuck at 3.3V
AnalogIn pin15(PTD5);//works as 12 bit ADC
AnalogIn pin16(PTD6);//works as 12 bit ADC
@@ -63,7 +63,7 @@
bool rxFlag = 0;
//other globals
-char charCCIn[2];
+char charCCIn[3];
int decCCIn;
int updatePeriodMs = 1000;
@@ -83,7 +83,7 @@
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");
}
@@ -127,28 +127,30 @@
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();
}
-void runWhenNewSerialIn() {
+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];
+ charCCIn[i] = rxBuffer[i+1];
}
- decCCIn=strtol(charCCIn,NULL,10);// this line converts char to int
+ 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() {
+void Rx_interrupt()
+{
// Loop just in case more than one character is in UART's receive FIFO buffer
// Stop if buffer full
//while ((serial.readable()) && (((rxIn + 1) % bufferSize) != 0)) {
@@ -158,31 +160,37 @@
rxFlag = 1;
//Turn built in LED blue (at half intensity) to confirm command recieved
ledConfirmReceive();
- //Execute runWhenNewSerialIn when new Rx recieved (ending with \r)
- runWhenNewSerialIn();
- rxFlag = 0; //reset flag to listen for next message
- rxIn = 0; // reset position index to 0
-
} else {
rxIn = (rxIn + 1) % bufferSize;
}
}
}
-int main() {
+int main()
+{
serial.baud(9600);
serial.attach(&Rx_interrupt, Serial::RxIrq);
- timer.start();
- //flash LED blue then green on startup or system reset
- ledConfirmSent();
- wait(0.2);
- ledConfirmReceive();
+ timer.start();
+ int startFnTimeUs;
+ int lastActionTimeUs=timer.read_us();
+
+ int updatePeriodUs = updatePeriodMs*1000;
while (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);
+ startFnTimeUs = timer.read_us();
+ if (rxFlag==1) {
+ runWhenNewSerialIn();
+ rxFlag = 0; //reset flag to listen for next message
+ rxIn = 0; //reset position index to 0
+ }
+ int timeChangeUs = (startFnTimeUs - lastActionTimeUs);
+ if (timeChangeUs<0) { //IMPOTRANT!! This handles wrapping of timer when it exceeds MAXINT and goes slightly above zero resulting in a negative timeChangeUs
+ timeChangeUs=timeChangeUs + MAXINT +1;
+ }
+ if (timeChangeUs >= updatePeriodUs) {//Prefer never to use wait in loop in priciple as it hangs processor from doing other tasks when necessary
+ //Run sendAnalogIn if elapsed time has passed. New decCCIn is registered with new serial input
+ sendAnalogIn(decCCIn);
+ lastActionTimeUs=startFnTimeUs;
+ }
}
}
\ No newline at end of file