From b00d2a1cab9c6f8281fa748168259baf73835643 Mon Sep 17 00:00:00 2001 From: Sonny Jeon Date: Wed, 16 Mar 2016 14:13:49 -0600 Subject: [PATCH] Soft limit handling bug fix - Soft limit errors were stuck in a feed hold without notifying the user why it was in a hold. When resumed, the soft limit error would kick in. Issue should be fixed to behave as intended to automatically hold and issue a soft limit alarm once the machine has come to a stop. --- README.md | 2 +- doc/log/commit_log_v0.9j.txt | 18 ++++++++++++++++++ grbl/grbl.h | 2 +- grbl/limits.c | 9 ++++----- grbl/main.c | 3 ++- grbl/protocol.c | 3 +-- grbl/system.h | 1 + 7 files changed, 28 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index e0d667766..e6cdf02ff 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Grbl includes full acceleration management with look ahead. That means the contr *** _**Master Branch:**_ -* [Grbl v0.9j Atmega328p 16mhz 115200baud with generic defaults](http://bit.ly/1I8Ey4S) _(2016-03-03)_ +* [Grbl v0.9j Atmega328p 16mhz 115200baud with generic defaults](http://bit.ly/1I8Ey4S) _(2016-03-16)_ - **IMPORTANT INFO WHEN UPGRADING TO GRBL v0.9 :** - Baudrate is now **115200** (Up from 9600). - Homing cycle updated. Located based on switch trigger, rather than release point. diff --git a/doc/log/commit_log_v0.9j.txt b/doc/log/commit_log_v0.9j.txt index 8c66a4260..cd1225123 100644 --- a/doc/log/commit_log_v0.9j.txt +++ b/doc/log/commit_log_v0.9j.txt @@ -1,3 +1,21 @@ +---------------- +Date: 2016-03-03 +Author: Sonny Jeon +Subject: Bug fixes and more limit configurability + +- Strange sizeof() bug in the most recent releases. Manifested as an +alarm upon a power up even when homing was disabled. Fixed by declaring +sizeof() with struct types, rather than variable names, even though +they were validated to give the same value. + +- Spindle speed zero should disable the spindle. Now fixed. + +- New configuration option for inverting certain limit pins. Handy for +mixed NO and NC switch machines. See config.h for details. + +- Incremented version and pre-build firmware link. + + ---------------- Date: 2015-12-18 Author: Sonny Jeon diff --git a/grbl/grbl.h b/grbl/grbl.h index 50f5bf361..93f5a620c 100644 --- a/grbl/grbl.h +++ b/grbl/grbl.h @@ -23,7 +23,7 @@ // Grbl versioning system #define GRBL_VERSION "0.9j" -#define GRBL_VERSION_BUILD "20160303" +#define GRBL_VERSION_BUILD "20160316" // Define standard libraries used by Grbl. #include diff --git a/grbl/limits.c b/grbl/limits.c index 90f49ba07..6cd1cd94b 100644 --- a/grbl/limits.c +++ b/grbl/limits.c @@ -317,23 +317,22 @@ void limits_go_home(uint8_t cycle_mask) void limits_soft_check(float *target) { uint8_t idx; - uint8_t soft_limit_error = false; for (idx=0; idx -settings.max_travel[idx]) { soft_limit_error = true; } + if (target[idx] < 0 || target[idx] > -settings.max_travel[idx]) { sys.soft_limit = true; } } else { - if (target[idx] > 0 || target[idx] < settings.max_travel[idx]) { soft_limit_error = true; } + if (target[idx] > 0 || target[idx] < settings.max_travel[idx]) { sys.soft_limit = true; } } #else // NOTE: max_travel is stored as negative - if (target[idx] > 0 || target[idx] < settings.max_travel[idx]) { soft_limit_error = true; } + if (target[idx] > 0 || target[idx] < settings.max_travel[idx]) { sys.soft_limit = true; } #endif - if (soft_limit_error) { + if (sys.soft_limit) { // Force feed hold if cycle is active. All buffered blocks are guaranteed to be within // workspace volume so just come to a controlled stop so position is not lost. When complete // enter alarm mode. diff --git a/grbl/main.c b/grbl/main.c index 32b2e2b89..7719fab54 100644 --- a/grbl/main.c +++ b/grbl/main.c @@ -80,7 +80,8 @@ int main(void) sys_rt_exec_state = 0; sys_rt_exec_alarm = 0; sys.suspend = false; - + sys.soft_limit = false; + // Start Grbl main loop. Processes program inputs and executes them. protocol_main_loop(); diff --git a/grbl/protocol.c b/grbl/protocol.c index d07a43a62..94434f581 100644 --- a/grbl/protocol.c +++ b/grbl/protocol.c @@ -335,13 +335,12 @@ void protocol_execute_realtime() // cycle reinitializations. The stepper path should continue exactly as if nothing has happened. // NOTE: EXEC_CYCLE_STOP is set by the stepper subsystem when a cycle or feed hold completes. if (rt_exec & EXEC_CYCLE_STOP) { - if (sys.state & (STATE_HOLD | STATE_SAFETY_DOOR)) { + if (sys.state & (STATE_HOLD | STATE_SAFETY_DOOR) && !(sys.soft_limit)) { // Hold complete. Set to indicate ready to resume. Remain in HOLD or DOOR states until user // has issued a resume command or reset. if (sys.suspend & SUSPEND_ENERGIZE) { // De-energize system if safety door has been opened. spindle_stop(); coolant_stop(); - // TODO: Install parking motion here. } bit_true(sys.suspend,SUSPEND_ENABLE_READY); } else { // Motion is complete. Includes CYCLE, HOMING, and MOTION_CANCEL states. diff --git a/grbl/system.h b/grbl/system.h index ee43ed256..079d68f3a 100644 --- a/grbl/system.h +++ b/grbl/system.h @@ -72,6 +72,7 @@ typedef struct { uint8_t abort; // System abort flag. Forces exit back to main loop for reset. uint8_t state; // Tracks the current state of Grbl. uint8_t suspend; // System suspend bitflag variable that manages holds, cancels, and safety door. + uint8_t soft_limit; // Tracks soft limit errors for the state machine. (boolean) int32_t position[N_AXIS]; // Real-time machine (aka home) position vector in steps. // NOTE: This may need to be a volatile variable, if problems arise.