From 7f6dfc29287cc07f60ec291320d867be0eb5e01e Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sat, 2 Mar 2019 11:17:38 +0000 Subject: [PATCH] - explicit disable wdt_disable - use switch for leaving error mode - use Uart with message fifo - fixed portGet, added PwrSwitch_in git-svn-id: http://moon:8086/svn/projects/HendiControl@33 fda53097-d464-4ada-af97-ba876c37ca34 --- Control/firmware/uart_echo/main.c | 113 ++++++++---------- Control/firmware/uart_echo/port.c | 9 +- Control/firmware/uart_echo/uart.c | 17 ++- Control/firmware/uart_echo/uart.h | 4 +- .../uart_echo/uart_echo.componentinfo.xml | 16 +-- Control/firmware/uart_echo/uart_echo.cproj | 72 +++++------ 6 files changed, 115 insertions(+), 116 deletions(-) diff --git a/Control/firmware/uart_echo/main.c b/Control/firmware/uart_echo/main.c index 0b3eb44..94a76e0 100755 --- a/Control/firmware/uart_echo/main.c +++ b/Control/firmware/uart_echo/main.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include "fifo.h" @@ -22,7 +23,6 @@ #include "mcp42x6.h" #define ARDUINO_NANO 1 -#define WITH_COMMAND_EVENTS 0 #define PRINT_PROMPT printf("\n:") #if ARDUINO_NANO @@ -40,29 +40,17 @@ static uint8_t ledState = 0; static int16_t adc_last = 0; +static int sw_in_last = 0; static Fifo messageFifo; -ISR(USART_RX_vect) -{ - uint8_t rx_data = UDR0; -#if WITH_COMMAND_EVENTS - if (rx_data == ' ') - { - Msg_t msg = {Error, rx_data}; - fifo_push(&messageFifo, &msg); - } - else if (rx_data >= '0' && rx_data <= '9') - { - Msg_t msg = {Command, rx_data}; - fifo_push(&messageFifo, &msg); - } -#endif - Msg_t msg = {Uart, rx_data}; - fifo_push(&messageFifo, &msg); -} - FILE uart_file = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); +typedef enum _eSwitch +{ + SwitchOff = 0, + SwitchOn = 1 +} Switch; + void setSwitch(int on) { const char *sw_str[2] = {"OFF", "ON"}; @@ -70,6 +58,12 @@ void setSwitch(int on) portSet(PwrSwitch_out, on != 0); } +typedef enum _ePower +{ + PowerLow = 4095, + PowerMax = 0 +} Power; + void setPower(uint16_t power) { printf("Set Power to %d\n", power); @@ -80,24 +74,27 @@ void setPower(uint16_t power) typedef enum _eState_t { - StateOff = 0, - StateNormal = 1, - StateRemote = 2, - StateError = 3, + StateNormal = 0, + StateRemote = 1, + StateError = 2, State_NumStates } State_t; int main(void) { - const char *state_str[State_NumStates] = {"Off","Normal","Remote","Error"}; + cli(); + wdt_reset(); + wdt_disable(); - State_t state = StateOff; - State_t state_next = StateOff; + const char *state_str[State_NumStates] = {"Normal","Remote","Error"}; + + State_t state = StateNormal; + State_t state_next = StateNormal; fifo_init(&messageFifo, 64, sizeof(Msg_t), "Fifo"); /* Replace with your application code */ - uart_init(BAUD_PRESCALE); + uart_init(&messageFifo, BAUD_PRESCALE); timer_init(&messageFifo, TIMER_HW_RELOAD, TimerClockSel_PS_8); adc_init(&messageFifo); i2c_init(); @@ -110,8 +107,6 @@ int main(void) size_t res = MCP47x6_write_volatile_mem(0x0000, dac_cmd, sizeof(dac_cmd)); i2c_send(0x60, I2C_WRITE, dac_cmd, res); - sei(); - char cmdStr[16]; size_t cmdStrSize = 0; PRINT_PROMPT; @@ -119,7 +114,9 @@ int main(void) // Start Timer timer_start(TIMER_GENERAL, 0); timer_start(TIMER_ADC, 0); - + setSwitch(1); + + sei(); while (1) { state_next = state; @@ -154,7 +151,6 @@ int main(void) uint16_t arg = atol(cmdStr+1); setPower(arg); timer_start(TIMER_TIMEOUT, TIMER_SW_DELAY_MS(5000)); - sei(); state_next = StateRemote; } @@ -183,15 +179,6 @@ int main(void) } break; - case Command: - { - printf("Command : %c\n", msg.data); - uint8_t dac_cmd[] = {0x00, 0x00}; // 6.2 Write Volatile Memory (C2:C0 = ‘010’) - size_t res = MCP47x6_write_volatile_dac((uint16_t)(msg.data-'0')<<8, dac_cmd, sizeof(dac_cmd)); - i2c_send(0x60, I2C_WRITE, dac_cmd, res); - } - break; - case AdcComplete: { int16_t adc_curr = adc_getData(); @@ -199,26 +186,9 @@ int main(void) { if (((adc_curr - adc_last) < -1) || ((adc_curr - adc_last) > 1)) { - - if (state == StateOff) + if (state == StateNormal) { - if (adc_curr > 2) - { - setSwitch(1); - state_next = StateNormal; - } - } - if (state == StateNormal || state == StateError) - { - if (adc_curr < 2) - { - state_next = StateOff; - setSwitch(0); - } - if (state == StateNormal) - { - setPower(adc_curr << 2); - } + setPower(adc_curr << 2); } } } @@ -260,14 +230,28 @@ int main(void) case TIMER_TIMEOUT: { printf("Timeout!\n"); - setPower(0); - setSwitch(0); + setPower(PowerLow); +// setSwitch(SwitchOff); state_next = StateError; } break; + case TIMER_ADC: { - timer_start(timer_id, TIMER_SW_DELAY_MS(50)); + timer_start(timer_id, TIMER_SW_DELAY_MS(100)); + int sw_in = portGet(PwrSwitch_in); + if (sw_in != sw_in_last) + { + printf ("PwrSwitch_in = %d\n", portGet(PwrSwitch_in)); + if (sw_in == 0) + { + if (state == StateError) + { + state_next = StateNormal; + } + } + } + sw_in_last = sw_in; adc_start_conversion(0x06); } break; @@ -275,8 +259,7 @@ int main(void) } break; - case Error: - printf("Error!!!\n"); + case NOP: break; } } diff --git a/Control/firmware/uart_echo/port.c b/Control/firmware/uart_echo/port.c index b6817de..31235c3 100644 --- a/Control/firmware/uart_echo/port.c +++ b/Control/firmware/uart_echo/port.c @@ -12,8 +12,8 @@ void port_init() { DDRB = 0x03; DDRC = 0x01; - PORTB = PORTB | 0x03; - PORTC = PORTC | 0x01; + PORTB = 0x03; + PORTC = 0x01; } @@ -30,6 +30,7 @@ const Port_t portItems[NUM_ITEMS] = {0x05, 1, 1}, {0x05, 2, 1}, {0x08, 0, 1}, + {0x06, 1, 1}, }; void portSet(int portItem, int enable) @@ -51,6 +52,6 @@ int portGet(int portItem) { uint8_t addr = portItems[portItem].port; uint8_t pin_mask = 1 << portItems[portItem].pin; - int enable = (_SFR_IO8(addr) & pin_mask) != portItems[portItem].pol; - return enable; + int enable = (_SFR_IO8(addr) & pin_mask) != pin_mask; + return enable ^ portItems[portItem].pol; } \ No newline at end of file diff --git a/Control/firmware/uart_echo/uart.c b/Control/firmware/uart_echo/uart.c index eb5d4a8..70d133b 100644 --- a/Control/firmware/uart_echo/uart.c +++ b/Control/firmware/uart_echo/uart.c @@ -5,12 +5,25 @@ * Author: jens */ -#include #include +#include +#include #include "uart.h" +#include "message.h" -void uart_init(uint16_t BAUD_PRESCALE) +static Fifo *g_pFifo = NULL; + +ISR(USART_RX_vect) { + uint8_t rx_data = UDR0; + Msg_t msg = {Uart, rx_data}; + fifo_push(g_pFifo, &msg); +} + +void uart_init(Fifo *pFifo, uint16_t BAUD_PRESCALE) +{ + g_pFifo = pFifo; + // Set baud rate UBRR0L = (uint8_t)BAUD_PRESCALE; UBRR0H = (uint8_t)(BAUD_PRESCALE >> 8); diff --git a/Control/firmware/uart_echo/uart.h b/Control/firmware/uart_echo/uart.h index 7cce928..a3df42f 100644 --- a/Control/firmware/uart_echo/uart.h +++ b/Control/firmware/uart_echo/uart.h @@ -9,7 +9,9 @@ #ifndef UART_H_ #define UART_H_ -void uart_init(uint16_t BAUD_PRESCALE); +#include "fifo.h" + +void uart_init(Fifo *pFifo, uint16_t BAUD_PRESCALE); void uart_putc(char c); int uart_putchar(char c, FILE *stream); void uart_puts(char const *str); diff --git a/Control/firmware/uart_echo/uart_echo.componentinfo.xml b/Control/firmware/uart_echo/uart_echo.componentinfo.xml index b002db6..0685a82 100755 --- a/Control/firmware/uart_echo/uart_echo.componentinfo.xml +++ b/Control/firmware/uart_echo/uart_echo.componentinfo.xml @@ -10,12 +10,12 @@ Atmel 1.2.0 - D:/Program Files (x86)\Atmel\Studio\7.0\Packs + C:/Program Files (x86)\Atmel\Studio\7.0\Packs - D:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.150\include + C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\include include C @@ -26,7 +26,7 @@ - D:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.150\include\avr\iom328p.h + C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\include\avr\iom328p.h header C @@ -37,7 +37,7 @@ - D:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.150\templates\main.c + C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\templates\main.c template source C Exe @@ -48,7 +48,7 @@ - D:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.150\templates\main.cpp + C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\templates\main.cpp template source C Exe @@ -59,7 +59,7 @@ - D:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.150\gcc\dev\atmega328p + C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega328p libraryPrefix GCC @@ -71,8 +71,8 @@ ATmega_DFP - D:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.2.150/Atmel.ATmega_DFP.pdsc - 1.2.150 + C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.2.209/Atmel.ATmega_DFP.pdsc + 1.2.209 true ATmega328P diff --git a/Control/firmware/uart_echo/uart_echo.cproj b/Control/firmware/uart_echo/uart_echo.cproj index 661d3bf..563dde8 100755 --- a/Control/firmware/uart_echo/uart_echo.cproj +++ b/Control/firmware/uart_echo/uart_echo.cproj @@ -84,45 +84,45 @@ - -mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\gcc\dev\atmega328p" - True - True - True - True - False - True - True - - - NDEBUG - - - - - %24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\include - - - Optimize for size (-Os) - True - True - True - - - libm - - - - - %24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\include - - - + -mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega328p" + True + True + True + True + False + True + True + + + NDEBUG + + + + + %24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include + + + Optimize for size (-Os) + True + True + True + + + libm + + + + + %24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include + + + - -mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\gcc\dev\atmega328p" + -mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega328p" True True True @@ -137,7 +137,7 @@ - %24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\include + %24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include Optimize debugging experience (-Og) @@ -152,7 +152,7 @@ - %24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\include + %24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include Default (-Wa,-g)