@ -46,7 +46,7 @@ block_t *current_block;  // A pointer to the block currently being traced
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					//static makes it impossible to be called from outside of this file by extern.!
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					// Variables used by The Stepper Driver Interrupt
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					static  unsigned  char  out_bits ;         // The next stepping-bits to be output
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					static  unsigned  char  out_bits  =  0  ;         // The next stepping-bits to be output
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					static  unsigned  int  cleaning_buffer_counter ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					# ifdef Z_DUAL_ENDSTOPS 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -364,9 +364,58 @@ FORCE_INLINE unsigned short calc_timer(unsigned short step_rate) {
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  return  timer ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					} 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					// set the stepper direction of each axis
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					void  set_stepper_direction ( )  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  // Set the direction bits (X_AXIS=A_AXIS and Y_AXIS=B_AXIS for COREXY)
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  if  ( TEST ( out_bits ,  X_AXIS ) )  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    X_APPLY_DIR ( INVERT_X_DIR , 0 ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    count_direction [ X_AXIS ]  =  - 1 ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  else  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    X_APPLY_DIR ( ! INVERT_X_DIR , 0 ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    count_direction [ X_AXIS ]  =  1 ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  if  ( TEST ( out_bits ,  Y_AXIS ) )  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    Y_APPLY_DIR ( INVERT_Y_DIR , 0 ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    count_direction [ Y_AXIS ]  =  - 1 ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  else  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    Y_APPLY_DIR ( ! INVERT_Y_DIR , 0 ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    count_direction [ Y_AXIS ]  =  1 ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  if  ( TEST ( out_bits ,  Z_AXIS ) )  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    Z_APPLY_DIR ( INVERT_Z_DIR , 0 ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    count_direction [ Z_AXIS ]  =  - 1 ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  else  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    Z_APPLY_DIR ( ! INVERT_Z_DIR , 0 ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    count_direction [ Z_AXIS ]  =  1 ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  # ifndef ADVANCE 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    if  ( TEST ( out_bits ,  E_AXIS ) )  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      REV_E_DIR ( ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      count_direction [ E_AXIS ]  =  - 1 ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    else  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      NORM_E_DIR ( ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      count_direction [ E_AXIS ]  =  1 ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  # endif  //!ADVANCE
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					} 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					// Initializes the trapezoid generator from the current block. Called whenever a new
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					// block begins.
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					FORCE_INLINE  void  trapezoid_generator_reset ( )  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  if  ( current_block - > direction_bits  ! =  out_bits )  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    out_bits  =  current_block - > direction_bits ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    set_stepper_direction ( ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  # ifdef ADVANCE 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    advance  =  current_block - > initial_advance ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    final_advance  =  current_block - > final_advance ; 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -439,48 +488,27 @@ ISR(TIMER1_COMPA_vect) {
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  if  ( current_block  ! =  NULL )  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    // Set directions TO DO This should be done once during init of trapezoid. Endstops -> interrupt
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    out_bits  =  current_block - > direction_bits ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    // Set the direction bits (X_AXIS=A_AXIS and Y_AXIS=B_AXIS for COREXY)
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    if  ( TEST ( out_bits ,  X_AXIS ) )  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      X_APPLY_DIR ( INVERT_X_DIR , 0 ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      count_direction [ X_AXIS ]  =  - 1 ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    else  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      X_APPLY_DIR ( ! INVERT_X_DIR , 0 ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      count_direction [ X_AXIS ]  =  1 ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    if  ( TEST ( out_bits ,  Y_AXIS ) )  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      Y_APPLY_DIR ( INVERT_Y_DIR , 0 ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      count_direction [ Y_AXIS ]  =  - 1 ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    else  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      Y_APPLY_DIR ( ! INVERT_Y_DIR , 0 ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      count_direction [ Y_AXIS ]  =  1 ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    // Check endstops
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    if  ( check_endstops )  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    # define _ENDSTOP(axis, minmax) axis ##_## minmax ##_endstop 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    # define _ENDSTOP_PIN(AXIS, MINMAX) AXIS ##_## MINMAX ##_PIN 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    # define _ENDSTOP_INVERTING(AXIS, MINMAX) AXIS ##_## MINMAX ##_ENDSTOP_INVERTING 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    # define _OLD_ENDSTOP(axis, minmax) old_## axis ##_## minmax ##_endstop 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    # define _AXIS(AXIS) AXIS ##_AXIS 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    # define _HIT_BIT(AXIS) AXIS ##_MIN 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    # define _ENDSTOP_HIT(AXIS) endstop_hit_bits |= BIT(_HIT_BIT(AXIS)) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    # define UPDATE_ENDSTOP(axis,AXIS,minmax,MINMAX) \ 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      bool  _ENDSTOP ( axis ,  minmax )  =  ( READ ( _ENDSTOP_PIN ( AXIS ,  MINMAX ) )  ! =  _ENDSTOP_INVERTING ( AXIS ,  MINMAX ) ) ;  \
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      if  ( _ENDSTOP ( axis ,  minmax )  & &  _OLD_ENDSTOP ( axis ,  minmax )  & &  ( current_block - > steps [ _AXIS ( AXIS ) ]  >  0 ) )  {  \
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        endstops_trigsteps [ _AXIS ( AXIS ) ]  =  count_position [ _AXIS ( AXIS ) ] ;  \
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # define _ENDSTOP(axis, minmax) axis ##_## minmax ##_endstop 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # define _ENDSTOP_PIN(AXIS, MINMAX) AXIS ##_## MINMAX ##_PIN 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # define _ENDSTOP_INVERTING(AXIS, MINMAX) AXIS ##_## MINMAX ##_ENDSTOP_INVERTING 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # define _OLD_ENDSTOP(axis, minmax) old_## axis ##_## minmax ##_endstop 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # define _AXIS(AXIS) AXIS ##_AXIS 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # define _HIT_BIT(AXIS) AXIS ##_MIN 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # define _ENDSTOP_HIT(AXIS) endstop_hit_bits |= BIT(_HIT_BIT(AXIS)) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					       # define UPDATE_ENDSTOP(axis,AXIS,minmax,MINMAX) \ 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					         bool  _ENDSTOP ( axis ,  minmax )  =  ( READ ( _ENDSTOP_PIN ( AXIS ,  MINMAX ) )  ! =  _ENDSTOP_INVERTING ( AXIS ,  MINMAX ) ) ;  \
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					         if  ( _ENDSTOP ( axis ,  minmax )  & &  _OLD_ENDSTOP ( axis ,  minmax )  & &  ( current_block - > steps [ _AXIS ( AXIS ) ]  >  0 ) )  {  \
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					           endstops_trigsteps [ _AXIS ( AXIS ) ]  =  count_position [ _AXIS ( AXIS ) ] ;  \
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					          _ENDSTOP_HIT ( AXIS ) ;  \
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        step_events_completed  =  current_block - > step_event_count ;  \
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      }  \
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      _OLD_ENDSTOP ( axis ,  minmax )  =  _ENDSTOP ( axis ,  minmax ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					          step_events_completed  =  current_block - > step_event_count ;  \
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        }  \
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        _OLD_ENDSTOP ( axis ,  minmax )  =  _ENDSTOP ( axis ,  minmax ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    // Check X and Y endstops
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    if  ( check_endstops )  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # ifdef COREXY 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // Head direction in -X axis for CoreXY bots.
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // If DeltaX == -DeltaY, the movement is only in Y axis
 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -533,15 +561,7 @@ ISR(TIMER1_COMPA_vect) {
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # ifdef COREXY 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # endif 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    if  ( TEST ( out_bits ,  Z_AXIS ) )  {    // -direction
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      Z_APPLY_DIR ( INVERT_Z_DIR , 0 ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      count_direction [ Z_AXIS ]  =  - 1 ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      if  ( check_endstops )  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      if  ( TEST ( out_bits ,  Z_AXIS ) )  {  // z -direction
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        # if HAS_Z_MIN 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					          # ifdef Z_DUAL_ENDSTOPS 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -581,22 +601,12 @@ ISR(TIMER1_COMPA_vect) {
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					          { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            endstops_trigsteps [ Z_AXIS ]  =  count_position [ Z_AXIS ] ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            endstop_hit_bits  | =  BIT ( Z_PROBE ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					//            if (z_probe_endstop && old_z_probe_endstop) SERIAL_ECHOLN("z_probe_endstop = true");
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  //        if (z_probe_endstop && old_z_probe_endstop) SERIAL_ECHOLN("z_probe_endstop = true");
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					          } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					          old_z_probe_endstop  =  z_probe_endstop ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        # endif 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      }  // check_endstops
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    else  {  // +direction
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      Z_APPLY_DIR ( ! INVERT_Z_DIR , 0 ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      count_direction [ Z_AXIS ]  =  1 ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      if  ( check_endstops )  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      else  {  // z +direction
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        # if HAS_Z_MAX 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					          # ifdef Z_DUAL_ENDSTOPS 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -640,25 +650,15 @@ ISR(TIMER1_COMPA_vect) {
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					          { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            endstops_trigsteps [ Z_AXIS ]  =  count_position [ Z_AXIS ] ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            endstop_hit_bits  | =  BIT ( Z_PROBE ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					//              if (z_probe_endstop && old_z_probe_endstop) SERIAL_ECHOLN("z_probe_endstop = true");
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					//           if (z_probe_endstop && old_z_probe_endstop) SERIAL_ECHOLN("z_probe_endstop = true");
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					          } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					          old_z_probe_endstop  =  z_probe_endstop ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        # endif 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					       }  // check_endstops
  
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    }  // +direction
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    # ifndef ADVANCE 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      if  ( TEST ( out_bits ,  E_AXIS ) )  {   // -direction
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        REV_E_DIR ( ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        count_direction [ E_AXIS ]  =  - 1 ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      else  {  // +direction
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        NORM_E_DIR ( ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        count_direction [ E_AXIS ]  =  1 ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    # endif  //!ADVANCE
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    // Take multiple steps per interrupt (For high speed moves)
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    for  ( int8_t  i  =  0 ;  i  <  step_loops ;  i + + )  { 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -989,12 +989,12 @@ void st_init() {
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    # endif 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  # endif 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					# if (defined(Z_PROBE_PIN) && Z_PROBE_PIN >= 0) && defined(Z_PROBE_ENDSTOP)  // Check for Z_PROBE_ENDSTOP so we don't pull a pin high unless it's to be used.
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  SET_INPUT ( Z_PROBE_PIN ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  # ifdef ENDSTOPPULLUP_ZPROBE 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    WRITE ( Z_PROBE_PIN , HIGH ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  # if (defined(Z_PROBE_PIN) && Z_PROBE_PIN >= 0) && defined(Z_PROBE_ENDSTOP)  // Check for Z_PROBE_ENDSTOP so we don't pull a pin high unless it's to be used.
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    SET_INPUT ( Z_PROBE_PIN ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    # ifdef ENDSTOPPULLUP_ZPROBE 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      WRITE ( Z_PROBE_PIN , HIGH ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    # endif 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  # endif 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					# endif 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  # define _STEP_INIT(AXIS) AXIS ##_STEP_INIT 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  # define _WRITE_STEP(AXIS, HIGHLOW) AXIS ##_STEP_WRITE(HIGHLOW) 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -1073,6 +1073,8 @@ void st_init() {
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  enable_endstops ( true ) ;  // Start with endstops active. After homing they can be disabled
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  sei ( ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  set_stepper_direction ( ) ;  // Init directions to out_bits = 0
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					}