@@ -189,7 +189,7 @@ bool Stepper::abort_current_block;
189
189
#endif
190
190
191
191
uint32_t Stepper::acceleration_time, Stepper::deceleration_time;
192
- uint8_t Stepper::steps_per_isr; // Count of steps to perform per Stepper ISR call
192
+ uint8_t Stepper::steps_per_isr = 1 ; // Count of steps to perform per Stepper ISR call
193
193
194
194
#if ENABLED(FREEZE_FEATURE)
195
195
bool Stepper::frozen; // = false
@@ -2088,8 +2088,7 @@ hal_timer_t Stepper::calc_timer_interval(uint32_t step_rate) {
2088
2088
}
2089
2089
2090
2090
// Get the timer interval and the number of loops to perform per tick
2091
- hal_timer_t Stepper::calc_timer_interval (uint32_t step_rate, uint8_t &loops) {
2092
- uint8_t multistep = 1 ;
2091
+ hal_timer_t Stepper::calc_multistep_timer_interval (uint32_t step_rate) {
2093
2092
#if ENABLED(DISABLE_MULTI_STEPPING)
2094
2093
2095
2094
// Just make sure the step rate is doable
@@ -2109,16 +2108,15 @@ hal_timer_t Stepper::calc_timer_interval(uint32_t step_rate, uint8_t &loops) {
2109
2108
(MAX_STEP_ISR_FREQUENCY_128X >> 7 )
2110
2109
};
2111
2110
2112
- // Select the proper multistepping
2113
- uint8_t idx = 0 ;
2114
- while (idx < 7 && step_rate > ( uint32_t ) pgm_read_dword (&limit[idx]) ) {
2111
+ // Find a doable step rate using multistepping
2112
+ uint8_t multistep = 1 ;
2113
+ for ( uint8_t i = 0 ; i < 7 && step_rate > uint32_t ( pgm_read_dword (&limit[i])); ++i ) {
2115
2114
step_rate >>= 1 ;
2116
2115
multistep <<= 1 ;
2117
- ++idx;
2118
- } ;
2116
+ }
2117
+ steps_per_isr = multistep ;
2119
2118
2120
2119
#endif
2121
- loops = multistep;
2122
2120
2123
2121
return calc_timer_interval (step_rate);
2124
2122
}
@@ -2176,7 +2174,7 @@ hal_timer_t Stepper::block_phase_isr() {
2176
2174
// acc_step_rate is in steps/second
2177
2175
2178
2176
// step_rate to timer interval and steps per stepper isr
2179
- interval = calc_timer_interval (acc_step_rate << oversampling_factor, steps_per_isr );
2177
+ interval = calc_multistep_timer_interval (acc_step_rate << oversampling_factor);
2180
2178
acceleration_time += interval;
2181
2179
2182
2180
#if ENABLED(LIN_ADVANCE)
@@ -2246,7 +2244,7 @@ hal_timer_t Stepper::block_phase_isr() {
2246
2244
#endif
2247
2245
2248
2246
// step_rate to timer interval and steps per stepper isr
2249
- interval = calc_timer_interval (step_rate << oversampling_factor, steps_per_isr );
2247
+ interval = calc_multistep_timer_interval (step_rate << oversampling_factor);
2250
2248
deceleration_time += interval;
2251
2249
2252
2250
#if ENABLED(LIN_ADVANCE)
@@ -2308,7 +2306,7 @@ hal_timer_t Stepper::block_phase_isr() {
2308
2306
// Calculate the ticks_nominal for this nominal speed, if not done yet
2309
2307
if (ticks_nominal == 0 ) {
2310
2308
// step_rate to timer interval and loops for the nominal speed
2311
- ticks_nominal = calc_timer_interval (current_block->nominal_rate << oversampling_factor, steps_per_isr );
2309
+ ticks_nominal = calc_multistep_timer_interval (current_block->nominal_rate << oversampling_factor);
2312
2310
2313
2311
#if ENABLED(LIN_ADVANCE)
2314
2312
if (la_active)
@@ -2628,7 +2626,7 @@ hal_timer_t Stepper::block_phase_isr() {
2628
2626
#endif
2629
2627
2630
2628
// Calculate the initial timer interval
2631
- interval = calc_timer_interval (current_block->initial_rate << oversampling_factor, steps_per_isr );
2629
+ interval = calc_multistep_timer_interval (current_block->initial_rate << oversampling_factor);
2632
2630
acceleration_time += interval;
2633
2631
2634
2632
#if ENABLED(LIN_ADVANCE)
0 commit comments