From 3701869e6cdf3fe24b44da8a606575cf4764f872 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 3 Jun 2018 01:43:00 -0500 Subject: [PATCH] Add HAL_timer_start for AVR, use stepper timer to time pulses --- Marlin/src/HAL/HAL_AVR/HAL.cpp | 10 +++++---- Marlin/src/HAL/HAL_AVR/HAL.h | 35 ++++++++++++++++++++++++++++--- Marlin/src/module/stepper.cpp | 23 ++------------------ Marlin/src/module/temperature.cpp | 9 +------- 4 files changed, 41 insertions(+), 36 deletions(-) diff --git a/Marlin/src/HAL/HAL_AVR/HAL.cpp b/Marlin/src/HAL/HAL_AVR/HAL.cpp index 9c69b90a8..58ee84cbd 100644 --- a/Marlin/src/HAL/HAL_AVR/HAL.cpp +++ b/Marlin/src/HAL/HAL_AVR/HAL.cpp @@ -34,6 +34,7 @@ // -------------------------------------------------------------------------- #include "../../inc/MarlinConfig.h" +#include "HAL.h" // -------------------------------------------------------------------------- // Externals @@ -74,9 +75,11 @@ // -------------------------------------------------------------------------- #if ENABLED(SDSUPPORT) + #include "../../sd/SdFatUtil.h" int freeMemory() { return SdFatUtil::FreeRam(); } -#else + +#else // !SDSUPPORT extern "C" { extern char __bss_end; @@ -93,7 +96,6 @@ extern "C" { } } -#endif //!SDSUPPORT - -#endif +#endif // !SDSUPPORT +#endif // __AVR__ diff --git a/Marlin/src/HAL/HAL_AVR/HAL.h b/Marlin/src/HAL/HAL_AVR/HAL.h index 4b84cf5ac..37fe65ff8 100644 --- a/Marlin/src/HAL/HAL_AVR/HAL.h +++ b/Marlin/src/HAL/HAL_AVR/HAL.h @@ -124,7 +124,7 @@ extern "C" { #define STEP_TIMER_NUM 1 #define TEMP_TIMER_NUM 0 -#define PULSE_TIMER_NUM TEMP_TIMER_NUM +#define PULSE_TIMER_NUM STEP_TIMER_NUM #define HAL_STEPPER_TIMER_RATE HAL_TIMER_RATE #define HAL_TICKS_PER_US ((HAL_STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double @@ -139,7 +139,7 @@ extern "C" { #define TIMER_OCR_0 OCR0A #define TIMER_COUNTER_0 TCNT0 -#define PULSE_TIMER_PRESCALE 8 +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE #define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A) #define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A) @@ -149,7 +149,36 @@ extern "C" { #define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0B) #define TEMPERATURE_ISR_ENABLED() TEST(TIMSK0, OCIE0B) -#define HAL_timer_start(timer_num, frequency) +FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + UNUSED(frequency); + switch (timer_num) { + case STEP_TIMER_NUM: + // waveform generation = 0100 = CTC + SET_WGM(1, CTC_OCRnA); + + // output mode = 00 (disconnected) + SET_COMA(1, NORMAL); + + // 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 + // sure to regenerate speed_lookuptable.h with + // create_speed_lookuptable.py + SET_CS(1, PRESCALER_8); // CS 2 = 1/8 prescaler + + // Init Stepper ISR to 122 Hz for quick starting + // (F_CPU) / (STEPPER_TIMER_PRESCALE) / frequency + OCR1A = 0x4000; + TCNT1 = 0; + break; + + case TEMP_TIMER_NUM: + // Use timer0 for temperature measurement + // Interleave temperature interrupt with millies interrupt + OCR0B = 128; + break; + } +} #define _CAT(a, ...) a ## __VA_ARGS__ #define HAL_timer_set_compare(timer, compare) (_CAT(TIMER_OCR_, timer) = compare) diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index e4e42eda2..6f21d84aa 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -1993,27 +1993,8 @@ void Stepper::init() { E_AXIS_INIT(4); #endif - #ifdef __AVR__ - // waveform generation = 0100 = CTC - SET_WGM(1, CTC_OCRnA); - - // output mode = 00 (disconnected) - SET_COMA(1, NORMAL); - - // 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 - // sure to regenerate speed_lookuptable.h with - // create_speed_lookuptable.py - SET_CS(1, PRESCALER_8); // CS 2 = 1/8 prescaler - - // Init Stepper ISR to 122 Hz for quick starting - OCR1A = 0x4000; - TCNT1 = 0; - #else - // Init Stepper ISR to 122 Hz for quick starting - HAL_timer_start(STEP_TIMER_NUM, 122); - #endif + // Init Stepper ISR to 122 Hz for quick starting + HAL_timer_start(STEP_TIMER_NUM, 122); ENABLE_STEPPER_DRIVER_INTERRUPT(); diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index bb45dcafd..a195c86e5 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1234,14 +1234,7 @@ void Temperature::init() { HAL_ANALOG_SELECT(FILWIDTH_PIN); #endif - // todo: HAL: fix abstraction - #ifdef __AVR__ - // Use timer0 for temperature measurement - // Interleave temperature interrupt with millies interrupt - OCR0B = 128; - #else - HAL_timer_start(TEMP_TIMER_NUM, TEMP_TIMER_FREQUENCY); - #endif + HAL_timer_start(TEMP_TIMER_NUM, TEMP_TIMER_FREQUENCY); ENABLE_TEMPERATURE_INTERRUPT(); #if HAS_AUTO_FAN_0