|
|
|
@ -275,6 +275,8 @@
|
|
|
|
|
#error "HAVE_TMC26X is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h."
|
|
|
|
|
#elif defined(HAVE_TMC2130)
|
|
|
|
|
#error "HAVE_TMC2130 is now [AXIS]_DRIVER_TYPE TMC2130. Please update your Configuration.h."
|
|
|
|
|
#elif defined(HAVE_TMC2208)
|
|
|
|
|
#error "HAVE_TMC2208 is now [AXIS]_DRIVER_TYPE TMC2208. Please update your Configuration.h."
|
|
|
|
|
#elif defined(HAVE_L6470DRIVER)
|
|
|
|
|
#error "HAVE_L6470DRIVER is now [AXIS]_DRIVER_TYPE L6470. Please update your Configuration.h."
|
|
|
|
|
#elif defined(X_IS_TMC) || defined(X2_IS_TMC) || defined(Y_IS_TMC) || defined(Y2_IS_TMC) || defined(Z_IS_TMC) || defined(Z2_IS_TMC) || defined(Z3_IS_TMC) \
|
|
|
|
@ -1070,10 +1072,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
|
|
|
|
|
* Require pin options and pins to be defined
|
|
|
|
|
*/
|
|
|
|
|
#if ENABLED(SENSORLESS_PROBING)
|
|
|
|
|
#if ENABLED(DELTA) && (!AXIS_DRIVER_TYPE_X(TMC2130) || !AXIS_DRIVER_TYPE_Y(TMC2130) || !AXIS_DRIVER_TYPE_Z(TMC2130))
|
|
|
|
|
#error "SENSORLESS_PROBING requires TMC2130 drivers on X, Y, and Z."
|
|
|
|
|
#elif !AXIS_DRIVER_TYPE_Z(TMC2130)
|
|
|
|
|
#error "SENSORLESS_PROBING requires a TMC2130 driver on Z."
|
|
|
|
|
#if ENABLED(DELTA) && !(AXIS_HAS_STALLGUARD(X) && AXIS_HAS_STALLGUARD(Y) && AXIS_HAS_STALLGUARD(Z))
|
|
|
|
|
#error "SENSORLESS_PROBING requires TMC2130/2160/2209/5130/5160 drivers on X, Y, and Z."
|
|
|
|
|
#elif !AXIS_HAS_STALLGUARD(Z)
|
|
|
|
|
#error "SENSORLESS_PROBING requires a TMC2130/2160/2209/5130/5160 driver on Z."
|
|
|
|
|
#endif
|
|
|
|
|
#elif ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN)
|
|
|
|
|
#if DISABLED(USE_ZMIN_PLUG)
|
|
|
|
@ -1876,73 +1878,106 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
|
|
|
|
|
/**
|
|
|
|
|
* Check existing CS pins against enabled TMC SPI drivers.
|
|
|
|
|
*/
|
|
|
|
|
#define INVALID_TMC2130(ST) (AXIS_DRIVER_TYPE(ST, TMC2130) && !PIN_EXISTS(ST##_CS))
|
|
|
|
|
#if INVALID_TMC2130(X)
|
|
|
|
|
#error "TMC2130 on X requires X_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC2130(X2)
|
|
|
|
|
#error "TMC2130 on X2 requires X2_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC2130(Y)
|
|
|
|
|
#error "TMC2130 on Y requires Y_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC2130(Y2)
|
|
|
|
|
#error "TMC2130 on Y2 requires Y2_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC2130(Z)
|
|
|
|
|
#error "TMC2130 on Z requires Z_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC2130(Z2)
|
|
|
|
|
#error "TMC2130 on Z2 requires Z2_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC2130(Z3)
|
|
|
|
|
#error "TMC2130 on Z3 requires Z3_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC2130(E0)
|
|
|
|
|
#error "TMC2130 on E0 requires E0_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC2130(E1)
|
|
|
|
|
#error "TMC2130 on E1 requires E1_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC2130(E2)
|
|
|
|
|
#error "TMC2130 on E2 requires E2_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC2130(E3)
|
|
|
|
|
#error "TMC2130 on E3 requires E3_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC2130(E4)
|
|
|
|
|
#error "TMC2130 on E4 requires E4_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC2130(E5)
|
|
|
|
|
#error "TMC2130 on E5 requires E5_CS_PIN."
|
|
|
|
|
#endif
|
|
|
|
|
#undef INVALID_TMC2130
|
|
|
|
|
#define INVALID_TMC_SPI(ST) (AXIS_HAS_SPI && !PIN_EXISTS(ST##_CS))
|
|
|
|
|
#if INVALID_TMC_SPI(X)
|
|
|
|
|
#error "An SPI driven TMC driver on X requires X_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC_SPI(X2)
|
|
|
|
|
#error "An SPI driven TMC driver on X2 requires X2_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC_SPI(Y)
|
|
|
|
|
#error "An SPI driven TMC driver on Y requires Y_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC_SPI(Y2)
|
|
|
|
|
#error "An SPI driven TMC driver on Y2 requires Y2_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC_SPI(Z)
|
|
|
|
|
#error "An SPI driven TMC driver on Z requires Z_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC_SPI(Z2)
|
|
|
|
|
#error "An SPI driven TMC driver on Z2 requires Z2_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC_SPI(Z3)
|
|
|
|
|
#error "An SPI driven TMC driver on Z3 requires Z3_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC_SPI(E0)
|
|
|
|
|
#error "An SPI driven TMC driver on E0 requires E0_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC_SPI(E1)
|
|
|
|
|
#error "An SPI driven TMC driver on E1 requires E1_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC_SPI(E2)
|
|
|
|
|
#error "An SPI driven TMC driver on E2 requires E2_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC_SPI(E3)
|
|
|
|
|
#error "An SPI driven TMC driver on E3 requires E3_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC_SPI(E4)
|
|
|
|
|
#error "An SPI driven TMC driver on E4 requires E4_CS_PIN."
|
|
|
|
|
#elif INVALID_TMC_SPI(E5)
|
|
|
|
|
#error "An SPI driven TMC driver on E5 requires E5_CS_PIN."
|
|
|
|
|
#endif
|
|
|
|
|
#undef INVALID_TMC_SPI
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Check existing RX/TX pins against enable TMC UART drivers.
|
|
|
|
|
*/
|
|
|
|
|
#define INVALID_TMC2208(ST) (AXIS_DRIVER_TYPE(ST, TMC2208) && !(defined(ST##_HARDWARE_SERIAL) || (PIN_EXISTS(ST##_SERIAL_RX, ST##_SERIAL_TX))))
|
|
|
|
|
#if INVALID_TMC2208(X)
|
|
|
|
|
#error "TMC2208 on X requires X_HARDWARE_SERIAL or X_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC2208(X2)
|
|
|
|
|
#error "TMC2208 on X2 requires X2_HARDWARE_SERIAL or X2_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC2208(Y)
|
|
|
|
|
#error "TMC2208 on Y requires Y_HARDWARE_SERIAL or Y_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC2208(Y2)
|
|
|
|
|
#error "TMC2208 on Y2 requires Y2_HARDWARE_SERIAL or Y2_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC2208(Z)
|
|
|
|
|
#error "TMC2208 on Z requires Z_HARDWARE_SERIAL or Z_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC2208(Z2)
|
|
|
|
|
#error "TMC2208 on Z2 requires Z2_HARDWARE_SERIAL or Z2_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC2208(Z3)
|
|
|
|
|
#error "TMC2208 on Z3 requires Z3_HARDWARE_SERIAL or Z3_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC2208(E0)
|
|
|
|
|
#error "TMC2208 on E0 requires E0_HARDWARE_SERIAL or E0_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC2208(E1)
|
|
|
|
|
#error "TMC2208 on E1 requires E1_HARDWARE_SERIAL or E1_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC2208(E2)
|
|
|
|
|
#error "TMC2208 on E2 requires E2_HARDWARE_SERIAL or E2_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC2208(E3)
|
|
|
|
|
#error "TMC2208 on E3 requires E3_HARDWARE_SERIAL or E3_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC2208(E4)
|
|
|
|
|
#error "TMC2208 on E4 requires E4_HARDWARE_SERIAL or E4_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC2208(E5)
|
|
|
|
|
#error "TMC2208 on E5 requires E5_HARDWARE_SERIAL or E5_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#endif
|
|
|
|
|
#undef INVALID_TMC2208
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* TMC2208 software UART and ENDSTOP_INTERRUPTS both use pin change interrupts (PCI)
|
|
|
|
|
*/
|
|
|
|
|
#if HAS_DRIVER(TMC2208) && ENABLED(ENDSTOP_INTERRUPTS_FEATURE) && !( \
|
|
|
|
|
#define INVALID_TMC_UART(ST) (AXIS_HAS_UART(ST) && !(defined(ST##_HARDWARE_SERIAL) || (PIN_EXISTS(ST##_SERIAL_RX, ST##_SERIAL_TX))))
|
|
|
|
|
#if INVALID_TMC_UART(X)
|
|
|
|
|
#error "TMC2208 or TMC2209 on X requires X_HARDWARE_SERIAL or X_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC_UART(X2)
|
|
|
|
|
#error "TMC2208 or TMC2209 on X2 requires X2_HARDWARE_SERIAL or X2_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC_UART(Y)
|
|
|
|
|
#error "TMC2208 or TMC2209 on Y requires Y_HARDWARE_SERIAL or Y_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC_UART(Y2)
|
|
|
|
|
#error "TMC2208 or TMC2209 on Y2 requires Y2_HARDWARE_SERIAL or Y2_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC_UART(Z)
|
|
|
|
|
#error "TMC2208 or TMC2209 on Z requires Z_HARDWARE_SERIAL or Z_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC_UART(Z2)
|
|
|
|
|
#error "TMC2208 or TMC2209 on Z2 requires Z2_HARDWARE_SERIAL or Z2_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC_UART(Z3)
|
|
|
|
|
#error "TMC2208 or TMC2209 on Z3 requires Z3_HARDWARE_SERIAL or Z3_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC_UART(E0)
|
|
|
|
|
#error "TMC2208 or TMC2209 on E0 requires E0_HARDWARE_SERIAL or E0_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC_UART(E1)
|
|
|
|
|
#error "TMC2208 or TMC2209 on E1 requires E1_HARDWARE_SERIAL or E1_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC_UART(E2)
|
|
|
|
|
#error "TMC2208 or TMC2209 on E2 requires E2_HARDWARE_SERIAL or E2_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC_UART(E3)
|
|
|
|
|
#error "TMC2208 or TMC2209 on E3 requires E3_HARDWARE_SERIAL or E3_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC_UART(E4)
|
|
|
|
|
#error "TMC2208 or TMC2209 on E4 requires E4_HARDWARE_SERIAL or E4_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#elif INVALID_TMC_UART(E5)
|
|
|
|
|
#error "TMC2208 or TMC2209 on E5 requires E5_HARDWARE_SERIAL or E5_SERIAL_(RX|TX)_PIN."
|
|
|
|
|
#endif
|
|
|
|
|
#undef INVALID_TMC_UART
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* TMC2209 slave address values
|
|
|
|
|
*/
|
|
|
|
|
#define INVALID_TMC_ADDRESS(ST) static_assert(0 <= ST##_SLAVE_ADDRESS && ST##_SLAVE_ADDRESS <= 3, "TMC2209 slave address must be 0, 1, 2 or 3")
|
|
|
|
|
#if AXIS_DRIVER_TYPE_X(TMC2209)
|
|
|
|
|
INVALID_TMC_ADDRESS(X);
|
|
|
|
|
#elif AXIS_DRIVER_TYPE_X2(TMC2209)
|
|
|
|
|
INVALID_TMC_ADDRESS(X2);
|
|
|
|
|
#elif AXIS_DRIVER_TYPE_Y(TMC2209)
|
|
|
|
|
INVALID_TMC_ADDRESS(Y);
|
|
|
|
|
#elif AXIS_DRIVER_TYPE_Y2(TMC2209)
|
|
|
|
|
INVALID_TMC_ADDRESS(Y2);
|
|
|
|
|
#elif AXIS_DRIVER_TYPE_Z(TMC2209)
|
|
|
|
|
INVALID_TMC_ADDRESS(Z);
|
|
|
|
|
#elif AXIS_DRIVER_TYPE_Z2(TMC2209)
|
|
|
|
|
INVALID_TMC_ADDRESS(Z2);
|
|
|
|
|
#elif AXIS_DRIVER_TYPE_Z3(TMC2209)
|
|
|
|
|
INVALID_TMC_ADDRESS(Z3);
|
|
|
|
|
#elif AXIS_DRIVER_TYPE_E0(TMC2209)
|
|
|
|
|
INVALID_TMC_ADDRESS(E0);
|
|
|
|
|
#elif AXIS_DRIVER_TYPE_E1(TMC2209)
|
|
|
|
|
INVALID_TMC_ADDRESS(E1);
|
|
|
|
|
#elif AXIS_DRIVER_TYPE_E2(TMC2209)
|
|
|
|
|
INVALID_TMC_ADDRESS(E2);
|
|
|
|
|
#elif AXIS_DRIVER_TYPE_E3(TMC2209)
|
|
|
|
|
INVALID_TMC_ADDRESS(E3);
|
|
|
|
|
#elif AXIS_DRIVER_TYPE_E4(TMC2209)
|
|
|
|
|
INVALID_TMC_ADDRESS(E4);
|
|
|
|
|
#elif AXIS_DRIVER_TYPE_E5(TMC2209)
|
|
|
|
|
INVALID_TMC_ADDRESS(E5);
|
|
|
|
|
#endif
|
|
|
|
|
#undef INVALID_TMC_ADDRESS
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* TMC2208/2209 software UART and ENDSTOP_INTERRUPTS both use pin change interrupts (PCI)
|
|
|
|
|
*/
|
|
|
|
|
#if (HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209)) && ENABLED(ENDSTOP_INTERRUPTS_FEATURE) && !( \
|
|
|
|
|
defined(X_HARDWARE_SERIAL ) \
|
|
|
|
|
|| defined(X2_HARDWARE_SERIAL) \
|
|
|
|
|
|| defined(Y_HARDWARE_SERIAL ) \
|
|
|
|
@ -1960,9 +1995,9 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* TMC2208 software UART is only supported on AVR
|
|
|
|
|
* TMC2208/2209 software UART is only supported on AVR and LPC
|
|
|
|
|
*/
|
|
|
|
|
#if HAS_DRIVER(TMC2208) && !defined(__AVR__) && !defined(TARGET_LPC1768) && !( \
|
|
|
|
|
#if (HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209)) && !defined(__AVR__) && !defined(TARGET_LPC1768) && !( \
|
|
|
|
|
defined(X_HARDWARE_SERIAL ) \
|
|
|
|
|
|| defined(X2_HARDWARE_SERIAL) \
|
|
|
|
|
|| defined(Y_HARDWARE_SERIAL ) \
|
|
|
|
@ -1983,25 +2018,36 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
|
|
|
|
|
// is necessary in order to reset the stallGuard indication between the initial movement of all three
|
|
|
|
|
// towers to +Z and the individual homing of each tower. This restriction can be removed once a means of
|
|
|
|
|
// clearing the stallGuard activated status is found.
|
|
|
|
|
|
|
|
|
|
// Stall detection DIAG = HIGH : TMC2209
|
|
|
|
|
// Stall detection DIAG = LOW : TMC2130/TMC2160/TMC2660/TMC5130/TMC5160
|
|
|
|
|
#define X_ENDSTOP_INVERTING !AXIS_DRIVER_TYPE(X,TMC2209)
|
|
|
|
|
#define Y_ENDSTOP_INVERTING !AXIS_DRIVER_TYPE(Y,TMC2209)
|
|
|
|
|
#define Z_ENDSTOP_INVERTING !AXIS_DRIVER_TYPE(Z,TMC2209)
|
|
|
|
|
|
|
|
|
|
#if ENABLED(DELTA) && !BOTH(STEALTHCHOP_XY, STEALTHCHOP_Z)
|
|
|
|
|
#error "SENSORLESS_HOMING on DELTA currently requires STEALTHCHOP_XY and STEALTHCHOP_Z."
|
|
|
|
|
#elif X_SENSORLESS && X_HOME_DIR == -1 && (!X_MIN_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_XMIN))
|
|
|
|
|
#elif X_SENSORLESS && X_HOME_DIR == -1 && (X_MIN_ENDSTOP_INVERTING != X_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_XMIN))
|
|
|
|
|
#error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_INVERTING and ENDSTOPPULLUP_XMIN when homing to X_MIN."
|
|
|
|
|
#elif X_SENSORLESS && X_HOME_DIR == 1 && (!X_MAX_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_XMAX))
|
|
|
|
|
#elif X_SENSORLESS && X_HOME_DIR == 1 && (X_MAX_ENDSTOP_INVERTING != X_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_XMAX))
|
|
|
|
|
#error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_INVERTING and ENDSTOPPULLUP_XMAX when homing to X_MAX."
|
|
|
|
|
#elif Y_SENSORLESS && Y_HOME_DIR == -1 && (!Y_MIN_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_YMIN))
|
|
|
|
|
#elif Y_SENSORLESS && Y_HOME_DIR == -1 && (Y_MIN_ENDSTOP_INVERTING != Y_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_YMIN))
|
|
|
|
|
#error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_INVERTING and ENDSTOPPULLUP_YMIN when homing to Y_MIN."
|
|
|
|
|
#elif Y_SENSORLESS && Y_HOME_DIR == 1 && (!Y_MAX_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_YMAX))
|
|
|
|
|
#elif Y_SENSORLESS && Y_HOME_DIR == 1 && (Y_MAX_ENDSTOP_INVERTING != Y_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_YMAX))
|
|
|
|
|
#error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_INVERTING and ENDSTOPPULLUP_YMAX when homing to Y_MAX."
|
|
|
|
|
#elif Z_SENSORLESS && Z_HOME_DIR == -1 && (!Z_MIN_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_ZMIN))
|
|
|
|
|
#elif Z_SENSORLESS && Z_HOME_DIR == -1 && (Z_MIN_ENDSTOP_INVERTING != Z_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_ZMIN))
|
|
|
|
|
#error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_INVERTING and ENDSTOPPULLUP_ZMIN when homing to Z_MIN."
|
|
|
|
|
#elif Z_SENSORLESS && Z_HOME_DIR == 1 && (!Z_MAX_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_ZMAX))
|
|
|
|
|
#elif Z_SENSORLESS && Z_HOME_DIR == 1 && (Z_MAX_ENDSTOP_INVERTING != Z_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_ZMAX))
|
|
|
|
|
#error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_INVERTING and ENDSTOPPULLUP_ZMAX when homing to Z_MAX."
|
|
|
|
|
#elif ENDSTOP_NOISE_THRESHOLD
|
|
|
|
|
#error "SENSORLESS_HOMING is incompatible with ENDSTOP_NOISE_THRESHOLD."
|
|
|
|
|
#elif !(X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS)
|
|
|
|
|
#error "SENSORLESS_HOMING requires a TMC stepper driver with StallGuard on X, Y, or Z axes."
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#undef X_ENDSTOP_INVERTING
|
|
|
|
|
#undef Y_ENDSTOP_INVERTING
|
|
|
|
|
#undef Z_ENDSTOP_INVERTING
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// Sensorless probing requirements
|
|
|
|
@ -2026,11 +2072,11 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
|
|
|
|
|
#if ENABLED(HYBRID_THRESHOLD) && !STEALTHCHOP_ENABLED
|
|
|
|
|
#error "Enable STEALTHCHOP_(XY|Z|E) to use HYBRID_THRESHOLD."
|
|
|
|
|
#elif ENABLED(SENSORLESS_HOMING) && !HAS_STALLGUARD
|
|
|
|
|
#error "SENSORLESS_HOMING requires TMC2130 or TMC2160 or TMC5160 stepper drivers."
|
|
|
|
|
#error "SENSORLESS_HOMING requires TMC2130, TMC2160, TMC2209, TMC2660, or TMC5160 stepper drivers."
|
|
|
|
|
#elif ENABLED(SENSORLESS_PROBING) && !HAS_STALLGUARD
|
|
|
|
|
#error "SENSORLESS_PROBING requires TMC2130 stepper drivers."
|
|
|
|
|
#error "SENSORLESS_PROBING requires TMC2130, TMC2160, TMC2209, TMC2660, or TMC5160 stepper drivers."
|
|
|
|
|
#elif STEALTHCHOP_ENABLED && !HAS_STEALTHCHOP
|
|
|
|
|
#error "STEALTHCHOP requires TMC2130 or TMC2160 or TMC2208 or TMC5160 stepper drivers."
|
|
|
|
|
#error "STEALTHCHOP requires TMC2130, TMC2160, TMC2208, TMC2209, or TMC5160 stepper drivers."
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if ENABLED(DELTA) && (ENABLED(STEALTHCHOP_XY) != ENABLED(STEALTHCHOP_Z))
|
|
|
|
|