- 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
This commit is contained in:
2019-03-02 11:17:38 +00:00
parent 0bd94e6859
commit 7f6dfc2928
6 changed files with 115 additions and 116 deletions
+48 -65
View File
@@ -10,6 +10,7 @@
#include <stdlib.h>
#include <string.h>
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#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;
}
}