diff --git a/dda.c b/dda.c index 57a026e..07e6471 100644 --- a/dda.c +++ b/dda.c @@ -354,6 +354,8 @@ void dda_start(DDA *dda) { psu_timeout = 0; if (dda->z_delta) z_enable(); + if (dda->endstop_check) + endstops_on(); // set direction outputs x_direction(dda->x_direction); @@ -636,6 +638,7 @@ void dda_step(DDA *dda) { // TODO: If we stop axes individually, could we home two or more axes at the same time? if (dda->endstop_check != 0x0 && endstop_not_done == 0x0) { move_state.x_steps = move_state.y_steps = move_state.z_steps = move_state.e_steps = 0; + endstops_off(); // as we stop without ramping down, we have to re-init our ramping here dda_init(); } diff --git a/gcode_process.c b/gcode_process.c index 0400bba..b8dd74f 100644 --- a/gcode_process.c +++ b/gcode_process.c @@ -724,6 +724,8 @@ void process_gcode_command() { //? --- M200: report endstop status --- //? Report the current status of the endstops configured in the firmware to the host. power_on(); + endstops_on(); + delay_ms(10); // allow the signal to stabilize #if defined(X_MIN_PIN) sersendf_P(PSTR("x_min:%d "), x_min()); #endif @@ -745,6 +747,7 @@ void process_gcode_command() { #if !(defined(X_MIN_PIN) || defined(X_MAX_PIN) || defined(Y_MIN_PIN) || defined(Y_MAX_PIN) || defined(Z_MIN_PIN) || defined(Z_MAX_PIN)) sersendf_P(PSTR("no endstops defined")); #endif + endstops_off(); break; #ifdef DEBUG diff --git a/mendel.c b/mendel.c index bbf6be6..cf2c1a1 100644 --- a/mendel.c +++ b/mendel.c @@ -72,19 +72,11 @@ void io_init(void) { WRITE(X_DIR_PIN, 0); SET_OUTPUT(X_DIR_PIN); #ifdef X_MIN_PIN SET_INPUT(X_MIN_PIN); - #ifdef USE_INTERNAL_PULLUPS - WRITE(X_MIN_PIN, 1); - #else - WRITE(X_MIN_PIN, 0); - #endif + WRITE(X_MIN_PIN, 0); // pullup resistors off #endif #ifdef X_MAX_PIN SET_INPUT(X_MAX_PIN); - #ifdef USE_INTERNAL_PULLUPS - WRITE(X_MAX_PIN, 1); - #else - WRITE(X_MAX_PIN, 0); - #endif + WRITE(X_MAX_PIN, 0); // pullup resistors off #endif // Y Stepper @@ -92,19 +84,11 @@ void io_init(void) { WRITE(Y_DIR_PIN, 0); SET_OUTPUT(Y_DIR_PIN); #ifdef Y_MIN_PIN SET_INPUT(Y_MIN_PIN); - #ifdef USE_INTERNAL_PULLUPS - WRITE(Y_MIN_PIN, 1); - #else - WRITE(Y_MIN_PIN, 0); - #endif + WRITE(Y_MIN_PIN, 0); // pullup resistors off #endif #ifdef Y_MAX_PIN SET_INPUT(Y_MAX_PIN); - #ifdef USE_INTERNAL_PULLUPS - WRITE(Y_MAX_PIN, 1); - #else - WRITE(Y_MAX_PIN, 0); - #endif + WRITE(Y_MAX_PIN, 0); // pullup resistors off #endif // Z Stepper @@ -114,19 +98,11 @@ void io_init(void) { #endif #ifdef Z_MIN_PIN SET_INPUT(Z_MIN_PIN); - #ifdef USE_INTERNAL_PULLUPS - WRITE(Z_MIN_PIN, 1); - #else - WRITE(Z_MIN_PIN, 0); - #endif + WRITE(Z_MIN_PIN, 0); // pullup resistors off #endif #ifdef Z_MAX_PIN SET_INPUT(Z_MAX_PIN); - #ifdef USE_INTERNAL_PULLUPS - WRITE(Z_MAX_PIN, 1); - #else - WRITE(Z_MAX_PIN, 0); - #endif + WRITE(Z_MAX_PIN, 0); // pullup resistors off #endif #if defined E_STEP_PIN && defined E_DIR_PIN diff --git a/pinio.h b/pinio.h index d5cc9aa..c1774be 100644 --- a/pinio.h +++ b/pinio.h @@ -211,4 +211,56 @@ Stepper Enable Pins #define e_disable() do { } while (0) #endif +/* +Internal pullup resistors for endstops +*/ +static void endstops_on(void) __attribute__ ((always_inline)); +inline void endstops_on(void) { + #ifdef USE_INTERNAL_PULLUPS + #ifdef X_MIN_PIN + WRITE(X_MIN_PIN, 1); + #endif + #ifdef X_MAX_PIN + WRITE(X_MAX_PIN, 1); + #endif + #ifdef Y_MIN_PIN + WRITE(Y_MIN_PIN, 1); + #endif + #ifdef Y_MAX_PIN + WRITE(Y_MAX_PIN, 1); + #endif + #ifdef Z_MIN_PIN + WRITE(Z_MIN_PIN, 1); + #endif + #ifdef Z_MAX_PIN + WRITE(Z_MAX_PIN, 1); + #endif + #endif +} + +static void endstops_off(void) __attribute__ ((always_inline)); +inline void endstops_off(void) { + #ifdef USE_INTERNAL_PULLUPS + #ifdef X_MIN_PIN + WRITE(X_MIN_PIN, 0); + #endif + #ifdef X_MAX_PIN + WRITE(X_MAX_PIN, 0); + #endif + #ifdef Y_MIN_PIN + WRITE(Y_MIN_PIN, 0); + #endif + #ifdef Y_MAX_PIN + WRITE(Y_MAX_PIN, 0); + #endif + #ifdef Z_MIN_PIN + WRITE(Z_MIN_PIN, 0); + #endif + #ifdef Z_MAX_PIN + WRITE(Z_MAX_PIN, 0); + #endif + #endif +} + + #endif /* _PINIO_H */