- 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;
}
}
+5 -4
View File
@@ -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;
}
+15 -2
View File
@@ -5,12 +5,25 @@
* Author: jens
*/
#include <avr/io.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#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);
+3 -1
View File
@@ -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);
@@ -10,12 +10,12 @@
<CVariant></CVariant>
<CVendor>Atmel</CVendor>
<CVersion>1.2.0</CVersion>
<DefaultRepoPath>D:/Program Files (x86)\Atmel\Studio\7.0\Packs</DefaultRepoPath>
<DefaultRepoPath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs</DefaultRepoPath>
<DependentComponents xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
<Description></Description>
<Files xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<d4p1:anyType i:type="FileInfo">
<AbsolutePath>D:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.150\include</AbsolutePath>
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\include</AbsolutePath>
<Attribute></Attribute>
<Category>include</Category>
<Condition>C</Condition>
@@ -26,7 +26,7 @@
<SourcePath></SourcePath>
</d4p1:anyType>
<d4p1:anyType i:type="FileInfo">
<AbsolutePath>D:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.150\include\avr\iom328p.h</AbsolutePath>
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\include\avr\iom328p.h</AbsolutePath>
<Attribute></Attribute>
<Category>header</Category>
<Condition>C</Condition>
@@ -37,7 +37,7 @@
<SourcePath></SourcePath>
</d4p1:anyType>
<d4p1:anyType i:type="FileInfo">
<AbsolutePath>D:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.150\templates\main.c</AbsolutePath>
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\templates\main.c</AbsolutePath>
<Attribute>template</Attribute>
<Category>source</Category>
<Condition>C Exe</Condition>
@@ -48,7 +48,7 @@
<SourcePath></SourcePath>
</d4p1:anyType>
<d4p1:anyType i:type="FileInfo">
<AbsolutePath>D:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.150\templates\main.cpp</AbsolutePath>
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\templates\main.cpp</AbsolutePath>
<Attribute>template</Attribute>
<Category>source</Category>
<Condition>C Exe</Condition>
@@ -59,7 +59,7 @@
<SourcePath></SourcePath>
</d4p1:anyType>
<d4p1:anyType i:type="FileInfo">
<AbsolutePath>D:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.150\gcc\dev\atmega328p</AbsolutePath>
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega328p</AbsolutePath>
<Attribute></Attribute>
<Category>libraryPrefix</Category>
<Condition>GCC</Condition>
@@ -71,8 +71,8 @@
</d4p1:anyType>
</Files>
<PackName>ATmega_DFP</PackName>
<PackPath>D:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.2.150/Atmel.ATmega_DFP.pdsc</PackPath>
<PackVersion>1.2.150</PackVersion>
<PackPath>C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.2.209/Atmel.ATmega_DFP.pdsc</PackPath>
<PackVersion>1.2.209</PackVersion>
<PresentInProject>true</PresentInProject>
<ReferenceConditionId>ATmega328P</ReferenceConditionId>
<RteComponents xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
+36 -36
View File
@@ -84,45 +84,45 @@
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<ToolchainSettings>
<AvrGcc>
<avrgcc.common.Device>-mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\gcc\dev\atmega328p"</avrgcc.common.Device>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>NDEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.directories.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\include</Value>
</ListValues>
</avrgcc.compiler.directories.IncludePaths>
<avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries>
<ListValues>
<Value>libm</Value>
</ListValues>
</avrgcc.linker.libraries.Libraries>
<avrgcc.assembler.general.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\include</Value>
</ListValues>
</avrgcc.assembler.general.IncludePaths>
</AvrGcc>
<avrgcc.common.Device>-mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega328p"</avrgcc.common.Device>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>NDEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.directories.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value>
</ListValues>
</avrgcc.compiler.directories.IncludePaths>
<avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries>
<ListValues>
<Value>libm</Value>
</ListValues>
</avrgcc.linker.libraries.Libraries>
<avrgcc.assembler.general.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value>
</ListValues>
</avrgcc.assembler.general.IncludePaths>
</AvrGcc>
</ToolchainSettings>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<ToolchainSettings>
<AvrGcc>
<avrgcc.common.Device>-mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\gcc\dev\atmega328p"</avrgcc.common.Device>
<avrgcc.common.Device>-mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega328p"</avrgcc.common.Device>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
@@ -137,7 +137,7 @@
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.directories.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\include</Value>
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value>
</ListValues>
</avrgcc.compiler.directories.IncludePaths>
<avrgcc.compiler.optimization.level>Optimize debugging experience (-Og)</avrgcc.compiler.optimization.level>
@@ -152,7 +152,7 @@
</avrgcc.linker.libraries.Libraries>
<avrgcc.assembler.general.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\include</Value>
<Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include</Value>
</ListValues>
</avrgcc.assembler.general.IncludePaths>
<avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>