From 668d50f68e49d7489f82460eacc8b701bb630f77 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 11 May 2016 15:24:24 -0700 Subject: [PATCH] Keep Stepper encapsulation, use static data and methods --- Marlin/stepper.cpp | 54 ++++++++++++++++++++++++++++++++++++++-- Marlin/stepper.h | 61 +++++++++++++++++++++++----------------------- 2 files changed, 83 insertions(+), 32 deletions(-) diff --git a/Marlin/stepper.cpp b/Marlin/stepper.cpp index e1a06be8b..3df97cd52 100644 --- a/Marlin/stepper.cpp +++ b/Marlin/stepper.cpp @@ -60,6 +60,55 @@ Stepper stepper; // Singleton +// public: + +block_t* Stepper::current_block = NULL; // A pointer to the block currently being traced + +#if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) + bool Stepper::abort_on_endstop_hit = false; +#endif + +#if ENABLED(Z_DUAL_ENDSTOPS) + bool Stepper::performing_homing = false; +#endif + +// private: + +unsigned char Stepper::last_direction_bits = 0; // The next stepping-bits to be output +unsigned int Stepper::cleaning_buffer_counter = 0; + +#if ENABLED(Z_DUAL_ENDSTOPS) + bool Stepper::locked_z_motor = false; + bool Stepper::locked_z2_motor = false; +#endif + +long Stepper::counter_X = 0, + Stepper::counter_Y = 0, + Stepper::counter_Z = 0, + Stepper::counter_E = 0; + +volatile unsigned long Stepper::step_events_completed = 0; // The number of step events executed in the current block + +#if ENABLED(ADVANCE) + unsigned char Stepper::old_OCR0A; + long Stepper::final_advance = 0, + Stepper::old_advance = 0, + Stepper::e_steps[4], + Stepper::advance_rate, + Stepper::advance; +#endif + +long Stepper::acceleration_time, Stepper::deceleration_time; + +volatile long Stepper::count_position[NUM_AXIS] = { 0 }; +volatile signed char Stepper::count_direction[NUM_AXIS] = { 1, 1, 1, 1 }; + +unsigned short Stepper::acc_step_rate; // needed for deceleration start point +uint8_t Stepper::step_loops, Stepper::step_loops_nominal; +unsigned short Stepper::OCR1A_nominal; + +volatile long Stepper::endstops_trigsteps[3]; + #if ENABLED(DUAL_X_CARRIAGE) #define X_APPLY_DIR(v,ALWAYS) \ if (extruder_duplication_enabled || ALWAYS) { \ @@ -238,7 +287,7 @@ void Stepper::set_directions() { // "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) { stepper.isr(); } +ISR(TIMER1_COMPA_vect) { Stepper::isr(); } void Stepper::isr() { if (cleaning_buffer_counter) { @@ -405,7 +454,7 @@ void Stepper::isr() { #if ENABLED(ADVANCE) // Timer interrupt for E. e_steps is set in the main routine; // Timer 0 is shared with millies - ISR(TIMER0_COMPA_vect) { stepper.advance_isr(); } + ISR(TIMER0_COMPA_vect) { Stepper::advance_isr(); } void Stepper::advance_isr() { old_OCR0A += 52; // ~10kHz interrupt (250000 / 26 = 9615kHz) @@ -443,6 +492,7 @@ void Stepper::isr() { #endif // ADVANCE void Stepper::init() { + digipot_init(); //Initialize Digipot Motor Current microstep_init(); //Initialize Microstepping Pins diff --git a/Marlin/stepper.h b/Marlin/stepper.h index cd2409c7d..eeb5a089e 100644 --- a/Marlin/stepper.h +++ b/Marlin/stepper.h @@ -80,49 +80,46 @@ class Stepper { public: - block_t* current_block = NULL; // A pointer to the block currently being traced + static block_t* current_block; // A pointer to the block currently being traced #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) - bool abort_on_endstop_hit = false; + static bool abort_on_endstop_hit; #endif #if ENABLED(Z_DUAL_ENDSTOPS) - bool performing_homing = false; + static bool performing_homing; #endif #if ENABLED(ADVANCE) - long e_steps[4]; + static long e_steps[4]; #endif private: - unsigned char last_direction_bits = 0; // The next stepping-bits to be output - unsigned int cleaning_buffer_counter = 0; + static unsigned char last_direction_bits; // The next stepping-bits to be output + static unsigned int cleaning_buffer_counter; #if ENABLED(Z_DUAL_ENDSTOPS) - bool locked_z_motor = false, - locked_z2_motor = false; + static bool locked_z_motor, locked_z2_motor; #endif // Counter variables for the Bresenham line tracer - long counter_X = 0, counter_Y = 0, counter_Z = 0, counter_E = 0; - volatile unsigned long step_events_completed = 0; // The number of step events executed in the current block + static long counter_X, counter_Y, counter_Z, counter_E; + static volatile unsigned long step_events_completed; // The number of step events executed in the current block #if ENABLED(ADVANCE) - unsigned char old_OCR0A; - long advance_rate, advance, final_advance = 0; - long old_advance = 0; + static unsigned char old_OCR0A; + static long advance_rate, advance, old_advance, final_advance; #endif - long acceleration_time, deceleration_time; + static long acceleration_time, deceleration_time; //unsigned long accelerate_until, decelerate_after, acceleration_rate, initial_rate, final_rate, nominal_rate; - unsigned short acc_step_rate; // needed for deceleration start point - uint8_t step_loops; - uint8_t step_loops_nominal; - unsigned short OCR1A_nominal; + static unsigned short acc_step_rate; // needed for deceleration start point + static uint8_t step_loops, step_loops_nominal; + static unsigned short OCR1A_nominal; - volatile long endstops_trigsteps[3]; - volatile long endstops_stepsTotal, endstops_stepsDone; + static volatile long endstops_trigsteps[3]; + static volatile long endstops_stepsTotal, endstops_stepsDone; #if HAS_MOTOR_CURRENT_PWM #ifndef PWM_MOTOR_CURRENT @@ -134,19 +131,19 @@ class Stepper { // // Positions of stepper motors, in step units // - volatile long count_position[NUM_AXIS] = { 0 }; + static volatile long count_position[NUM_AXIS]; // // Current direction of stepper motors (+1 or -1) // - volatile signed char count_direction[NUM_AXIS] = { 1, 1, 1, 1 }; + static volatile signed char count_direction[NUM_AXIS]; public: // // Constructor / initializer // - Stepper() {}; + Stepper() { }; // // Initialize stepper hardware @@ -157,10 +154,10 @@ class Stepper { // Interrupt Service Routines // - void isr(); + static void isr(); #if ENABLED(ADVANCE) - void advance_isr(); + static void advance_isr(); #endif // @@ -177,7 +174,7 @@ class Stepper { // // Set direction bits for all steppers // - void set_directions(); + static void set_directions(); // // Get the position of a stepper, in steps @@ -213,7 +210,7 @@ class Stepper { // // The direction of a single motor // - FORCE_INLINE bool motor_direction(AxisEnum axis) { return TEST(last_direction_bits, axis); } + static FORCE_INLINE bool motor_direction(AxisEnum axis) { return TEST(last_direction_bits, axis); } #if HAS_DIGIPOTSS void digitalPotWrite(int address, int value); @@ -251,7 +248,7 @@ class Stepper { private: - FORCE_INLINE unsigned short calc_timer(unsigned short step_rate) { + static FORCE_INLINE unsigned short calc_timer(unsigned short step_rate) { unsigned short timer; NOMORE(step_rate, MAX_STEP_FREQUENCY); @@ -283,13 +280,17 @@ class Stepper { timer = (unsigned short)pgm_read_word_near(table_address); timer -= (((unsigned short)pgm_read_word_near(table_address + 2) * (unsigned char)(step_rate & 0x0007)) >> 3); } - if (timer < 100) { timer = 100; MYSERIAL.print(MSG_STEPPER_TOO_HIGH); MYSERIAL.println(step_rate); }//(20kHz this should never happen) + if (timer < 100) { // (20kHz - this should never happen) + timer = 100; + MYSERIAL.print(MSG_STEPPER_TOO_HIGH); + MYSERIAL.println(step_rate); + } return timer; } // Initializes the trapezoid generator from the current block. Called whenever a new // block begins. - FORCE_INLINE void trapezoid_generator_reset() { + static FORCE_INLINE void trapezoid_generator_reset() { static int8_t last_extruder = -1;