@@ -1676,7 +1676,7 @@ void Stepper::pulse_phase_isr() {
1676
1676
int32_t de = delta_error[_AXIS (AXIS)] + advance_dividend[_AXIS (AXIS)]; \
1677
1677
if (de >= 0 ) { \
1678
1678
step_needed.set (_AXIS (AXIS)); \
1679
- de -= advance_divisor ; \
1679
+ de -= advance_divisor_cached ; \
1680
1680
} \
1681
1681
delta_error[_AXIS (AXIS)] = de; \
1682
1682
}while (0 )
@@ -1702,19 +1702,22 @@ void Stepper::pulse_phase_isr() {
1702
1702
#define HYSTERESIS (AXIS ) _HYSTERESIS(AXIS)
1703
1703
1704
1704
#define PULSE_PREP_SHAPING (AXIS, DELTA_ERROR, DIVIDEND ) do { \
1705
- if (step_needed.test (_AXIS (AXIS))) { \
1706
- DELTA_ERROR += (DIVIDEND); \
1707
- if ((MAXDIR (AXIS) && DELTA_ERROR <= -(64 + HYSTERESIS (AXIS))) || (MINDIR (AXIS) && DELTA_ERROR >= (64 + HYSTERESIS (AXIS)))) { \
1705
+ int16_t de = DELTA_ERROR + (DIVIDEND); \
1706
+ const bool step_fwd = de >= (64 + HYSTERESIS (AXIS)), \
1707
+ step_bak = de <= -(64 + HYSTERESIS (AXIS)); \
1708
+ if (step_fwd || step_bak) { \
1709
+ de += step_fwd ? -128 : 128 ; \
1710
+ if ((MAXDIR (AXIS) && step_bak) || (MINDIR (AXIS) && step_fwd)) { \
1708
1711
{ USING_TIMED_PULSE (); START_TIMED_PULSE (); AWAIT_LOW_PULSE (); } \
1709
1712
TBI (last_direction_bits, _AXIS (AXIS)); \
1710
1713
DIR_WAIT_BEFORE (); \
1711
1714
SET_STEP_DIR (AXIS); \
1712
1715
DIR_WAIT_AFTER (); \
1713
1716
} \
1714
- step_needed.set (_AXIS (AXIS), DELTA_ERROR <= -(64 + HYSTERESIS (AXIS)) || DELTA_ERROR >= (64 + HYSTERESIS (AXIS))); \
1715
- if (step_needed.test (_AXIS (AXIS))) \
1716
- DELTA_ERROR += MAXDIR (AXIS) ? -128 : 128 ; \
1717
1717
} \
1718
+ else \
1719
+ step_needed.clear (_AXIS (AXIS)); \
1720
+ DELTA_ERROR = de; \
1718
1721
}while (0 )
1719
1722
1720
1723
// Start an active pulse if needed
@@ -1839,6 +1842,9 @@ void Stepper::pulse_phase_isr() {
1839
1842
#endif // DIRECT_STEPPING
1840
1843
1841
1844
if (!is_page) {
1845
+ // Give the compiler a clue to store advance_divisor in registers for what follows
1846
+ const uint32_t advance_divisor_cached = advance_divisor;
1847
+
1842
1848
// Determine if pulses are needed
1843
1849
#if HAS_X_STEP
1844
1850
PULSE_PREP (X);
@@ -1883,19 +1889,19 @@ void Stepper::pulse_phase_isr() {
1883
1889
1884
1890
#if HAS_SHAPING
1885
1891
// record an echo if a step is needed in the primary bresenham
1886
- const bool x_step = TERN0 (INPUT_SHAPING_X, shaping_x. enabled && step_needed. x ),
1887
- y_step = TERN0 (INPUT_SHAPING_Y, shaping_y. enabled && step_needed. y );
1892
+ const bool x_step = TERN0 (INPUT_SHAPING_X, step_needed. x && shaping_x. enabled ),
1893
+ y_step = TERN0 (INPUT_SHAPING_Y, step_needed. y && shaping_y. enabled );
1888
1894
if (x_step || y_step)
1889
1895
ShapingQueue::enqueue (x_step, TERN0 (INPUT_SHAPING_X, shaping_x.forward ), y_step, TERN0 (INPUT_SHAPING_Y, shaping_y.forward ));
1890
1896
1891
1897
// do the first part of the secondary bresenham
1892
1898
#if ENABLED(INPUT_SHAPING_X)
1893
- if (shaping_x. enabled )
1894
- PULSE_PREP_SHAPING (X, shaping_x.delta_error , shaping_x.factor1 * ( shaping_x.forward ? 1 : -1 ) );
1899
+ if (x_step )
1900
+ PULSE_PREP_SHAPING (X, shaping_x.delta_error , shaping_x.forward ? shaping_x.factor1 : -shaping_x. factor1 );
1895
1901
#endif
1896
1902
#if ENABLED(INPUT_SHAPING_Y)
1897
- if (shaping_y. enabled )
1898
- PULSE_PREP_SHAPING (Y, shaping_y.delta_error , shaping_y.factor1 * ( shaping_y.forward ? 1 : -1 ) );
1903
+ if (y_step )
1904
+ PULSE_PREP_SHAPING (Y, shaping_y.delta_error , shaping_y.forward ? shaping_y.factor1 : -shaping_y. factor1 );
1899
1905
#endif
1900
1906
#endif
1901
1907
}
@@ -2008,15 +2014,15 @@ void Stepper::pulse_phase_isr() {
2008
2014
#if ENABLED(INPUT_SHAPING_X)
2009
2015
if (step_needed.x ) {
2010
2016
const bool forward = ShapingQueue::dequeue_x ();
2011
- PULSE_PREP_SHAPING (X, shaping_x.delta_error , shaping_x. factor2 * (forward ? 1 : -1 ));
2017
+ PULSE_PREP_SHAPING (X, shaping_x.delta_error , (forward ? shaping_x. factor2 : -shaping_x. factor2 ));
2012
2018
PULSE_START (X);
2013
2019
}
2014
2020
#endif
2015
2021
2016
2022
#if ENABLED(INPUT_SHAPING_Y)
2017
2023
if (step_needed.y ) {
2018
2024
const bool forward = ShapingQueue::dequeue_y ();
2019
- PULSE_PREP_SHAPING (Y, shaping_y.delta_error , shaping_y. factor2 * (forward ? 1 : -1 ));
2025
+ PULSE_PREP_SHAPING (Y, shaping_y.delta_error , (forward ? shaping_y. factor2 : -shaping_y. factor2 ));
2020
2026
PULSE_START (Y);
2021
2027
}
2022
2028
#endif
0 commit comments