Firmware for single step driver with fast step (up to 340kHz) and simple gcode interpreter.
Dependencies: FastPWM SimpleIOMacros mbed
main.cpp@1:86997189bb6b, 2013-02-28 (annotated)
- Committer:
- daapp
- Date:
- Thu Feb 28 11:40:50 2013 +0000
- Revision:
- 1:86997189bb6b
- Parent:
- 0:b53649cd217f
- Child:
- 2:33a99f65551d
Fix state of code before implementation of real movement.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
daapp | 1:86997189bb6b | 1 | /* picocom -b 115200 -c --imap lfcrlf --omap crlf /dev/ttyACM0 */ |
daapp | 1:86997189bb6b | 2 | |
daapp | 1:86997189bb6b | 3 | |
daapp | 1:86997189bb6b | 4 | /* |
daapp | 1:86997189bb6b | 5 | todo: attach callback to Serial when no command executed only with STOP command |
daapp | 1:86997189bb6b | 6 | todo: when command complete it should print "ok" |
daapp | 1:86997189bb6b | 7 | todo: when all settings printed print "ok" |
daapp | 1:86997189bb6b | 8 | todo: when value of parameter changed print "ok saved" |
daapp | 1:86997189bb6b | 9 | todo: when value of parameter is invalid print "err invalid value" |
daapp | 1:86997189bb6b | 10 | todo: add G command for set zero here |
daapp | 1:86997189bb6b | 11 | */ |
daapp | 1:86997189bb6b | 12 | |
daapp | 1:86997189bb6b | 13 | #include "mbed.h" |
daapp | 1:86997189bb6b | 14 | #include "FastPWM.h" |
daapp | 1:86997189bb6b | 15 | #include "IOMacros.h" |
daapp | 1:86997189bb6b | 16 | |
daapp | 1:86997189bb6b | 17 | #define VERSION "0.1" |
daapp | 1:86997189bb6b | 18 | |
daapp | 1:86997189bb6b | 19 | #define DEBUG |
daapp | 1:86997189bb6b | 20 | |
daapp | 1:86997189bb6b | 21 | #define FILESYSTEM_ROOT "local" |
daapp | 1:86997189bb6b | 22 | #define SETTINGS_FILE ("/" FILESYSTEM_ROOT "/settings.txt") |
daapp | 1:86997189bb6b | 23 | #define SETTINGS_BACKUP_FILE ("/" FILESYSTEM_ROOT "/settings.bak") |
daapp | 1:86997189bb6b | 24 | |
daapp | 1:86997189bb6b | 25 | LocalFileSystem local(FILESYSTEM_ROOT); |
daapp | 1:86997189bb6b | 26 | |
daapp | 1:86997189bb6b | 27 | |
daapp | 1:86997189bb6b | 28 | /* p30 - P0_4 */ |
daapp | 1:86997189bb6b | 29 | // const uint32_t counterPin = 4; |
daapp | 1:86997189bb6b | 30 | const uint32_t counterIntMask = p30_SET_MASK; |
daapp | 1:86997189bb6b | 31 | |
daapp | 1:86997189bb6b | 32 | volatile int32_t position; |
daapp | 1:86997189bb6b | 33 | |
daapp | 1:86997189bb6b | 34 | FastPWM stepper(p21); |
daapp | 1:86997189bb6b | 35 | |
daapp | 1:86997189bb6b | 36 | // Dir pin is p22 - P2.4 |
daapp | 1:86997189bb6b | 37 | |
daapp | 1:86997189bb6b | 38 | |
daapp | 1:86997189bb6b | 39 | /* G code interpreter state*/ |
daapp | 1:86997189bb6b | 40 | bool absMovementMode = true; |
daapp | 1:86997189bb6b | 41 | double mmPosition = 0.0; // mm |
daapp | 1:86997189bb6b | 42 | double feedRate = 1.0; // mm/sec^2 |
daapp | 1:86997189bb6b | 43 | |
daapp | 1:86997189bb6b | 44 | /* *** Serial port *** */ |
daapp | 1:86997189bb6b | 45 | Serial pc(USBTX, USBRX); |
daapp | 1:86997189bb6b | 46 | #define SERIAL_BUFFER_SIZE 40 |
daapp | 1:86997189bb6b | 47 | char serialBuffer[SERIAL_BUFFER_SIZE+1]; |
daapp | 1:86997189bb6b | 48 | int serialPosition = 0; |
daapp | 1:86997189bb6b | 49 | |
daapp | 1:86997189bb6b | 50 | |
daapp | 1:86997189bb6b | 51 | /* *** Settings *** */ |
daapp | 1:86997189bb6b | 52 | |
daapp | 1:86997189bb6b | 53 | typedef struct { |
daapp | 1:86997189bb6b | 54 | double steps_per_mm; |
daapp | 1:86997189bb6b | 55 | double acceleration; // mm/sec^2 |
daapp | 1:86997189bb6b | 56 | double start_acceleration; // mm/sec^2 |
daapp | 1:86997189bb6b | 57 | } settings_t; |
daapp | 1:86997189bb6b | 58 | |
daapp | 1:86997189bb6b | 59 | settings_t settings; |
daapp | 1:86997189bb6b | 60 | |
daapp | 1:86997189bb6b | 61 | // return true - if parsed succesfully |
daapp | 1:86997189bb6b | 62 | // return false - if error during parsing |
daapp | 1:86997189bb6b | 63 | bool parse_settings(FILE *fp, settings_t *settings) { |
daapp | 1:86997189bb6b | 64 | // todo: write parser |
daapp | 1:86997189bb6b | 65 | return true; |
daapp | 1:86997189bb6b | 66 | } |
daapp | 1:86997189bb6b | 67 | |
daapp | 1:86997189bb6b | 68 | void load_settings(char *filename) { |
daapp | 1:86997189bb6b | 69 | FILE *fp; |
daapp | 1:86997189bb6b | 70 | |
daapp | 1:86997189bb6b | 71 | #ifdef DEBUG |
daapp | 1:86997189bb6b | 72 | pc.printf("debug load settings from file \"%s\"\n", filename); |
daapp | 1:86997189bb6b | 73 | #endif |
daapp | 1:86997189bb6b | 74 | |
daapp | 1:86997189bb6b | 75 | fp = fopen(filename, "r"); |
daapp | 1:86997189bb6b | 76 | if (fp == NULL) { |
daapp | 1:86997189bb6b | 77 | settings.steps_per_mm = 25600.0 / 150.0; // 170.666667; |
daapp | 1:86997189bb6b | 78 | settings.acceleration = 1000.000; |
daapp | 1:86997189bb6b | 79 | settings.start_acceleration = 0.0; |
daapp | 1:86997189bb6b | 80 | } else { |
daapp | 1:86997189bb6b | 81 | parse_settings(fp, &settings); |
daapp | 1:86997189bb6b | 82 | fclose(fp); |
daapp | 1:86997189bb6b | 83 | } |
daapp | 1:86997189bb6b | 84 | } |
daapp | 1:86997189bb6b | 85 | |
daapp | 1:86997189bb6b | 86 | void save_settings(char *filename) { |
daapp | 1:86997189bb6b | 87 | FILE *fp; |
daapp | 1:86997189bb6b | 88 | |
daapp | 1:86997189bb6b | 89 | fp = fopen(SETTINGS_FILE, "w"); |
daapp | 1:86997189bb6b | 90 | if (fp != NULL) { |
daapp | 1:86997189bb6b | 91 | fprintf(fp, "$0=%f\n", settings.steps_per_mm); |
daapp | 1:86997189bb6b | 92 | fprintf(fp, "$1=%f\n", settings.acceleration); |
daapp | 1:86997189bb6b | 93 | fprintf(fp, "$2=%f\n", settings.start_acceleration); |
daapp | 1:86997189bb6b | 94 | fclose(fp); |
daapp | 1:86997189bb6b | 95 | #ifdef DEBUG |
daapp | 1:86997189bb6b | 96 | pc.printf("ok settings saved to %s\n", SETTINGS_FILE); |
daapp | 1:86997189bb6b | 97 | #endif |
daapp | 1:86997189bb6b | 98 | } else { |
daapp | 1:86997189bb6b | 99 | pc.printf("err unable to open %s for writing\n", SETTINGS_FILE); |
daapp | 1:86997189bb6b | 100 | } |
daapp | 1:86997189bb6b | 101 | } |
daapp | 1:86997189bb6b | 102 | |
daapp | 1:86997189bb6b | 103 | void print_settings() { |
daapp | 1:86997189bb6b | 104 | pc.printf("$0=%f (x, steps/mm)\n", settings.steps_per_mm); |
daapp | 1:86997189bb6b | 105 | pc.printf("$1=%f (x accel, mm/sec^2)\n", settings.acceleration); |
daapp | 1:86997189bb6b | 106 | pc.printf("$2=%f (x start acceleration, mm/sec^2)\n", settings.start_acceleration); |
daapp | 1:86997189bb6b | 107 | pc.printf("ok\n"); |
daapp | 1:86997189bb6b | 108 | } |
daapp | 1:86997189bb6b | 109 | |
daapp | 1:86997189bb6b | 110 | // return true if no error |
daapp | 1:86997189bb6b | 111 | // return false if error (invalid parameter or value) |
daapp | 1:86997189bb6b | 112 | bool set_param(char name, char *value) { |
daapp | 1:86997189bb6b | 113 | if (name >= '0' && name <= '2') { |
daapp | 1:86997189bb6b | 114 | char *endP = value; |
daapp | 1:86997189bb6b | 115 | double dblValue; |
daapp | 1:86997189bb6b | 116 | bool error = false; |
daapp | 1:86997189bb6b | 117 | |
daapp | 1:86997189bb6b | 118 | dblValue = strtod(value, &endP); |
daapp | 1:86997189bb6b | 119 | if (value == endP || *endP != '\0') { |
daapp | 1:86997189bb6b | 120 | pc.printf("err invalid value for command $%c: %s\n", name, value); |
daapp | 1:86997189bb6b | 121 | error = true; |
daapp | 1:86997189bb6b | 122 | } else { |
daapp | 1:86997189bb6b | 123 | |
daapp | 1:86997189bb6b | 124 | #ifdef DEBUG |
daapp | 1:86997189bb6b | 125 | pc.printf("debug $%c=%f -> %s\n", name, dblValue, endP); |
daapp | 1:86997189bb6b | 126 | #endif |
daapp | 1:86997189bb6b | 127 | |
daapp | 1:86997189bb6b | 128 | switch (name) { |
daapp | 1:86997189bb6b | 129 | case '0': |
daapp | 1:86997189bb6b | 130 | if (dblValue > 0.0) { |
daapp | 1:86997189bb6b | 131 | settings.steps_per_mm = dblValue; |
daapp | 1:86997189bb6b | 132 | } else { |
daapp | 1:86997189bb6b | 133 | pc.printf("err value should be > 0.0, but %f\n", dblValue); |
daapp | 1:86997189bb6b | 134 | error = true; |
daapp | 1:86997189bb6b | 135 | } |
daapp | 1:86997189bb6b | 136 | break; |
daapp | 1:86997189bb6b | 137 | case '1': |
daapp | 1:86997189bb6b | 138 | if (dblValue > 0.0) { |
daapp | 1:86997189bb6b | 139 | settings.acceleration = dblValue; |
daapp | 1:86997189bb6b | 140 | } else { |
daapp | 1:86997189bb6b | 141 | pc.printf("err value should be > 0.0, but %f\n", dblValue); |
daapp | 1:86997189bb6b | 142 | error = true; |
daapp | 1:86997189bb6b | 143 | } |
daapp | 1:86997189bb6b | 144 | break; |
daapp | 1:86997189bb6b | 145 | case '2': |
daapp | 1:86997189bb6b | 146 | if (dblValue >= 0.0) { |
daapp | 1:86997189bb6b | 147 | settings.start_acceleration = dblValue; |
daapp | 1:86997189bb6b | 148 | } else { |
daapp | 1:86997189bb6b | 149 | pc.printf("err value should be >= 0.0, but %f\n", dblValue); |
daapp | 1:86997189bb6b | 150 | error = true; |
daapp | 1:86997189bb6b | 151 | } |
daapp | 1:86997189bb6b | 152 | break; |
daapp | 1:86997189bb6b | 153 | default: |
daapp | 1:86997189bb6b | 154 | pc.printf("err parameter %c unrecognized\n", name); |
daapp | 1:86997189bb6b | 155 | error = true; |
daapp | 1:86997189bb6b | 156 | break; |
daapp | 1:86997189bb6b | 157 | } |
daapp | 1:86997189bb6b | 158 | } |
daapp | 1:86997189bb6b | 159 | return !error; |
daapp | 1:86997189bb6b | 160 | } else { |
daapp | 1:86997189bb6b | 161 | pc.printf("err invalid parameter %c\n", name); |
daapp | 1:86997189bb6b | 162 | return false; |
daapp | 1:86997189bb6b | 163 | } |
daapp | 1:86997189bb6b | 164 | } |
daapp | 1:86997189bb6b | 165 | |
daapp | 1:86997189bb6b | 166 | |
daapp | 1:86997189bb6b | 167 | void invalidCommand() { |
daapp | 1:86997189bb6b | 168 | pc.printf("err invalid command %s\n", serialBuffer); |
daapp | 1:86997189bb6b | 169 | } |
daapp | 1:86997189bb6b | 170 | |
daapp | 1:86997189bb6b | 171 | void moveModule(double position) { |
daapp | 1:86997189bb6b | 172 | double newmmPosition; |
daapp | 1:86997189bb6b | 173 | newmmPosition = absMovementMode ? position : mmPosition + position; |
daapp | 1:86997189bb6b | 174 | |
daapp | 1:86997189bb6b | 175 | #ifdef DEBUG |
daapp | 1:86997189bb6b | 176 | pc.printf("debug move from %f to %f\n", mmPosition, newmmPosition); |
daapp | 1:86997189bb6b | 177 | pc.printf("debug move from %f to %f\n", mmPosition * settings.steps_per_mm, newmmPosition * settings.steps_per_mm); |
daapp | 1:86997189bb6b | 178 | #endif |
daapp | 1:86997189bb6b | 179 | |
daapp | 1:86997189bb6b | 180 | if (newmmPosition > mmPosition) { |
daapp | 1:86997189bb6b | 181 | p22_CLR; |
daapp | 1:86997189bb6b | 182 | } else { |
daapp | 1:86997189bb6b | 183 | p22_SET; |
daapp | 1:86997189bb6b | 184 | } |
daapp | 1:86997189bb6b | 185 | |
daapp | 1:86997189bb6b | 186 | // todo: remove |
daapp | 1:86997189bb6b | 187 | position = 0; |
daapp | 1:86997189bb6b | 188 | |
daapp | 1:86997189bb6b | 189 | stepper.period(1.0/170000.0); |
daapp | 1:86997189bb6b | 190 | stepper.write(0.50); |
daapp | 1:86997189bb6b | 191 | |
daapp | 1:86997189bb6b | 192 | mmPosition = newmmPosition; |
daapp | 1:86997189bb6b | 193 | } |
daapp | 1:86997189bb6b | 194 | |
daapp | 1:86997189bb6b | 195 | void stopModule() { |
daapp | 1:86997189bb6b | 196 | stepper.write(0); |
daapp | 1:86997189bb6b | 197 | |
daapp | 1:86997189bb6b | 198 | #ifdef DEBUG |
daapp | 1:86997189bb6b | 199 | pc.printf("position = %d steps\n", position); |
daapp | 1:86997189bb6b | 200 | #endif |
daapp | 1:86997189bb6b | 201 | |
daapp | 1:86997189bb6b | 202 | mmPosition = position / settings.steps_per_mm; |
daapp | 1:86997189bb6b | 203 | pc.printf("ok stop position %f mm\n", mmPosition); |
daapp | 1:86997189bb6b | 204 | } |
daapp | 1:86997189bb6b | 205 | |
daapp | 1:86997189bb6b | 206 | void processCommand(void) { |
daapp | 1:86997189bb6b | 207 | #ifdef DEBUG |
daapp | 1:86997189bb6b | 208 | pc.printf("debug serial buffer <%s>\n", serialBuffer); |
daapp | 1:86997189bb6b | 209 | #endif |
daapp | 1:86997189bb6b | 210 | |
daapp | 1:86997189bb6b | 211 | if (serialBuffer[0] == '\0') { |
daapp | 1:86997189bb6b | 212 | // todo: empty command stop the stage |
daapp | 1:86997189bb6b | 213 | stopModule(); |
daapp | 1:86997189bb6b | 214 | } else if (serialBuffer[0] == '$') { |
daapp | 1:86997189bb6b | 215 | // '$' - print or change settings |
daapp | 1:86997189bb6b | 216 | if (serialBuffer[1] == '\0') { |
daapp | 1:86997189bb6b | 217 | print_settings(); |
daapp | 1:86997189bb6b | 218 | } else if (serialBuffer[1] >= '0' and serialBuffer[1] <='9' and serialBuffer[2] == '=') { |
daapp | 1:86997189bb6b | 219 | // todo: save settings to file |
daapp | 1:86997189bb6b | 220 | if (set_param(serialBuffer[1], &serialBuffer[3])) { |
daapp | 1:86997189bb6b | 221 | save_settings(SETTINGS_FILE); |
daapp | 1:86997189bb6b | 222 | } |
daapp | 1:86997189bb6b | 223 | } else { |
daapp | 1:86997189bb6b | 224 | invalidCommand(); |
daapp | 1:86997189bb6b | 225 | } |
daapp | 1:86997189bb6b | 226 | } else if (serialBuffer[0] == '?' && serialBuffer[1] == '\0') { |
daapp | 1:86997189bb6b | 227 | // todo: print in millimeters |
daapp | 1:86997189bb6b | 228 | pc.printf("ok %f\n", mmPosition); |
daapp | 1:86997189bb6b | 229 | } else { |
daapp | 1:86997189bb6b | 230 | // todo: parse G-code here |
daapp | 1:86997189bb6b | 231 | char *p = serialBuffer, *endP = serialBuffer; |
daapp | 1:86997189bb6b | 232 | uint32_t ulValue; |
daapp | 1:86997189bb6b | 233 | double dblValue; |
daapp | 1:86997189bb6b | 234 | |
daapp | 1:86997189bb6b | 235 | bool error = false; |
daapp | 1:86997189bb6b | 236 | |
daapp | 1:86997189bb6b | 237 | bool newAbsMovementMode = absMovementMode; |
daapp | 1:86997189bb6b | 238 | double newmmPosition = mmPosition; |
daapp | 1:86997189bb6b | 239 | double newFeedRate = feedRate; |
daapp | 1:86997189bb6b | 240 | |
daapp | 1:86997189bb6b | 241 | bool move = false; |
daapp | 1:86997189bb6b | 242 | |
daapp | 1:86997189bb6b | 243 | while (*p != '\0') { |
daapp | 1:86997189bb6b | 244 | switch (*p) { |
daapp | 1:86997189bb6b | 245 | case 'G': |
daapp | 1:86997189bb6b | 246 | p++; |
daapp | 1:86997189bb6b | 247 | ulValue = strtoul(p, &endP, 10); |
daapp | 1:86997189bb6b | 248 | if (p == endP) { |
daapp | 1:86997189bb6b | 249 | pc.printf("err invalid value for command G: %s\n", p); |
daapp | 1:86997189bb6b | 250 | error = true; |
daapp | 1:86997189bb6b | 251 | } else { |
daapp | 1:86997189bb6b | 252 | #ifdef DEBUG |
daapp | 1:86997189bb6b | 253 | pc.printf("debug G%u -> %s\n", ulValue, endP); |
daapp | 1:86997189bb6b | 254 | #endif |
daapp | 1:86997189bb6b | 255 | p = endP; |
daapp | 1:86997189bb6b | 256 | switch (ulValue) { |
daapp | 1:86997189bb6b | 257 | case 0: |
daapp | 1:86997189bb6b | 258 | // todo: implement |
daapp | 1:86997189bb6b | 259 | break; |
daapp | 1:86997189bb6b | 260 | case 1: |
daapp | 1:86997189bb6b | 261 | // todo: implement |
daapp | 1:86997189bb6b | 262 | break; |
daapp | 1:86997189bb6b | 263 | case 90: |
daapp | 1:86997189bb6b | 264 | newAbsMovementMode = true; |
daapp | 1:86997189bb6b | 265 | break; |
daapp | 1:86997189bb6b | 266 | case 91: |
daapp | 1:86997189bb6b | 267 | newAbsMovementMode = false; |
daapp | 1:86997189bb6b | 268 | break; |
daapp | 1:86997189bb6b | 269 | default: |
daapp | 1:86997189bb6b | 270 | pc.printf("err invalid value for command G: %u\n", ulValue); |
daapp | 1:86997189bb6b | 271 | error = true; |
daapp | 1:86997189bb6b | 272 | break; |
daapp | 1:86997189bb6b | 273 | } |
daapp | 1:86997189bb6b | 274 | } |
daapp | 1:86997189bb6b | 275 | break; |
daapp | 1:86997189bb6b | 276 | case 'X': |
daapp | 1:86997189bb6b | 277 | p++; |
daapp | 1:86997189bb6b | 278 | dblValue = strtod(p, &endP); |
daapp | 1:86997189bb6b | 279 | if (p == endP) { |
daapp | 1:86997189bb6b | 280 | pc.printf("err invalid value for command X: %s\n", p); |
daapp | 1:86997189bb6b | 281 | error = true; |
daapp | 1:86997189bb6b | 282 | } else { |
daapp | 1:86997189bb6b | 283 | #ifdef DEBUG |
daapp | 1:86997189bb6b | 284 | pc.printf("debug X%f -> %s\n", dblValue, endP); |
daapp | 1:86997189bb6b | 285 | #endif |
daapp | 1:86997189bb6b | 286 | p = endP; |
daapp | 1:86997189bb6b | 287 | newmmPosition = dblValue; |
daapp | 1:86997189bb6b | 288 | |
daapp | 1:86997189bb6b | 289 | move = true; |
daapp | 1:86997189bb6b | 290 | } |
daapp | 1:86997189bb6b | 291 | break; |
daapp | 1:86997189bb6b | 292 | case 'F': |
daapp | 1:86997189bb6b | 293 | p++; |
daapp | 1:86997189bb6b | 294 | dblValue = strtod(p, &endP); |
daapp | 1:86997189bb6b | 295 | if (p == endP || dblValue < 0.0) { |
daapp | 1:86997189bb6b | 296 | pc.printf("err invalid value for command F: %s\n", p); |
daapp | 1:86997189bb6b | 297 | error = true; |
daapp | 1:86997189bb6b | 298 | } else { |
daapp | 1:86997189bb6b | 299 | #ifdef DEBUG |
daapp | 1:86997189bb6b | 300 | pc.printf("debug parse F%f => rest %s\n", dblValue, endP); |
daapp | 1:86997189bb6b | 301 | #endif |
daapp | 1:86997189bb6b | 302 | p = endP; |
daapp | 1:86997189bb6b | 303 | newFeedRate = dblValue; |
daapp | 1:86997189bb6b | 304 | } |
daapp | 1:86997189bb6b | 305 | break; |
daapp | 1:86997189bb6b | 306 | default: |
daapp | 1:86997189bb6b | 307 | pc.printf("err invalid command %s\n", p); |
daapp | 1:86997189bb6b | 308 | error = true; |
daapp | 1:86997189bb6b | 309 | break; |
daapp | 1:86997189bb6b | 310 | } |
daapp | 1:86997189bb6b | 311 | |
daapp | 1:86997189bb6b | 312 | if (error) { |
daapp | 1:86997189bb6b | 313 | break; |
daapp | 1:86997189bb6b | 314 | } |
daapp | 1:86997189bb6b | 315 | |
daapp | 1:86997189bb6b | 316 | } |
daapp | 1:86997189bb6b | 317 | |
daapp | 1:86997189bb6b | 318 | if (!error) { |
daapp | 1:86997189bb6b | 319 | // todo: check all flags and execute commands here |
daapp | 1:86997189bb6b | 320 | absMovementMode = newAbsMovementMode; |
daapp | 1:86997189bb6b | 321 | //mmPosition = newmmPosition; |
daapp | 1:86997189bb6b | 322 | feedRate = newFeedRate; |
daapp | 1:86997189bb6b | 323 | // todo: run line module here |
daapp | 1:86997189bb6b | 324 | |
daapp | 1:86997189bb6b | 325 | pc.printf("absMovementMode = %u\n", absMovementMode); |
daapp | 1:86997189bb6b | 326 | pc.printf("mmPosition = %f\n", mmPosition); |
daapp | 1:86997189bb6b | 327 | pc.printf("feedRate = %f\n", feedRate); |
daapp | 1:86997189bb6b | 328 | |
daapp | 1:86997189bb6b | 329 | if (move) { |
daapp | 1:86997189bb6b | 330 | moveModule(newmmPosition); |
daapp | 1:86997189bb6b | 331 | } |
daapp | 1:86997189bb6b | 332 | } |
daapp | 1:86997189bb6b | 333 | } |
daapp | 1:86997189bb6b | 334 | } |
daapp | 1:86997189bb6b | 335 | |
daapp | 1:86997189bb6b | 336 | |
daapp | 1:86997189bb6b | 337 | void readChar(void) { |
daapp | 1:86997189bb6b | 338 | int ch; |
daapp | 1:86997189bb6b | 339 | |
daapp | 1:86997189bb6b | 340 | #ifdef DEBUG |
daapp | 1:86997189bb6b | 341 | LED4_ON; |
daapp | 1:86997189bb6b | 342 | #endif |
daapp | 1:86997189bb6b | 343 | |
daapp | 1:86997189bb6b | 344 | ch = pc.getc(); |
daapp | 1:86997189bb6b | 345 | if (serialPosition < SERIAL_BUFFER_SIZE) { |
daapp | 1:86997189bb6b | 346 | |
daapp | 1:86997189bb6b | 347 | } else { |
daapp | 1:86997189bb6b | 348 | pc.printf("\nToo long string, should be <= %d characters.\n", SERIAL_BUFFER_SIZE); |
daapp | 1:86997189bb6b | 349 | serialPosition = 0; |
daapp | 1:86997189bb6b | 350 | } |
daapp | 1:86997189bb6b | 351 | if (ch == ' ' || ch == '\t') { |
daapp | 1:86997189bb6b | 352 | // ignore space characters |
daapp | 1:86997189bb6b | 353 | } else { |
daapp | 1:86997189bb6b | 354 | |
daapp | 1:86997189bb6b | 355 | if (ch == '\n') { |
daapp | 1:86997189bb6b | 356 | serialBuffer[serialPosition] = '\0'; |
daapp | 1:86997189bb6b | 357 | processCommand(); |
daapp | 1:86997189bb6b | 358 | serialPosition = 0; |
daapp | 1:86997189bb6b | 359 | serialBuffer[serialPosition] = '\0'; |
daapp | 1:86997189bb6b | 360 | } else { |
daapp | 1:86997189bb6b | 361 | if (ch >= 'a' and ch <= 'z') { |
daapp | 1:86997189bb6b | 362 | ch = 'A' + (ch - 'a'); // convert to upper case |
daapp | 1:86997189bb6b | 363 | } |
daapp | 1:86997189bb6b | 364 | serialBuffer[serialPosition++] = ch; |
daapp | 1:86997189bb6b | 365 | } |
daapp | 1:86997189bb6b | 366 | } |
daapp | 1:86997189bb6b | 367 | |
daapp | 1:86997189bb6b | 368 | #ifdef DEBUG |
daapp | 1:86997189bb6b | 369 | LED4_OFF; |
daapp | 1:86997189bb6b | 370 | #endif |
daapp | 1:86997189bb6b | 371 | } |
daapp | 1:86997189bb6b | 372 | |
daapp | 1:86997189bb6b | 373 | |
daapp | 1:86997189bb6b | 374 | |
daapp | 1:86997189bb6b | 375 | void update_position(); |
daapp | 1:86997189bb6b | 376 | |
daapp | 1:86997189bb6b | 377 | |
daapp | 1:86997189bb6b | 378 | extern "C" void EINT3_IRQHandler (void) __irq { |
daapp | 1:86997189bb6b | 379 | if (LPC_GPIOINT->IntStatus & 0x1) { |
daapp | 1:86997189bb6b | 380 | if (LPC_GPIOINT->IO0IntStatF & counterIntMask) { |
daapp | 1:86997189bb6b | 381 | update_position(); |
daapp | 1:86997189bb6b | 382 | } |
daapp | 1:86997189bb6b | 383 | } |
daapp | 1:86997189bb6b | 384 | |
daapp | 1:86997189bb6b | 385 | LPC_GPIOINT->IO2IntClr = (LPC_GPIOINT->IO2IntStatR | LPC_GPIOINT->IO2IntStatF); |
daapp | 1:86997189bb6b | 386 | LPC_GPIOINT->IO0IntClr = (LPC_GPIOINT->IO0IntStatR | LPC_GPIOINT->IO0IntStatF); |
daapp | 1:86997189bb6b | 387 | |
daapp | 1:86997189bb6b | 388 | } |
daapp | 1:86997189bb6b | 389 | |
daapp | 1:86997189bb6b | 390 | void update_position() { |
daapp | 1:86997189bb6b | 391 | position++; |
daapp | 1:86997189bb6b | 392 | /* |
daapp | 1:86997189bb6b | 393 | if (position > 0) { |
daapp | 1:86997189bb6b | 394 | position--; |
daapp | 1:86997189bb6b | 395 | } else { |
daapp | 1:86997189bb6b | 396 | position = 170000; |
daapp | 1:86997189bb6b | 397 | }*/ |
daapp | 1:86997189bb6b | 398 | } |
daapp | 1:86997189bb6b | 399 | |
daapp | 1:86997189bb6b | 400 | |
daapp | 1:86997189bb6b | 401 | void event_irq_init(void) { |
daapp | 1:86997189bb6b | 402 | p30_AS_INPUT; |
daapp | 1:86997189bb6b | 403 | // Enable p30 is P0_4 for rising edge interrupt generation. |
daapp | 1:86997189bb6b | 404 | LPC_GPIOINT->IO0IntEnF |= counterIntMask; |
daapp | 1:86997189bb6b | 405 | //NVIC_SetPriority(EINT3_IRQn, 1); |
daapp | 1:86997189bb6b | 406 | // Enable the interrupt |
daapp | 1:86997189bb6b | 407 | NVIC_EnableIRQ(EINT3_IRQn); |
daapp | 1:86997189bb6b | 408 | } |
daapp | 1:86997189bb6b | 409 | |
daapp | 1:86997189bb6b | 410 | |
daapp | 1:86997189bb6b | 411 | |
daapp | 1:86997189bb6b | 412 | int main() { |
daapp | 1:86997189bb6b | 413 | LED1_USE; // step movement |
daapp | 1:86997189bb6b | 414 | LED4_USE; // serial port receive |
daapp | 1:86997189bb6b | 415 | |
daapp | 1:86997189bb6b | 416 | p22_AS_OUTPUT; |
daapp | 1:86997189bb6b | 417 | |
daapp | 1:86997189bb6b | 418 | position = 0; |
daapp | 1:86997189bb6b | 419 | |
daapp | 1:86997189bb6b | 420 | pc.baud(115200); |
daapp | 1:86997189bb6b | 421 | pc.attach(readChar); |
daapp | 1:86997189bb6b | 422 | |
daapp | 1:86997189bb6b | 423 | pc.printf("IGNB-SM %s ['$' for help]\n", VERSION); |
daapp | 1:86997189bb6b | 424 | |
daapp | 1:86997189bb6b | 425 | load_settings(SETTINGS_FILE); |
daapp | 1:86997189bb6b | 426 | |
daapp | 1:86997189bb6b | 427 | //stepper.period(1.0/170000.0); |
daapp | 1:86997189bb6b | 428 | //stepper.write(0.50); |
daapp | 1:86997189bb6b | 429 | |
daapp | 1:86997189bb6b | 430 | event_irq_init(); |
daapp | 1:86997189bb6b | 431 | |
daapp | 1:86997189bb6b | 432 | while(1) { |
daapp | 1:86997189bb6b | 433 | //position = 0; |
daapp | 1:86997189bb6b | 434 | |
daapp | 1:86997189bb6b | 435 | //LED1_ON; |
daapp | 1:86997189bb6b | 436 | //stepper.write(0.5); |
daapp | 1:86997189bb6b | 437 | //wait(1); |
daapp | 1:86997189bb6b | 438 | //stepper.write(0.0); |
daapp | 1:86997189bb6b | 439 | //LED1_OFF; |
daapp | 1:86997189bb6b | 440 | //pc.printf("%d\r\n", position); |
daapp | 1:86997189bb6b | 441 | //wait(1); |
daapp | 1:86997189bb6b | 442 | } |
daapp | 1:86997189bb6b | 443 | } |