From e02a5a637112817601abcc7f7188bfa2bc3e8b5c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 11 Apr 2017 02:33:46 -0500 Subject: [PATCH 1/3] Add macros for delays by machine cycle --- Marlin/macros.h | 40 +++++++++++++++++++++++++++++ Marlin/servo.h | 2 +- Marlin/ultralcd_st7920_u8glib_rrd.h | 7 ----- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/Marlin/macros.h b/Marlin/macros.h index d84c277d5..a91690835 100644 --- a/Marlin/macros.h +++ b/Marlin/macros.h @@ -39,6 +39,46 @@ // Clock speed factor #define CYCLES_PER_MICROSECOND (F_CPU / 1000000UL) // 16 or 20 +// Highly granular delays for step pulses, etc. +#define DELAY_0_NOP NOOP +#define DELAY_1_NOP __asm__("nop\n\t") +#define DELAY_2_NOP DELAY_1_NOP; DELAY_1_NOP +#define DELAY_3_NOP DELAY_1_NOP; DELAY_2_NOP +#define DELAY_4_NOP DELAY_1_NOP; DELAY_3_NOP +#define DELAY_5_NOP DELAY_1_NOP; DELAY_4_NOP + +#define DELAY_NOPS(X) \ + switch (X) { \ + case 20: DELAY_1_NOP; case 19: DELAY_1_NOP; \ + case 18: DELAY_1_NOP; case 17: DELAY_1_NOP; \ + case 16: DELAY_1_NOP; case 15: DELAY_1_NOP; \ + case 14: DELAY_1_NOP; case 13: DELAY_1_NOP; \ + case 12: DELAY_1_NOP; case 11: DELAY_1_NOP; \ + case 10: DELAY_1_NOP; case 9: DELAY_1_NOP; \ + case 8: DELAY_1_NOP; case 7: DELAY_1_NOP; \ + case 6: DELAY_1_NOP; case 5: DELAY_1_NOP; \ + case 4: DELAY_1_NOP; case 3: DELAY_1_NOP; \ + case 2: DELAY_1_NOP; case 1: DELAY_1_NOP; \ + } + +#define DELAY_10_NOP DELAY_5_NOP; DELAY_5_NOP +#define DELAY_20_NOP DELAY_10_NOP; DELAY_10_NOP + +#if CYCLES_PER_MICROSECOND == 16 + #define DELAY_1US DELAY_10_NOP; DELAY_5_NOP; DELAY_1_NOP +#else + #define DELAY_1US DELAY_20_NOP +#endif +#define DELAY_2US DELAY_1US; DELAY_1US +#define DELAY_3US DELAY_1US; DELAY_2US +#define DELAY_4US DELAY_1US; DELAY_3US +#define DELAY_5US DELAY_1US; DELAY_4US +#define DELAY_6US DELAY_1US; DELAY_5US +#define DELAY_7US DELAY_1US; DELAY_6US +#define DELAY_8US DELAY_1US; DELAY_7US +#define DELAY_9US DELAY_1US; DELAY_8US +#define DELAY_10US DELAY_1US; DELAY_9US + // Remove compiler warning on an unused variable #define UNUSED(x) (void) (x) diff --git a/Marlin/servo.h b/Marlin/servo.h index 07532bc30..ad75b6baa 100644 --- a/Marlin/servo.h +++ b/Marlin/servo.h @@ -82,7 +82,7 @@ // Say which 16 bit timers can be used and in what order #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - //#define _useTimer1 + //#define _useTimer1 // Timer 1 is used by the stepper ISR #define _useTimer3 #define _useTimer4 #if !HAS_MOTOR_CURRENT_PWM diff --git a/Marlin/ultralcd_st7920_u8glib_rrd.h b/Marlin/ultralcd_st7920_u8glib_rrd.h index 66e1f1722..cb063f8e9 100644 --- a/Marlin/ultralcd_st7920_u8glib_rrd.h +++ b/Marlin/ultralcd_st7920_u8glib_rrd.h @@ -43,13 +43,6 @@ //set optimization so ARDUINO optimizes this file #pragma GCC optimize (3) -#define DELAY_0_NOP NOOP -#define DELAY_1_NOP __asm__("nop\n\t") -#define DELAY_2_NOP __asm__("nop\n\t" "nop\n\t") -#define DELAY_3_NOP __asm__("nop\n\t" "nop\n\t" "nop\n\t") -#define DELAY_4_NOP __asm__("nop\n\t" "nop\n\t" "nop\n\t" "nop\n\t") - - // If you want you can define your own set of delays in Configuration.h //#define ST7920_DELAY_1 DELAY_0_NOP //#define ST7920_DELAY_2 DELAY_0_NOP From 68773f4486cf2f740fbb5b1658a1f705e0f5996f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 11 Apr 2017 11:10:26 -0500 Subject: [PATCH 2/3] Simplify stepper macros by renaming enable/disable macros --- Marlin/Marlin.h | 104 ++++++++++++++++++++--------------------- Marlin/Marlin_main.cpp | 56 +++++++++++----------- Marlin/planner.cpp | 92 ++++++++++++++++++------------------ Marlin/stepper.cpp | 25 +++++----- 4 files changed, 139 insertions(+), 138 deletions(-) diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index 122a3547a..a8c85848f 100644 --- a/Marlin/Marlin.h +++ b/Marlin/Marlin.h @@ -60,36 +60,36 @@ void manage_inactivity(bool ignore_stepper_queue = false); #endif #if HAS_X2_ENABLE - #define enable_x() do{ X_ENABLE_WRITE( X_ENABLE_ON); X2_ENABLE_WRITE( X_ENABLE_ON); }while(0) - #define disable_x() do{ X_ENABLE_WRITE(!X_ENABLE_ON); X2_ENABLE_WRITE(!X_ENABLE_ON); axis_known_position[X_AXIS] = false; }while(0) + #define enable_X() do{ X_ENABLE_WRITE( X_ENABLE_ON); X2_ENABLE_WRITE( X_ENABLE_ON); }while(0) + #define disable_X() do{ X_ENABLE_WRITE(!X_ENABLE_ON); X2_ENABLE_WRITE(!X_ENABLE_ON); axis_known_position[X_AXIS] = false; }while(0) #elif HAS_X_ENABLE - #define enable_x() X_ENABLE_WRITE( X_ENABLE_ON) - #define disable_x() do{ X_ENABLE_WRITE(!X_ENABLE_ON); axis_known_position[X_AXIS] = false; }while(0) + #define enable_X() X_ENABLE_WRITE( X_ENABLE_ON) + #define disable_X() do{ X_ENABLE_WRITE(!X_ENABLE_ON); axis_known_position[X_AXIS] = false; }while(0) #else - #define enable_x() NOOP - #define disable_x() NOOP + #define enable_X() NOOP + #define disable_X() NOOP #endif #if HAS_Y2_ENABLE - #define enable_y() do{ Y_ENABLE_WRITE( Y_ENABLE_ON); Y2_ENABLE_WRITE(Y_ENABLE_ON); }while(0) - #define disable_y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); Y2_ENABLE_WRITE(!Y_ENABLE_ON); axis_known_position[Y_AXIS] = false; }while(0) + #define enable_Y() do{ Y_ENABLE_WRITE( Y_ENABLE_ON); Y2_ENABLE_WRITE(Y_ENABLE_ON); }while(0) + #define disable_Y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); Y2_ENABLE_WRITE(!Y_ENABLE_ON); axis_known_position[Y_AXIS] = false; }while(0) #elif HAS_Y_ENABLE - #define enable_y() Y_ENABLE_WRITE( Y_ENABLE_ON) - #define disable_y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); axis_known_position[Y_AXIS] = false; }while(0) + #define enable_Y() Y_ENABLE_WRITE( Y_ENABLE_ON) + #define disable_Y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); axis_known_position[Y_AXIS] = false; }while(0) #else - #define enable_y() NOOP - #define disable_y() NOOP + #define enable_Y() NOOP + #define disable_Y() NOOP #endif #if HAS_Z2_ENABLE - #define enable_z() do{ Z_ENABLE_WRITE( Z_ENABLE_ON); Z2_ENABLE_WRITE(Z_ENABLE_ON); }while(0) - #define disable_z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); Z2_ENABLE_WRITE(!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }while(0) + #define enable_Z() do{ Z_ENABLE_WRITE( Z_ENABLE_ON); Z2_ENABLE_WRITE(Z_ENABLE_ON); }while(0) + #define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); Z2_ENABLE_WRITE(!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }while(0) #elif HAS_Z_ENABLE - #define enable_z() Z_ENABLE_WRITE( Z_ENABLE_ON) - #define disable_z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }while(0) + #define enable_Z() Z_ENABLE_WRITE( Z_ENABLE_ON) + #define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); axis_known_position[Z_AXIS] = false; }while(0) #else - #define enable_z() NOOP - #define disable_z() NOOP + #define enable_Z() NOOP + #define disable_Z() NOOP #endif #if ENABLED(MIXING_EXTRUDER) @@ -98,64 +98,64 @@ void manage_inactivity(bool ignore_stepper_queue = false); * Mixing steppers synchronize their enable (and direction) together */ #if MIXING_STEPPERS > 3 - #define enable_e0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); } - #define disable_e0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); } + #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); } + #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); } #elif MIXING_STEPPERS > 2 - #define enable_e0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); } - #define disable_e0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); } + #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); } + #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); } #else - #define enable_e0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); } - #define disable_e0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); } + #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); } + #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); } #endif - #define enable_e1() NOOP - #define disable_e1() NOOP - #define enable_e2() NOOP - #define disable_e2() NOOP - #define enable_e3() NOOP - #define disable_e3() NOOP - #define enable_e4() NOOP - #define disable_e4() NOOP + #define enable_E1() NOOP + #define disable_E1() NOOP + #define enable_E2() NOOP + #define disable_E2() NOOP + #define enable_E3() NOOP + #define disable_E3() NOOP + #define enable_E4() NOOP + #define disable_E4() NOOP #else // !MIXING_EXTRUDER #if HAS_E0_ENABLE - #define enable_e0() E0_ENABLE_WRITE( E_ENABLE_ON) - #define disable_e0() E0_ENABLE_WRITE(!E_ENABLE_ON) + #define enable_E0() E0_ENABLE_WRITE( E_ENABLE_ON) + #define disable_E0() E0_ENABLE_WRITE(!E_ENABLE_ON) #else - #define enable_e0() NOOP - #define disable_e0() NOOP + #define enable_E0() NOOP + #define disable_E0() NOOP #endif #if E_STEPPERS > 1 && HAS_E1_ENABLE - #define enable_e1() E1_ENABLE_WRITE( E_ENABLE_ON) - #define disable_e1() E1_ENABLE_WRITE(!E_ENABLE_ON) + #define enable_E1() E1_ENABLE_WRITE( E_ENABLE_ON) + #define disable_E1() E1_ENABLE_WRITE(!E_ENABLE_ON) #else - #define enable_e1() NOOP - #define disable_e1() NOOP + #define enable_E1() NOOP + #define disable_E1() NOOP #endif #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define enable_e2() E2_ENABLE_WRITE( E_ENABLE_ON) - #define disable_e2() E2_ENABLE_WRITE(!E_ENABLE_ON) + #define enable_E2() E2_ENABLE_WRITE( E_ENABLE_ON) + #define disable_E2() E2_ENABLE_WRITE(!E_ENABLE_ON) #else - #define enable_e2() NOOP - #define disable_e2() NOOP + #define enable_E2() NOOP + #define disable_E2() NOOP #endif #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define enable_e3() E3_ENABLE_WRITE( E_ENABLE_ON) - #define disable_e3() E3_ENABLE_WRITE(!E_ENABLE_ON) + #define enable_E3() E3_ENABLE_WRITE( E_ENABLE_ON) + #define disable_E3() E3_ENABLE_WRITE(!E_ENABLE_ON) #else - #define enable_e3() NOOP - #define disable_e3() NOOP + #define enable_E3() NOOP + #define disable_E3() NOOP #endif #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define enable_e4() E4_ENABLE_WRITE( E_ENABLE_ON) - #define disable_e4() E4_ENABLE_WRITE(!E_ENABLE_ON) + #define enable_E4() E4_ENABLE_WRITE( E_ENABLE_ON) + #define disable_E4() E4_ENABLE_WRITE(!E_ENABLE_ON) #else - #define enable_e4() NOOP - #define disable_e4() NOOP + #define enable_E4() NOOP + #define disable_E4() NOOP #endif #endif // !MIXING_EXTRUDER diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 513fde848..7f7d93178 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -6489,9 +6489,9 @@ inline void gcode_M18_M84() { } else { stepper.synchronize(); - if (code_seen('X')) disable_x(); - if (code_seen('Y')) disable_y(); - if (code_seen('Z')) disable_z(); + if (code_seen('X')) disable_X(); + if (code_seen('Y')) disable_Y(); + if (code_seen('Z')) disable_Z(); #if ((E0_ENABLE_PIN != X_ENABLE_PIN) && (E1_ENABLE_PIN != Y_ENABLE_PIN)) // Only enable on boards that have seperate ENABLE_PINS if (code_seen('E')) disable_e_steppers(); #endif @@ -10888,28 +10888,28 @@ void calculate_volumetric_multipliers() { } void enable_all_steppers() { - enable_x(); - enable_y(); - enable_z(); - enable_e0(); - enable_e1(); - enable_e2(); - enable_e3(); - enable_e4(); + enable_X(); + enable_Y(); + enable_Z(); + enable_E0(); + enable_E1(); + enable_E2(); + enable_E3(); + enable_E4(); } void disable_e_steppers() { - disable_e0(); - disable_e1(); - disable_e2(); - disable_e3(); - disable_e4(); + disable_E0(); + disable_E1(); + disable_E2(); + disable_E3(); + disable_E4(); } void disable_all_steppers() { - disable_x(); - disable_y(); - disable_z(); + disable_X(); + disable_Y(); + disable_Z(); disable_e_steppers(); } @@ -11011,13 +11011,13 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) { if (M600_TEST && stepper_inactive_time && ELAPSED(ms, previous_cmd_ms + stepper_inactive_time) && !ignore_stepper_queue && !planner.blocks_queued()) { #if ENABLED(DISABLE_INACTIVE_X) - disable_x(); + disable_X(); #endif #if ENABLED(DISABLE_INACTIVE_Y) - disable_y(); + disable_Y(); #endif #if ENABLED(DISABLE_INACTIVE_Z) - disable_z(); + disable_Z(); #endif #if ENABLED(DISABLE_INACTIVE_E) disable_e_steppers(); @@ -11080,32 +11080,32 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) { bool oldstatus; #if ENABLED(SWITCHING_EXTRUDER) oldstatus = E0_ENABLE_READ; - enable_e0(); + enable_E0(); #else // !SWITCHING_EXTRUDER switch (active_extruder) { case 0: oldstatus = E0_ENABLE_READ; - enable_e0(); + enable_E0(); break; #if E_STEPPERS > 1 case 1: oldstatus = E1_ENABLE_READ; - enable_e1(); + enable_E1(); break; #if E_STEPPERS > 2 case 2: oldstatus = E2_ENABLE_READ; - enable_e2(); + enable_E2(); break; #if E_STEPPERS > 3 case 3: oldstatus = E3_ENABLE_READ; - enable_e3(); + enable_E3(); break; #if E_STEPPERS > 4 case 4: oldstatus = E4_ENABLE_READ; - enable_e4(); + enable_E4(); break; #endif // E_STEPPERS > 4 #endif // E_STEPPERS > 3 diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp index bb7578db3..8740eee3f 100644 --- a/Marlin/planner.cpp +++ b/Marlin/planner.cpp @@ -441,13 +441,13 @@ void Planner::check_axes_activity() { } } #if ENABLED(DISABLE_X) - if (!axis_active[X_AXIS]) disable_x(); + if (!axis_active[X_AXIS]) disable_X(); #endif #if ENABLED(DISABLE_Y) - if (!axis_active[Y_AXIS]) disable_y(); + if (!axis_active[Y_AXIS]) disable_Y(); #endif #if ENABLED(DISABLE_Z) - if (!axis_active[Z_AXIS]) disable_z(); + if (!axis_active[Z_AXIS]) disable_Z(); #endif #if ENABLED(DISABLE_E) if (!axis_active[E_AXIS]) disable_e_steppers(); @@ -832,29 +832,29 @@ void Planner::_buffer_line(const float &a, const float &b, const float &c, const //enable active axes #if CORE_IS_XY if (block->steps[A_AXIS] || block->steps[B_AXIS]) { - enable_x(); - enable_y(); + enable_X(); + enable_Y(); } #if DISABLED(Z_LATE_ENABLE) - if (block->steps[Z_AXIS]) enable_z(); + if (block->steps[Z_AXIS]) enable_Z(); #endif #elif CORE_IS_XZ if (block->steps[A_AXIS] || block->steps[C_AXIS]) { - enable_x(); - enable_z(); + enable_X(); + enable_Z(); } - if (block->steps[Y_AXIS]) enable_y(); + if (block->steps[Y_AXIS]) enable_Y(); #elif CORE_IS_YZ if (block->steps[B_AXIS] || block->steps[C_AXIS]) { - enable_y(); - enable_z(); + enable_Y(); + enable_Z(); } - if (block->steps[X_AXIS]) enable_x(); + if (block->steps[X_AXIS]) enable_X(); #else - if (block->steps[X_AXIS]) enable_x(); - if (block->steps[Y_AXIS]) enable_y(); + if (block->steps[X_AXIS]) enable_X(); + if (block->steps[Y_AXIS]) enable_Y(); #if DISABLED(Z_LATE_ENABLE) - if (block->steps[Z_AXIS]) enable_z(); + if (block->steps[Z_AXIS]) enable_Z(); #endif #endif @@ -868,22 +868,22 @@ void Planner::_buffer_line(const float &a, const float &b, const float &c, const switch(extruder) { case 0: - enable_e0(); + enable_E0(); #if ENABLED(DUAL_X_CARRIAGE) if (extruder_duplication_enabled) { - enable_e1(); + enable_E1(); g_uc_extruder_last_move[1] = (BLOCK_BUFFER_SIZE) * 2; } #endif g_uc_extruder_last_move[0] = (BLOCK_BUFFER_SIZE) * 2; #if EXTRUDERS > 1 - if (g_uc_extruder_last_move[1] == 0) disable_e1(); + if (g_uc_extruder_last_move[1] == 0) disable_E1(); #if EXTRUDERS > 2 - if (g_uc_extruder_last_move[2] == 0) disable_e2(); + if (g_uc_extruder_last_move[2] == 0) disable_E2(); #if EXTRUDERS > 3 - if (g_uc_extruder_last_move[3] == 0) disable_e3(); + if (g_uc_extruder_last_move[3] == 0) disable_E3(); #if EXTRUDERS > 4 - if (g_uc_extruder_last_move[4] == 0) disable_e4(); + if (g_uc_extruder_last_move[4] == 0) disable_E4(); #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 #endif // EXTRUDERS > 2 @@ -891,51 +891,51 @@ void Planner::_buffer_line(const float &a, const float &b, const float &c, const break; #if EXTRUDERS > 1 case 1: - enable_e1(); + enable_E1(); g_uc_extruder_last_move[1] = (BLOCK_BUFFER_SIZE) * 2; - if (g_uc_extruder_last_move[0] == 0) disable_e0(); + if (g_uc_extruder_last_move[0] == 0) disable_E0(); #if EXTRUDERS > 2 - if (g_uc_extruder_last_move[2] == 0) disable_e2(); + if (g_uc_extruder_last_move[2] == 0) disable_E2(); #if EXTRUDERS > 3 - if (g_uc_extruder_last_move[3] == 0) disable_e3(); + if (g_uc_extruder_last_move[3] == 0) disable_E3(); #if EXTRUDERS > 4 - if (g_uc_extruder_last_move[4] == 0) disable_e4(); + if (g_uc_extruder_last_move[4] == 0) disable_E4(); #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 #endif // EXTRUDERS > 2 break; #if EXTRUDERS > 2 case 2: - enable_e2(); + enable_E2(); g_uc_extruder_last_move[2] = (BLOCK_BUFFER_SIZE) * 2; - if (g_uc_extruder_last_move[0] == 0) disable_e0(); - if (g_uc_extruder_last_move[1] == 0) disable_e1(); + if (g_uc_extruder_last_move[0] == 0) disable_E0(); + if (g_uc_extruder_last_move[1] == 0) disable_E1(); #if EXTRUDERS > 3 - if (g_uc_extruder_last_move[3] == 0) disable_e3(); + if (g_uc_extruder_last_move[3] == 0) disable_E3(); #if EXTRUDERS > 4 - if (g_uc_extruder_last_move[4] == 0) disable_e4(); + if (g_uc_extruder_last_move[4] == 0) disable_E4(); #endif #endif break; #if EXTRUDERS > 3 case 3: - enable_e3(); + enable_E3(); g_uc_extruder_last_move[3] = (BLOCK_BUFFER_SIZE) * 2; - if (g_uc_extruder_last_move[0] == 0) disable_e0(); - if (g_uc_extruder_last_move[1] == 0) disable_e1(); - if (g_uc_extruder_last_move[2] == 0) disable_e2(); + if (g_uc_extruder_last_move[0] == 0) disable_E0(); + if (g_uc_extruder_last_move[1] == 0) disable_E1(); + if (g_uc_extruder_last_move[2] == 0) disable_E2(); #if EXTRUDERS > 4 - if (g_uc_extruder_last_move[4] == 0) disable_e4(); + if (g_uc_extruder_last_move[4] == 0) disable_E4(); #endif break; #if EXTRUDERS > 4 case 4: - enable_e4(); + enable_E4(); g_uc_extruder_last_move[4] = (BLOCK_BUFFER_SIZE) * 2; - if (g_uc_extruder_last_move[0] == 0) disable_e0(); - if (g_uc_extruder_last_move[1] == 0) disable_e1(); - if (g_uc_extruder_last_move[2] == 0) disable_e2(); - if (g_uc_extruder_last_move[3] == 0) disable_e3(); + if (g_uc_extruder_last_move[0] == 0) disable_E0(); + if (g_uc_extruder_last_move[1] == 0) disable_E1(); + if (g_uc_extruder_last_move[2] == 0) disable_E2(); + if (g_uc_extruder_last_move[3] == 0) disable_E3(); break; #endif // EXTRUDERS > 4 #endif // EXTRUDERS > 3 @@ -943,11 +943,11 @@ void Planner::_buffer_line(const float &a, const float &b, const float &c, const #endif // EXTRUDERS > 1 } #else - enable_e0(); - enable_e1(); - enable_e2(); - enable_e3(); - enable_e4(); + enable_E0(); + enable_E1(); + enable_E2(); + enable_E3(); + enable_E4(); #endif } diff --git a/Marlin/stepper.cpp b/Marlin/stepper.cpp index 462701795..0ff0ec74d 100644 --- a/Marlin/stepper.cpp +++ b/Marlin/stepper.cpp @@ -428,7 +428,7 @@ void Stepper::isr() { #if ENABLED(Z_LATE_ENABLE) if (current_block->steps[Z_AXIS] > 0) { - enable_z(); + enable_Z(); _NEXT_ISR(2000); // Run at slow speed - 1 KHz _ENABLE_ISRs(); // re-enable ISRs return; @@ -986,14 +986,14 @@ void Stepper::init() { #define _STEP_INIT(AXIS) AXIS ##_STEP_INIT #define _WRITE_STEP(AXIS, HIGHLOW) AXIS ##_STEP_WRITE(HIGHLOW) - #define _DISABLE(axis) disable_## axis() + #define _DISABLE(AXIS) disable_## AXIS() - #define AXIS_INIT(axis, AXIS, PIN) \ + #define AXIS_INIT(AXIS, PIN) \ _STEP_INIT(AXIS); \ _WRITE_STEP(AXIS, _INVERT_STEP_PIN(PIN)); \ - _DISABLE(axis) + _DISABLE(AXIS) - #define E_AXIS_INIT(NUM) AXIS_INIT(e## NUM, E## NUM, E) + #define E_AXIS_INIT(NUM) AXIS_INIT(E## NUM, E) // Init Step Pins #if HAS_X_STEP @@ -1001,7 +1001,7 @@ void Stepper::init() { X2_STEP_INIT; X2_STEP_WRITE(INVERT_X_STEP_PIN); #endif - AXIS_INIT(x, X, X); + AXIS_INIT(X, X); #endif #if HAS_Y_STEP @@ -1009,7 +1009,7 @@ void Stepper::init() { Y2_STEP_INIT; Y2_STEP_WRITE(INVERT_Y_STEP_PIN); #endif - AXIS_INIT(y, Y, Y); + AXIS_INIT(Y, Y); #endif #if HAS_Z_STEP @@ -1017,7 +1017,7 @@ void Stepper::init() { Z2_STEP_INIT; Z2_STEP_WRITE(INVERT_Z_STEP_PIN); #endif - AXIS_INIT(z, Z, Z); + AXIS_INIT(Z, Z); #endif #if HAS_E0_STEP @@ -1237,7 +1237,7 @@ void Stepper::report_positions() { #define CYCLES_EATEN_BY_BABYSTEP 60 - #define _ENABLE(axis) enable_## axis() + #define _ENABLE(AXIS) enable_## AXIS() #define _READ_DIR(AXIS) AXIS ##_DIR_READ #define _INVERT_DIR(AXIS) INVERT_## AXIS ##_DIR #define _APPLY_DIR(AXIS, INVERT) AXIS ##_APPLY_DIR(INVERT, true) @@ -1298,9 +1298,10 @@ void Stepper::report_positions() { bool z_direction = direction ^ BABYSTEP_INVERT_Z; - enable_x(); - enable_y(); - enable_z(); + enable_X(); + enable_Y(); + enable_Z(); + uint8_t old_x_dir_pin = X_DIR_READ, old_y_dir_pin = Y_DIR_READ, old_z_dir_pin = Z_DIR_READ; From 6a9b008044b363fb0f55aa01016afbd3347b3e68 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 11 Apr 2017 11:11:17 -0500 Subject: [PATCH 3/3] Fix MINIMUM_STEPPER_PULSE maths --- Marlin/macros.h | 5 +- Marlin/stepper.cpp | 176 +++++++++++++++++++++++++++++---------------- 2 files changed, 117 insertions(+), 64 deletions(-) diff --git a/Marlin/macros.h b/Marlin/macros.h index a91690835..a943e9cb5 100644 --- a/Marlin/macros.h +++ b/Marlin/macros.h @@ -36,8 +36,9 @@ #define CRITICAL_SECTION_END SREG = _sreg; #endif -// Clock speed factor -#define CYCLES_PER_MICROSECOND (F_CPU / 1000000UL) // 16 or 20 +// Clock speed factors +#define CYCLES_PER_MICROSECOND (F_CPU / 1000000L) // 16 or 20 +#define INT0_PRESCALER 8 // Highly granular delays for step pulses, etc. #define DELAY_0_NOP NOOP diff --git a/Marlin/stepper.cpp b/Marlin/stepper.cpp index 0ff0ec74d..fb761aefc 100644 --- a/Marlin/stepper.cpp +++ b/Marlin/stepper.cpp @@ -460,7 +460,7 @@ void Stepper::isr() { // Take multiple steps per interrupt (For high speed moves) bool all_steps_done = false; - for (int8_t i = 0; i < step_loops; i++) { + for (uint8_t i = step_loops; i--;) { #if ENABLED(LIN_ADVANCE) counter_E += current_block->steps[E_AXIS]; @@ -530,10 +530,34 @@ void Stepper::isr() { _APPLY_STEP(AXIS)(_INVERT_STEP_PIN(AXIS),0); \ } - #define CYCLES_EATEN_BY_CODE 240 + #if HAS_X_STEP + #define _COUNT_STEPPERS_1 1 + #else + #define _COUNT_STEPPERS_1 0 + #endif + #if HAS_Y_STEP + #define _COUNT_STEPPERS_2 _COUNT_STEPPERS_1 + 1 + #else + #define _COUNT_STEPPERS_2 _COUNT_STEPPERS_1 + #endif + #if HAS_Z_STEP + #define _COUNT_STEPPERS_3 _COUNT_STEPPERS_2 + 1 + #else + #define _COUNT_STEPPERS_3 _COUNT_STEPPERS_2 + #endif + #if DISABLED(ADVANCE) && DISABLED(LIN_ADVANCE) + #define _COUNT_STEPPERS_4 _COUNT_STEPPERS_3 + 1 + #else + #define _COUNT_STEPPERS_4 _COUNT_STEPPERS_3 + #endif + + #define CYCLES_EATEN_XYZE ((_COUNT_STEPPERS_4) * 5) + #define EXTRA_CYCLES_XYZE (STEP_PULSE_CYCLES - (CYCLES_EATEN_XYZE)) - // If a minimum pulse time was specified get the CPU clock - #if STEP_PULSE_CYCLES > CYCLES_EATEN_BY_CODE + // If a minimum pulse time was specified get the timer 0 value + // which increments every 4µs on 16MHz and every 3.2µs on 20MHz. + // Two or 3 counts of TCNT0 should be a sufficient delay. + #if EXTRA_CYCLES_XYZE > 20 uint32_t pulse_start = TCNT0; #endif @@ -564,9 +588,12 @@ void Stepper::isr() { #endif #endif // !ADVANCE && !LIN_ADVANCE - // For a minimum pulse time wait before stopping pulses - #if STEP_PULSE_CYCLES > CYCLES_EATEN_BY_CODE - while ((uint32_t)(TCNT0 - pulse_start) < STEP_PULSE_CYCLES - CYCLES_EATEN_BY_CODE) { /* nada */ } + // For minimum pulse time wait before stopping pulses + #if EXTRA_CYCLES_XYZE > 20 + while (EXTRA_CYCLES_XYZE > (uint32_t)(TCNT0 - pulse_start) * (INT0_PRESCALER)) { /* nada */ } + pulse_start = TCNT0; + #elif EXTRA_CYCLES_XYZE > 0 + DELAY_NOPS(EXTRA_CYCLES_XYZE); #endif #if HAS_X_STEP @@ -601,7 +628,15 @@ void Stepper::isr() { all_steps_done = true; break; } - } + + // For minimum pulse time wait before stopping pulses + #if EXTRA_CYCLES_XYZE > 20 + if (i) while (EXTRA_CYCLES_XYZE > (uint32_t)(TCNT0 - pulse_start) * (INT0_PRESCALER)) { /* nada */ } + #elif EXTRA_CYCLES_XYZE > 0 + if (i) DELAY_NOPS(EXTRA_CYCLES_XYZE); + #endif + + } // steps_loop #if ENABLED(LIN_ADVANCE) if (current_block->use_advance_lead) { @@ -765,6 +800,9 @@ void Stepper::isr() { #if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE) + #define CYCLES_EATEN_E (E_STEPPERS * 5) + #define EXTRA_CYCLES_E (STEP_PULSE_CYCLES - (CYCLES_EATEN_E)) + // Timer interrupt for E. e_steps is set in the main routine; void Stepper::advance_isr() { @@ -794,12 +832,10 @@ void Stepper::isr() { #endif #endif - #define CYCLES_EATEN_BY_E 60 - // Step all E steppers that have steps - for (uint8_t i = 0; i < step_loops; i++) { + for (uint8_t i = step_loops; i--;) { - #if STEP_PULSE_CYCLES > CYCLES_EATEN_BY_E + #if EXTRA_CYCLES_E > 20 uint32_t pulse_start = TCNT0; #endif @@ -814,9 +850,12 @@ void Stepper::isr() { #endif #endif - // For a minimum pulse time wait before stopping pulses - #if STEP_PULSE_CYCLES > CYCLES_EATEN_BY_E - while ((uint32_t)(TCNT0 - pulse_start) < STEP_PULSE_CYCLES - CYCLES_EATEN_BY_E) { /* nada */ } + // For minimum pulse time wait before stopping pulses + #if EXTRA_CYCLES_E > 20 + while (EXTRA_CYCLES_E > (uint32_t)(TCNT0 - pulse_start) * (INT0_PRESCALER)) { /* nada */ } + pulse_start = TCNT0; + #elif EXTRA_CYCLES_E > 0 + DELAY_NOPS(EXTRA_CYCLES_E); #endif STOP_E_PULSE(0); @@ -829,8 +868,15 @@ void Stepper::isr() { #endif #endif #endif - } + // For minimum pulse time wait before looping + #if EXTRA_CYCLES_E > 20 + if (i) while (EXTRA_CYCLES_E > (uint32_t)(TCNT0 - pulse_start) * (INT0_PRESCALER)) { /* nada */ } + #elif EXTRA_CYCLES_E > 0 + if (i) DELAY_NOPS(EXTRA_CYCLES_E); + #endif + + } // steps_loop } void Stepper::advance_isr_scheduler() { @@ -1056,15 +1102,11 @@ void Stepper::init() { ENABLE_STEPPER_DRIVER_INTERRUPT(); #if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE) - - for (int i = 0; i < E_STEPPERS; i++) { - e_steps[i] = 0; - #if ENABLED(LIN_ADVANCE) - current_adv_steps[i] = 0; - #endif - } - - #endif // ADVANCE or LIN_ADVANCE + ZERO(e_steps); + #if ENABLED(LIN_ADVANCE) + ZERO(current_adv_steps); + #endif + #endif // ADVANCE || LIN_ADVANCE endstops.enable(true); // Start with endstops active. After homing they can be disabled sei(); @@ -1235,32 +1277,43 @@ void Stepper::report_positions() { #if ENABLED(BABYSTEPPING) - #define CYCLES_EATEN_BY_BABYSTEP 60 + #if ENABLED(DELTA) + #define CYCLES_EATEN_BABYSTEP (2 * 15) + #else + #define CYCLES_EATEN_BABYSTEP 0 + #endif + #define EXTRA_CYCLES_BABYSTEP (STEP_PULSE_CYCLES - (CYCLES_EATEN_BABYSTEP)) #define _ENABLE(AXIS) enable_## AXIS() #define _READ_DIR(AXIS) AXIS ##_DIR_READ #define _INVERT_DIR(AXIS) INVERT_## AXIS ##_DIR #define _APPLY_DIR(AXIS, INVERT) AXIS ##_APPLY_DIR(INVERT, true) - #if STEP_PULSE_CYCLES > CYCLES_EATEN_BY_BABYSTEP + #if EXTRA_CYCLES_BABYSTEP > 20 #define _SAVE_START (pulse_start = TCNT0) - #define _PULSE_WAIT while ((uint32_t)(TCNT0 - pulse_start) < STEP_PULSE_CYCLES - CYCLES_EATEN_BY_BABYSTEP) { /* nada */ } + #define _PULSE_WAIT while (EXTRA_CYCLES_BABYSTEP > (uint32_t)(TCNT0 - pulse_start) * (INT0_PRESCALER)) { /* nada */ } #else #define _SAVE_START NOOP - #define _PULSE_WAIT NOOP + #if EXTRA_CYCLES_BABYSTEP > 0 + #define _PULSE_WAIT DELAY_NOPS(EXTRA_CYCLES_BABYSTEP) + #elif STEP_PULSE_CYCLES > 0 + #define _PULSE_WAIT NOOP + #elif ENABLED(DELTA) + #define _PULSE_WAIT delayMicroseconds(2); + #else + #define _PULSE_WAIT delayMicroseconds(4); + #endif #endif - #define START_BABYSTEP_AXIS(AXIS, INVERT) { \ - old_dir = _READ_DIR(AXIS); \ - _SAVE_START; \ + #define BABYSTEP_AXIS(AXIS, INVERT) { \ + const uint8_t old_dir = _READ_DIR(AXIS); \ + _ENABLE(AXIS); \ + _SAVE_START; \ _APPLY_DIR(AXIS, _INVERT_DIR(AXIS)^direction^INVERT); \ - _APPLY_STEP(AXIS)(!_INVERT_STEP_PIN(AXIS), true); \ - } - - #define STOP_BABYSTEP_AXIS(AXIS) { \ - _PULSE_WAIT; \ - _APPLY_STEP(AXIS)(_INVERT_STEP_PIN(AXIS), true); \ - _APPLY_DIR(AXIS, old_dir); \ + _APPLY_STEP(AXIS)(!_INVERT_STEP_PIN(AXIS), true); \ + _PULSE_WAIT; \ + _APPLY_STEP(AXIS)(_INVERT_STEP_PIN(AXIS), true); \ + _APPLY_DIR(AXIS, old_dir); \ } // MUST ONLY BE CALLED BY AN ISR, @@ -1268,31 +1321,30 @@ void Stepper::report_positions() { void Stepper::babystep(const AxisEnum axis, const bool direction) { cli(); uint8_t old_dir; - #if STEP_PULSE_CYCLES > CYCLES_EATEN_BY_BABYSTEP + + #if EXTRA_CYCLES_BABYSTEP > 20 uint32_t pulse_start; #endif switch (axis) { - case X_AXIS: - _ENABLE(x); - START_BABYSTEP_AXIS(X, false); - STOP_BABYSTEP_AXIS(X); - break; + #if ENABLED(BABYSTEP_XY) + + case X_AXIS: + BABYSTEP_AXIS(X, false); + break; - case Y_AXIS: - _ENABLE(y); - START_BABYSTEP_AXIS(Y, false); - STOP_BABYSTEP_AXIS(Y); - break; + case Y_AXIS: + BABYSTEP_AXIS(Y, false); + break; + + #endif case Z_AXIS: { #if DISABLED(DELTA) - _ENABLE(z); - START_BABYSTEP_AXIS(Z, BABYSTEP_INVERT_Z); - STOP_BABYSTEP_AXIS(Z); + BABYSTEP_AXIS(Z, BABYSTEP_INVERT_Z); #else // DELTA @@ -1305,24 +1357,24 @@ void Stepper::report_positions() { uint8_t old_x_dir_pin = X_DIR_READ, old_y_dir_pin = Y_DIR_READ, old_z_dir_pin = Z_DIR_READ; - //setup new step + X_DIR_WRITE(INVERT_X_DIR ^ z_direction); Y_DIR_WRITE(INVERT_Y_DIR ^ z_direction); Z_DIR_WRITE(INVERT_Z_DIR ^ z_direction); - //perform step - #if STEP_PULSE_CYCLES > CYCLES_EATEN_BY_BABYSTEP - pulse_start = TCNT0; - #endif + + _SAVE_START; + X_STEP_WRITE(!INVERT_X_STEP_PIN); Y_STEP_WRITE(!INVERT_Y_STEP_PIN); Z_STEP_WRITE(!INVERT_Z_STEP_PIN); - #if STEP_PULSE_CYCLES > CYCLES_EATEN_BY_BABYSTEP - while ((uint32_t)(TCNT0 - pulse_start) < STEP_PULSE_CYCLES - CYCLES_EATEN_BY_BABYSTEP) { /* nada */ } - #endif + + _PULSE_WAIT; + X_STEP_WRITE(INVERT_X_STEP_PIN); Y_STEP_WRITE(INVERT_Y_STEP_PIN); Z_STEP_WRITE(INVERT_Z_STEP_PIN); - //get old pin state back. + + // Restore direction bits X_DIR_WRITE(old_x_dir_pin); Y_DIR_WRITE(old_y_dir_pin); Z_DIR_WRITE(old_z_dir_pin);