|
|
@ -48,8 +48,8 @@ block_t *current_block; // A pointer to the block currently being traced |
|
|
|
// Variables used by The Stepper Driver Interrupt
|
|
|
|
static unsigned char out_bits; // The next stepping-bits to be output
|
|
|
|
static long counter_x, // Counter variables for the bresenham line tracer
|
|
|
|
counter_y, |
|
|
|
counter_z, |
|
|
|
counter_y, |
|
|
|
counter_z, |
|
|
|
counter_e; |
|
|
|
volatile static unsigned long step_events_completed; // The number of step events executed in the current block
|
|
|
|
#ifdef ADVANCE |
|
|
@ -224,27 +224,27 @@ void enable_endstops(bool check) |
|
|
|
// | BLOCK 1 | BLOCK 2 | d
|
|
|
|
//
|
|
|
|
// time ----->
|
|
|
|
//
|
|
|
|
// The trapezoid is the shape the speed curve over time. It starts at block->initial_rate, accelerates
|
|
|
|
// first block->accelerate_until step_events_completed, then keeps going at constant speed until
|
|
|
|
//
|
|
|
|
// The trapezoid is the shape the speed curve over time. It starts at block->initial_rate, accelerates
|
|
|
|
// first block->accelerate_until step_events_completed, then keeps going at constant speed until
|
|
|
|
// step_events_completed reaches block->decelerate_after after which it decelerates until the trapezoid generator is reset.
|
|
|
|
// The slope of acceleration is calculated with the leib ramp alghorithm.
|
|
|
|
|
|
|
|
void st_wake_up() { |
|
|
|
// TCNT1 = 0;
|
|
|
|
ENABLE_STEPPER_DRIVER_INTERRUPT(); |
|
|
|
ENABLE_STEPPER_DRIVER_INTERRUPT(); |
|
|
|
} |
|
|
|
|
|
|
|
void step_wait(){ |
|
|
|
for(int8_t i=0; i < 6; i++){ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FORCE_INLINE unsigned short calc_timer(unsigned short step_rate) { |
|
|
|
unsigned short timer; |
|
|
|
if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY; |
|
|
|
|
|
|
|
|
|
|
|
if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times
|
|
|
|
step_rate = (step_rate >> 2)&0x3fff; |
|
|
|
step_loops = 4; |
|
|
@ -255,11 +255,11 @@ FORCE_INLINE unsigned short calc_timer(unsigned short step_rate) { |
|
|
|
} |
|
|
|
else { |
|
|
|
step_loops = 1; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if(step_rate < (F_CPU/500000)) step_rate = (F_CPU/500000); |
|
|
|
step_rate -= (F_CPU/500000); // Correct for minimal speed
|
|
|
|
if(step_rate >= (8*256)){ // higher step rate
|
|
|
|
if(step_rate >= (8*256)){ // higher step rate
|
|
|
|
unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0]; |
|
|
|
unsigned char tmp_step_rate = (step_rate & 0x00ff); |
|
|
|
unsigned short gain = (unsigned short)pgm_read_word_near(table_address+2); |
|
|
@ -276,7 +276,7 @@ FORCE_INLINE unsigned short calc_timer(unsigned short step_rate) { |
|
|
|
return timer; |
|
|
|
} |
|
|
|
|
|
|
|
// Initializes the trapezoid generator from the current block. Called whenever a new
|
|
|
|
// Initializes the trapezoid generator from the current block. Called whenever a new
|
|
|
|
// block begins.
|
|
|
|
FORCE_INLINE void trapezoid_generator_reset() { |
|
|
|
#ifdef ADVANCE |
|
|
@ -284,7 +284,7 @@ FORCE_INLINE void trapezoid_generator_reset() { |
|
|
|
final_advance = current_block->final_advance; |
|
|
|
// Do E steps + advance steps
|
|
|
|
e_steps[current_block->active_extruder] += ((advance >>8) - old_advance); |
|
|
|
old_advance = advance >>8; |
|
|
|
old_advance = advance >>8; |
|
|
|
#endif |
|
|
|
deceleration_time = 0; |
|
|
|
// step_rate to timer interval
|
|
|
@ -294,7 +294,7 @@ FORCE_INLINE void trapezoid_generator_reset() { |
|
|
|
acc_step_rate = current_block->initial_rate; |
|
|
|
acceleration_time = calc_timer(acc_step_rate); |
|
|
|
OCR1A = acceleration_time; |
|
|
|
|
|
|
|
|
|
|
|
// SERIAL_ECHO_START;
|
|
|
|
// SERIAL_ECHOPGM("advance :");
|
|
|
|
// SERIAL_ECHO(current_block->advance/256.0);
|
|
|
@ -304,13 +304,13 @@ FORCE_INLINE void trapezoid_generator_reset() { |
|
|
|
// SERIAL_ECHO(current_block->initial_advance/256.0);
|
|
|
|
// SERIAL_ECHOPGM("final advance :");
|
|
|
|
// SERIAL_ECHOLN(current_block->final_advance/256.0);
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// "The Stepper Driver Interrupt" - This timer interrupt is the workhorse.
|
|
|
|
// It pops blocks from the block_buffer and executes them by pulsing the stepper pins appropriately.
|
|
|
|
// "The Stepper Driver Interrupt" - This timer interrupt is the workhorse.
|
|
|
|
// It pops blocks from the block_buffer and executes them by pulsing the stepper pins appropriately.
|
|
|
|
ISR(TIMER1_COMPA_vect) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// If there is no current block, attempt to pop one from the buffer
|
|
|
|
if (current_block == NULL) { |
|
|
|
// Anything in the buffer?
|
|
|
@ -322,24 +322,24 @@ ISR(TIMER1_COMPA_vect) |
|
|
|
counter_y = counter_x; |
|
|
|
counter_z = counter_x; |
|
|
|
counter_e = counter_x; |
|
|
|
step_events_completed = 0; |
|
|
|
|
|
|
|
#ifdef Z_LATE_ENABLE |
|
|
|
step_events_completed = 0; |
|
|
|
|
|
|
|
#ifdef Z_LATE_ENABLE |
|
|
|
if(current_block->steps_z > 0) { |
|
|
|
enable_z(); |
|
|
|
OCR1A = 2000; //1ms wait
|
|
|
|
return; |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
// #ifdef ADVANCE
|
|
|
|
// e_steps[current_block->active_extruder] = 0;
|
|
|
|
// #endif
|
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
OCR1A=2000; // 1kHz.
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (current_block != NULL) { |
|
|
|
// Set directions TO DO This should be done once during init of trapezoid. Endstops -> interrupt
|
|
|
@ -348,58 +348,22 @@ ISR(TIMER1_COMPA_vect) |
|
|
|
|
|
|
|
// Set the direction bits (X_AXIS=A_AXIS and Y_AXIS=B_AXIS for COREXY)
|
|
|
|
if((out_bits & (1<<X_AXIS))!=0){ |
|
|
|
#ifdef DUAL_X_CARRIAGE |
|
|
|
if (extruder_duplication_enabled){ |
|
|
|
WRITE(X_DIR_PIN, INVERT_X_DIR); |
|
|
|
WRITE(X2_DIR_PIN, INVERT_X_DIR); |
|
|
|
} |
|
|
|
else{ |
|
|
|
if (current_block->active_extruder != 0) |
|
|
|
WRITE(X2_DIR_PIN, INVERT_X_DIR); |
|
|
|
else |
|
|
|
WRITE(X_DIR_PIN, INVERT_X_DIR); |
|
|
|
} |
|
|
|
#else |
|
|
|
WRITE(X_DIR_PIN, INVERT_X_DIR); |
|
|
|
#endif |
|
|
|
WRITE(X_DIR_PIN, INVERT_X_DIR); |
|
|
|
count_direction[X_AXIS]=-1; |
|
|
|
} |
|
|
|
else{ |
|
|
|
#ifdef DUAL_X_CARRIAGE |
|
|
|
if (extruder_duplication_enabled){ |
|
|
|
WRITE(X_DIR_PIN, !INVERT_X_DIR); |
|
|
|
WRITE(X2_DIR_PIN, !INVERT_X_DIR); |
|
|
|
} |
|
|
|
else{ |
|
|
|
if (current_block->active_extruder != 0) |
|
|
|
WRITE(X2_DIR_PIN, !INVERT_X_DIR); |
|
|
|
else |
|
|
|
WRITE(X_DIR_PIN, !INVERT_X_DIR); |
|
|
|
} |
|
|
|
#else |
|
|
|
WRITE(X_DIR_PIN, !INVERT_X_DIR); |
|
|
|
#endif |
|
|
|
WRITE(X_DIR_PIN, !INVERT_X_DIR); |
|
|
|
count_direction[X_AXIS]=1; |
|
|
|
} |
|
|
|
if((out_bits & (1<<Y_AXIS))!=0){ |
|
|
|
WRITE(Y_DIR_PIN, INVERT_Y_DIR); |
|
|
|
|
|
|
|
#ifdef Y_DUAL_STEPPER_DRIVERS |
|
|
|
WRITE(Y2_DIR_PIN, !(INVERT_Y_DIR == INVERT_Y2_VS_Y_DIR)); |
|
|
|
#endif |
|
|
|
|
|
|
|
count_direction[Y_AXIS]=-1; |
|
|
|
} |
|
|
|
else{ |
|
|
|
WRITE(Y_DIR_PIN, !INVERT_Y_DIR); |
|
|
|
|
|
|
|
#ifdef Y_DUAL_STEPPER_DRIVERS |
|
|
|
WRITE(Y2_DIR_PIN, (INVERT_Y_DIR == INVERT_Y2_VS_Y_DIR)); |
|
|
|
#endif |
|
|
|
|
|
|
|
count_direction[Y_AXIS]=1; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Set direction en check limit switches
|
|
|
|
#ifndef COREXY |
|
|
|
if ((out_bits & (1<<X_AXIS)) != 0) { // stepping along -X axis
|
|
|
@ -408,43 +372,29 @@ ISR(TIMER1_COMPA_vect) |
|
|
|
#endif |
|
|
|
CHECK_ENDSTOPS |
|
|
|
{ |
|
|
|
#ifdef DUAL_X_CARRIAGE |
|
|
|
// with 2 x-carriages, endstops are only checked in the homing direction for the active extruder
|
|
|
|
if ((current_block->active_extruder == 0 && X_HOME_DIR == -1) |
|
|
|
|| (current_block->active_extruder != 0 && X2_HOME_DIR == -1)) |
|
|
|
#endif |
|
|
|
{ |
|
|
|
#if defined(X_MIN_PIN) && X_MIN_PIN > -1 |
|
|
|
bool x_min_endstop=(READ(X_MIN_PIN) != X_MIN_ENDSTOP_INVERTING); |
|
|
|
if(x_min_endstop && old_x_min_endstop && (current_block->steps_x > 0)) { |
|
|
|
endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; |
|
|
|
endstop_x_hit=true; |
|
|
|
step_events_completed = current_block->step_event_count; |
|
|
|
} |
|
|
|
old_x_min_endstop = x_min_endstop; |
|
|
|
#endif |
|
|
|
} |
|
|
|
#if defined(X_MIN_PIN) && X_MIN_PIN > -1 |
|
|
|
bool x_min_endstop=(READ(X_MIN_PIN) != X_ENDSTOPS_INVERTING); |
|
|
|
if(x_min_endstop && old_x_min_endstop && (current_block->steps_x > 0)) { |
|
|
|
endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; |
|
|
|
endstop_x_hit=true; |
|
|
|
step_events_completed = current_block->step_event_count; |
|
|
|
} |
|
|
|
old_x_min_endstop = x_min_endstop; |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
else { // +direction
|
|
|
|
CHECK_ENDSTOPS |
|
|
|
CHECK_ENDSTOPS |
|
|
|
{ |
|
|
|
#ifdef DUAL_X_CARRIAGE |
|
|
|
// with 2 x-carriages, endstops are only checked in the homing direction for the active extruder
|
|
|
|
if ((current_block->active_extruder == 0 && X_HOME_DIR == 1) |
|
|
|
|| (current_block->active_extruder != 0 && X2_HOME_DIR == 1)) |
|
|
|
#endif |
|
|
|
{ |
|
|
|
#if defined(X_MAX_PIN) && X_MAX_PIN > -1 |
|
|
|
bool x_max_endstop=(READ(X_MAX_PIN) != X_MAX_ENDSTOP_INVERTING); |
|
|
|
if(x_max_endstop && old_x_max_endstop && (current_block->steps_x > 0)){ |
|
|
|
endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; |
|
|
|
endstop_x_hit=true; |
|
|
|
step_events_completed = current_block->step_event_count; |
|
|
|
} |
|
|
|
old_x_max_endstop = x_max_endstop; |
|
|
|
#endif |
|
|
|
} |
|
|
|
#if defined(X_MAX_PIN) && X_MAX_PIN > -1 |
|
|
|
bool x_max_endstop=(READ(X_MAX_PIN) != X_ENDSTOPS_INVERTING); |
|
|
|
if(x_max_endstop && old_x_max_endstop && (current_block->steps_x > 0)){ |
|
|
|
endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; |
|
|
|
endstop_x_hit=true; |
|
|
|
step_events_completed = current_block->step_event_count; |
|
|
|
} |
|
|
|
old_x_max_endstop = x_max_endstop; |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -456,7 +406,7 @@ ISR(TIMER1_COMPA_vect) |
|
|
|
CHECK_ENDSTOPS |
|
|
|
{ |
|
|
|
#if defined(Y_MIN_PIN) && Y_MIN_PIN > -1 |
|
|
|
bool y_min_endstop=(READ(Y_MIN_PIN) != Y_MIN_ENDSTOP_INVERTING); |
|
|
|
bool y_min_endstop=(READ(Y_MIN_PIN) != Y_ENDSTOPS_INVERTING); |
|
|
|
if(y_min_endstop && old_y_min_endstop && (current_block->steps_y > 0)) { |
|
|
|
endstops_trigsteps[Y_AXIS] = count_position[Y_AXIS]; |
|
|
|
endstop_y_hit=true; |
|
|
@ -470,7 +420,7 @@ ISR(TIMER1_COMPA_vect) |
|
|
|
CHECK_ENDSTOPS |
|
|
|
{ |
|
|
|
#if defined(Y_MAX_PIN) && Y_MAX_PIN > -1 |
|
|
|
bool y_max_endstop=(READ(Y_MAX_PIN) != Y_MAX_ENDSTOP_INVERTING); |
|
|
|
bool y_max_endstop=(READ(Y_MAX_PIN) != Y_ENDSTOPS_INVERTING); |
|
|
|
if(y_max_endstop && old_y_max_endstop && (current_block->steps_y > 0)){ |
|
|
|
endstops_trigsteps[Y_AXIS] = count_position[Y_AXIS]; |
|
|
|
endstop_y_hit=true; |
|
|
@ -484,15 +434,15 @@ ISR(TIMER1_COMPA_vect) |
|
|
|
if ((out_bits & (1<<Z_AXIS)) != 0) { // -direction
|
|
|
|
WRITE(Z_DIR_PIN,INVERT_Z_DIR); |
|
|
|
|
|
|
|
#ifdef Z_DUAL_STEPPER_DRIVERS |
|
|
|
#ifdef Z_DUAL_STEPPER_DRIVERS |
|
|
|
WRITE(Z2_DIR_PIN,INVERT_Z_DIR); |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
count_direction[Z_AXIS]=-1; |
|
|
|
CHECK_ENDSTOPS |
|
|
|
{ |
|
|
|
#if defined(Z_MIN_PIN) && Z_MIN_PIN > -1 |
|
|
|
bool z_min_endstop=(READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING); |
|
|
|
bool z_min_endstop=(READ(Z_MIN_PIN) != Z_ENDSTOPS_INVERTING); |
|
|
|
if(z_min_endstop && old_z_min_endstop && (current_block->steps_z > 0)) { |
|
|
|
endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; |
|
|
|
endstop_z_hit=true; |
|
|
@ -505,7 +455,7 @@ ISR(TIMER1_COMPA_vect) |
|
|
|
else { // +direction
|
|
|
|
WRITE(Z_DIR_PIN,!INVERT_Z_DIR); |
|
|
|
|
|
|
|
#ifdef Z_DUAL_STEPPER_DRIVERS |
|
|
|
#ifdef Z_DUAL_STEPPER_DRIVERS |
|
|
|
WRITE(Z2_DIR_PIN,!INVERT_Z_DIR); |
|
|
|
#endif |
|
|
|
|
|
|
@ -513,7 +463,7 @@ ISR(TIMER1_COMPA_vect) |
|
|
|
CHECK_ENDSTOPS |
|
|
|
{ |
|
|
|
#if defined(Z_MAX_PIN) && Z_MAX_PIN > -1 |
|
|
|
bool z_max_endstop=(READ(Z_MAX_PIN) != Z_MAX_ENDSTOP_INVERTING); |
|
|
|
bool z_max_endstop=(READ(Z_MAX_PIN) != Z_ENDSTOPS_INVERTING); |
|
|
|
if(z_max_endstop && old_z_max_endstop && (current_block->steps_z > 0)) { |
|
|
|
endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; |
|
|
|
endstop_z_hit=true; |
|
|
@ -534,10 +484,10 @@ ISR(TIMER1_COMPA_vect) |
|
|
|
count_direction[E_AXIS]=1; |
|
|
|
} |
|
|
|
#endif //!ADVANCE
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for(int8_t i=0; i < step_loops; i++) { // Take multiple steps per interrupt (For high speed moves)
|
|
|
|
|
|
|
|
for(int8_t i=0; i < step_loops; i++) { // Take multiple steps per interrupt (For high speed moves)
|
|
|
|
#ifndef AT90USB |
|
|
|
MSerial.checkRx(); // Check for serial chars.
|
|
|
|
#endif |
|
|
@ -552,73 +502,38 @@ ISR(TIMER1_COMPA_vect) |
|
|
|
else { |
|
|
|
e_steps[current_block->active_extruder]++; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
#endif //ADVANCE
|
|
|
|
|
|
|
|
counter_x += current_block->steps_x; |
|
|
|
if (counter_x > 0) { |
|
|
|
#ifdef DUAL_X_CARRIAGE |
|
|
|
if (extruder_duplication_enabled){ |
|
|
|
WRITE(X_STEP_PIN, !INVERT_X_STEP_PIN); |
|
|
|
WRITE(X2_STEP_PIN, !INVERT_X_STEP_PIN); |
|
|
|
} |
|
|
|
else { |
|
|
|
if (current_block->active_extruder != 0) |
|
|
|
WRITE(X2_STEP_PIN, !INVERT_X_STEP_PIN); |
|
|
|
else |
|
|
|
WRITE(X_STEP_PIN, !INVERT_X_STEP_PIN); |
|
|
|
} |
|
|
|
#else |
|
|
|
WRITE(X_STEP_PIN, !INVERT_X_STEP_PIN); |
|
|
|
#endif |
|
|
|
counter_x -= current_block->step_event_count; |
|
|
|
count_position[X_AXIS]+=count_direction[X_AXIS]; |
|
|
|
#ifdef DUAL_X_CARRIAGE |
|
|
|
if (extruder_duplication_enabled){ |
|
|
|
WRITE(X_STEP_PIN, INVERT_X_STEP_PIN); |
|
|
|
WRITE(X2_STEP_PIN, INVERT_X_STEP_PIN); |
|
|
|
} |
|
|
|
else { |
|
|
|
if (current_block->active_extruder != 0) |
|
|
|
WRITE(X2_STEP_PIN, INVERT_X_STEP_PIN); |
|
|
|
else |
|
|
|
WRITE(X_STEP_PIN, INVERT_X_STEP_PIN); |
|
|
|
} |
|
|
|
#else |
|
|
|
WRITE(X_STEP_PIN, INVERT_X_STEP_PIN); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
counter_y += current_block->steps_y; |
|
|
|
if (counter_y > 0) { |
|
|
|
WRITE(Y_STEP_PIN, !INVERT_Y_STEP_PIN); |
|
|
|
|
|
|
|
#ifdef Y_DUAL_STEPPER_DRIVERS |
|
|
|
WRITE(Y2_STEP_PIN, !INVERT_Y_STEP_PIN); |
|
|
|
#endif |
|
|
|
|
|
|
|
counter_y -= current_block->step_event_count; |
|
|
|
count_position[Y_AXIS]+=count_direction[Y_AXIS]; |
|
|
|
counter_y -= current_block->step_event_count; |
|
|
|
count_position[Y_AXIS]+=count_direction[Y_AXIS]; |
|
|
|
WRITE(Y_STEP_PIN, INVERT_Y_STEP_PIN); |
|
|
|
|
|
|
|
#ifdef Y_DUAL_STEPPER_DRIVERS |
|
|
|
WRITE(Y2_STEP_PIN, INVERT_Y_STEP_PIN); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
counter_z += current_block->steps_z; |
|
|
|
if (counter_z > 0) { |
|
|
|
WRITE(Z_STEP_PIN, !INVERT_Z_STEP_PIN); |
|
|
|
|
|
|
|
#ifdef Z_DUAL_STEPPER_DRIVERS |
|
|
|
#ifdef Z_DUAL_STEPPER_DRIVERS |
|
|
|
WRITE(Z2_STEP_PIN, !INVERT_Z_STEP_PIN); |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
counter_z -= current_block->step_event_count; |
|
|
|
count_position[Z_AXIS]+=count_direction[Z_AXIS]; |
|
|
|
WRITE(Z_STEP_PIN, INVERT_Z_STEP_PIN); |
|
|
|
|
|
|
|
#ifdef Z_DUAL_STEPPER_DRIVERS |
|
|
|
#ifdef Z_DUAL_STEPPER_DRIVERS |
|
|
|
WRITE(Z2_STEP_PIN, INVERT_Z_STEP_PIN); |
|
|
|
#endif |
|
|
|
} |
|
|
@ -632,17 +547,17 @@ ISR(TIMER1_COMPA_vect) |
|
|
|
WRITE_E_STEP(INVERT_E_STEP_PIN); |
|
|
|
} |
|
|
|
#endif //!ADVANCE
|
|
|
|
step_events_completed += 1; |
|
|
|
step_events_completed += 1; |
|
|
|
if(step_events_completed >= current_block->step_event_count) break; |
|
|
|
} |
|
|
|
// Calculare new timer value
|
|
|
|
unsigned short timer; |
|
|
|
unsigned short step_rate; |
|
|
|
if (step_events_completed <= (unsigned long int)current_block->accelerate_until) { |
|
|
|
|
|
|
|
|
|
|
|
MultiU24X24toH16(acc_step_rate, acceleration_time, current_block->acceleration_rate); |
|
|
|
acc_step_rate += current_block->initial_rate; |
|
|
|
|
|
|
|
|
|
|
|
// upper limit
|
|
|
|
if(acc_step_rate > current_block->nominal_rate) |
|
|
|
acc_step_rate = current_block->nominal_rate; |
|
|
@ -658,13 +573,13 @@ ISR(TIMER1_COMPA_vect) |
|
|
|
//if(advance > current_block->advance) advance = current_block->advance;
|
|
|
|
// Do E steps + advance steps
|
|
|
|
e_steps[current_block->active_extruder] += ((advance >>8) - old_advance); |
|
|
|
old_advance = advance >>8; |
|
|
|
|
|
|
|
old_advance = advance >>8; |
|
|
|
|
|
|
|
#endif |
|
|
|
} |
|
|
|
else if (step_events_completed > (unsigned long int)current_block->decelerate_after) { |
|
|
|
} |
|
|
|
else if (step_events_completed > (unsigned long int)current_block->decelerate_after) { |
|
|
|
MultiU24X24toH16(step_rate, deceleration_time, current_block->acceleration_rate); |
|
|
|
|
|
|
|
|
|
|
|
if(step_rate > acc_step_rate) { // Check step_rate stays positive
|
|
|
|
step_rate = current_block->final_rate; |
|
|
|
} |
|
|
@ -687,7 +602,7 @@ ISR(TIMER1_COMPA_vect) |
|
|
|
if(advance < final_advance) advance = final_advance; |
|
|
|
// Do E steps + advance steps
|
|
|
|
e_steps[current_block->active_extruder] += ((advance >>8) - old_advance); |
|
|
|
old_advance = advance >>8; |
|
|
|
old_advance = advance >>8; |
|
|
|
#endif //ADVANCE
|
|
|
|
} |
|
|
|
else { |
|
|
@ -696,12 +611,12 @@ ISR(TIMER1_COMPA_vect) |
|
|
|
step_loops = step_loops_nominal; |
|
|
|
} |
|
|
|
|
|
|
|
// If current block is finished, reset pointer
|
|
|
|
// If current block is finished, reset pointer
|
|
|
|
if (step_events_completed >= current_block->step_event_count) { |
|
|
|
current_block = NULL; |
|
|
|
plan_discard_current_block(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#ifdef ADVANCE |
|
|
@ -720,7 +635,7 @@ ISR(TIMER1_COMPA_vect) |
|
|
|
WRITE(E0_DIR_PIN, INVERT_E0_DIR); |
|
|
|
e_steps[0]++; |
|
|
|
WRITE(E0_STEP_PIN, !INVERT_E_STEP_PIN); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (e_steps[0] > 0) { |
|
|
|
WRITE(E0_DIR_PIN, !INVERT_E0_DIR); |
|
|
|
e_steps[0]--; |
|
|
@ -734,7 +649,7 @@ ISR(TIMER1_COMPA_vect) |
|
|
|
WRITE(E1_DIR_PIN, INVERT_E1_DIR); |
|
|
|
e_steps[1]++; |
|
|
|
WRITE(E1_STEP_PIN, !INVERT_E_STEP_PIN); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (e_steps[1] > 0) { |
|
|
|
WRITE(E1_DIR_PIN, !INVERT_E1_DIR); |
|
|
|
e_steps[1]--; |
|
|
@ -749,7 +664,7 @@ ISR(TIMER1_COMPA_vect) |
|
|
|
WRITE(E2_DIR_PIN, INVERT_E2_DIR); |
|
|
|
e_steps[2]++; |
|
|
|
WRITE(E2_STEP_PIN, !INVERT_E_STEP_PIN); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (e_steps[2] > 0) { |
|
|
|
WRITE(E2_DIR_PIN, !INVERT_E2_DIR); |
|
|
|
e_steps[2]--; |
|
|
@ -765,29 +680,22 @@ void st_init() |
|
|
|
{ |
|
|
|
digipot_init(); //Initialize Digipot Motor Current
|
|
|
|
microstep_init(); //Initialize Microstepping Pins
|
|
|
|
|
|
|
|
|
|
|
|
//Initialize Dir Pins
|
|
|
|
#if defined(X_DIR_PIN) && X_DIR_PIN > -1 |
|
|
|
SET_OUTPUT(X_DIR_PIN); |
|
|
|
#endif |
|
|
|
#if defined(X2_DIR_PIN) && X2_DIR_PIN > -1 |
|
|
|
SET_OUTPUT(X2_DIR_PIN); |
|
|
|
#endif |
|
|
|
#if defined(Y_DIR_PIN) && Y_DIR_PIN > -1 |
|
|
|
#if defined(Y_DIR_PIN) && Y_DIR_PIN > -1 |
|
|
|
SET_OUTPUT(Y_DIR_PIN); |
|
|
|
|
|
|
|
#if defined(Y_DUAL_STEPPER_DRIVERS) && defined(Y2_DIR_PIN) && (Y2_DIR_PIN > -1) |
|
|
|
SET_OUTPUT(Y2_DIR_PIN); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#if defined(Z_DIR_PIN) && Z_DIR_PIN > -1 |
|
|
|
#if defined(Z_DIR_PIN) && Z_DIR_PIN > -1 |
|
|
|
SET_OUTPUT(Z_DIR_PIN); |
|
|
|
|
|
|
|
#if defined(Z_DUAL_STEPPER_DRIVERS) && defined(Z2_DIR_PIN) && (Z2_DIR_PIN > -1) |
|
|
|
SET_OUTPUT(Z2_DIR_PIN); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#if defined(E0_DIR_PIN) && E0_DIR_PIN > -1 |
|
|
|
#if defined(E0_DIR_PIN) && E0_DIR_PIN > -1 |
|
|
|
SET_OUTPUT(E0_DIR_PIN); |
|
|
|
#endif |
|
|
|
#if defined(E1_DIR_PIN) && (E1_DIR_PIN > -1) |
|
|
@ -803,23 +711,14 @@ void st_init() |
|
|
|
SET_OUTPUT(X_ENABLE_PIN); |
|
|
|
if(!X_ENABLE_ON) WRITE(X_ENABLE_PIN,HIGH); |
|
|
|
#endif |
|
|
|
#if defined(X2_ENABLE_PIN) && X2_ENABLE_PIN > -1 |
|
|
|
SET_OUTPUT(X2_ENABLE_PIN); |
|
|
|
if(!X_ENABLE_ON) WRITE(X2_ENABLE_PIN,HIGH); |
|
|
|
#endif |
|
|
|
#if defined(Y_ENABLE_PIN) && Y_ENABLE_PIN > -1 |
|
|
|
SET_OUTPUT(Y_ENABLE_PIN); |
|
|
|
if(!Y_ENABLE_ON) WRITE(Y_ENABLE_PIN,HIGH); |
|
|
|
|
|
|
|
#if defined(Y_DUAL_STEPPER_DRIVERS) && defined(Y2_ENABLE_PIN) && (Y2_ENABLE_PIN > -1) |
|
|
|
SET_OUTPUT(Y2_ENABLE_PIN); |
|
|
|
if(!Y_ENABLE_ON) WRITE(Y2_ENABLE_PIN,HIGH); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#if defined(Z_ENABLE_PIN) && Z_ENABLE_PIN > -1 |
|
|
|
SET_OUTPUT(Z_ENABLE_PIN); |
|
|
|
if(!Z_ENABLE_ON) WRITE(Z_ENABLE_PIN,HIGH); |
|
|
|
|
|
|
|
|
|
|
|
#if defined(Z_DUAL_STEPPER_DRIVERS) && defined(Z2_ENABLE_PIN) && (Z2_ENABLE_PIN > -1) |
|
|
|
SET_OUTPUT(Z2_ENABLE_PIN); |
|
|
|
if(!Z_ENABLE_ON) WRITE(Z2_ENABLE_PIN,HIGH); |
|
|
@ -839,71 +738,62 @@ void st_init() |
|
|
|
#endif |
|
|
|
|
|
|
|
//endstops and pullups
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(X_MIN_PIN) && X_MIN_PIN > -1 |
|
|
|
SET_INPUT(X_MIN_PIN); |
|
|
|
SET_INPUT(X_MIN_PIN); |
|
|
|
#ifdef ENDSTOPPULLUP_XMIN |
|
|
|
WRITE(X_MIN_PIN,HIGH); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if defined(Y_MIN_PIN) && Y_MIN_PIN > -1 |
|
|
|
SET_INPUT(Y_MIN_PIN); |
|
|
|
SET_INPUT(Y_MIN_PIN); |
|
|
|
#ifdef ENDSTOPPULLUP_YMIN |
|
|
|
WRITE(Y_MIN_PIN,HIGH); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if defined(Z_MIN_PIN) && Z_MIN_PIN > -1 |
|
|
|
SET_INPUT(Z_MIN_PIN); |
|
|
|
SET_INPUT(Z_MIN_PIN); |
|
|
|
#ifdef ENDSTOPPULLUP_ZMIN |
|
|
|
WRITE(Z_MIN_PIN,HIGH); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if defined(X_MAX_PIN) && X_MAX_PIN > -1 |
|
|
|
SET_INPUT(X_MAX_PIN); |
|
|
|
SET_INPUT(X_MAX_PIN); |
|
|
|
#ifdef ENDSTOPPULLUP_XMAX |
|
|
|
WRITE(X_MAX_PIN,HIGH); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if defined(Y_MAX_PIN) && Y_MAX_PIN > -1 |
|
|
|
SET_INPUT(Y_MAX_PIN); |
|
|
|
SET_INPUT(Y_MAX_PIN); |
|
|
|
#ifdef ENDSTOPPULLUP_YMAX |
|
|
|
WRITE(Y_MAX_PIN,HIGH); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if defined(Z_MAX_PIN) && Z_MAX_PIN > -1 |
|
|
|
SET_INPUT(Z_MAX_PIN); |
|
|
|
SET_INPUT(Z_MAX_PIN); |
|
|
|
#ifdef ENDSTOPPULLUP_ZMAX |
|
|
|
WRITE(Z_MAX_PIN,HIGH); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Initialize Step Pins
|
|
|
|
#if defined(X_STEP_PIN) && (X_STEP_PIN > -1) |
|
|
|
#if defined(X_STEP_PIN) && (X_STEP_PIN > -1) |
|
|
|
SET_OUTPUT(X_STEP_PIN); |
|
|
|
WRITE(X_STEP_PIN,INVERT_X_STEP_PIN); |
|
|
|
disable_x(); |
|
|
|
#endif |
|
|
|
#if defined(X2_STEP_PIN) && (X2_STEP_PIN > -1) |
|
|
|
SET_OUTPUT(X2_STEP_PIN); |
|
|
|
WRITE(X2_STEP_PIN,INVERT_X_STEP_PIN); |
|
|
|
disable_x(); |
|
|
|
#endif |
|
|
|
#if defined(Y_STEP_PIN) && (Y_STEP_PIN > -1) |
|
|
|
#endif |
|
|
|
#if defined(Y_STEP_PIN) && (Y_STEP_PIN > -1) |
|
|
|
SET_OUTPUT(Y_STEP_PIN); |
|
|
|
WRITE(Y_STEP_PIN,INVERT_Y_STEP_PIN); |
|
|
|
#if defined(Y_DUAL_STEPPER_DRIVERS) && defined(Y2_STEP_PIN) && (Y2_STEP_PIN > -1) |
|
|
|
SET_OUTPUT(Y2_STEP_PIN); |
|
|
|
WRITE(Y2_STEP_PIN,INVERT_Y_STEP_PIN); |
|
|
|
#endif |
|
|
|
disable_y(); |
|
|
|
#endif |
|
|
|
#if defined(Z_STEP_PIN) && (Z_STEP_PIN > -1) |
|
|
|
#endif |
|
|
|
#if defined(Z_STEP_PIN) && (Z_STEP_PIN > -1) |
|
|
|
SET_OUTPUT(Z_STEP_PIN); |
|
|
|
WRITE(Z_STEP_PIN,INVERT_Z_STEP_PIN); |
|
|
|
#if defined(Z_DUAL_STEPPER_DRIVERS) && defined(Z2_STEP_PIN) && (Z2_STEP_PIN > -1) |
|
|
@ -911,33 +801,33 @@ void st_init() |
|
|
|
WRITE(Z2_STEP_PIN,INVERT_Z_STEP_PIN); |
|
|
|
#endif |
|
|
|
disable_z(); |
|
|
|
#endif |
|
|
|
#if defined(E0_STEP_PIN) && (E0_STEP_PIN > -1) |
|
|
|
#endif |
|
|
|
#if defined(E0_STEP_PIN) && (E0_STEP_PIN > -1) |
|
|
|
SET_OUTPUT(E0_STEP_PIN); |
|
|
|
WRITE(E0_STEP_PIN,INVERT_E_STEP_PIN); |
|
|
|
disable_e0(); |
|
|
|
#endif |
|
|
|
#if defined(E1_STEP_PIN) && (E1_STEP_PIN > -1) |
|
|
|
#endif |
|
|
|
#if defined(E1_STEP_PIN) && (E1_STEP_PIN > -1) |
|
|
|
SET_OUTPUT(E1_STEP_PIN); |
|
|
|
WRITE(E1_STEP_PIN,INVERT_E_STEP_PIN); |
|
|
|
disable_e1(); |
|
|
|
#endif |
|
|
|
#if defined(E2_STEP_PIN) && (E2_STEP_PIN > -1) |
|
|
|
#endif |
|
|
|
#if defined(E2_STEP_PIN) && (E2_STEP_PIN > -1) |
|
|
|
SET_OUTPUT(E2_STEP_PIN); |
|
|
|
WRITE(E2_STEP_PIN,INVERT_E_STEP_PIN); |
|
|
|
disable_e2(); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
// waveform generation = 0100 = CTC
|
|
|
|
TCCR1B &= ~(1<<WGM13); |
|
|
|
TCCR1B |= (1<<WGM12); |
|
|
|
TCCR1A &= ~(1<<WGM11); |
|
|
|
TCCR1A &= ~(1<<WGM11); |
|
|
|
TCCR1A &= ~(1<<WGM10); |
|
|
|
|
|
|
|
// output mode = 00 (disconnected)
|
|
|
|
TCCR1A &= ~(3<<COM1A0); |
|
|
|
TCCR1A &= ~(3<<COM1B0); |
|
|
|
|
|
|
|
TCCR1A &= ~(3<<COM1A0); |
|
|
|
TCCR1A &= ~(3<<COM1B0); |
|
|
|
|
|
|
|
// Set the timer pre-scaler
|
|
|
|
// Generally we use a divider of 8, resulting in a 2MHz timer
|
|
|
|
// frequency on a 16MHz MCU. If you are going to change this, be
|
|
|
@ -947,19 +837,19 @@ void st_init() |
|
|
|
|
|
|
|
OCR1A = 0x4000; |
|
|
|
TCNT1 = 0; |
|
|
|
ENABLE_STEPPER_DRIVER_INTERRUPT(); |
|
|
|
ENABLE_STEPPER_DRIVER_INTERRUPT(); |
|
|
|
|
|
|
|
#ifdef ADVANCE |
|
|
|
#if defined(TCCR0A) && defined(WGM01) |
|
|
|
TCCR0A &= ~(1<<WGM01); |
|
|
|
TCCR0A &= ~(1<<WGM00); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
e_steps[0] = 0; |
|
|
|
e_steps[1] = 0; |
|
|
|
e_steps[2] = 0; |
|
|
|
TIMSK0 |= (1<<OCIE0A); |
|
|
|
#endif //ADVANCE
|
|
|
|
|
|
|
|
|
|
|
|
enable_endstops(true); // Start with endstops active. After homing they can be disabled
|
|
|
|
sei(); |
|
|
|
} |
|
|
@ -1003,13 +893,13 @@ long st_get_position(uint8_t axis) |
|
|
|
|
|
|
|
void finishAndDisableSteppers() |
|
|
|
{ |
|
|
|
st_synchronize(); |
|
|
|
disable_x(); |
|
|
|
disable_y(); |
|
|
|
disable_z(); |
|
|
|
disable_e0(); |
|
|
|
disable_e1(); |
|
|
|
disable_e2(); |
|
|
|
st_synchronize(); |
|
|
|
disable_x(); |
|
|
|
disable_y(); |
|
|
|
disable_z(); |
|
|
|
disable_e0(); |
|
|
|
disable_e1(); |
|
|
|
disable_e2(); |
|
|
|
} |
|
|
|
|
|
|
|
void quickStop() |
|
|
@ -1036,10 +926,10 @@ void digipot_init() //Initialize Digipot Motor Current |
|
|
|
{ |
|
|
|
#if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1 |
|
|
|
const uint8_t digipot_motor_current[] = DIGIPOT_MOTOR_CURRENT; |
|
|
|
|
|
|
|
SPI.begin(); |
|
|
|
pinMode(DIGIPOTSS_PIN, OUTPUT); |
|
|
|
for(int i=0;i<=4;i++) |
|
|
|
|
|
|
|
SPI.begin(); |
|
|
|
pinMode(DIGIPOTSS_PIN, OUTPUT); |
|
|
|
for(int i=0;i<=4;i++) |
|
|
|
//digitalPotWrite(digipot_ch[i], digipot_motor_current[i]);
|
|
|
|
digipot_current(i,digipot_motor_current[i]); |
|
|
|
#endif |
|
|
|