From 921273baa006f697e6a6828cb2b648159853db11 Mon Sep 17 00:00:00 2001 From: daid303 Date: Tue, 8 Jan 2013 11:53:18 +0100 Subject: [PATCH] Added optional feature to stop printing when an endstop is hit. Made the Z display on the LCD in 3.2 format instead of 3.1. Added LCD message when and endstop is hit. --- Marlin/Configuration_adv.h | 8 ++++--- Marlin/Marlin_main.cpp | 12 ++++++++-- Marlin/stepper.cpp | 22 +++++++++++++++++-- Marlin/stepper.h | 3 +++ Marlin/ultralcd.cpp | 21 ++++++++++++------ .../ultralcd_implementation_hitachi_HD44780.h | 4 ++-- 6 files changed, 54 insertions(+), 16 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index b74f74ad8..f9dce1483 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -15,7 +15,7 @@ // If the temperature has not increased at the end of that period, the target temperature is set to zero. // It can be reset with another M104/M109. This check is also only triggered if the target temperature and the current temperature // differ by at least 2x WATCH_TEMP_INCREASE -//#define WATCH_TEMP_PERIOD 20000 //20 seconds +//#define WATCH_TEMP_PERIOD 40000 //40 seconds //#define WATCH_TEMP_INCREASE 10 //Heat up at least 10 degree in 20 seconds // Wait for Cooldown @@ -193,7 +193,6 @@ //=============================Additional Features=========================== //=========================================================================== - #define SD_FINISHED_STEPPERRELEASE true //if sd support and the file is finished: disable steppers? #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. @@ -206,6 +205,9 @@ // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. //#define WATCHDOG_RESET_MANUAL #endif + +// Enable the option to stop SD printing when hitting and endstops, needs to be enabled from the LCD menu when this option is enabled. +//#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED // extruder advance constant (s2/mm3) // @@ -252,7 +254,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st #else #define BLOCK_BUFFER_SIZE 16 // maximize block buffer #endif - + //The ASCII buffer for recieving from the serial: #define MAX_CMD_SIZE 96 diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 1dc4c2103..bd811caed 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -124,7 +124,8 @@ // M500 - stores paramters in EEPROM // M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). // M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. -// M503 - print the current settings (from memory not from eeprom) +// M503 - print the current settings (from memory not from eeprom) +// M540 - Use S[0|1] to enable or disable the stop SD card print on endstop hit (requires ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) // M907 - Set digital trimpot motor current using axis codes. // M908 - Control digital trimpot directly. // M350 - Set microstepping mode. @@ -1493,7 +1494,14 @@ void process_commands() { Config_PrintSettings(); } - break; + break; + #ifdef ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + case 540: + { + if(code_seen('S')) abort_on_endstop_hit = code_value() > 0; + } + break; + #endif case 907: // M907 Set digital trimpot motor current using axis codes. { #if DIGIPOTSS_PIN > -1 diff --git a/Marlin/stepper.cpp b/Marlin/stepper.cpp index 81b2ab75c..4ed8bef40 100644 --- a/Marlin/stepper.cpp +++ b/Marlin/stepper.cpp @@ -27,6 +27,7 @@ #include "temperature.h" #include "ultralcd.h" #include "language.h" +#include "cardreader.h" #include "speed_lookuptable.h" #if DIGIPOTSS_PIN > -1 #include @@ -67,6 +68,9 @@ volatile long endstops_stepsTotal,endstops_stepsDone; static volatile bool endstop_x_hit=false; static volatile bool endstop_y_hit=false; static volatile bool endstop_z_hit=false; +#ifdef ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED +bool abort_on_endstop_hit = false; +#endif static bool old_x_min_endstop=false; static bool old_x_max_endstop=false; @@ -169,17 +173,31 @@ void checkHitEndstops() SERIAL_ECHOPGM(MSG_ENDSTOPS_HIT); if(endstop_x_hit) { SERIAL_ECHOPAIR(" X:",(float)endstops_trigsteps[X_AXIS]/axis_steps_per_unit[X_AXIS]); + LCD_MESSAGEPGM(MSG_ENDSTOPS_HIT "X"); } if(endstop_y_hit) { SERIAL_ECHOPAIR(" Y:",(float)endstops_trigsteps[Y_AXIS]/axis_steps_per_unit[Y_AXIS]); + LCD_MESSAGEPGM(MSG_ENDSTOPS_HIT "Y"); } if(endstop_z_hit) { SERIAL_ECHOPAIR(" Z:",(float)endstops_trigsteps[Z_AXIS]/axis_steps_per_unit[Z_AXIS]); + LCD_MESSAGEPGM(MSG_ENDSTOPS_HIT "Z"); } - SERIAL_ECHOLN(""); + SERIAL_ECHOLN(""); endstop_x_hit=false; endstop_y_hit=false; - endstop_z_hit=false; + endstop_z_hit=false; +#ifdef ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + if (abort_on_endstop_hit) + { + card.sdprinting = false; + card.closefile(); + quickStop(); + setTargetHotend0(0); + setTargetHotend1(0); + setTargetHotend2(0); + } +#endif } } diff --git a/Marlin/stepper.h b/Marlin/stepper.h index 8c5c6ab63..6e60a332e 100644 --- a/Marlin/stepper.h +++ b/Marlin/stepper.h @@ -37,6 +37,9 @@ #define REV_E_DIR() WRITE(E0_DIR_PIN, INVERT_E0_DIR) #endif +#ifdef ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED +extern bool abort_on_endstop_hit; +#endif // Initialize and start the stepper motor subsystem void st_init(); diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index cd9cedf97..32398354f 100644 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -518,6 +518,9 @@ static void lcd_control_motion_menu() MENU_ITEM_EDIT(float52, MSG_YSTEPS, &axis_steps_per_unit[Y_AXIS], 5, 9999); MENU_ITEM_EDIT(float51, MSG_ZSTEPS, &axis_steps_per_unit[Z_AXIS], 5, 9999); MENU_ITEM_EDIT(float51, MSG_ESTEPS, &axis_steps_per_unit[E_AXIS], 5, 9999); +#ifdef ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + MENU_ITEM_EDIT(bool, "Endstop abort", &abort_on_endstop_hit); +#endif END_MENU(); } @@ -888,14 +891,18 @@ char *ftostr31(const float &x) char *ftostr32(const float &x) { - long xx=x*100; - conv[0]=(xx>=0)?'+':'-'; + long xx=x*100; + if (xx >= 0) + conv[0]=(xx/10000)%10+'0'; + else + conv[0]='-'; xx=abs(xx); - conv[1]=(xx/100)%10+'0'; - conv[2]='.'; - conv[3]=(xx/10)%10+'0'; - conv[4]=(xx)%10+'0'; - conv[5]=0; + conv[1]=(xx/1000)%10+'0'; + conv[2]=(xx/100)%10+'0'; + conv[3]='.'; + conv[4]=(xx/10)%10+'0'; + conv[5]=(xx)%10+'0'; + conv[6]=0; return conv; } diff --git a/Marlin/ultralcd_implementation_hitachi_HD44780.h b/Marlin/ultralcd_implementation_hitachi_HD44780.h index 0390a0baa..58d75bd39 100644 --- a/Marlin/ultralcd_implementation_hitachi_HD44780.h +++ b/Marlin/ultralcd_implementation_hitachi_HD44780.h @@ -256,9 +256,9 @@ static void lcd_implementation_status_screen() lcd.print(ftostr3(current_position[Y_AXIS])); # endif//EXTRUDERS > 1 || TEMP_SENSOR_BED != 0 # endif//LCD_WIDTH > 19 - lcd.setCursor(LCD_WIDTH - 7, 1); + lcd.setCursor(LCD_WIDTH - 8, 1); lcd.print('Z'); - lcd.print(ftostr31(current_position[Z_AXIS])); + lcd.print(ftostr32(current_position[Z_AXIS])); #endif//LCD_HEIGHT > 2 #if LCD_HEIGHT > 3