Firmware for single step driver with fast step (up to 340kHz) and simple gcode interpreter.

Dependencies:   FastPWM SimpleIOMacros mbed

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?

UserRevisionLine numberNew 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 }