@ -46,7 +46,7 @@ block_t *current_block; // A pointer to the block currently being traced
// Variables used by The Stepper Driver Interrupt
// Variables used by The Stepper Driver Interrupt
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
# ifdef Z_DUAL_ENDSTOPS
static bool performing_homing = false ,
static bool performing_homing = false ,
@ -285,8 +285,8 @@ void checkHitEndstops() {
}
}
# ifdef Z_PROBE_ENDSTOP
# ifdef Z_PROBE_ENDSTOP
if ( endstop_z_probe_hit ) {
if ( endstop_z_probe_hit ) {
SERIAL_ECHOPAIR ( " Z_PROBE: " , ( float ) endstops_trigsteps [ Z_AXIS ] / axis_steps_per_unit [ Z_AXIS ] ) ;
SERIAL_ECHOPAIR ( " Z_PROBE: " , ( float ) endstops_trigsteps [ Z_AXIS ] / axis_steps_per_unit [ Z_AXIS ] ) ;
LCD_MESSAGEPGM ( MSG_ENDSTOPS_HIT " ZP " ) ;
LCD_MESSAGEPGM ( MSG_ENDSTOPS_HIT " ZP " ) ;
}
}
# endif
# endif
SERIAL_EOL ;
SERIAL_EOL ;
@ -411,7 +411,7 @@ ISR(TIMER1_COMPA_vect) {
OCR1A = 200 ;
OCR1A = 200 ;
return ;
return ;
}
}
// If there is no current block, attempt to pop one from the buffer
// If there is no current block, attempt to pop one from the buffer
if ( ! current_block ) {
if ( ! current_block ) {
// Anything in the buffer?
// Anything in the buffer?
@ -463,14 +463,22 @@ ISR(TIMER1_COMPA_vect) {
count_direction [ Y_AXIS ] = 1 ;
count_direction [ Y_AXIS ] = 1 ;
}
}
# 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 _ENDSTOP_HIT(axis) endstop_## axis ##_hit
# define UPDATE_ENDSTOP(axis,AXIS,minmax,MINMAX) \
# define UPDATE_ENDSTOP(axis,AXIS,minmax,MINMAX) \
bool axis # # _ # # minmax # # _endstop = ( READ ( AXIS # # _ # # MINMAX # # _PIN ) ! = AXIS # # _ # # MINMAX # # _ENDSTOP_INVERTING ) ; \
bool _ENDSTOP ( axis , minmax ) = ( READ ( _ENDSTOP_PIN ( AXIS , MINMAX ) ) ! = _ENDSTOP_INVERTING ( AXIS , MINMAX ) ) ; \
if ( axis # # _ # # minmax # # _endstop & & old_ # # axis # # _ # # minmax # # _endstop & & ( current_block - > steps [ AXIS # # _AXIS ] > 0 ) ) { \
if ( _ENDSTOP( axis , minmax ) & & _OLD_ENDSTOP ( axis , minmax ) & & ( current_block - > steps [ _AXIS( AXIS ) ] > 0 ) ) { \
endstops_trigsteps [ AXIS # # _AXIS ] = count_position [ AXIS # # _AXIS ] ; \
endstops_trigsteps [ _AXIS( AXIS ) ] = count_position [ _AXIS ( AXIS ) ] ; \
endstop_ # # axis # # _hit = true ; \
_ENDSTOP_HIT( axis ) = true ; \
step_events_completed = current_block - > step_event_count ; \
step_events_completed = current_block - > step_event_count ; \
} \
} \
old_ # # axis # # _ # # minmax # # _endstop = axis # # _ # # minmax # # _endstop ;
_OLD_ENDSTOP ( axis , minmax ) = _ENDSTOP ( axis , minmax ) ;
// Check X and Y endstops
// Check X and Y endstops
if ( check_endstops ) {
if ( check_endstops ) {
@ -486,7 +494,7 @@ ISR(TIMER1_COMPA_vect) {
# ifdef DUAL_X_CARRIAGE
# ifdef DUAL_X_CARRIAGE
// with 2 x-carriages, endstops are only checked in the homing direction for the active extruder
// with 2 x-carriages, endstops are only checked in the homing direction for the active extruder
if ( ( current_block - > active_extruder = = 0 & & X_HOME_DIR = = - 1 ) | | ( current_block - > active_extruder ! = 0 & & X2_HOME_DIR = = - 1 ) )
if ( ( current_block - > active_extruder = = 0 & & X_HOME_DIR = = - 1 ) | | ( current_block - > active_extruder ! = 0 & & X2_HOME_DIR = = - 1 ) )
# endif
# endif
{
{
# if HAS_X_MIN
# if HAS_X_MIN
UPDATE_ENDSTOP ( x , X , min , MIN ) ;
UPDATE_ENDSTOP ( x , X , min , MIN ) ;
@ -572,14 +580,14 @@ ISR(TIMER1_COMPA_vect) {
z_probe_endstop = ( READ ( Z_PROBE_PIN ) ! = Z_PROBE_ENDSTOP_INVERTING ) ;
z_probe_endstop = ( READ ( Z_PROBE_PIN ) ! = Z_PROBE_ENDSTOP_INVERTING ) ;
if ( z_probe_endstop & & old_z_probe_endstop )
if ( z_probe_endstop & & old_z_probe_endstop )
{
{
endstops_trigsteps [ Z_AXIS ] = count_position [ Z_AXIS ] ;
endstops_trigsteps [ Z_AXIS ] = count_position [ Z_AXIS ] ;
endstop_z_probe_hit = true ;
endstop_z_probe_hit = true ;
// 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 ;
old_z_probe_endstop = z_probe_endstop ;
# endif
# endif
} // check_endstops
} // check_endstops
}
}
@ -625,15 +633,15 @@ ISR(TIMER1_COMPA_vect) {
# endif // !Z_DUAL_ENDSTOPS
# endif // !Z_DUAL_ENDSTOPS
# endif // Z_MAX_PIN
# endif // Z_MAX_PIN
# ifdef Z_PROBE_ENDSTOP
# ifdef Z_PROBE_ENDSTOP
UPDATE_ENDSTOP ( z , Z , probe , PROBE ) ;
UPDATE_ENDSTOP ( z , Z , probe , PROBE ) ;
z_probe_endstop = ( READ ( Z_PROBE_PIN ) ! = Z_PROBE_ENDSTOP_INVERTING ) ;
z_probe_endstop = ( READ ( Z_PROBE_PIN ) ! = Z_PROBE_ENDSTOP_INVERTING ) ;
if ( z_probe_endstop & & old_z_probe_endstop )
if ( z_probe_endstop & & old_z_probe_endstop )
{
{
endstops_trigsteps [ Z_AXIS ] = count_position [ Z_AXIS ] ;
endstops_trigsteps [ Z_AXIS ] = count_position [ Z_AXIS ] ;
endstop_z_probe_hit = true ;
endstop_z_probe_hit = true ;
// 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 ;
old_z_probe_endstop = z_probe_endstop ;
# endif
# endif
@ -667,6 +675,11 @@ ISR(TIMER1_COMPA_vect) {
}
}
# endif //ADVANCE
# endif //ADVANCE
# define _COUNTER(axis) counter_## axis
# define _WRITE_STEP(AXIS, HIGHLOW) AXIS ##_STEP_WRITE(HIGHLOW)
# define _APPLY_STEP(AXIS) AXIS ##_APPLY_STEP
# define _INVERT_STEP_PIN(AXIS) INVERT_## AXIS ##_STEP_PIN
# ifdef CONFIG_STEPPERS_TOSHIBA
# ifdef CONFIG_STEPPERS_TOSHIBA
/**
/**
* The Toshiba stepper controller require much longer pulses .
* The Toshiba stepper controller require much longer pulses .
@ -675,8 +688,8 @@ ISR(TIMER1_COMPA_vect) {
* lag to allow it work with without needing NOPs
* lag to allow it work with without needing NOPs
*/
*/
# define STEP_ADD(axis, AXIS) \
# define STEP_ADD(axis, AXIS) \
counter_# # axis + = current_block - > steps [ AXIS # # _AXIS ] ; \
_COUNTER( axis ) + = current_block - > steps [ _AXIS ( AXIS ) ] ; \
if ( counter_# # axis > 0 ) { AXIS # # _STEP_WRITE ( HIGH ) ; }
if ( _COUNTER( axis ) > 0 ) { _WRITE_STEP ( AXIS , HIGH ) ; }
STEP_ADD ( x , X ) ;
STEP_ADD ( x , X ) ;
STEP_ADD ( y , Y ) ;
STEP_ADD ( y , Y ) ;
STEP_ADD ( z , Z ) ;
STEP_ADD ( z , Z ) ;
@ -685,10 +698,10 @@ ISR(TIMER1_COMPA_vect) {
# endif
# endif
# define STEP_IF_COUNTER(axis, AXIS) \
# define STEP_IF_COUNTER(axis, AXIS) \
if ( counter_# # axis > 0 ) { \
if ( _COUNTER( axis ) > 0 ) { \
counter_# # axis - = current_block - > step_event_count ; \
_COUNTER( axis ) - = current_block - > step_event_count ; \
count_position [ AXIS # # _AXIS ] + = count_direction [ AXIS # # _AXIS ] ; \
count_position [ _AXIS( AXIS ) ] + = count_direction [ _AXIS ( AXIS ) ] ; \
AXIS # # _STEP_WRITE ( LOW ) ; \
_WRITE_STEP( AXIS , LOW ) ; \
}
}
STEP_IF_COUNTER ( x , X ) ;
STEP_IF_COUNTER ( x , X ) ;
@ -701,12 +714,12 @@ ISR(TIMER1_COMPA_vect) {
# else // !CONFIG_STEPPERS_TOSHIBA
# else // !CONFIG_STEPPERS_TOSHIBA
# define APPLY_MOVEMENT(axis, AXIS) \
# define APPLY_MOVEMENT(axis, AXIS) \
counter_# # axis + = current_block - > steps [ AXIS # # _AXIS ] ; \
_COUNTER( axis ) + = current_block - > steps [ _AXIS ( AXIS ) ] ; \
if ( counter_# # axis > 0 ) { \
if ( _COUNTER( axis ) > 0 ) { \
AXIS # # _APPLY_STEP ( ! INVERT_ # # AXIS # # _STEP_PIN , 0 ) ; \
_APPLY_STEP( AXIS ) ( ! _INVERT_STEP_PIN ( AXIS ) , 0 ) ; \
counter_# # axis - = current_block - > step_event_count ; \
_COUNTER( axis ) - = current_block - > step_event_count ; \
count_position [ AXIS # # _AXIS ] + = count_direction [ AXIS # # _AXIS ] ; \
count_position [ _AXIS( AXIS ) ] + = count_direction [ _AXIS ( AXIS ) ] ; \
AXIS # # _APPLY_STEP ( INVERT_ # # AXIS # # _STEP_PIN , 0 ) ; \
_APPLY_STEP( AXIS ) ( _INVERT_STEP_PIN ( AXIS ) , 0 ) ; \
}
}
APPLY_MOVEMENT ( x , X ) ;
APPLY_MOVEMENT ( x , X ) ;
@ -874,7 +887,7 @@ void st_init() {
# ifdef HAVE_L6470DRIVER
# ifdef HAVE_L6470DRIVER
L6470_init ( ) ;
L6470_init ( ) ;
# endif
# endif
// Initialize Dir Pins
// Initialize Dir Pins
# if HAS_X_DIR
# if HAS_X_DIR
X_DIR_INIT ;
X_DIR_INIT ;
@ -920,11 +933,11 @@ void st_init() {
# if HAS_Y_ENABLE
# if HAS_Y_ENABLE
Y_ENABLE_INIT ;
Y_ENABLE_INIT ;
if ( ! Y_ENABLE_ON ) Y_ENABLE_WRITE ( HIGH ) ;
if ( ! Y_ENABLE_ON ) Y_ENABLE_WRITE ( HIGH ) ;
# if defined(Y_DUAL_STEPPER_DRIVERS) && HAS_Y2_ENABLE
# if defined(Y_DUAL_STEPPER_DRIVERS) && HAS_Y2_ENABLE
Y2_ENABLE_INIT ;
Y2_ENABLE_INIT ;
if ( ! Y_ENABLE_ON ) Y2_ENABLE_WRITE ( HIGH ) ;
if ( ! Y_ENABLE_ON ) Y2_ENABLE_WRITE ( HIGH ) ;
# endif
# endif
# endif
# endif
# if HAS_Z_ENABLE
# if HAS_Z_ENABLE
Z_ENABLE_INIT ;
Z_ENABLE_INIT ;
@ -1001,8 +1014,8 @@ void st_init() {
# ifdef ENDSTOPPULLUP_ZMAX
# ifdef ENDSTOPPULLUP_ZMAX
WRITE ( Z2_MAX_PIN , HIGH ) ;
WRITE ( Z2_MAX_PIN , HIGH ) ;
# endif
# endif
# 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.
# 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 ) ;
SET_INPUT ( Z_PROBE_PIN ) ;
# ifdef ENDSTOPPULLUP_ZPROBE
# ifdef ENDSTOPPULLUP_ZPROBE
@ -1010,10 +1023,13 @@ void st_init() {
# endif
# endif
# endif
# endif
# define _STEP_INIT(AXIS) AXIS ##_STEP_INIT
# define _DISABLE(axis) disable_## axis()
# define AXIS_INIT(axis, AXIS, PIN) \
# define AXIS_INIT(axis, AXIS, PIN) \
AXIS # # _STEP_INIT ; \
_STEP_INIT( AXIS ) ; \
AXIS # # _STEP_WRITE ( INVERT_ # # PIN # # _STEP_PIN ) ; \
_WRITE_STEP( AXIS , _INVERT_STEP_PIN ( PIN ) ) ; \
disable_# # axis ( )
_DISABLE( axis )
# define E_AXIS_INIT(NUM) AXIS_INIT(e## NUM, E## NUM, E)
# define E_AXIS_INIT(NUM) AXIS_INIT(e## NUM, E## NUM, E)
@ -1146,14 +1162,19 @@ void quickStop() {
// No other ISR should ever interrupt this!
// No other ISR should ever interrupt this!
void babystep ( const uint8_t axis , const bool direction ) {
void babystep ( const uint8_t axis , const bool direction ) {
# define _ENABLE(axis) enable_## axis()
# define _READ_DIR(AXIS) AXIS ##_DIR_READ
# define _INVERT_DIR(AXIS) INVERT_## AXIS ##_DIR
# define _APPLY_DIR(AXIS, INVERT) AXIS ##_APPLY_DIR(INVERT, true)
# define BABYSTEP_AXIS(axis, AXIS, INVERT) { \
# define BABYSTEP_AXIS(axis, AXIS, INVERT) { \
enable_ # # axis ( ) ; \
_ENABLE( axis ) ; \
uint8_t old_pin = AXIS # # _DIR_READ ; \
uint8_t old_pin = _READ_DIR( AXIS ) ; \
AXIS # # _APPLY_DIR ( INVERT_ # # AXIS # # _DIR ^ direction ^ INVERT , true ) ; \
_APPLY_DIR( AXIS , _INVERT_DIR ( AXIS ) ^ direction ^ INVERT ) ; \
AXIS # # _APPLY_STEP ( ! INVERT_ # # AXIS # # _STEP_PIN , true ) ; \
_APPLY_STEP( AXIS ) ( ! _INVERT_STEP_PIN ( AXIS ) , true ) ; \
delayMicroseconds ( 2 ) ; \
delayMicroseconds ( 2 ) ; \
AXIS # # _APPLY_STEP ( INVERT_ # # AXIS # # _STEP_PIN , true ) ; \
_APPLY_STEP( AXIS ) ( _INVERT_STEP_PIN ( AXIS ) , true ) ; \
AXIS # # _APPLY_DIR( old_pin, true ) ; \
_APPLY_DIR( AXIS, old_pin) ; \
}
}
switch ( axis ) {
switch ( axis ) {
@ -1165,7 +1186,7 @@ void quickStop() {
case Y_AXIS :
case Y_AXIS :
BABYSTEP_AXIS ( y , Y , false ) ;
BABYSTEP_AXIS ( y , Y , false ) ;
break ;
break ;
case Z_AXIS : {
case Z_AXIS : {
# ifndef DELTA
# ifndef DELTA
@ -1202,7 +1223,7 @@ void quickStop() {
# endif
# endif
} break ;
} break ;
default : break ;
default : break ;
}
}
}
}
@ -1266,7 +1287,7 @@ void microstep_init() {
# if HAS_MICROSTEPS
# if HAS_MICROSTEPS
pinMode ( X_MS1_PIN , OUTPUT ) ;
pinMode ( X_MS1_PIN , OUTPUT ) ;
pinMode ( X_MS2_PIN , OUTPUT ) ;
pinMode ( X_MS2_PIN , OUTPUT ) ;
pinMode ( Y_MS1_PIN , OUTPUT ) ;
pinMode ( Y_MS1_PIN , OUTPUT ) ;
pinMode ( Y_MS2_PIN , OUTPUT ) ;
pinMode ( Y_MS2_PIN , OUTPUT ) ;
pinMode ( Z_MS1_PIN , OUTPUT ) ;
pinMode ( Z_MS1_PIN , OUTPUT ) ;