From b8bc965414b57c4abf5e1ab80cd3d21ab2208c60 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 9 Dec 2017 20:00:10 -0600 Subject: [PATCH 1/4] General cleanup HAL timers --- Marlin/src/HAL/HAL_AVR/HAL_AVR.h | 10 +++--- Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h | 4 +-- .../src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h | 33 +++++++++---------- .../HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h | 10 +++--- Marlin/src/core/macros.h | 3 +- 5 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Marlin/src/HAL/HAL_AVR/HAL_AVR.h b/Marlin/src/HAL/HAL_AVR/HAL_AVR.h index 6c6b9be0b5..8c8c09b82f 100644 --- a/Marlin/src/HAL/HAL_AVR/HAL_AVR.h +++ b/Marlin/src/HAL/HAL_AVR/HAL_AVR.h @@ -100,13 +100,13 @@ extern "C" { // timers -#define STEP_TIMER_NUM OCR1A -#define TEMP_TIMER_NUM 0 -#define TEMP_TIMER_FREQUENCY (F_CPU / 64.0 / 256.0) +#define STEP_TIMER_NUM OCR1A +#define TEMP_TIMER_NUM 0 +#define TEMP_TIMER_FREQUENCY (F_CPU / 64.0 / 256.0) #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 STEPPER_TIMER_PRESCALE 8 #define HAL_TICKS_PER_US ((HAL_STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double #define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A) @@ -118,6 +118,8 @@ extern "C" { //void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); #define HAL_timer_start(timer_num,frequency) +#define HAL_timer_get_count(timer) timer + //void HAL_timer_set_count(const uint8_t timer_num, const uint16_t count); #define HAL_timer_set_count(timer, count) timer = (count) diff --git a/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h b/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h index 2d70792061..03ee584be9 100644 --- a/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h +++ b/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h @@ -87,7 +87,7 @@ extern const tTimerConfig TimerConfig[]; void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); -FORCE_INLINE static void HAL_timer_set_count(const uint8_t timer_num, const uint32_t count) { +FORCE_INLINE static void HAL_timer_set_count(const uint8_t timer_num, const hal_timer_t count) { const tTimerConfig *pConfig = &TimerConfig[timer_num]; pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC = count; } @@ -97,7 +97,7 @@ FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC; } -FORCE_INLINE static uint32_t HAL_timer_get_current_count(const uint8_t timer_num) { +FORCE_INLINE static hal_timer_t HAL_timer_get_current_count(const uint8_t timer_num) { const tTimerConfig *pConfig = &TimerConfig[timer_num]; return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_CV; } diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h b/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h index 163eb498da..f23de80c3f 100644 --- a/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h +++ b/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h @@ -51,7 +51,6 @@ typedef uint16_t hal_timer_t; #define TEMP_TIMER_NUM 2 // index of timer to use for temperature #define TEMP_TIMER_CHAN 1 // Channel of the timer to use for compare and interrupts - #define HAL_TIMER_RATE (F_CPU) // frequency of timers peripherals #define STEPPER_TIMER_PRESCALE 36 // prescaler for setting stepper timer, 2Mhz #define HAL_STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) @@ -60,11 +59,11 @@ typedef uint16_t hal_timer_t; #define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz #define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency -#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt (STEP_TIMER_NUM) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt (STEP_TIMER_NUM) +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) -#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt (TEMP_TIMER_NUM) -#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt (TEMP_TIMER_NUM) +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) #define HAL_ENABLE_ISRs() do { if (thermalManager.in_temp_isr)DISABLE_TEMPERATURE_INTERRUPT(); else ENABLE_TEMPERATURE_INTERRUPT(); ENABLE_STEPPER_DRIVER_INTERRUPT(); } while(0) // TODO change this @@ -92,7 +91,7 @@ static HardwareTimer TempTimer(TEMP_TIMER_NUM); // Public functions // -------------------------------------------------------------------------- -void HAL_timer_start (uint8_t timer_num, uint32_t frequency); +void HAL_timer_start(uint8_t timer_num, uint32_t frequency); void HAL_timer_enable_interrupt(uint8_t timer_num); void HAL_timer_disable_interrupt(uint8_t timer_num); @@ -107,26 +106,26 @@ void HAL_timer_disable_interrupt(uint8_t timer_num); * Todo: Look at that possibility later. */ -FORCE_INLINE static void HAL_timer_set_count (uint8_t timer_num, uint32_t count) { +FORCE_INLINE static void HAL_timer_set_count(const uint8_t timer_num, const hal_timer_t count) { switch (timer_num) { case STEP_TIMER_NUM: StepperTimer.pause(); - StepperTimer.setCompare (STEP_TIMER_CHAN, count); - StepperTimer.refresh (); - StepperTimer.resume (); + StepperTimer.setCompare(STEP_TIMER_CHAN, count); + StepperTimer.refresh(); + StepperTimer.resume(); break; case TEMP_TIMER_NUM: TempTimer.pause(); - TempTimer.setCompare (TEMP_TIMER_CHAN, count); - TempTimer.refresh (); - TempTimer.resume (); + TempTimer.setCompare(TEMP_TIMER_CHAN, count); + TempTimer.refresh(); + TempTimer.resume(); break; default: break; } } -FORCE_INLINE static hal_timer_t HAL_timer_get_count (uint8_t timer_num) { +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { hal_timer_t temp; switch (timer_num) { case STEP_TIMER_NUM: @@ -142,7 +141,7 @@ FORCE_INLINE static hal_timer_t HAL_timer_get_count (uint8_t timer_num) { return temp; } -FORCE_INLINE static hal_timer_t HAL_timer_get_current_count(uint8_t timer_num) { +FORCE_INLINE static hal_timer_t HAL_timer_get_current_count(const uint8_t timer_num) { hal_timer_t temp; switch (timer_num) { case STEP_TIMER_NUM: @@ -159,9 +158,9 @@ FORCE_INLINE static hal_timer_t HAL_timer_get_current_count(uint8_t timer_num) { } -//void HAL_timer_isr_prologue (uint8_t timer_num); +//void HAL_timer_isr_prologue (const uint8_t timer_num); -FORCE_INLINE static void HAL_timer_isr_prologue(uint8_t timer_num) { +FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { switch (timer_num) { case STEP_TIMER_NUM: StepperTimer.pause(); 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 65ea165615..0327ce88fd 100644 --- a/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h @@ -75,23 +75,23 @@ typedef uint32_t hal_timer_t; void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); -FORCE_INLINE static void HAL_timer_set_count(const uint8_t timer_num, const uint32_t count) { - switch(timer_num) { +FORCE_INLINE static void HAL_timer_set_count(const uint8_t timer_num, const hal_timer_t count) { + switch (timer_num) { case 0: FTM0_C0V = count; break; case 1: FTM1_C0V = count; break; } } FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { - switch(timer_num) { + switch (timer_num) { case 0: return FTM0_C0V; case 1: return FTM1_C0V; } return 0; } -FORCE_INLINE static uint32_t HAL_timer_get_current_count(const uint8_t timer_num) { - switch(timer_num) { +FORCE_INLINE static hal_timer_t HAL_timer_get_current_count(const uint8_t timer_num) { + switch (timer_num) { case 0: return FTM0_CNT; case 1: return FTM1_CNT; } diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index aed0850215..ea6ef387b5 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -44,8 +44,7 @@ #define _O3 __attribute__((optimize("O3"))) // Clock speed factors -#define CYCLES_PER_MICROSECOND (F_CPU / 1000000L) // 16 or 20 -#define INT0_PRESCALER 8 +#define CYCLES_PER_MICROSECOND (F_CPU / 1000000L) // 16 or 20 on AVR // Highly granular delays for step pulses, etc. #define DELAY_0_NOP NOOP From 82ef6b52420b47004fea9c34c6bf445157a7f9bb Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 9 Dec 2017 19:59:12 -0600 Subject: [PATCH 2/4] Add an option to specify "pulse" timer --- Marlin/src/HAL/HAL_AVR/HAL_AVR.h | 4 ++++ Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h | 3 +++ Marlin/src/HAL/HAL_LPC1768/HAL_timers.h | 3 +++ .../src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h | 3 +++ .../HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h | 3 +++ Marlin/src/module/stepper.cpp | 18 +++++++++--------- 6 files changed, 25 insertions(+), 9 deletions(-) diff --git a/Marlin/src/HAL/HAL_AVR/HAL_AVR.h b/Marlin/src/HAL/HAL_AVR/HAL_AVR.h index 8c8c09b82f..b4b908155e 100644 --- a/Marlin/src/HAL/HAL_AVR/HAL_AVR.h +++ b/Marlin/src/HAL/HAL_AVR/HAL_AVR.h @@ -109,6 +109,10 @@ extern "C" { #define STEPPER_TIMER_PRESCALE 8 #define HAL_TICKS_PER_US ((HAL_STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double +#define PULSE_TIMER_NUM TEMP_TIMER_NUM +#define TIMER_COUNTER_0 TCNT0 +#define PULSE_TIMER_PRESCALE 8 + #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 03ee584be9..c85a8a7ee3 100644 --- a/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h +++ b/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h @@ -64,6 +64,9 @@ typedef uint32_t hal_timer_t; #define HAL_STEP_TIMER_ISR void TC3_Handler() #define HAL_TEMP_TIMER_ISR void TC4_Handler() +#define PULSE_TIMER_NUM STEP_TIMER_NUM +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE + // -------------------------------------------------------------------------- // Types // -------------------------------------------------------------------------- diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL_timers.h b/Marlin/src/HAL/HAL_LPC1768/HAL_timers.h index 52ee1f7d36..fe5fb472ac 100644 --- a/Marlin/src/HAL/HAL_LPC1768/HAL_timers.h +++ b/Marlin/src/HAL/HAL_LPC1768/HAL_timers.h @@ -53,6 +53,9 @@ typedef uint32_t hal_timer_t; #define HAL_TEMP_TIMER_RATE 1000000 #define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency +#define PULSE_TIMER_NUM STEP_TIMER_NUM +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE + #define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) #define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h b/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h index f23de80c3f..85c0f18661 100644 --- a/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h +++ b/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h @@ -56,6 +56,9 @@ typedef uint16_t hal_timer_t; #define HAL_STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // 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 +#define PULSE_TIMER_NUM STEP_TIMER_NUM +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE + #define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz #define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency 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 0327ce88fd..f804ab2209 100644 --- a/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h @@ -57,6 +57,9 @@ typedef uint32_t hal_timer_t; #define STEPPER_TIMER STEP_TIMER_NUM // Alias? #define STEPPER_TIMER_PRESCALE 0 // Not defined anywhere else! +#define PULSE_TIMER_NUM STEP_TIMER_NUM +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE + #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) diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 77da0b26fd..c3f03cdbe3 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -564,7 +564,7 @@ void Stepper::isr() { * 10µs = 160 or 200 cycles. */ #if EXTRA_CYCLES_XYZE > 20 - hal_timer_t pulse_start = HAL_timer_get_current_count(STEP_TIMER_NUM); + hal_timer_t pulse_start = HAL_timer_get_current_count(PULSE_TIMER_NUM); #endif #if HAS_X_STEP @@ -596,8 +596,8 @@ void Stepper::isr() { // For minimum pulse time wait before stopping pulses #if EXTRA_CYCLES_XYZE > 20 - while (EXTRA_CYCLES_XYZE > (uint32_t)(HAL_timer_get_current_count(STEP_TIMER_NUM) - pulse_start) * (STEPPER_TIMER_PRESCALE)) { /* nada */ } - pulse_start = HAL_timer_get_current_count(STEP_TIMER_NUM); + while (EXTRA_CYCLES_XYZE > (uint32_t)(HAL_timer_get_current_count(PULSE_TIMER_NUM) - pulse_start) * (PULSE_TIMER_PRESCALE)) { /* nada */ } + pulse_start = HAL_timer_get_current_count(PULSE_TIMER_NUM); #elif EXTRA_CYCLES_XYZE > 0 DELAY_NOPS(EXTRA_CYCLES_XYZE); #endif @@ -637,7 +637,7 @@ void Stepper::isr() { // For minimum pulse time wait after stopping pulses also #if EXTRA_CYCLES_XYZE > 20 - if (i) while (EXTRA_CYCLES_XYZE > (uint32_t)(HAL_timer_get_current_count(STEP_TIMER_NUM) - pulse_start) * (STEPPER_TIMER_PRESCALE)) { /* nada */ } + if (i) while (EXTRA_CYCLES_XYZE > (uint32_t)(HAL_timer_get_current_count(PULSE_TIMER_NUM) - pulse_start) * (PULSE_TIMER_PRESCALE)) { /* nada */ } #elif EXTRA_CYCLES_XYZE > 0 if (i) DELAY_NOPS(EXTRA_CYCLES_XYZE); #endif @@ -818,7 +818,7 @@ void Stepper::isr() { for (uint8_t i = step_loops; i--;) { #if EXTRA_CYCLES_E > 20 - hal_timer_t pulse_start = HAL_timer_get_current_count(STEP_TIMER_NUM); + hal_timer_t pulse_start = HAL_timer_get_current_count(PULSE_TIMER_NUM); #endif START_E_PULSE(0); @@ -837,8 +837,8 @@ void Stepper::isr() { // For minimum pulse time wait before stopping pulses #if EXTRA_CYCLES_E > 20 - while (EXTRA_CYCLES_E > (hal_timer_t)(HAL_timer_get_current_count(STEP_TIMER_NUM) - pulse_start) * (STEPPER_TIMER_PRESCALE)) { /* nada */ } - pulse_start = HAL_timer_get_current_count(STEP_TIMER_NUM); + while (EXTRA_CYCLES_E > (hal_timer_t)(HAL_timer_get_current_count(PULSE_TIMER_NUM) - pulse_start) * (PULSE_TIMER_PRESCALE)) { /* nada */ } + pulse_start = HAL_timer_get_current_count(PULSE_TIMER_NUM); #elif EXTRA_CYCLES_E > 0 DELAY_NOPS(EXTRA_CYCLES_E); #endif @@ -859,7 +859,7 @@ void Stepper::isr() { // For minimum pulse time wait before looping #if EXTRA_CYCLES_E > 20 - if (i) while (EXTRA_CYCLES_E > (hal_timer_t)(HAL_timer_get_current_count(STEP_TIMER_NUM) - pulse_start) * (STEPPER_TIMER_PRESCALE)) { /* nada */ } + if (i) while (EXTRA_CYCLES_E > (hal_timer_t)(HAL_timer_get_current_count(PULSE_TIMER_NUM) - pulse_start) * (PULSE_TIMER_PRESCALE)) { /* nada */ } #elif EXTRA_CYCLES_E > 0 if (i) DELAY_NOPS(EXTRA_CYCLES_E); #endif @@ -1299,7 +1299,7 @@ void Stepper::report_positions() { #if EXTRA_CYCLES_BABYSTEP > 20 #define _SAVE_START const hal_timer_t pulse_start = HAL_timer_get_current_count(STEP_TIMER_NUM) - #define _PULSE_WAIT while (EXTRA_CYCLES_BABYSTEP > (uint32_t)(HAL_timer_get_current_count(STEP_TIMER_NUM) - pulse_start) * (STEPPER_TIMER_PRESCALE)) { /* nada */ } + #define _PULSE_WAIT while (EXTRA_CYCLES_BABYSTEP > (uint32_t)(HAL_timer_get_current_count(STEP_TIMER_NUM) - pulse_start) * (PULSE_TIMER_PRESCALE)) { /* nada */ } #else #define _SAVE_START NOOP #if EXTRA_CYCLES_BABYSTEP > 0 From 6149b82119d2bedc8197e18f034f58210f633025 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 9 Dec 2017 19:57:25 -0600 Subject: [PATCH 3/4] Allow setting current timer counter --- Marlin/src/HAL/HAL_AVR/HAL_AVR.h | 33 ++++++++++--------- Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h | 5 +++ Marlin/src/HAL/HAL_LPC1768/HAL_timers.h | 7 ++++ .../src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h | 8 ++++- .../HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h | 7 ++++ 5 files changed, 44 insertions(+), 16 deletions(-) diff --git a/Marlin/src/HAL/HAL_AVR/HAL_AVR.h b/Marlin/src/HAL/HAL_AVR/HAL_AVR.h index b4b908155e..2d59323051 100644 --- a/Marlin/src/HAL/HAL_AVR/HAL_AVR.h +++ b/Marlin/src/HAL/HAL_AVR/HAL_AVR.h @@ -100,17 +100,23 @@ extern "C" { // timers -#define STEP_TIMER_NUM OCR1A -#define TEMP_TIMER_NUM 0 -#define TEMP_TIMER_FREQUENCY (F_CPU / 64.0 / 256.0) - #define HAL_TIMER_RATE ((F_CPU) / 8) // i.e., 2MHz or 2.5MHz +#define HAL_TICKS_PER_US ((HAL_STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double + +#define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0) + #define HAL_STEPPER_TIMER_RATE HAL_TIMER_RATE #define STEPPER_TIMER_PRESCALE 8 -#define HAL_TICKS_PER_US ((HAL_STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double -#define PULSE_TIMER_NUM TEMP_TIMER_NUM +#define STEP_TIMER_NUM 1 +#define TIMER_OCR_1 OCR1A +#define TIMER_COUNTER_1 TCNT1 + +#define TEMP_TIMER_NUM 0 +#define TIMER_OCR_0 OCR0A #define TIMER_COUNTER_0 TCNT0 + +#define PULSE_TIMER_NUM TEMP_TIMER_NUM #define PULSE_TIMER_PRESCALE 8 #define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A) @@ -119,17 +125,14 @@ extern "C" { #define ENABLE_TEMPERATURE_INTERRUPT() SBI(TIMSK0, OCIE0B) #define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0B) -//void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); -#define HAL_timer_start(timer_num,frequency) - -#define HAL_timer_get_count(timer) timer - -//void HAL_timer_set_count(const uint8_t timer_num, const uint16_t count); -#define HAL_timer_set_count(timer, count) timer = (count) +#define HAL_timer_start(timer_num, frequency) -#define HAL_timer_get_current_count(timer) timer +#define _CAT(a, ...) a ## __VA_ARGS__ +#define HAL_timer_set_count(timer, count) (_CAT(TIMER_OCR_, timer) = count) +#define HAL_timer_get_count(timer) _CAT(TIMER_OCR_, timer) +#define HAL_timer_set_current_count(timer, count) (_CAT(TIMER_COUNTER_, timer) = count) +#define HAL_timer_get_current_count(timer) _CAT(TIMER_COUNTER_, timer) -//void HAL_timer_isr_prologue(const uint8_t timer_num); #define HAL_timer_isr_prologue(timer_num) #define HAL_STEP_TIMER_ISR ISR(TIMER1_COMPA_vect) diff --git a/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h b/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h index c85a8a7ee3..b93e80b7d6 100644 --- a/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h +++ b/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h @@ -100,6 +100,11 @@ FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC; } +FORCE_INLINE static void HAL_timer_set_current_count(const uint8_t timer_num, const hal_timer_t count) { + const tTimerConfig *pConfig = &TimerConfig[timer_num]; + pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_CV = count; +} + FORCE_INLINE static hal_timer_t HAL_timer_get_current_count(const uint8_t timer_num) { const tTimerConfig *pConfig = &TimerConfig[timer_num]; return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_CV; diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL_timers.h b/Marlin/src/HAL/HAL_LPC1768/HAL_timers.h index fe5fb472ac..15085efa60 100644 --- a/Marlin/src/HAL/HAL_LPC1768/HAL_timers.h +++ b/Marlin/src/HAL/HAL_LPC1768/HAL_timers.h @@ -103,6 +103,13 @@ FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { return 0; } +FORCE_INLINE static void HAL_timer_set_current_count(const uint8_t timer_num, const hal_timer_t count) { + switch (timer_num) { + case 0: LPC_TIM0->TC = count; break; + case 1: LPC_TIM1->TC = count; break; + } +} + FORCE_INLINE static hal_timer_t HAL_timer_get_current_count(const uint8_t timer_num) { switch (timer_num) { case 0: return LPC_TIM0->TC; diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h b/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h index 85c0f18661..541a214a7a 100644 --- a/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h +++ b/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h @@ -144,6 +144,13 @@ FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { return temp; } +FORCE_INLINE static void HAL_timer_set_current_count(const uint8_t timer_num, const hal_timer_t count) { + switch (timer_num) { + case STEP_TIMER_NUM: StepperTimer.setCount(count); break; + case TEMP_TIMER_NUM: TempTimer.setCount(count); break; + } +} + FORCE_INLINE static hal_timer_t HAL_timer_get_current_count(const uint8_t timer_num) { hal_timer_t temp; switch (timer_num) { @@ -160,7 +167,6 @@ FORCE_INLINE static hal_timer_t HAL_timer_get_current_count(const uint8_t timer_ return temp; } - //void HAL_timer_isr_prologue (const uint8_t timer_num); FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { 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 f804ab2209..3675ea60bd 100644 --- a/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h @@ -93,6 +93,13 @@ FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { return 0; } +FORCE_INLINE static void HAL_timer_set_current_count(const uint8_t timer_num, const hal_timer_t count) { + switch (timer_num) { + case 0: FTM0_CNT = count; + case 1: FTM1_CNT = count; + } +} + FORCE_INLINE static hal_timer_t HAL_timer_get_current_count(const uint8_t timer_num) { switch (timer_num) { case 0: return FTM0_CNT; From 5cf6a062e315e7c0936f60ba6bf11d7f8fb1f20c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 9 Dec 2017 18:41:15 -0600 Subject: [PATCH 4/4] Reset timer count before first block step --- Marlin/src/module/stepper.cpp | 21 +++++++++++++++------ Marlin/src/module/stepper.h | 3 --- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index c3f03cdbe3..cbb227d936 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -408,10 +408,13 @@ void Stepper::isr() { } // If there is no current block, attempt to pop one from the buffer + bool first_step = false; if (!current_block) { // Anything in the buffer? if ((current_block = planner.get_current_block())) { trapezoid_generator_reset(); + HAL_timer_set_current_count(STEP_TIMER_NUM, 0); + first_step = true; // Initialize Bresenham counters to 1/2 the ceiling counter_X = counter_Y = counter_Z = counter_E = -(current_block->step_event_count >> 1); @@ -666,12 +669,18 @@ void Stepper::isr() { // Calculate new timer value if (step_events_completed <= (uint32_t)current_block->accelerate_until) { - #ifdef CPU_32_BIT - MultiU32X24toH32(acc_step_rate, acceleration_time, current_block->acceleration_rate); - #else - MultiU24X32toH16(acc_step_rate, acceleration_time, current_block->acceleration_rate); - #endif - acc_step_rate += current_block->initial_rate; + if (first_step) { + acc_step_rate = current_block->initial_rate; + acceleration_time = 0; + } + else { + #ifdef CPU_32_BIT + MultiU32X24toH32(acc_step_rate, acceleration_time, current_block->acceleration_rate); + #else + MultiU24X32toH16(acc_step_rate, acceleration_time, current_block->acceleration_rate); + #endif + acc_step_rate += current_block->initial_rate; + } // upper limit NOMORE(acc_step_rate, current_block->nominal_rate); diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index b15d699872..b1e73bf053 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -362,9 +362,6 @@ class Stepper { OCR1A_nominal = calc_timer_interval(current_block->nominal_rate); // make a note of the number of step loops required at nominal speed step_loops_nominal = step_loops; - acc_step_rate = current_block->initial_rate; - acceleration_time = calc_timer_interval(acc_step_rate); - _NEXT_ISR(acceleration_time); #if ENABLED(LIN_ADVANCE) if (current_block->use_advance_lead) {