@ -95,7 +95,7 @@ volatile uint32_t Stepper::step_events_completed = 0; // The number of step even
volatile unsigned char Stepper : : eISR_Rate = 200 ; // Keep the ISR at a low rate until needed
volatile unsigned char Stepper : : eISR_Rate = 200 ; // Keep the ISR at a low rate until needed
# if ENABLED(LIN_ADVANCE)
# if ENABLED(LIN_ADVANCE)
volatile long Stepper : : e_steps [ E_STEPPERS ] ;
volatile int Stepper : : e_steps [ E_STEPPERS ] ;
int Stepper : : extruder_advance_k = LIN_ADVANCE_K ,
int Stepper : : extruder_advance_k = LIN_ADVANCE_K ,
Stepper : : final_estep_rate ,
Stepper : : final_estep_rate ,
Stepper : : current_estep_rate [ E_STEPPERS ] ,
Stepper : : current_estep_rate [ E_STEPPERS ] ,
@ -391,7 +391,7 @@ void Stepper::isr() {
# if ENABLED(MIXING_EXTRUDER)
# if ENABLED(MIXING_EXTRUDER)
// Step mixing steppers proportionally
// Step mixing steppers proportionally
bool dir = motor_direction ( E_AXIS ) ;
const bool dir = motor_direction ( E_AXIS ) ;
MIXING_STEPPERS_LOOP ( j ) {
MIXING_STEPPERS_LOOP ( j ) {
counter_m [ j ] + = current_block - > steps [ E_AXIS ] ;
counter_m [ j ] + = current_block - > steps [ E_AXIS ] ;
if ( counter_m [ j ] > 0 ) {
if ( counter_m [ j ] > 0 ) {
@ -401,22 +401,6 @@ void Stepper::isr() {
}
}
# endif
# endif
if ( current_block - > use_advance_lead ) {
int delta_adv_steps = ( ( ( long ) extruder_advance_k * current_estep_rate [ TOOL_E_INDEX ] ) > > 9 ) - current_adv_steps [ TOOL_E_INDEX ] ;
# if ENABLED(MIXING_EXTRUDER)
// Mixing extruders apply advance lead proportionally
MIXING_STEPPERS_LOOP ( j ) {
int steps = delta_adv_steps * current_block - > step_event_count / current_block - > mix_event_count [ j ] ;
e_steps [ j ] + = steps ;
current_adv_steps [ j ] + = steps ;
}
# else
// For most extruders, advance the single E stepper
e_steps [ TOOL_E_INDEX ] + = delta_adv_steps ;
current_adv_steps [ TOOL_E_INDEX ] + = delta_adv_steps ;
# endif
}
# elif ENABLED(ADVANCE)
# elif ENABLED(ADVANCE)
// Always count the unified E axis
// Always count the unified E axis
@ -432,7 +416,7 @@ void Stepper::isr() {
# if ENABLED(MIXING_EXTRUDER)
# if ENABLED(MIXING_EXTRUDER)
// Step mixing steppers proportionally
// Step mixing steppers proportionally
bool dir = motor_direction ( E_AXIS ) ;
const bool dir = motor_direction ( E_AXIS ) ;
MIXING_STEPPERS_LOOP ( j ) {
MIXING_STEPPERS_LOOP ( j ) {
counter_m [ j ] + = current_block - > steps [ E_AXIS ] ;
counter_m [ j ] + = current_block - > steps [ E_AXIS ] ;
if ( counter_m [ j ] > 0 ) {
if ( counter_m [ j ] > 0 ) {
@ -536,6 +520,21 @@ void Stepper::isr() {
}
}
}
}
# if ENABLED(LIN_ADVANCE)
if ( current_block - > use_advance_lead ) {
int delta_adv_steps = ( ( ( long ) extruder_advance_k * current_estep_rate [ TOOL_E_INDEX ] ) > > 9 ) - current_adv_steps [ TOOL_E_INDEX ] ;
current_adv_steps [ TOOL_E_INDEX ] + = delta_adv_steps ;
# if ENABLED(MIXING_EXTRUDER)
// Mixing extruders apply advance lead proportionally
MIXING_STEPPERS_LOOP ( j )
e_steps [ j ] + = delta_adv_steps * current_block - > step_event_count / current_block - > mix_event_count [ j ] ;
# else
// For most extruders, advance the single E stepper
e_steps [ TOOL_E_INDEX ] + = delta_adv_steps ;
# endif
}
# endif
# if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE)
# if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE)
// If we have esteps to execute, fire the next advance_isr "now"
// If we have esteps to execute, fire the next advance_isr "now"
if ( e_steps [ TOOL_E_INDEX ] ) OCR0A = TCNT0 + 2 ;
if ( e_steps [ TOOL_E_INDEX ] ) OCR0A = TCNT0 + 2 ;
@ -593,7 +592,7 @@ void Stepper::isr() {
# endif // ADVANCE or LIN_ADVANCE
# endif // ADVANCE or LIN_ADVANCE
# if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE)
# if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE)
eISR_Rate = ( timer > > 2 ) * step_loops / abs ( e_steps [ TOOL_E_INDEX ] ) ;
eISR_Rate = ( timer > > 3 ) * step_loops / abs ( e_steps [ TOOL_E_INDEX ] ) ; //>> 3 is divide by 8. Reason: Timer 0 runs at 16/8=2MHz, Timer 1 at 16/64=0.25MHz. ==> 2/0.25=8.
# endif
# endif
}
}
else if ( step_events_completed > ( uint32_t ) current_block - > decelerate_after ) {
else if ( step_events_completed > ( uint32_t ) current_block - > decelerate_after ) {
@ -643,7 +642,7 @@ void Stepper::isr() {
# endif // ADVANCE or LIN_ADVANCE
# endif // ADVANCE or LIN_ADVANCE
# if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE)
# if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE)
eISR_Rate = ( timer > > 2 ) * step_loops / abs ( e_steps [ TOOL_E_INDEX ] ) ;
eISR_Rate = ( timer > > 3 ) * step_loops / abs ( e_steps [ TOOL_E_INDEX ] ) ;
# endif
# endif
}
}
else {
else {
@ -653,7 +652,7 @@ void Stepper::isr() {
if ( current_block - > use_advance_lead )
if ( current_block - > use_advance_lead )
current_estep_rate [ TOOL_E_INDEX ] = final_estep_rate ;
current_estep_rate [ TOOL_E_INDEX ] = final_estep_rate ;
eISR_Rate = ( OCR1A_nominal > > 2 ) * step_loops_nominal / abs ( e_steps [ TOOL_E_INDEX ] ) ;
eISR_Rate = ( OCR1A_nominal > > 3 ) * step_loops_nominal / abs ( e_steps [ TOOL_E_INDEX ] ) ;
# endif
# endif