From 77152f9c8cfe2206301a69886fd0594f21681a8b Mon Sep 17 00:00:00 2001 From: Olaf Rempel Date: Tue, 16 Feb 2021 21:13:02 +0100 Subject: [PATCH] Working version --- ledfade.c | 12 ++-- main.c | 15 +---- pwm.c | 186 +++++++++++++++++++++++++----------------------------- timer.c | 2 +- usbcdc.c | 47 ++++++++++++-- 5 files changed, 135 insertions(+), 127 deletions(-) diff --git a/ledfade.c b/ledfade.c index dc54973..63a23c2 100644 --- a/ledfade.c +++ b/ledfade.c @@ -67,7 +67,7 @@ static uint8_t m_ledfade_timer_running; /* *********************************************************************** */ -static void ledfade_update(uint8_t channel) +static void ledfade_update(uint8_t channel, uint8_t force_event) { uint8_t update_pwm = 0; @@ -91,7 +91,7 @@ static void ledfade_update(uint8_t channel) update_pwm = 1; } - if (update_pwm) + if (update_pwm || force_event) { event_queue(EVENT_TYPE_PWM_VALUE, channel, @@ -170,7 +170,7 @@ void ledfade_event_handler(event_entry_t * p_event) break; } - ledfade_update(channel); + ledfade_update(channel, 1); } else if (p_event->type == EVENT_TYPE_LEDFADE_VALUE) { @@ -185,7 +185,7 @@ void ledfade_event_handler(event_entry_t * p_event) m_ledfade_setpoint[channel] = (LEDFADE_TABLE_SIZE -1); } - ledfade_update(channel); + ledfade_update(channel, 1); } else if ((p_event->type == EVENT_TYPE_TIMER_ELAPSED) && (p_event->num == EVENT_NUM_TIMER_LEDFADE) @@ -193,7 +193,7 @@ void ledfade_event_handler(event_entry_t * p_event) { m_ledfade_timer_running = 0; - ledfade_update(0); - ledfade_update(1); + ledfade_update(0, 0); + ledfade_update(1, 0); } } /* ledfade_event_handler */ diff --git a/main.c b/main.c index 9dc22cc..983aa42 100644 --- a/main.c +++ b/main.c @@ -46,9 +46,6 @@ void disable_wdt_timer(void) * ************************************************************************* */ int main(void) { - DDRD = (1<num == EVENT_NUM_LED_CH0) - { - PORTD &= ~(1<num == EVENT_NUM_LED_CH0) - { - PORTD |= (1< - #include "pwm.h" /* *********************************************************************** */ -#define PWM_MIN 0x0000 -#define PWM_MAX 0xFFFF - #define PWM_TIM_INIT() { \ /* enable output for OC1A, OC1B, OC3A */ \ DDRB |= (1<= PWM_CH0_MAX) + { + PWM_CH0_ON(); } else { - PWM_TIM1_DISABLE(); + PWM_CH0_PWM(value); + } + + if (PWM_CH0_CHECK()) + { + PWM_CH0_ENABLE(); + } + else + { + PWM_CH0_DISABLE(); } break; case 1: - /* disable timer if all channels are ON or OFF */ - if (PWM_TIM3_CHECK()) + if (value <= PWM_CH1_MIN) { - PWM_TIM3_ENABLE(); + PWM_CH1_OFF(); + } + else if (value >= PWM_CH1_MAX) + { + PWM_CH1_ON(); } else { - PWM_TIM3_DISABLE(); + PWM_CH1_PWM(value); + } + + if (PWM_CH1_CHECK()) + { + PWM_CH1_ENABLE(); + } + else + { + PWM_CH1_DISABLE(); + } + break; + + case 2: + if (value <= PWM_CH2_MIN) + { + PWM_CH2_OFF(); + } + else if (value >= PWM_CH2_MAX) + { + PWM_CH2_ON(); + } + else + { + PWM_CH2_PWM(value); + } + + if (PWM_CH2_CHECK()) + { + PWM_CH2_ENABLE(); + } + else + { + PWM_CH2_DISABLE(); } break; } @@ -174,10 +160,10 @@ void pwm_event_handler(event_entry_t * p_event) } /* pwm_event_handler */ -uint8_t pwm_get_sleep_mode(void) +uint8_t pwm_need_hw_clock(void) { - return !!(PWM_TIM1_RUNNING() || PWM_TIM3_RUNNING()); -} /* pwm_get_sleep_mode */ + return !!(PWM_CH0_RUNNING() || PWM_CH1_RUNNING() || PWM_CH2_RUNNING()); +} /* pwm_need_hw_clock */ void pwm_init(void) diff --git a/timer.c b/timer.c index 14a74fd..f7a7050 100644 --- a/timer.c +++ b/timer.c @@ -114,7 +114,7 @@ void timer_event_handler(event_entry_t * p_event) uint8_t timer_need_hw_clock(void) { return !!TIMER_TIM_RUNNING(); -} /* timer_get_sleep_mode */ +} /* timer_need_hw_clock */ void timer_init(void) diff --git a/usbcdc.c b/usbcdc.c index 689aecf..6ff47ea 100644 --- a/usbcdc.c +++ b/usbcdc.c @@ -293,15 +293,48 @@ void usbcdc_task(void) if (CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface)) { uint8_t cmd = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); - uint16_t value = 0; - if ((cmd >= '1') && (cmd <= '8')) + switch (cmd) { - value = ((cmd - '0') * 0x2000) -1; - } + /* turn off fan */ + case '0': + event_queue(EVENT_TYPE_PWM_VALUE, EVENT_NUM_PWM_CH2, 0x00); + break; - event_queue(EVENT_TYPE_PWM_VALUE, - EVENT_NUM_PWM_CH2, - value); + /* turn on fan, ~50% (12V) */ + case '1': + event_queue(EVENT_TYPE_PWM_VALUE, EVENT_NUM_PWM_CH2, 0x58); + break; + + /* turn on fan, ~75% (18V) */ + case '2': + event_queue(EVENT_TYPE_PWM_VALUE, EVENT_NUM_PWM_CH2, 0xC0); + break; + + /* turn on fan, 100% (24V) */ + case '3': + event_queue(EVENT_TYPE_PWM_VALUE, EVENT_NUM_PWM_CH2, 0xFF); + break; + + /* turn off LEDs */ + case 'a': + event_queue(EVENT_TYPE_LEDFADE_VALUE, EVENT_NUM_LED_CH0, 0); + break; + + /* turn on LEDs */ + case 'b': + event_queue(EVENT_TYPE_LEDFADE_VALUE, EVENT_NUM_LED_CH0, 0x50); + break; + + /* turn on LEDs */ + case 'c': + event_queue(EVENT_TYPE_LEDFADE_VALUE, EVENT_NUM_LED_CH0, 0x70); + break; + + /* turn on LEDs, 100% */ + case 'd': + event_queue(EVENT_TYPE_LEDFADE_VALUE, EVENT_NUM_LED_CH0, 0x80); + break; + } } }