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