From 8315a8a716d4e9146a5e60231500fa66ca23cbb3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 7 Oct 2017 13:34:25 -0500 Subject: [PATCH] Apply fixes for DUE Alternative to #7882. If F_CPU is greater than 1000 it can be evenly divided by 8. Over 10000, 16; over 100000, 32; over 1 million, 64; etc. --- Marlin/src/HAL/HAL_AVR/HAL_AVR.h | 8 ++++---- Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h | 2 +- Marlin/src/HAL/HAL_LPC1768/HAL_timers.cpp | 8 ++++---- Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.cpp | 10 +++++----- Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h | 2 +- Marlin/src/gcode/config/M43.cpp | 2 +- Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/module/stepper.h | 7 +++---- 8 files changed, 20 insertions(+), 21 deletions(-) diff --git a/Marlin/src/HAL/HAL_AVR/HAL_AVR.h b/Marlin/src/HAL/HAL_AVR/HAL_AVR.h index fdd26b0cf..95c0db5c6 100644 --- a/Marlin/src/HAL/HAL_AVR/HAL_AVR.h +++ b/Marlin/src/HAL/HAL_AVR/HAL_AVR.h @@ -102,10 +102,10 @@ extern "C" { #define TEMP_TIMER_NUM 0 #define TEMP_TIMER_FREQUENCY (F_CPU / 64.0 / 256.0) -#define HAL_TIMER_RATE ((F_CPU) / 8.0) -#define HAL_STEPPER_TIMER_RATE HAL_TIMER_RATE -#define STEPPER_TIMER_PRESCALE INT0_PRESCALER -#define HAL_TICKS_PER_US (((F_CPU) / 8) / 1000000) // Can not be of type double +#define HAL_TIMER_RATE ((F_CPU) / 8) // i.e., 2MHz or 2.5MHz +#define HAL_STEPPER_TIMER_RATE HAL_TIMER_RATE +#define STEPPER_TIMER_PRESCALE INT0_PRESCALER +#define HAL_TICKS_PER_US ((HAL_STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double #define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A) #define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A) diff --git a/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h b/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h index 64a0e72a3..5dfd42ce9 100644 --- a/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h +++ b/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h @@ -46,7 +46,7 @@ #define STEP_TIMER_NUM 3 // index of timer to use for stepper #define TEMP_TIMER_NUM 4 // index of timer to use for temperature -#define HAL_TIMER_RATE ((F_CPU) / 2.0) // frequency of timers peripherals +#define HAL_TIMER_RATE ((F_CPU) / 2) // frequency of timers peripherals #define STEPPER_TIMER_PRESCALE 1.0 // prescaler for setting stepper frequency #define HAL_STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) #define HAL_TICKS_PER_US ((HAL_STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per us diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL_timers.cpp b/Marlin/src/HAL/HAL_LPC1768/HAL_timers.cpp index 3613f8a40..c46e80f4b 100644 --- a/Marlin/src/HAL/HAL_LPC1768/HAL_timers.cpp +++ b/Marlin/src/HAL/HAL_LPC1768/HAL_timers.cpp @@ -33,22 +33,22 @@ void HAL_timer_init(void) { SBI(LPC_SC->PCONP, 1); // power on timer0 - LPC_TIM0->PR = ((HAL_TIMER_RATE / HAL_STEPPER_TIMER_RATE) - 1); // Use prescaler to set frequency if needed + LPC_TIM0->PR = (HAL_TIMER_RATE) / (HAL_STEPPER_TIMER_RATE) - 1; // Use prescaler to set frequency if needed SBI(LPC_SC->PCONP, 2); // power on timer1 - LPC_TIM1->PR = ((HAL_TIMER_RATE / 1000000) - 1); + LPC_TIM1->PR = (HAL_TIMER_RATE) / 1000000 - 1; } void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { switch (timer_num) { case 0: LPC_TIM0->MCR = 3; // Match on MR0, reset on MR0 - LPC_TIM0->MR0 = (uint32_t)(HAL_STEPPER_TIMER_RATE / frequency); // Match value (period) to set frequency + LPC_TIM0->MR0 = uint32_t(HAL_STEPPER_TIMER_RATE) / frequency; // Match value (period) to set frequency LPC_TIM0->TCR = _BV(0); // enable break; case 1: LPC_TIM1->MCR = 3; - LPC_TIM1->MR0 = (uint32_t)(HAL_TEMP_TIMER_RATE / frequency);; + LPC_TIM1->MR0 = uint32_t(HAL_TEMP_TIMER_RATE) / frequency; LPC_TIM1->TCR = _BV(0); break; default: break; diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.cpp b/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.cpp index bf1ae230b..eb002ab93 100644 --- a/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.cpp +++ b/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.cpp @@ -93,14 +93,14 @@ Timer_clock4: Prescaler 128 -> 656.25kHz * TODO: Calculate Timer prescale value, so we get the 32bit to adjust */ -void HAL_timer_start (uint8_t timer_num, uint32_t frequency) { +void HAL_timer_start(uint8_t timer_num, uint32_t frequency) { switch (timer_num) { case STEP_TIMER_NUM: StepperTimer.pause(); StepperTimer.setCount(0); StepperTimer.setPrescaleFactor(STEPPER_TIMER_PRESCALE); StepperTimer.setOverflow(0xFFFF); - StepperTimer.setCompare (STEP_TIMER_CHAN, (HAL_STEPPER_TIMER_RATE / frequency)); + StepperTimer.setCompare(STEP_TIMER_CHAN, uint32_t(HAL_STEPPER_TIMER_RATE) / frequency); StepperTimer.refresh(); StepperTimer.resume(); break; @@ -109,14 +109,14 @@ void HAL_timer_start (uint8_t timer_num, uint32_t frequency) { TempTimer.setCount(0); TempTimer.setPrescaleFactor(TEMP_TIMER_PRESCALE); TempTimer.setOverflow(0xFFFF); - TempTimer.setCompare (TEMP_TIMER_CHAN, ((F_CPU / TEMP_TIMER_PRESCALE) / frequency)); + TempTimer.setCompare(TEMP_TIMER_CHAN, (F_CPU) / (TEMP_TIMER_PRESCALE) / frequency); TempTimer.refresh(); TempTimer.resume(); break; } } -void HAL_timer_enable_interrupt (uint8_t timer_num) { +void HAL_timer_enable_interrupt(uint8_t timer_num) { switch (timer_num) { case STEP_TIMER_NUM: StepperTimer.attachInterrupt(STEP_TIMER_CHAN, stepTC_Handler); @@ -129,7 +129,7 @@ void HAL_timer_enable_interrupt (uint8_t timer_num) { } } -void HAL_timer_disable_interrupt (uint8_t timer_num) { +void HAL_timer_disable_interrupt(uint8_t timer_num) { switch (timer_num) { case STEP_TIMER_NUM: StepperTimer.detachInterrupt(STEP_TIMER_CHAN); diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h index ab12de81f..e48ea5460 100644 --- a/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h @@ -59,7 +59,7 @@ #define HAL_TIMER_RATE (FTM0_TIMER_RATE) #define HAL_STEPPER_TIMER_RATE HAL_TIMER_RATE -#define HAL_TICKS_PER_US (HAL_STEPPER_TIMER_RATE/1000000) +#define HAL_TICKS_PER_US ((HAL_STEPPER_TIMER_RATE) / 1000000) #define TEMP_TIMER_FREQUENCY 1000 diff --git a/Marlin/src/gcode/config/M43.cpp b/Marlin/src/gcode/config/M43.cpp index 225843017..e3f2021f5 100644 --- a/Marlin/src/gcode/config/M43.cpp +++ b/Marlin/src/gcode/config/M43.cpp @@ -224,7 +224,7 @@ inline void servo_probe_test() { * - Machine continues to operate * - Reports changes to endstops * - Toggles LED_PIN when an endstop changes - * - Can not reliably catch the 5mS pulse from BLTouch type probes + * - Cannot reliably catch the 5mS pulse from BLTouch type probes * * M43 T - Toggle pin(s) and report which pin is being toggled * S - Start Pin number. If not given, will default to 0 diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 15a3e1e54..c86a665b0 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -207,7 +207,7 @@ /** * Hidden options for developer */ - // Double stepping start from STEP_DOUBLER_FREQUENCY + 1, quad stepping start from STEP_DOUBLER_FREQUENCY * 2 + 1 + // Double stepping starts at STEP_DOUBLER_FREQUENCY + 1, quad stepping starts at STEP_DOUBLER_FREQUENCY * 2 + 1 #ifndef STEP_DOUBLER_FREQUENCY #if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE) #define STEP_DOUBLER_FREQUENCY 60000 // Hz diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index d4f198c18..bf3c16497 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -303,10 +303,9 @@ class Stepper { #ifdef CPU_32_BIT // In case of high-performance processor, it is able to calculate in real-time - timer = (uint32_t)(HAL_STEPPER_TIMER_RATE) / step_rate; - if (timer < (HAL_STEPPER_TIMER_RATE / (STEP_DOUBLER_FREQUENCY * 2))) { // (STEP_DOUBLER_FREQUENCY * 2 kHz - this should never happen) - timer = (HAL_STEPPER_TIMER_RATE / (STEP_DOUBLER_FREQUENCY * 2)); - } + constexpr uint32_t MIN_TIME_PER_STEP = (HAL_STEPPER_TIMER_RATE) / ((STEP_DOUBLER_FREQUENCY) * 2); + timer = uint32_t(HAL_STEPPER_TIMER_RATE) / step_rate; + NOLESS(timer, MIN_TIME_PER_STEP); // (STEP_DOUBLER_FREQUENCY * 2 kHz - this should never happen) #else NOLESS(step_rate, F_CPU / 500000); step_rate -= F_CPU / 500000; // Correct for minimal speed