This app requires a Windows Form to send/receive commands. See GHI Electronics Codeshare.. https://www.ghielectronics.com/community
main.cpp@0:9122ef37df55, 2015-03-07 (annotated)
- Committer:
- willgeorge
- Date:
- Sat Mar 07 11:09:27 2015 +0000
- Revision:
- 0:9122ef37df55
This app requires a Windows Form to send/receive commands.
; See GHI Electronics code share.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
willgeorge | 0:9122ef37df55 | 1 | // |
willgeorge | 0:9122ef37df55 | 2 | //OutrageousPWM |
willgeorge | 0:9122ef37df55 | 3 | // |
willgeorge | 0:9122ef37df55 | 4 | // Control characters are used so there is no restriction on text characters that can be used for serial messages. |
willgeorge | 0:9122ef37df55 | 5 | // Test for the control characters to reset the mBuino and for setting the PWM values |
willgeorge | 0:9122ef37df55 | 6 | |
willgeorge | 0:9122ef37df55 | 7 | //Use USB Library Device stack |
willgeorge | 0:9122ef37df55 | 8 | |
willgeorge | 0:9122ef37df55 | 9 | #include "mbed.h" |
willgeorge | 0:9122ef37df55 | 10 | #include "USBSerial.h" |
willgeorge | 0:9122ef37df55 | 11 | #include <string> |
willgeorge | 0:9122ef37df55 | 12 | |
willgeorge | 0:9122ef37df55 | 13 | |
willgeorge | 0:9122ef37df55 | 14 | DigitalOut LED[] = {(LED1), (LED2), (LED3), (LED4), (LED5), (LED6), (LED7)};// declare 7 LEDs |
willgeorge | 0:9122ef37df55 | 15 | |
willgeorge | 0:9122ef37df55 | 16 | |
willgeorge | 0:9122ef37df55 | 17 | //Virtual serial port over USB |
willgeorge | 0:9122ef37df55 | 18 | USBSerial serial; |
willgeorge | 0:9122ef37df55 | 19 | |
willgeorge | 0:9122ef37df55 | 20 | /* |
willgeorge | 0:9122ef37df55 | 21 | Serial pc(USBTX, USBRX); |
willgeorge | 0:9122ef37df55 | 22 | DigitalOut led1(LED1); |
willgeorge | 0:9122ef37df55 | 23 | DigitalOut led2(LED2); |
willgeorge | 0:9122ef37df55 | 24 | DigitalOut led3(LED3); |
willgeorge | 0:9122ef37df55 | 25 | DigitalOut led4(LED4); |
willgeorge | 0:9122ef37df55 | 26 | DigitalOut led5(LED5); |
willgeorge | 0:9122ef37df55 | 27 | DigitalOut led6(LED6); |
willgeorge | 0:9122ef37df55 | 28 | DigitalOut led7(LED7); |
willgeorge | 0:9122ef37df55 | 29 | pwmEdge.rise(&showEdgeHigh); |
willgeorge | 0:9122ef37df55 | 30 | pwmEdge.fall(&showEdgeLow); |
willgeorge | 0:9122ef37df55 | 31 | */ |
willgeorge | 0:9122ef37df55 | 32 | |
willgeorge | 0:9122ef37df55 | 33 | |
willgeorge | 0:9122ef37df55 | 34 | //Create interrupt input |
willgeorge | 0:9122ef37df55 | 35 | InterruptIn pwmEdge(P0_21); |
willgeorge | 0:9122ef37df55 | 36 | |
willgeorge | 0:9122ef37df55 | 37 | //create PWM outputs |
willgeorge | 0:9122ef37df55 | 38 | PwmOut PWM1(P0_18); |
willgeorge | 0:9122ef37df55 | 39 | PwmOut PWM2(P0_19); |
willgeorge | 0:9122ef37df55 | 40 | PwmOut PWM3(P1_15); |
willgeorge | 0:9122ef37df55 | 41 | |
willgeorge | 0:9122ef37df55 | 42 | //create output pin to display interrupt state event |
willgeorge | 0:9122ef37df55 | 43 | DigitalOut led7(LED7); |
willgeorge | 0:9122ef37df55 | 44 | |
willgeorge | 0:9122ef37df55 | 45 | float Period1; |
willgeorge | 0:9122ef37df55 | 46 | float DutyCycle1; |
willgeorge | 0:9122ef37df55 | 47 | float Period2; |
willgeorge | 0:9122ef37df55 | 48 | float DutyCycle2; |
willgeorge | 0:9122ef37df55 | 49 | float Period3; |
willgeorge | 0:9122ef37df55 | 50 | float DutyCycle3; |
willgeorge | 0:9122ef37df55 | 51 | |
willgeorge | 0:9122ef37df55 | 52 | //Event |
willgeorge | 0:9122ef37df55 | 53 | void onEdgeHigh() { |
willgeorge | 0:9122ef37df55 | 54 | led7 = 1; |
willgeorge | 0:9122ef37df55 | 55 | } |
willgeorge | 0:9122ef37df55 | 56 | // |
willgeorge | 0:9122ef37df55 | 57 | |
willgeorge | 0:9122ef37df55 | 58 | //Event |
willgeorge | 0:9122ef37df55 | 59 | void onEdgeLow() { |
willgeorge | 0:9122ef37df55 | 60 | led7 = 0; |
willgeorge | 0:9122ef37df55 | 61 | } |
willgeorge | 0:9122ef37df55 | 62 | // |
willgeorge | 0:9122ef37df55 | 63 | |
willgeorge | 0:9122ef37df55 | 64 | int main() { |
willgeorge | 0:9122ef37df55 | 65 | |
willgeorge | 0:9122ef37df55 | 66 | reset: //Here on Reset request.. |
willgeorge | 0:9122ef37df55 | 67 | |
willgeorge | 0:9122ef37df55 | 68 | for(int i = 0; i < 7; i++) // turn all led's off |
willgeorge | 0:9122ef37df55 | 69 | { |
willgeorge | 0:9122ef37df55 | 70 | LED[i].write(0); |
willgeorge | 0:9122ef37df55 | 71 | } |
willgeorge | 0:9122ef37df55 | 72 | // |
willgeorge | 0:9122ef37df55 | 73 | |
willgeorge | 0:9122ef37df55 | 74 | //Display we have started... |
willgeorge | 0:9122ef37df55 | 75 | for(int i = 0;i < 7;i++) { |
willgeorge | 0:9122ef37df55 | 76 | LED[i].write(1); |
willgeorge | 0:9122ef37df55 | 77 | wait(0.2); |
willgeorge | 0:9122ef37df55 | 78 | LED[i].write(0); |
willgeorge | 0:9122ef37df55 | 79 | } |
willgeorge | 0:9122ef37df55 | 80 | |
willgeorge | 0:9122ef37df55 | 81 | for(int i = 6;i >= 0;i--) { |
willgeorge | 0:9122ef37df55 | 82 | LED[i].write(1); |
willgeorge | 0:9122ef37df55 | 83 | wait(0.2); |
willgeorge | 0:9122ef37df55 | 84 | LED[i].write(0); |
willgeorge | 0:9122ef37df55 | 85 | } |
willgeorge | 0:9122ef37df55 | 86 | |
willgeorge | 0:9122ef37df55 | 87 | |
willgeorge | 0:9122ef37df55 | 88 | //Test 1kHz 70% (0.999 kHz) |
willgeorge | 0:9122ef37df55 | 89 | Period1 = 0.01; |
willgeorge | 0:9122ef37df55 | 90 | DutyCycle1 = 0.3; |
willgeorge | 0:9122ef37df55 | 91 | |
willgeorge | 0:9122ef37df55 | 92 | //Test 1kHz 50% (0.999 kHz) |
willgeorge | 0:9122ef37df55 | 93 | Period2 = 0.001; |
willgeorge | 0:9122ef37df55 | 94 | DutyCycle2 = 0.5; |
willgeorge | 0:9122ef37df55 | 95 | |
willgeorge | 0:9122ef37df55 | 96 | //Test 979.4 kHz |
willgeorge | 0:9122ef37df55 | 97 | Period3 = 0.000001; |
willgeorge | 0:9122ef37df55 | 98 | DutyCycle3 = 0.5; //51% |
willgeorge | 0:9122ef37df55 | 99 | |
willgeorge | 0:9122ef37df55 | 100 | //Set some defaults |
willgeorge | 0:9122ef37df55 | 101 | PWM1.period(Period1); |
willgeorge | 0:9122ef37df55 | 102 | PWM1=DutyCycle1; |
willgeorge | 0:9122ef37df55 | 103 | |
willgeorge | 0:9122ef37df55 | 104 | PWM2.period(Period2); |
willgeorge | 0:9122ef37df55 | 105 | PWM2=DutyCycle2; |
willgeorge | 0:9122ef37df55 | 106 | |
willgeorge | 0:9122ef37df55 | 107 | PWM3.period(Period3); |
willgeorge | 0:9122ef37df55 | 108 | PWM3=DutyCycle3; |
willgeorge | 0:9122ef37df55 | 109 | |
willgeorge | 0:9122ef37df55 | 110 | while(1) |
willgeorge | 0:9122ef37df55 | 111 | { |
willgeorge | 0:9122ef37df55 | 112 | if(serial.readable()) { |
willgeorge | 0:9122ef37df55 | 113 | |
willgeorge | 0:9122ef37df55 | 114 | //Control Characters are received as Decimal ASCII |
willgeorge | 0:9122ef37df55 | 115 | |
willgeorge | 0:9122ef37df55 | 116 | char str[60]; |
willgeorge | 0:9122ef37df55 | 117 | serial.gets(str, 60); |
willgeorge | 0:9122ef37df55 | 118 | serial.puts(str); |
willgeorge | 0:9122ef37df55 | 119 | //Indicate we have received/returned data |
willgeorge | 0:9122ef37df55 | 120 | LED[3].write(1); |
willgeorge | 0:9122ef37df55 | 121 | wait(0.2); |
willgeorge | 0:9122ef37df55 | 122 | LED[3].write(0); |
willgeorge | 0:9122ef37df55 | 123 | |
willgeorge | 0:9122ef37df55 | 124 | //Get PWM (or other) to use and the value from string |
willgeorge | 0:9122ef37df55 | 125 | //The first three characters tell us what PwmOut to use |
willgeorge | 0:9122ef37df55 | 126 | //The remaining characters are the value to use |
willgeorge | 0:9122ef37df55 | 127 | |
willgeorge | 0:9122ef37df55 | 128 | int len = strlen(str); |
willgeorge | 0:9122ef37df55 | 129 | string s2 = string(str).substr(3, len - 3); |
willgeorge | 0:9122ef37df55 | 130 | //serial.printf("s: %s Len: %d \r\n", str, len); |
willgeorge | 0:9122ef37df55 | 131 | |
willgeorge | 0:9122ef37df55 | 132 | //Warning: Non-POD class type passed through ellipsis in "main.cpp" |
willgeorge | 0:9122ef37df55 | 133 | //serial.printf("part: %s \r\n", s2); //<< My original code causing error |
willgeorge | 0:9122ef37df55 | 134 | //serial.printf("part: %s \r\n", s2.c_str()); //<< taylorza provided this and saved my day |
willgeorge | 0:9122ef37df55 | 135 | |
willgeorge | 0:9122ef37df55 | 136 | |
willgeorge | 0:9122ef37df55 | 137 | //Control Character 10 = DLE (P0_21) |
willgeorge | 0:9122ef37df55 | 138 | //Interrupt input pin |
willgeorge | 0:9122ef37df55 | 139 | if(str[0] == '1' && str[1] == '0') { |
willgeorge | 0:9122ef37df55 | 140 | if(str[2] == '1') { |
willgeorge | 0:9122ef37df55 | 141 | pwmEdge.rise(&onEdgeHigh); //Event |
willgeorge | 0:9122ef37df55 | 142 | } |
willgeorge | 0:9122ef37df55 | 143 | else if(str[2] == '0') { |
willgeorge | 0:9122ef37df55 | 144 | pwmEdge.fall(&onEdgeLow); //Event |
willgeorge | 0:9122ef37df55 | 145 | } |
willgeorge | 0:9122ef37df55 | 146 | //Disable events |
willgeorge | 0:9122ef37df55 | 147 | else if(str[2] == '2') { |
willgeorge | 0:9122ef37df55 | 148 | pwmEdge.rise(NULL); |
willgeorge | 0:9122ef37df55 | 149 | pwmEdge.fall(NULL); |
willgeorge | 0:9122ef37df55 | 150 | } |
willgeorge | 0:9122ef37df55 | 151 | // |
willgeorge | 0:9122ef37df55 | 152 | } |
willgeorge | 0:9122ef37df55 | 153 | // |
willgeorge | 0:9122ef37df55 | 154 | |
willgeorge | 0:9122ef37df55 | 155 | //Control Character 18 = DC2 (PwmOut PWM1(P0_18)) |
willgeorge | 0:9122ef37df55 | 156 | else if(str[0] == '1' && str[1] == '8') { |
willgeorge | 0:9122ef37df55 | 157 | if(str[2] == 'd') { |
willgeorge | 0:9122ef37df55 | 158 | DutyCycle1 = atof(s2.c_str()); |
willgeorge | 0:9122ef37df55 | 159 | PWM1=DutyCycle1; |
willgeorge | 0:9122ef37df55 | 160 | } |
willgeorge | 0:9122ef37df55 | 161 | else if(str[2] == 'p') { |
willgeorge | 0:9122ef37df55 | 162 | Period1 = atof(s2.c_str()); |
willgeorge | 0:9122ef37df55 | 163 | PWM1.period(Period1); |
willgeorge | 0:9122ef37df55 | 164 | } |
willgeorge | 0:9122ef37df55 | 165 | // |
willgeorge | 0:9122ef37df55 | 166 | } |
willgeorge | 0:9122ef37df55 | 167 | // |
willgeorge | 0:9122ef37df55 | 168 | |
willgeorge | 0:9122ef37df55 | 169 | //Control Character 19 = DC3 (PwmOut PWM2(P0_19)) |
willgeorge | 0:9122ef37df55 | 170 | else if(str[0] == '1' && str[1] == '9') { |
willgeorge | 0:9122ef37df55 | 171 | if(str[2] == 'd') { |
willgeorge | 0:9122ef37df55 | 172 | DutyCycle2 = atof(s2.c_str()); |
willgeorge | 0:9122ef37df55 | 173 | PWM2=DutyCycle2; |
willgeorge | 0:9122ef37df55 | 174 | } |
willgeorge | 0:9122ef37df55 | 175 | else if(str[2] == 'p') { |
willgeorge | 0:9122ef37df55 | 176 | Period2 = atof(s2.c_str()); |
willgeorge | 0:9122ef37df55 | 177 | PWM2.period(Period2); |
willgeorge | 0:9122ef37df55 | 178 | } |
willgeorge | 0:9122ef37df55 | 179 | // |
willgeorge | 0:9122ef37df55 | 180 | } |
willgeorge | 0:9122ef37df55 | 181 | // |
willgeorge | 0:9122ef37df55 | 182 | |
willgeorge | 0:9122ef37df55 | 183 | //Control Character 20 = DC4 (PwmOut PWM3(P1_15)) |
willgeorge | 0:9122ef37df55 | 184 | else if(str[0] == '2' && str[1] == '0') { |
willgeorge | 0:9122ef37df55 | 185 | if(str[2] == 'd') { |
willgeorge | 0:9122ef37df55 | 186 | DutyCycle3 = atof(s2.c_str()); |
willgeorge | 0:9122ef37df55 | 187 | PWM3=DutyCycle3; |
willgeorge | 0:9122ef37df55 | 188 | } |
willgeorge | 0:9122ef37df55 | 189 | else if(str[2] == 'p') { |
willgeorge | 0:9122ef37df55 | 190 | Period3 = atof(s2.c_str()); |
willgeorge | 0:9122ef37df55 | 191 | PWM3.period(Period3); |
willgeorge | 0:9122ef37df55 | 192 | } |
willgeorge | 0:9122ef37df55 | 193 | // |
willgeorge | 0:9122ef37df55 | 194 | } |
willgeorge | 0:9122ef37df55 | 195 | // |
willgeorge | 0:9122ef37df55 | 196 | |
willgeorge | 0:9122ef37df55 | 197 | //Control Character 17 = DC1 |
willgeorge | 0:9122ef37df55 | 198 | //Reset the mBuino - (Assuming serial can read) |
willgeorge | 0:9122ef37df55 | 199 | else if(str[0] == '1' && str[1] == '7') { |
willgeorge | 0:9122ef37df55 | 200 | goto reset; |
willgeorge | 0:9122ef37df55 | 201 | } //if |
willgeorge | 0:9122ef37df55 | 202 | |
willgeorge | 0:9122ef37df55 | 203 | } //if serial.readable() |
willgeorge | 0:9122ef37df55 | 204 | } //while |
willgeorge | 0:9122ef37df55 | 205 | } //main |
willgeorge | 0:9122ef37df55 | 206 | // |