diff --git a/Firmware/Configuration_prusa.h b/Firmware/Configuration_prusa.h index b002dd4e5..ef474714a 100644 --- a/Firmware/Configuration_prusa.h +++ b/Firmware/Configuration_prusa.h @@ -46,7 +46,7 @@ const bool Z_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic o #define MANUAL_Z_HOME_POS 0.2 // Travel limits after homing -#define X_MAX_POS 250 +#define X_MAX_POS 255 #define X_MIN_POS 0 #define Y_MAX_POS 210 #define Y_MIN_POS -12 //orig -4 diff --git a/Firmware/tmc2130.cpp b/Firmware/tmc2130.cpp index 3a93ebf47..18cc4e285 100644 --- a/Firmware/tmc2130.cpp +++ b/Firmware/tmc2130.cpp @@ -219,7 +219,7 @@ uint8_t tmc2130_sample_diag() void tmc2130_st_isr(uint8_t last_step_mask) { - if (tmc2130_mode == TMC2130_MODE_SILENT) return; + if (tmc2130_mode == TMC2130_MODE_SILENT || tmc2130_sg_stop_on_crash == false) return; bool crash = false; uint8_t diag_mask = tmc2130_sample_diag(); // for (uint8_t axis = X_AXIS; axis <= E_AXIS; axis++) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 01926c1c4..c4cee605e 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -3689,7 +3689,7 @@ static void lcd_calibration_menu() if (!isPrintPaused) { MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28 W")); - MENU_ITEM(function, MSG_SELFTEST, lcd_selftest_); + MENU_ITEM(function, MSG_SELFTEST, lcd_selftest_v); #ifdef MK1BP // MK1 // "Calibrate Z" @@ -5309,6 +5309,11 @@ menu_edit_type(float, float51, ftostr51, 10) menu_edit_type(float, float52, ftostr52, 100) menu_edit_type(unsigned long, long5, ftostr5, 0.01) +static void lcd_selftest_v() +{ + (void)lcd_selftest(); +} + static bool lcd_selftest() { int _progress = 0; @@ -5344,29 +5349,39 @@ static bool lcd_selftest() { //current_position[Z_AXIS] += 15; //move Z axis higher to avoid false triggering of Z end stop in case that we are very low - just above heatbed _progress = lcd_selftest_screen(4, _progress, 3, true, 2000); - _result = lcd_selfcheck_axis_sg(X_AXIS);//, X_MAX_POS); +#ifdef TMC2130 + _result = lcd_selfcheck_axis_sg(X_AXIS); +#else + _result = lcd_selfcheck_axis(X_AXIS, X_MAX_POS); +#endif //TMC2130 } if (_result) { _progress = lcd_selftest_screen(4, _progress, 3, true, 0); - - //_result = lcd_selfcheck_pulleys(X_AXIS); +#ifndef TMC2130 + _result = lcd_selfcheck_pulleys(X_AXIS); +#endif } if (_result) { _progress = lcd_selftest_screen(5, _progress, 3, true, 1500); +#ifdef TMC2130 _result = lcd_selfcheck_axis_sg(Y_AXIS); - //_result = lcd_selfcheck_axis(Y_AXIS, Y_MAX_POS); +#else + _result = lcd_selfcheck_axis(Y_AXIS, Y_MAX_POS); +#endif // TMC2130 } if (_result) { _progress = lcd_selftest_screen(5, _progress, 3, true, 0); - //_result = lcd_selfcheck_pulleys(Y_AXIS); +#ifndef TMC2130 + _result = lcd_selfcheck_pulleys(Y_AXIS); +#endif // TMC2130 } @@ -5421,74 +5436,80 @@ static bool lcd_selftest() return(_result); } +#ifdef TMC2130 + +static void reset_crash_det(char axis) { + current_position[axis] += 10; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder); + st_synchronize(); + if (eeprom_read_byte((uint8_t*)EEPROM_CRASH_DET)) tmc2130_sg_stop_on_crash = true; +} static bool lcd_selfcheck_axis_sg(char axis) { - +// each axis length is measured twice float axis_length, current_position_init, current_position_final; float measured_axis_length[2]; - float margin = 100; + float margin = 60; float max_error_mm = 10; switch (axis) { case 0: axis_length = X_MAX_POS; break; case 1: axis_length = Y_MAX_POS + 8; break; default: axis_length = 210; break; } - //tmc2130_sg_stop_on_crash = false; - crashdet_disable(); -#ifdef TMC2130 + + + tmc2130_sg_stop_on_crash = false; tmc2130_home_exit(); enable_endstops(true); -#endif +// first axis length measurement begin + tmc2130_home_enter(X_AXIS_MASK << axis); + current_position[axis] -= (axis_length + margin); + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder); - for (char i = 0; i < 2; i++) { + + st_synchronize(); + tmc2130_home_exit(); -#ifdef TMC2130 - tmc2130_home_enter(X_AXIS_MASK << axis); -#endif - current_position[axis] -= (axis_length + margin); - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder); + current_position_init = st_get_position_mm(axis); - st_synchronize(); + current_position[axis] += 2 * margin; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder); + st_synchronize(); + current_position[axis] += axis_length; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder); -#ifdef TMC2130 - tmc2130_home_exit(); -#endif - //current_position[axis] = st_get_position_mm(axis); - //plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); + tmc2130_home_enter(X_AXIS_MASK << axis); + st_synchronize(); + tmc2130_home_exit(); + current_position_final = st_get_position_mm(axis); + measured_axis_length[0] = abs(current_position_final - current_position_init); - current_position_init = st_get_position_mm(axis); - if (i < 1) { - current_position[axis] += 2 * margin; - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder); - st_synchronize(); - current_position[axis] += axis_length; - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder); -#ifdef TMC2130 - tmc2130_home_enter(X_AXIS_MASK << axis); -#endif - st_synchronize(); -#ifdef TMC2130 - tmc2130_home_exit(); -#endif - //current_position[axis] = st_get_position_mm(axis); - //plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); +// first measurement end and second measurement begin + + current_position[axis] -= margin; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder); + st_synchronize(); - current_position_final = st_get_position_mm(axis); + tmc2130_home_enter(X_AXIS_MASK << axis); + current_position[axis] -= (axis_length + margin); + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder); + + st_synchronize(); + tmc2130_home_exit(); - current_position[axis] -= margin; - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder); - st_synchronize(); - } - measured_axis_length[i] = abs(current_position_final - current_position_init); + current_position_init = st_get_position_mm(axis); + + measured_axis_length[1] = abs(current_position_final - current_position_init); + +//end of second measurement, now check for possible errors: + + for(int i = 0; i < 2; i++){ //check if measured axis length corresponds to expected length SERIAL_ECHOPGM("Measured axis length:"); MYSERIAL.println(measured_axis_length[i]); if (abs(measured_axis_length[i] - axis_length) > max_error_mm) { - //axis length -#ifdef TMC2130 - tmc2130_home_exit(); enable_endstops(false); -#endif + const char *_error_1; const char *_error_2; @@ -5497,8 +5518,7 @@ static bool lcd_selfcheck_axis_sg(char axis) { if (axis == Z_AXIS) _error_1 = "Z"; lcd_selftest_error(9, _error_1, _error_2); - //crashdet_enable(); - //uint8_t crashdet = eeprom_read_byte((uint8_t*)EEPROM_CRASH_DET); + reset_crash_det(axis); return false; } } @@ -5506,7 +5526,7 @@ static bool lcd_selfcheck_axis_sg(char axis) { SERIAL_ECHOPGM("Axis length difference:"); MYSERIAL.println(abs(measured_axis_length[0] - measured_axis_length[1])); - if (abs(measured_axis_length[0] - measured_axis_length[1]) > 1) { + if (abs(measured_axis_length[0] - measured_axis_length[1]) > 1) { //check if difference between first and second measurement is low //loose pulleys const char *_error_1; const char *_error_2; @@ -5516,12 +5536,16 @@ static bool lcd_selfcheck_axis_sg(char axis) { if (axis == Z_AXIS) _error_1 = "Z"; lcd_selftest_error(8, _error_1, _error_2); - //crashdet_enable(); + + reset_crash_det(axis); + return false; } - //crashdet_enable(); + + reset_crash_det(axis); return true; } +#endif //TMC2130 diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index 59f551b35..ca1cc16c7 100644 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -34,11 +34,15 @@ void lcd_mylang(); bool lcd_detected(void); - + static void lcd_selftest_v(); static bool lcd_selftest(); static bool lcd_selfcheck_endstops(); - static bool lcd_selfcheck_axis(int _axis, int _travel); + +#ifdef TMC2130 + static void reset_crash_det(char axis); static bool lcd_selfcheck_axis_sg(char axis); +#endif //TMC2130 + static bool lcd_selfcheck_axis(int _axis, int _travel); static bool lcd_selfcheck_check_heater(bool _isbed); static int lcd_selftest_screen(int _step, int _progress, int _progress_scale, bool _clear, int _delay); static void lcd_selftest_screen_step(int _row, int _col, int _state, const char *_name, const char *_indicator);