Add option to only check endstop when homing
This commit is contained in:
		| @@ -170,6 +170,7 @@ const bool Y_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th | |||||||
| const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops.  | const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops.  | ||||||
| // For optos H21LOB set to true, for Mendel-Parts newer optos TCST2103 set to false | // For optos H21LOB set to true, for Mendel-Parts newer optos TCST2103 set to false | ||||||
|  |  | ||||||
|  | //#define ENDSTOPS_ONLY_FOR_HOMING // If defined the endstops will only be used for homing | ||||||
|  |  | ||||||
| // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 | // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 | ||||||
| #define X_ENABLE_ON 0 | #define X_ENABLE_ON 0 | ||||||
|   | |||||||
| @@ -528,6 +528,8 @@ FORCE_INLINE void process_commands() | |||||||
|       saved_feedmultiply = feedmultiply; |       saved_feedmultiply = feedmultiply; | ||||||
|       feedmultiply = 100; |       feedmultiply = 100; | ||||||
|        |        | ||||||
|  |       enable_endstops(true); | ||||||
|  |        | ||||||
|       for(int8_t i=0; i < NUM_AXIS; i++) { |       for(int8_t i=0; i < NUM_AXIS; i++) { | ||||||
|         destination[i] = current_position[i]; |         destination[i] = current_position[i]; | ||||||
|       } |       } | ||||||
| @@ -563,6 +565,9 @@ FORCE_INLINE void process_commands() | |||||||
|         HOMEAXIS(Z); |         HOMEAXIS(Z); | ||||||
| 	current_position[2]=code_value()+add_homeing[2]; | 	current_position[2]=code_value()+add_homeing[2]; | ||||||
|       }        |       }        | ||||||
|  |       #ifdef ENDSTOPS_ONLY_FOR_HOMING | ||||||
|  |         enable_endstops(false); | ||||||
|  |       #endif | ||||||
|        |        | ||||||
|       feedrate = saved_feedrate; |       feedrate = saved_feedrate; | ||||||
|       feedmultiply = saved_feedmultiply; |       feedmultiply = saved_feedmultiply; | ||||||
|   | |||||||
| @@ -79,6 +79,8 @@ static bool old_y_max_endstop=false; | |||||||
| static bool old_z_min_endstop=false; | static bool old_z_min_endstop=false; | ||||||
| static bool old_z_max_endstop=false; | static bool old_z_max_endstop=false; | ||||||
|  |  | ||||||
|  | static bool check_endstops = true; | ||||||
|  |  | ||||||
| volatile long count_position[NUM_AXIS] = { 0, 0, 0, 0}; | volatile long count_position[NUM_AXIS] = { 0, 0, 0, 0}; | ||||||
| volatile char count_direction[NUM_AXIS] = { 1, 1, 1, 1}; | volatile char count_direction[NUM_AXIS] = { 1, 1, 1, 1}; | ||||||
|  |  | ||||||
| @@ -191,6 +193,11 @@ void endstops_hit_on_purpose() | |||||||
|   endstop_z_hit=false; |   endstop_z_hit=false; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void enable_endstops(bool check) | ||||||
|  | { | ||||||
|  |   check_endstops = check; | ||||||
|  | } | ||||||
|  |  | ||||||
| //         __________________________ | //         __________________________ | ||||||
| //        /|                        |\     _________________         ^ | //        /|                        |\     _________________         ^ | ||||||
| //       / |                        | \   /|               |\        | | //       / |                        | \   /|               |\        | | ||||||
| @@ -309,82 +316,94 @@ ISR(TIMER1_COMPA_vect) | |||||||
|     if ((out_bits & (1<<X_AXIS)) != 0) {   // -direction |     if ((out_bits & (1<<X_AXIS)) != 0) {   // -direction | ||||||
|       WRITE(X_DIR_PIN, INVERT_X_DIR); |       WRITE(X_DIR_PIN, INVERT_X_DIR); | ||||||
|       count_direction[X_AXIS]=-1; |       count_direction[X_AXIS]=-1; | ||||||
|       #if X_MIN_PIN > -1 |       if(check_endstops) { | ||||||
|         bool x_min_endstop=(READ(X_MIN_PIN) != X_ENDSTOPS_INVERTING); |         #if X_MIN_PIN > -1 | ||||||
|         if(x_min_endstop && old_x_min_endstop && (current_block->steps_x > 0)) { |           bool x_min_endstop=(READ(X_MIN_PIN) != X_ENDSTOPS_INVERTING); | ||||||
|           endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; |           if(x_min_endstop && old_x_min_endstop && (current_block->steps_x > 0)) { | ||||||
|           endstop_x_hit=true; |             endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; | ||||||
|           step_events_completed = current_block->step_event_count; |             endstop_x_hit=true; | ||||||
|         } |             step_events_completed = current_block->step_event_count; | ||||||
|         old_x_min_endstop = x_min_endstop; |           } | ||||||
|       #endif |           old_x_min_endstop = x_min_endstop; | ||||||
|  |         #endif | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|     else { // +direction  |     else { // +direction  | ||||||
|       WRITE(X_DIR_PIN,!INVERT_X_DIR); |       WRITE(X_DIR_PIN,!INVERT_X_DIR); | ||||||
|       count_direction[X_AXIS]=1; |       count_direction[X_AXIS]=1; | ||||||
|       #if X_MAX_PIN > -1 |       if(check_endstops) { | ||||||
|         bool x_max_endstop=(READ(X_MAX_PIN) != X_ENDSTOPS_INVERTING); |         #if X_MAX_PIN > -1 | ||||||
|         if(x_max_endstop && old_x_max_endstop && (current_block->steps_x > 0)){ |           bool x_max_endstop=(READ(X_MAX_PIN) != X_ENDSTOPS_INVERTING); | ||||||
|           endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; |           if(x_max_endstop && old_x_max_endstop && (current_block->steps_x > 0)){ | ||||||
|           endstop_x_hit=true; |             endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; | ||||||
|           step_events_completed = current_block->step_event_count; |             endstop_x_hit=true; | ||||||
|         } |             step_events_completed = current_block->step_event_count; | ||||||
|         old_x_max_endstop = x_max_endstop; |           } | ||||||
|       #endif |           old_x_max_endstop = x_max_endstop; | ||||||
|  |         #endif | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if ((out_bits & (1<<Y_AXIS)) != 0) {   // -direction |     if ((out_bits & (1<<Y_AXIS)) != 0) {   // -direction | ||||||
|       WRITE(Y_DIR_PIN,INVERT_Y_DIR); |       WRITE(Y_DIR_PIN,INVERT_Y_DIR); | ||||||
|       count_direction[Y_AXIS]=-1; |       count_direction[Y_AXIS]=-1; | ||||||
|       #if Y_MIN_PIN > -1 |       if(check_endstops) { | ||||||
|         bool y_min_endstop=(READ(Y_MIN_PIN) != Y_ENDSTOPS_INVERTING); |         #if Y_MIN_PIN > -1 | ||||||
|         if(y_min_endstop && old_y_min_endstop && (current_block->steps_y > 0)) { |           bool y_min_endstop=(READ(Y_MIN_PIN) != Y_ENDSTOPS_INVERTING); | ||||||
|           endstops_trigsteps[Y_AXIS] = count_position[Y_AXIS]; |           if(y_min_endstop && old_y_min_endstop && (current_block->steps_y > 0)) { | ||||||
|           endstop_y_hit=true; |             endstops_trigsteps[Y_AXIS] = count_position[Y_AXIS]; | ||||||
|           step_events_completed = current_block->step_event_count; |             endstop_y_hit=true; | ||||||
|         } |             step_events_completed = current_block->step_event_count; | ||||||
|         old_y_min_endstop = y_min_endstop; |           } | ||||||
|       #endif |           old_y_min_endstop = y_min_endstop; | ||||||
|  |         #endif | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|     else { // +direction |     else { // +direction | ||||||
|     WRITE(Y_DIR_PIN,!INVERT_Y_DIR); |     WRITE(Y_DIR_PIN,!INVERT_Y_DIR); | ||||||
|       count_direction[Y_AXIS]=1; |       count_direction[Y_AXIS]=1; | ||||||
|       #if Y_MAX_PIN > -1 |       if(check_endstops) { | ||||||
|         bool y_max_endstop=(READ(Y_MAX_PIN) != Y_ENDSTOPS_INVERTING); |         #if Y_MAX_PIN > -1 | ||||||
|         if(y_max_endstop && old_y_max_endstop && (current_block->steps_y > 0)){ |           bool y_max_endstop=(READ(Y_MAX_PIN) != Y_ENDSTOPS_INVERTING); | ||||||
|           endstops_trigsteps[Y_AXIS] = count_position[Y_AXIS]; |           if(y_max_endstop && old_y_max_endstop && (current_block->steps_y > 0)){ | ||||||
|           endstop_y_hit=true; |             endstops_trigsteps[Y_AXIS] = count_position[Y_AXIS]; | ||||||
|           step_events_completed = current_block->step_event_count; |             endstop_y_hit=true; | ||||||
|         } |             step_events_completed = current_block->step_event_count; | ||||||
|         old_y_max_endstop = y_max_endstop; |           } | ||||||
|       #endif |           old_y_max_endstop = y_max_endstop; | ||||||
|  |         #endif | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if ((out_bits & (1<<Z_AXIS)) != 0) {   // -direction |     if ((out_bits & (1<<Z_AXIS)) != 0) {   // -direction | ||||||
|       WRITE(Z_DIR_PIN,INVERT_Z_DIR); |       WRITE(Z_DIR_PIN,INVERT_Z_DIR); | ||||||
|       count_direction[Z_AXIS]=-1; |       count_direction[Z_AXIS]=-1; | ||||||
|       #if Z_MIN_PIN > -1 |       if(check_endstops) { | ||||||
|         bool z_min_endstop=(READ(Z_MIN_PIN) != Z_ENDSTOPS_INVERTING); |         #if Z_MIN_PIN > -1 | ||||||
|         if(z_min_endstop && old_z_min_endstop && (current_block->steps_z > 0)) { |           bool z_min_endstop=(READ(Z_MIN_PIN) != Z_ENDSTOPS_INVERTING); | ||||||
|           endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; |           if(z_min_endstop && old_z_min_endstop && (current_block->steps_z > 0)) { | ||||||
|           endstop_z_hit=true; |             endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; | ||||||
|           step_events_completed = current_block->step_event_count; |             endstop_z_hit=true; | ||||||
|         } |             step_events_completed = current_block->step_event_count; | ||||||
|         old_z_min_endstop = z_min_endstop; |           } | ||||||
|       #endif |           old_z_min_endstop = z_min_endstop; | ||||||
|  |         #endif | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|     else { // +direction |     else { // +direction | ||||||
|       WRITE(Z_DIR_PIN,!INVERT_Z_DIR); |       WRITE(Z_DIR_PIN,!INVERT_Z_DIR); | ||||||
|         count_direction[Z_AXIS]=1; |       count_direction[Z_AXIS]=1; | ||||||
|       #if Z_MAX_PIN > -1 |       if(check_endstops) { | ||||||
|         bool z_max_endstop=(READ(Z_MAX_PIN) != Z_ENDSTOPS_INVERTING); |         #if Z_MAX_PIN > -1 | ||||||
|         if(z_max_endstop && old_z_max_endstop && (current_block->steps_z > 0)) { |           bool z_max_endstop=(READ(Z_MAX_PIN) != Z_ENDSTOPS_INVERTING); | ||||||
|           endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; |           if(z_max_endstop && old_z_max_endstop && (current_block->steps_z > 0)) { | ||||||
|           endstop_z_hit=true; |             endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; | ||||||
|           step_events_completed = current_block->step_event_count; |             endstop_z_hit=true; | ||||||
|         } |             step_events_completed = current_block->step_event_count; | ||||||
|         old_z_max_endstop = z_max_endstop; |           } | ||||||
|       #endif |           old_z_max_endstop = z_max_endstop; | ||||||
|  |         #endif | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     #ifndef ADVANCE |     #ifndef ADVANCE | ||||||
| @@ -666,6 +685,13 @@ void st_init() | |||||||
|     e_steps = 0; |     e_steps = 0; | ||||||
|     TIMSK0 |= (1<<OCIE0A); |     TIMSK0 |= (1<<OCIE0A); | ||||||
|   #endif //ADVANCE |   #endif //ADVANCE | ||||||
|  |    | ||||||
|  |   #ifdef ENDSTOPS_ONLY_FOR_HOMING | ||||||
|  |     enable_endstops(false); | ||||||
|  |   #else | ||||||
|  |     enable_endstops(true); | ||||||
|  |   #endif | ||||||
|  |    | ||||||
|   sei(); |   sei(); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -44,6 +44,8 @@ void st_wake_up(); | |||||||
| void checkHitEndstops(); //call from somwhere to create an serial error message with the locations the endstops where hit, in case they were triggered | void checkHitEndstops(); //call from somwhere to create an serial error message with the locations the endstops where hit, in case they were triggered | ||||||
| void endstops_hit_on_purpose(); //avoid creation of the message, i.e. after homeing and before a routine call of checkHitEndstops(); | void endstops_hit_on_purpose(); //avoid creation of the message, i.e. after homeing and before a routine call of checkHitEndstops(); | ||||||
|  |  | ||||||
|  | void enable_endstops(bool check); // Enable/disable endstop checking | ||||||
|  |  | ||||||
| void checkStepperErrors(); //Print errors detected by the stepper | void checkStepperErrors(); //Print errors detected by the stepper | ||||||
|  |  | ||||||
| void finishAndDisableSteppers(); | void finishAndDisableSteppers(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user