@ -48,6 +48,12 @@ block_t *current_block; // A pointer to the block currently being traced
static unsigned char out_bits ; // The next stepping-bits to be output
static unsigned char out_bits ; // The next stepping-bits to be output
static unsigned int cleaning_buffer_counter ;
static unsigned int cleaning_buffer_counter ;
# ifdef Z_DUAL_ENDSTOPS
static bool performing_homing = false ,
locked_z_motor = false ,
locked_z2_motor = false ;
# endif
// Counter variables for the bresenham line tracer
// Counter variables for the bresenham line tracer
static long counter_x , counter_y , counter_z , counter_e ;
static long counter_x , counter_y , counter_z , counter_e ;
volatile static unsigned long step_events_completed ; // The number of step events executed in the current block
volatile static unsigned long step_events_completed ; // The number of step events executed in the current block
@ -84,7 +90,13 @@ static bool old_x_min_endstop = false,
old_y_min_endstop = false ,
old_y_min_endstop = false ,
old_y_max_endstop = false ,
old_y_max_endstop = false ,
old_z_min_endstop = false ,
old_z_min_endstop = false ,
# ifndef Z_DUAL_ENDSTOPS
old_z_max_endstop = false ;
old_z_max_endstop = false ;
# else
old_z_max_endstop = false ,
old_z2_min_endstop = false ,
old_z2_max_endstop = false ;
# endif
static bool check_endstops = true ;
static bool check_endstops = true ;
@ -128,7 +140,23 @@ volatile signed char count_direction[NUM_AXIS] = { 1, 1, 1, 1 };
# ifdef Z_DUAL_STEPPER_DRIVERS
# ifdef Z_DUAL_STEPPER_DRIVERS
# define Z_APPLY_DIR(v,Q) { Z_DIR_WRITE(v); Z2_DIR_WRITE(v); }
# define Z_APPLY_DIR(v,Q) { Z_DIR_WRITE(v); Z2_DIR_WRITE(v); }
# define Z_APPLY_STEP(v,Q) { Z_STEP_WRITE(v); Z2_STEP_WRITE(v); }
# ifdef Z_DUAL_ENDSTOPS
# define Z_APPLY_STEP(v,Q) \
if ( performing_homing ) { \
if ( Z_HOME_DIR > 0 ) { \
if ( ! ( old_z_max_endstop & & ( count_direction [ Z_AXIS ] > 0 ) ) & & ! locked_z_motor ) Z_STEP_WRITE ( v ) ; \
if ( ! ( old_z2_max_endstop & & ( count_direction [ Z_AXIS ] > 0 ) ) & & ! locked_z2_motor ) Z2_STEP_WRITE ( v ) ; \
} else { \
if ( ! ( old_z_min_endstop & & ( count_direction [ Z_AXIS ] < 0 ) ) & & ! locked_z_motor ) Z_STEP_WRITE ( v ) ; \
if ( ! ( old_z2_min_endstop & & ( count_direction [ Z_AXIS ] < 0 ) ) & & ! locked_z2_motor ) Z2_STEP_WRITE ( v ) ; \
} \
} else { \
Z_STEP_WRITE ( v ) ; \
Z2_STEP_WRITE ( v ) ; \
}
# else
# define Z_APPLY_STEP(v,Q) Z_STEP_WRITE(v), Z2_STEP_WRITE(v)
# endif
# else
# else
# define Z_APPLY_DIR(v,Q) Z_DIR_WRITE(v)
# define Z_APPLY_DIR(v,Q) Z_DIR_WRITE(v)
# define Z_APPLY_STEP(v,Q) Z_STEP_WRITE(v)
# define Z_APPLY_STEP(v,Q) Z_STEP_WRITE(v)
@ -465,28 +493,66 @@ ISR(TIMER1_COMPA_vect) {
}
}
if ( TEST ( out_bits , Z_AXIS ) ) { // -direction
if ( TEST ( out_bits , Z_AXIS ) ) { // -direction
Z_DIR_WRITE ( INVERT_Z_DIR ) ;
Z_APPLY_DIR ( INVERT_Z_DIR , 0 ) ;
# ifdef Z_DUAL_STEPPER_DRIVERS
Z2_DIR_WRITE ( INVERT_Z_DIR ) ;
# endif
count_direction [ Z_AXIS ] = - 1 ;
count_direction [ Z_AXIS ] = - 1 ;
if ( check_endstops ) {
if ( check_endstops )
# if defined(Z_MIN_PIN) && Z_MIN_PIN >= 0
{
# if defined(Z_MIN_PIN) && Z_MIN_PIN > -1
# ifndef Z_DUAL_ENDSTOPS
UPDATE_ENDSTOP ( z , Z , min , MIN ) ;
UPDATE_ENDSTOP ( z , Z , min , MIN ) ;
# else
bool z_min_endstop = ( READ ( Z_MIN_PIN ) ! = Z_MIN_ENDSTOP_INVERTING ) ;
# if defined(Z2_MIN_PIN) && Z2_MIN_PIN > -1
bool z2_min_endstop = ( READ ( Z2_MIN_PIN ) ! = Z2_MIN_ENDSTOP_INVERTING ) ;
# else
bool z2_min_endstop = z_min_endstop ;
# endif
# endif
if ( ( ( z_min_endstop & & old_z_min_endstop ) | | ( z2_min_endstop & & old_z2_min_endstop ) ) & & ( current_block - > steps [ Z_AXIS ] > 0 ) )
{
endstops_trigsteps [ Z_AXIS ] = count_position [ Z_AXIS ] ;
endstop_z_hit = true ;
if ( ! ( performing_homing ) | | ( ( performing_homing ) & & ( z_min_endstop & & old_z_min_endstop ) & & ( z2_min_endstop & & old_z2_min_endstop ) ) ) //if not performing home or if both endstops were trigged during homing...
{
step_events_completed = current_block - > step_event_count ;
}
}
}
}
else { // +direction
old_z_min_endstop = z_min_endstop ;
Z_DIR_WRITE ( ! INVERT_Z_DIR ) ;
old_z2_min_endstop = z2_min_endstop ;
# ifdef Z_DUAL_STEPPER_DRIVERS
Z2_DIR_WRITE ( ! INVERT_Z_DIR ) ;
# endif
# endif
# endif
}
}
else { // +direction
Z_APPLY_DIR ( ! INVERT_Z_DIR , 0 ) ;
count_direction [ Z_AXIS ] = 1 ;
count_direction [ Z_AXIS ] = 1 ;
if ( check_endstops ) {
if ( check_endstops ) {
# if defined(Z_MAX_PIN) && Z_MAX_PIN >= 0
# if defined(Z_MAX_PIN) && Z_MAX_PIN >= 0
# ifndef Z_DUAL_ENDSTOPS
UPDATE_ENDSTOP ( z , Z , max , MAX ) ;
UPDATE_ENDSTOP ( z , Z , max , MAX ) ;
# else
bool z_max_endstop = ( READ ( Z_MAX_PIN ) ! = Z_MAX_ENDSTOP_INVERTING ) ;
# if defined(Z2_MAX_PIN) && Z2_MAX_PIN > -1
bool z2_max_endstop = ( READ ( Z2_MAX_PIN ) ! = Z2_MAX_ENDSTOP_INVERTING ) ;
# else
bool z2_max_endstop = z_max_endstop ;
# endif
if ( ( ( z_max_endstop & & old_z_max_endstop ) | | ( z2_max_endstop & & old_z2_max_endstop ) ) & & ( current_block - > steps [ Z_AXIS ] > 0 ) )
{
endstops_trigsteps [ Z_AXIS ] = count_position [ Z_AXIS ] ;
endstop_z_hit = true ;
// if (z_max_endstop && old_z_max_endstop) SERIAL_ECHOLN("z_max_endstop = true");
// if (z2_max_endstop && old_z2_max_endstop) SERIAL_ECHOLN("z2_max_endstop = true");
if ( ! ( performing_homing ) | | ( ( performing_homing ) & & ( z_max_endstop & & old_z_max_endstop ) & & ( z2_max_endstop & & old_z2_max_endstop ) ) ) //if not performing home or if both endstops were trigged during homing...
{
step_events_completed = current_block - > step_event_count ;
}
}
old_z_max_endstop = z_max_endstop ;
old_z2_max_endstop = z2_max_endstop ;
# endif
# endif
# endif
}
}
}
}
@ -845,6 +911,13 @@ void st_init() {
# endif
# endif
# endif
# endif
# if defined(Z2_MAX_PIN) && Z2_MAX_PIN >= 0
SET_INPUT ( Z2_MAX_PIN ) ;
# ifdef ENDSTOPPULLUP_ZMAX
WRITE ( Z2_MAX_PIN , HIGH ) ;
# endif
# endif
# define AXIS_INIT(axis, AXIS, PIN) \
# define AXIS_INIT(axis, AXIS, PIN) \
AXIS # # _STEP_INIT ; \
AXIS # # _STEP_INIT ; \
AXIS # # _STEP_WRITE ( INVERT_ # # PIN # # _STEP_PIN ) ; \
AXIS # # _STEP_WRITE ( INVERT_ # # PIN # # _STEP_PIN ) ; \
@ -1174,3 +1247,9 @@ void microstep_readings() {
SERIAL_PROTOCOLLN ( digitalRead ( E1_MS2_PIN ) ) ;
SERIAL_PROTOCOLLN ( digitalRead ( E1_MS2_PIN ) ) ;
# endif
# endif
}
}
# ifdef Z_DUAL_ENDSTOPS
void In_Homing_Process ( bool state ) { performing_homing = state ; }
void Lock_z_motor ( bool state ) { locked_z_motor = state ; }
void Lock_z2_motor ( bool state ) { locked_z2_motor = state ; }
# endif