@@ -2098,9 +2098,15 @@ hal_timer_t Stepper::calc_timer_interval(uint32_t step_rate) {
2098
2098
2099
2099
#else
2100
2100
2101
- // AVR is able to keep up at 30khz Stepping ISR rate.
2102
2101
constexpr uint32_t min_step_rate = (F_CPU) / 500000U ; // i.e., 32 or 40
2103
2102
if (step_rate >= 0x0800 ) { // higher step rate
2103
+ // AVR is able to keep up at around 65kHz Stepping ISR rate at most.
2104
+ // So values for step_rate > 65535 might as well be truncated.
2105
+ // Handle it as quickly as possible. i.e., assume highest byte is zero
2106
+ // because non-zero would represent a step rate far beyond AVR capabilities.
2107
+ if (uint8_t (step_rate >> 16 ))
2108
+ return uint32_t (STEPPER_TIMER_RATE) / 0x10000 ;
2109
+
2104
2110
const uintptr_t table_address = uintptr_t (&speed_lookuptable_fast[uint8_t (step_rate >> 8 )]);
2105
2111
const uint16_t base = uint16_t (pgm_read_word (table_address));
2106
2112
const uint8_t gain = uint8_t (pgm_read_byte (table_address + 2 ));
@@ -2112,10 +2118,8 @@ hal_timer_t Stepper::calc_timer_interval(uint32_t step_rate) {
2112
2118
return uint16_t (pgm_read_word (table_address))
2113
2119
- ((uint16_t (pgm_read_word (table_address + 2 )) * uint8_t (step_rate & 0x0007 )) >> 3 );
2114
2120
}
2115
- else {
2116
- step_rate = 0 ;
2117
- return uint16_t (pgm_read_word (uintptr_t (speed_lookuptable_slow)));
2118
- }
2121
+
2122
+ return uint16_t (pgm_read_word (uintptr_t (speed_lookuptable_slow)));
2119
2123
2120
2124
#endif // !CPU_32_BIT
2121
2125
}
@@ -2250,7 +2254,7 @@ hal_timer_t Stepper::block_phase_isr() {
2250
2254
#if ENABLED(LIN_ADVANCE)
2251
2255
if (la_active) {
2252
2256
const uint32_t la_step_rate = la_advance_steps < current_block->max_adv_steps ? current_block->la_advance_rate : 0 ;
2253
- la_interval = calc_timer_interval (acc_step_rate + la_step_rate) << current_block->la_scaling ;
2257
+ la_interval = calc_timer_interval (( acc_step_rate + la_step_rate) >> current_block->la_scaling ) ;
2254
2258
}
2255
2259
#endif
2256
2260
@@ -2322,7 +2326,7 @@ hal_timer_t Stepper::block_phase_isr() {
2322
2326
const uint32_t la_step_rate = la_advance_steps > current_block->final_adv_steps ? current_block->la_advance_rate : 0 ;
2323
2327
if (la_step_rate != step_rate) {
2324
2328
bool reverse_e = la_step_rate > step_rate;
2325
- la_interval = calc_timer_interval (reverse_e ? la_step_rate - step_rate : step_rate - la_step_rate) << current_block->la_scaling ;
2329
+ la_interval = calc_timer_interval (( reverse_e ? la_step_rate - step_rate : step_rate - la_step_rate) >> current_block->la_scaling ) ;
2326
2330
2327
2331
if (reverse_e != motor_direction (E_AXIS)) {
2328
2332
TBI (last_direction_bits, E_AXIS);
@@ -2380,7 +2384,7 @@ hal_timer_t Stepper::block_phase_isr() {
2380
2384
2381
2385
#if ENABLED(LIN_ADVANCE)
2382
2386
if (la_active)
2383
- la_interval = calc_timer_interval (current_block->nominal_rate ) << current_block->la_scaling ;
2387
+ la_interval = calc_timer_interval (current_block->nominal_rate >> current_block->la_scaling ) ;
2384
2388
#endif
2385
2389
}
2386
2390
@@ -2702,7 +2706,7 @@ hal_timer_t Stepper::block_phase_isr() {
2702
2706
#if ENABLED(LIN_ADVANCE)
2703
2707
if (la_active) {
2704
2708
const uint32_t la_step_rate = la_advance_steps < current_block->max_adv_steps ? current_block->la_advance_rate : 0 ;
2705
- la_interval = calc_timer_interval (current_block->initial_rate + la_step_rate) << current_block->la_scaling ;
2709
+ la_interval = calc_timer_interval (( current_block->initial_rate + la_step_rate) >> current_block->la_scaling ) ;
2706
2710
}
2707
2711
#endif
2708
2712
}
0 commit comments