- 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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user