Browse Source

Merge pull request #87 from PavelSindler/wizard

Wizard: improved axis selftest code readability and no sg crash triggered
XPila 7 years ago
parent
commit
27a63eeb0f
4 changed files with 87 additions and 59 deletions
  1. 1 1
      Firmware/Configuration_prusa.h
  2. 1 1
      Firmware/tmc2130.cpp
  3. 79 55
      Firmware/ultralcd.cpp
  4. 6 2
      Firmware/ultralcd.h

+ 1 - 1
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

+ 1 - 1
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++)

+ 79 - 55
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
 	
 
 

+ 6 - 2
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);