From 5d6de1761b826d31133703a10589e0ac1d30121a Mon Sep 17 00:00:00 2001 From: Markus Hitter Date: Sat, 6 Oct 2012 22:02:37 +0200 Subject: [PATCH] Enable internal pullups for endstops on demand, only. The binary size impact is moderate, like 18 bytes plus 4 bytes per endstop defined. The story is a follows: The endstop logic can be used to use a touch probe with PCB milling. Connect the (conductive) PCB surface to GND, the spindle/mill bit to the signal line, turn the internal pullups on and there you go. However, doing so with pullups always enabled and while milling under (conductive) water showed polished mill and drill bits to become matte after a few hours of usage. Obviously, this small 0.5 mA current from the pullup resistors going through the rotating mill bit is sufficient to get some spark erosion going. That's bad, as spark erosion happening also means tools become dull faster than neccessary. With this patch, pullups are turned on while being used, only, so this sparc erosion should go away. --- dda.c | 3 +++ gcode_process.c | 3 +++ mendel.c | 36 ++++++---------------------------- pinio.h | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 30 deletions(-) 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 */