From 4a2ba4b7105d168932163cbd07a062fdf2ba00e9 Mon Sep 17 00:00:00 2001 From: sicarius Date: Sat, 17 Feb 2007 00:35:01 +0000 Subject: +++ enhanced framework hardware interface --- source/Concept/Framework/RoboCode.aps | 2 +- source/Concept/Framework/atmega128io.cpp | 586 ++++++++++++++++++++++++++- source/Concept/Framework/atmega128io.h | 177 +++++++- source/Concept/Framework/default/Makefile | 4 +- source/Concept/Framework/defines.h | 26 +- source/Concept/Framework/display.cpp | 1 + source/Concept/Framework/display.h | 60 +++ source/Concept/Framework/distance_sensor.cpp | 27 +- source/Concept/Framework/distance_sensor.h | 46 ++- source/Concept/Framework/dribbler.cpp | 1 + source/Concept/Framework/dribbler.h | 118 ++++++ source/Concept/Framework/engine.cpp | 2 +- source/Concept/Framework/engine.h | 32 +- source/Concept/Framework/io_module.cpp | 2 +- source/Concept/Framework/ir_sensor.cpp | 2 +- source/Concept/Framework/kicker.cpp | 2 +- source/Concept/Framework/led.cpp | 2 +- source/Concept/Framework/main.cpp | 26 ++ source/Concept/Framework/robot.cpp | 10 +- source/Concept/Framework/stdafx.h | 2 + source/Concept/Framework/tools.h | 30 +- 21 files changed, 1106 insertions(+), 52 deletions(-) create mode 100644 source/Concept/Framework/display.cpp create mode 100644 source/Concept/Framework/display.h create mode 100644 source/Concept/Framework/dribbler.cpp create mode 100644 source/Concept/Framework/dribbler.h (limited to 'source/Concept') diff --git a/source/Concept/Framework/RoboCode.aps b/source/Concept/Framework/RoboCode.aps index 3864c4f..b759997 100644 --- a/source/Concept/Framework/RoboCode.aps +++ b/source/Concept/Framework/RoboCode.aps @@ -1 +1 @@ -RoboCode16-Feb-2007 15:16:4616-Feb-2007 16:19:25241016-Feb-2007 15:16:4644, 12, 0, 462AVR GCCdefault\RoboCode.elfI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\falseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31000main.cppsensor.cpptools.cppatmega128io.cppdistance_sensor.cppengine.cppio_module.cppir_sensor.cppkicker.cppled.cpprobot.cppsensor.hstdafx.htools.hatmega128io.hdefines.hdistance_sensor.hengine.hio_module.hir_sensor.hkicker.hled.hrobot.hdefault\MakefiledefaultYESdefault\Makefileatmega128100RoboCode.elfdefault\1-Wall -gdwarf-2 -O0 -fsigned-chardefault1G:\_Tools\Winavr\bin\avr-gcc.exeG:\_Tools\Winavr\utils\bin\make.exeI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\sensor.hI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\stdafx.hI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\tools.hI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\atmega128io.hI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\defines.hI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\distance_sensor.hI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\engine.hI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\io_module.hI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\ir_sensor.hI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\kicker.hI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\led.hI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\robot.hI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\main.cppI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\sensor.cppI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\tools.cppI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\atmega128io.cppI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\distance_sensor.cppI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\engine.cppI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\io_module.cppI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\ir_sensor.cppI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\kicker.cppI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\led.cppI:\Projects\RoboCup WM 2006 07\trunk\rc2007-soccer\source\Concept\Framework\robot.cpp00000stdafx.h100001engine.h100002defines.h100003io_module.h100004robot.h100005robot.cpp100006atmega128io.h100007main.cpp100008tools.cpp100009tools.h1331 119 937 3937 24353 141 953 387123 3375 163 975 409107 8397 185 997 43116 0419 207 1019 4533 19309 97 909 34344 0353 141 953 3874 26375 163 975 4095 0397 185 997 4312 11419 207 1019 4535 11 +RoboCode16-Feb-2007 15:16:4617-Feb-2007 01:31:58241016-Feb-2007 15:16:4644, 12, 0, 462AVR GCCdefault\RoboCode.elfY:\Concept\Framework\falseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31000main.cppsensor.cpptools.cppatmega128io.cppdistance_sensor.cppengine.cppio_module.cppir_sensor.cppkicker.cppled.cpprobot.cppdribbler.cppdisplay.cppsensor.hstdafx.htools.hatmega128io.hdefines.hdistance_sensor.hengine.hio_module.hir_sensor.hkicker.hled.hrobot.hdribbler.hdisplay.hdefault\MakefiledefaultYESdefault\Makefileatmega128100RoboCode.elfdefault\1-Wall -gdwarf-2 -O0 -fsigned-chardefault1C:\WinAVR\bin\avr-gcc.exeC:\WinAVR\utils\bin\make.exeY:\Concept\Framework\sensor.hY:\Concept\Framework\stdafx.hY:\Concept\Framework\tools.hY:\Concept\Framework\atmega128io.hY:\Concept\Framework\defines.hY:\Concept\Framework\distance_sensor.hY:\Concept\Framework\engine.hY:\Concept\Framework\io_module.hY:\Concept\Framework\ir_sensor.hY:\Concept\Framework\kicker.hY:\Concept\Framework\led.hY:\Concept\Framework\robot.hY:\Concept\Framework\dribbler.hY:\Concept\Framework\display.hY:\Concept\Framework\main.cppY:\Concept\Framework\sensor.cppY:\Concept\Framework\tools.cppY:\Concept\Framework\atmega128io.cppY:\Concept\Framework\distance_sensor.cppY:\Concept\Framework\engine.cppY:\Concept\Framework\io_module.cppY:\Concept\Framework\ir_sensor.cppY:\Concept\Framework\kicker.cppY:\Concept\Framework\led.cppY:\Concept\Framework\robot.cppY:\Concept\Framework\dribbler.cppY:\Concept\Framework\display.cpp00000stdafx.h100001engine.h100002defines.h100003io_module.h100004robot.h100005robot.cpp100006atmega128io.h100007main.cpp100008tools.cpp100009tools.h100010distance_sensor.h100011ir_sensor.h100012kicker.h100013led.h100014sensor.h100015dribbler.h100016kicker.cpp100017dribbler.cpp100018ir_sensor.cpp100019io_module.cpp100020engine.cpp100021distance_sensor.cpp100022atmega128io.cpp100023led.cpp100024sensor.cpp100025display.h100026display.cpp1299 73 1025 5287 24347 137 947 38311 21369 159 969 40557 11391 181 991 42716 0413 203 1013 44919 38303 93 903 33969 15347 137 947 38318 37299 72 1025 52786 2Maximized391 181 991 4272 0413 203 1013 44936 2300 100 930 4054 19322 129 952 43423 0344 158 974 46329 0366 187 996 49258 0388 216 1018 5210 0300 100 930 40543 0344 158 974 4631 0366 187 996 4920 0388 216 1018 5219 0300 100 930 4051 0322 129 952 4341 0344 158 974 4630 28366 187 996 492463 0388 216 1018 5211 0300 100 930 4050 19303 102 933 40726 11347 160 977 4650 0 diff --git a/source/Concept/Framework/atmega128io.cpp b/source/Concept/Framework/atmega128io.cpp index cf8fb98..b1d6f4d 100644 --- a/source/Concept/Framework/atmega128io.cpp +++ b/source/Concept/Framework/atmega128io.cpp @@ -1 +1,585 @@ -#include "atmega128io.h" \ No newline at end of file +#include "atmega128io.h" + +/************************************************************************* +Title: Interrupt UART library with receive/transmit circular buffers +Author: Peter Fleury http://jump.to/fleury +File: $Id: uart.c,v 1.5.2.10 2005/11/15 19:49:12 peter Exp $ +Software: AVR-GCC 3.3 +Hardware: any AVR with built-in UART, + tested on AT90S8515 at 4 Mhz and ATmega at 1Mhz + +DESCRIPTION: + An interrupt is generated when the UART has finished transmitting or + receiving a byte. The interrupt handling routines use circular buffers + for buffering received and transmitted data. + + The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE variables define + the buffer size in bytes. Note that these variables must be a + power of 2. + +USAGE: + Refere to the header file uart.h for a description of the routines. + See also example test_uart.c. + +NOTES: + Based on Atmel Application Note AVR306 + +*************************************************************************/ +#include +#include +//#include +#include + +/* + * constants and macros + */ + +/* size of RX/TX buffers */ +#define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1) +#define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1) + +#if ( UART_RX_BUFFER_SIZE & UART_RX_BUFFER_MASK ) +#error RX buffer size is not a power of 2 +#endif +#if ( UART_TX_BUFFER_SIZE & UART_TX_BUFFER_MASK ) +#error TX buffer size is not a power of 2 +#endif + +#if defined(__AVR_AT90S2313__) \ + || defined(__AVR_AT90S4414__) || defined(__AVR_AT90S4434__) \ + || defined(__AVR_AT90S8515__) || defined(__AVR_AT90S8535__) \ + || defined(__AVR_ATmega103__) + /* old AVR classic or ATmega103 with one UART */ + #define AT90_UART + #define UART0_RECEIVE_INTERRUPT SIG_UART_RECV + #define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA + #define UART0_STATUS USR + #define UART0_CONTROL UCR + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined(__AVR_AT90S2333__) || defined(__AVR_AT90S4433__) + /* old AVR classic with one UART */ + #define AT90_UART + #define UART0_RECEIVE_INTERRUPT SIG_UART_RECV + #define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA + #define UART0_STATUS UCSRA + #define UART0_CONTROL UCSRB + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \ + || defined(__AVR_ATmega8515__) || defined(__AVR_ATmega8535__) \ + || defined(__AVR_ATmega323__) + /* ATmega with one USART */ + #define ATMEGA_USART + #define UART0_RECEIVE_INTERRUPT SIG_UART_RECV + #define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA + #define UART0_STATUS UCSRA + #define UART0_CONTROL UCSRB + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined(__AVR_ATmega163__) + /* ATmega163 with one UART */ + #define ATMEGA_UART + #define UART0_RECEIVE_INTERRUPT SIG_UART_RECV + #define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA + #define UART0_STATUS UCSRA + #define UART0_CONTROL UCSRB + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined(__AVR_ATmega162__) + /* ATmega with two USART */ + #define ATMEGA_USART0 + #define ATMEGA_USART1 + #define UART0_RECEIVE_INTERRUPT SIG_USART0_RECV + #define UART1_RECEIVE_INTERRUPT SIG_USART1_RECV + #define UART0_TRANSMIT_INTERRUPT SIG_USART0_DATA + #define UART1_TRANSMIT_INTERRUPT SIG_USART1_DATA + #define UART0_STATUS UCSR0A + #define UART0_CONTROL UCSR0B + #define UART0_DATA UDR0 + #define UART0_UDRIE UDRIE0 + #define UART1_STATUS UCSR1A + #define UART1_CONTROL UCSR1B + #define UART1_DATA UDR1 + #define UART1_UDRIE UDRIE1 +#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) + /* ATmega with two USART */ + #define ATMEGA_USART0 + #define ATMEGA_USART1 + #define UART0_RECEIVE_INTERRUPT SIG_UART0_RECV + #define UART1_RECEIVE_INTERRUPT SIG_UART1_RECV + #define UART0_TRANSMIT_INTERRUPT SIG_UART0_DATA + #define UART1_TRANSMIT_INTERRUPT SIG_UART1_DATA + #define UART0_STATUS UCSR0A + #define UART0_CONTROL UCSR0B + #define UART0_DATA UDR0 + #define UART0_UDRIE UDRIE0 + #define UART1_STATUS UCSR1A + #define UART1_CONTROL UCSR1B + #define UART1_DATA UDR1 + #define UART1_UDRIE UDRIE1 +#elif defined(__AVR_ATmega161__) + /* ATmega with UART */ + #error "AVR ATmega161 currently not supported by this libaray !" +#elif defined(__AVR_ATmega169__) + /* ATmega with one USART */ + #define ATMEGA_USART + #define UART0_RECEIVE_INTERRUPT SIG_USART_RECV + #define UART0_TRANSMIT_INTERRUPT SIG_USART_DATA + #define UART0_STATUS UCSRA + #define UART0_CONTROL UCSRB + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined(__AVR_ATmega48__) ||defined(__AVR_ATmega88__) || defined(__AVR_ATmega168__) + #define ATMEGA_USART0 + #define UART0_RECEIVE_INTERRUPT SIG_USART_RECV + #define UART0_TRANSMIT_INTERRUPT SIG_USART_DATA + #define UART0_STATUS UCSR0A + #define UART0_CONTROL UCSR0B + #define UART0_DATA UDR0 + #define UART0_UDRIE UDRIE0 +#elif defined(__AVR_ATtiny2313__) + #define ATMEGA_USART + #define UART0_RECEIVE_INTERRUPT SIG_USART0_RX + #define UART0_TRANSMIT_INTERRUPT SIG_USART0_UDRE + #define UART0_STATUS UCSRA + #define UART0_CONTROL UCSRB + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#else + #error "no UART definition for MCU available" +#endif + + +/* + * module global variables + */ +static volatile unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE]; +static volatile unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE]; +static volatile unsigned char UART_TxHead; +static volatile unsigned char UART_TxTail; +static volatile unsigned char UART_RxHead; +static volatile unsigned char UART_RxTail; +static volatile unsigned char UART_LastRxError; + +#if defined( ATMEGA_USART1 ) +static volatile unsigned char UART1_TxBuf[UART_TX_BUFFER_SIZE]; +static volatile unsigned char UART1_RxBuf[UART_RX_BUFFER_SIZE]; +static volatile unsigned char UART1_TxHead; +static volatile unsigned char UART1_TxTail; +static volatile unsigned char UART1_RxHead; +static volatile unsigned char UART1_RxTail; +static volatile unsigned char UART1_LastRxError; +#endif + + + +SIGNAL(UART0_RECEIVE_INTERRUPT) +/************************************************************************* +Function: UART Receive Complete interrupt +Purpose: called when the UART has received a character +**************************************************************************/ +{ + unsigned char tmphead; + unsigned char data; + unsigned char usr; + unsigned char lastRxError; + + + /* read UART status register and UART data register */ + usr = UART0_STATUS; + data = UART0_DATA; + + /* */ +#if defined( AT90_UART ) + lastRxError = (usr & (_BV(FE)|_BV(DOR)) ); +#elif defined( ATMEGA_USART ) + lastRxError = (usr & (_BV(FE)|_BV(DOR)) ); +#elif defined( ATMEGA_USART0 ) + lastRxError = (usr & (_BV(FE0)|_BV(DOR0)) ); +#elif defined ( ATMEGA_UART ) + lastRxError = (usr & (_BV(FE)|_BV(DOR)) ); +#endif + + /* calculate buffer index */ + tmphead = ( UART_RxHead + 1) & UART_RX_BUFFER_MASK; + + if ( tmphead == UART_RxTail ) { + /* error: receive buffer overflow */ + lastRxError = UART_BUFFER_OVERFLOW >> 8; + }else{ + /* store new index */ + UART_RxHead = tmphead; + /* store received data in buffer */ + UART_RxBuf[tmphead] = data; + } + UART_LastRxError = lastRxError; +} + + +SIGNAL(UART0_TRANSMIT_INTERRUPT) +/************************************************************************* +Function: UART Data Register Empty interrupt +Purpose: called when the UART is ready to transmit the next byte +**************************************************************************/ +{ + unsigned char tmptail; + + + if ( UART_TxHead != UART_TxTail) { + /* calculate and store new buffer index */ + tmptail = (UART_TxTail + 1) & UART_TX_BUFFER_MASK; + UART_TxTail = tmptail; + /* get one byte from buffer and write it to UART */ + UART0_DATA = UART_TxBuf[tmptail]; /* start transmission */ + }else{ + /* tx buffer empty, disable UDRE interrupt */ + UART0_CONTROL &= ~_BV(UART0_UDRIE); + } +} + + +/************************************************************************* +Function: uart_init() +Purpose: initialize UART and set baudrate +Input: baudrate using macro UART_BAUD_SELECT() +Returns: none +**************************************************************************/ +void uart_init(unsigned int baudrate) +{ + UART_TxHead = 0; + UART_TxTail = 0; + UART_RxHead = 0; + UART_RxTail = 0; + +#if defined( AT90_UART ) + /* set baud rate */ + UBRR = (unsigned char)baudrate; + + /* enable UART receiver and transmmitter and receive complete interrupt */ + UART0_CONTROL = _BV(RXCIE)|_BV(RXEN)|_BV(TXEN); + +#elif defined (ATMEGA_USART) + /* Set baud rate */ + if ( baudrate & 0x8000 ) + { + UART0_STATUS = (1<>8); + UBRRL = (unsigned char) baudrate; + + /* Enable USART receiver and transmitter and receive complete interrupt */ + UART0_CONTROL = _BV(RXCIE)|(1<>8); + UBRR0L = (unsigned char) baudrate; + + /* Enable USART receiver and transmitter and receive complete interrupt */ + UART0_CONTROL = _BV(RXCIE0)|(1<>8); + UBRR = (unsigned char) baudrate; + + /* Enable UART receiver and transmitter and receive complete interrupt */ + UART0_CONTROL = _BV(RXCIE)|(1<> 8; + }else{ + /* store new index */ + UART1_RxHead = tmphead; + /* store received data in buffer */ + UART1_RxBuf[tmphead] = data; + } + UART1_LastRxError = lastRxError; +} + + +SIGNAL(UART1_TRANSMIT_INTERRUPT) +/************************************************************************* +Function: UART1 Data Register Empty interrupt +Purpose: called when the UART1 is ready to transmit the next byte +**************************************************************************/ +{ + unsigned char tmptail; + + + if ( UART1_TxHead != UART1_TxTail) { + /* calculate and store new buffer index */ + tmptail = (UART1_TxTail + 1) & UART_TX_BUFFER_MASK; + UART1_TxTail = tmptail; + /* get one byte from buffer and write it to UART */ + UART1_DATA = UART1_TxBuf[tmptail]; /* start transmission */ + }else{ + /* tx buffer empty, disable UDRE interrupt */ + UART1_CONTROL &= ~_BV(UART1_UDRIE); + } +} + + +/************************************************************************* +Function: uart1_init() +Purpose: initialize UART1 and set baudrate +Input: baudrate using macro UART_BAUD_SELECT() +Returns: none +**************************************************************************/ +void uart1_init(unsigned int baudrate) +{ + UART1_TxHead = 0; + UART1_TxTail = 0; + UART1_RxHead = 0; + UART1_RxTail = 0; + + + /* Set baud rate */ + if ( baudrate & 0x8000 ) + { + UART1_STATUS = (1<>8); + UBRR1L = (unsigned char) baudrate; + + /* Enable USART receiver and transmitter and receive complete interrupt */ + UART1_CONTROL = _BV(RXCIE1)|(1< #include -namespace hardware -{ +/************************************************************************ +Title: Interrupt UART library with receive/transmit circular buffers +Author: Peter Fleury http://jump.to/fleury +File: $Id: uart.h,v 1.7.2.5 2005/08/14 11:25:41 Peter Exp $ +Software: AVR-GCC 3.3 +Hardware: any AVR with built-in UART, tested on AT90S8515 at 4 Mhz +Usage: see Doxygen manual +************************************************************************/ + +/** + * @defgroup pfleury_uart UART Library + * @code #include @endcode + * + * @brief Interrupt UART library using the built-in UART with transmit and receive circular buffers. + * + * This library can be used to transmit and receive data through the built in UART. + * + * An interrupt is generated when the UART has finished transmitting or + * receiving a byte. The interrupt handling routines use circular buffers + * for buffering received and transmitted data. + * + * The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE constants define + * the size of the circular buffers in bytes. Note that these constants must be a power of 2. + * You may need to adapt this constants to your target and your application by adding + * CDEFS += -DUART_RX_BUFFER_SIZE=nn -DUART_RX_BUFFER_SIZE=nn to your Makefile. + * + * @note Based on Atmel Application Note AVR306 + * @author Peter Fleury pfleury@gmx.ch http://jump.to/fleury + */ + +/**@{*/ + + +#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304 +#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !" +#endif + + +/* +** constants and macros +*/ + +/** @brief UART Baudrate Expression + * @param xtalcpu system clock in Mhz, e.g. 4000000L for 4Mhz + * @param baudrate baudrate in bps, e.g. 1200, 2400, 9600 + */ +#define UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu)/((baudRate)*16l)-1) + +/** @brief UART Baudrate Expression for ATmega double speed mode + * @param xtalcpu system clock in Mhz, e.g. 4000000L for 4Mhz + * @param baudrate baudrate in bps, e.g. 1200, 2400, 9600 + */ +#define UART_BAUD_SELECT_DOUBLE_SPEED(baudRate,xtalCpu) (((xtalCpu)/((baudRate)*8l)-1)|0x8000) + + +/** Size of the circular receive buffer, must be power of 2 */ +#ifndef UART_RX_BUFFER_SIZE +#define UART_RX_BUFFER_SIZE 32 +#endif +/** Size of the circular transmit buffer, must be power of 2 */ +#ifndef UART_TX_BUFFER_SIZE +#define UART_TX_BUFFER_SIZE 32 +#endif + +/* test if the size of the circular buffers fits into SRAM */ +#if ( (UART_RX_BUFFER_SIZE+UART_TX_BUFFER_SIZE) >= (RAMEND-0x60 ) ) +#error "size of UART_RX_BUFFER_SIZE + UART_TX_BUFFER_SIZE larger than size of SRAM" +#endif + +/* +** high byte error return code of uart_getc() +*/ +#define UART_FRAME_ERROR 0x0800 /* Framing Error by UART */ +#define UART_OVERRUN_ERROR 0x0400 /* Overrun condition by UART */ +#define UART_BUFFER_OVERFLOW 0x0200 /* receive ringbuffer overflow */ +#define UART_NO_DATA 0x0100 /* no receive data available */ + + +/* +** function prototypes +*/ + +/** + @brief Initialize UART and set baudrate + @param baudrate Specify baudrate using macro UART_BAUD_SELECT() + @return none +*/ +extern void uart_init(unsigned int baudrate); + + +/** + * @brief Get received byte from ringbuffer + * + * Returns in the lower byte the received character and in the + * higher byte the last receive error. + * UART_NO_DATA is returned when no data is available. + * + * @param void + * @return lower byte: received byte from ringbuffer + * @return higher byte: last receive status + * - \b 0 successfully received data from UART + * - \b UART_NO_DATA + *
no receive data available + * - \b UART_BUFFER_OVERFLOW + *
Receive ringbuffer overflow. + * We are not reading the receive buffer fast enough, + * one or more received character have been dropped + * - \b UART_OVERRUN_ERROR + *
Overrun condition by UART. + * A character already present in the UART UDR register was + * not read by the interrupt handler before the next character arrived, + * one or more received characters have been dropped. + * - \b UART_FRAME_ERROR + *
Framing Error by UART + */ +extern unsigned int uart_getc(void); + + +/** + * @brief Put byte to ringbuffer for transmitting via UART + * @param data byte to be transmitted + * @return none + */ +extern void uart_putc(unsigned char data); + + +/** + * @brief Put string to ringbuffer for transmitting via UART + * + * The string is buffered by the uart library in a circular buffer + * and one character at a time is transmitted to the UART using interrupts. + * Blocks if it can not write the whole string into the circular buffer. + * + * @param s string to be transmitted + * @return none + */ +extern void uart_puts(const char *s ); + + +/** + * @brief Put string from program memory to ringbuffer for transmitting via UART. + * + * The string is buffered by the uart library in a circular buffer + * and one character at a time is transmitted to the UART using interrupts. + * Blocks if it can not write the whole string into the circular buffer. + * + * @param s program memory string to be transmitted + * @return none + * @see uart_puts_P + */ +extern void uart_puts_p(const char *s ); + +/** + * @brief Macro to automatically put a string constant into program memory + */ +#define uart_puts_P(__s) uart_puts_p(PSTR(__s)) + + + +/** @brief Initialize USART1 (only available on selected ATmegas) @see uart_init */ +extern void uart1_init(unsigned int baudrate); +/** @brief Get received byte of USART1 from ringbuffer. (only available on selected ATmega) @see uart_getc */ +extern unsigned int uart1_getc(void); +/** @brief Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_putc */ +extern void uart1_putc(unsigned char data); +/** @brief Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts */ +extern void uart1_puts(const char *s ); +/** @brief Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts_p */ +extern void uart1_puts_p(const char *s ); +/** @brief Macro to automatically put a string constant into program memory */ +#define uart1_puts_P(__s) uart1_puts_p(PSTR(__s)) -}; +/**@}*/ #endif diff --git a/source/Concept/Framework/default/Makefile b/source/Concept/Framework/default/Makefile index ca32983..20eef5c 100644 --- a/source/Concept/Framework/default/Makefile +++ b/source/Concept/Framework/default/Makefile @@ -6,14 +6,14 @@ PROJECT = RoboCode MCU = atmega128 TARGET = RoboCode.elf -CC = avr-gcc.exe +CC = avr-g++.exe ## Options common to compile, link and assembly rules COMMON = -mmcu=$(MCU) ## Compile options common for all C compilation units. CFLAGS = $(COMMON) -CFLAGS += -Wall -gdwarf-2 -O0 +CFLAGS += -Wall -gdwarf-2 -DF_CPU=16000000ULUL -O3 -fsigned-char CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d ## Assembly specific flags diff --git a/source/Concept/Framework/defines.h b/source/Concept/Framework/defines.h index 1b14aa7..1e25ba5 100644 --- a/source/Concept/Framework/defines.h +++ b/source/Concept/Framework/defines.h @@ -57,6 +57,7 @@ //Constants #define SPEED_PER_PWM 1 +#define DISTANCE_PER_VALUE 1 //IO Module Names enum IOModuleNames @@ -70,13 +71,20 @@ enum IOModuleNames IO_ENGINE_DRIVE_LEFT = IO_ENGINE_START, IO_ENGINE_DRIVE_RIGHT, IO_ENGINE_DRIVE_BACK, - IO_ENGINE_DRIBBLER, IO_ENGINE_END, + //Dribbler + + IO_DRIBBLER_START = IO_ENGINE_END, + + IO_DRIBBLER_MAIN = IO_DRIBBLER_START, + + IO_DRIBBLER_END, + //Kicker - IO_KICKER_START = IO_ENGINE_END, + IO_KICKER_START = IO_DRIBBLER_END, IO_KICKER_MAIN = IO_KICKER_START, @@ -93,6 +101,10 @@ enum IOModuleNames IO_SENSOR_IR_260_DEG, IO_SENSOR_IR_300_DEG, IO_SENSOR_IR_330_DEG, + IO_SENSOR_DISTANCE_0_DEG, + IO_SENSOR_DISTANCE_90_DEG, + IO_SENSOR_DISTANCE_180_DEG, + IO_SENSOR_DISTANCE_270_DEG, IO_SENSOR_END, @@ -104,8 +116,16 @@ enum IOModuleNames IO_LED_END, + //Displays + + IO_DISPLAY_START = IO_LED_END, + + IO_DISPLAY_MAIN = IO_DISPLAY_START, + + IO_DISPLAY_END, + //General - IO_END = IO_LED_END, + IO_END = IO_DISPLAY_END, }; #endif diff --git a/source/Concept/Framework/display.cpp b/source/Concept/Framework/display.cpp new file mode 100644 index 0000000..82fbb41 --- /dev/null +++ b/source/Concept/Framework/display.cpp @@ -0,0 +1 @@ +#include "display.h" diff --git a/source/Concept/Framework/display.h b/source/Concept/Framework/display.h new file mode 100644 index 0000000..8e6e0a4 --- /dev/null +++ b/source/Concept/Framework/display.h @@ -0,0 +1,60 @@ +#ifndef _DISPLAY_H +#define _DISPLAY_H + +#include "stdafx.h" + +class Display : public IO_Module +{ +public: + Display() + { + this->parent = NULL; + this->moduleId = 0; + } + + Display(uint32 displayId) + { + this->parent = NULL; + this->moduleId = displayId; + + switch(displayId) + { + case IO_DISPLAY_MAIN: + msleep(500); + uart1_init(103);//9600 BAUD at 16MHz Atmel + sleep(2); + break; + default: + break; + } + } + +protected: + //Hardware + volatile uint8* hardwarePort; + volatile uint16* pwmSpeed; + uint8 pinForward; + uint8 pinReverse; + +public: + void Print(char* newString) + { + switch(moduleId) + { + case IO_DISPLAY_MAIN: + uart1_puts(newString); + break; + default: + break; + } + } + + void Print(int32 newInteger) + { + char buffer[12]; + ltoa(newInteger, buffer, 10); + Print(buffer); + } +}; + +#endif diff --git a/source/Concept/Framework/distance_sensor.cpp b/source/Concept/Framework/distance_sensor.cpp index a11460c..c6c0582 100644 --- a/source/Concept/Framework/distance_sensor.cpp +++ b/source/Concept/Framework/distance_sensor.cpp @@ -1 +1,26 @@ -#include "distance_sensor.h" \ No newline at end of file +#include "distance_sensor.h" + +//----------------------------------------------------------------------------- +float Distance_Sensor::GetDistance() +{ + uint32 result = 0; + + //Generate pulse + *hardwareDDR |= pin;//Set pin output + *hardwarePort |= pin;//Activate port + usleep(10);//Wait for 10µs + *hardwarePort &= ~pin;//Deactivate port + *hardwareDDR &= ~pin;//Set pin input + + //Wait for response + while(!(*hardwarePin & pin)); + + //Calculate duration of response + while(*hardwarePin & pin) + { + result++; + asm volatile("nop"); + } + + return (float(result) * DISTANCE_PER_VALUE); +} diff --git a/source/Concept/Framework/distance_sensor.h b/source/Concept/Framework/distance_sensor.h index 7690ab4..832e556 100644 --- a/source/Concept/Framework/distance_sensor.h +++ b/source/Concept/Framework/distance_sensor.h @@ -1,7 +1,7 @@ #ifndef _DISTANCE_SENSOR_H #define _DISTANCE_SENSOR_H -//#include "stdafx.h" +#include "stdafx.h" #include "sensor.h" class Distance_Sensor : public Sensor @@ -11,17 +11,61 @@ public: { this->parent = NULL; this->moduleId = 0; + this->hardwarePort = NULL; + this->hardwareDDR = NULL; + this->hardwarePin = NULL; + this->pin = 0; } Distance_Sensor(uint32 sensorId) { this->parent = NULL; this->moduleId = sensorId; + + switch(sensorId) + { + case IO_SENSOR_DISTANCE_0_DEG: + this->hardwarePort = &PORTC; + this->hardwareDDR = &DDRC; + this->hardwarePin = &PINC; + this->pin = (1 << 0); + break; + case IO_SENSOR_DISTANCE_90_DEG: + this->hardwarePort = &PORTC; + this->hardwareDDR = &DDRC; + this->hardwarePin = &PINC; + this->pin = (1 << 1); + break; + case IO_SENSOR_DISTANCE_180_DEG: + this->hardwarePort = &PORTC; + this->hardwareDDR = &DDRC; + this->hardwarePin = &PINC; + this->pin = (1 << 2); + break; + case IO_SENSOR_DISTANCE_270_DEG: + this->hardwarePort = &PORTC; + this->hardwareDDR = &DDRC; + this->hardwarePin = &PINC; + this->pin = (1 << 3); + break; + default: + this->hardwarePort = NULL; + this->hardwareDDR = NULL; + this->hardwarePin = NULL; + this->pin = 0; + break; + } } protected: + //Hardware + volatile uint8* hardwarePort; + volatile uint8* hardwareDDR; + volatile uint8* hardwarePin; + uint8 pin; public: + float GetDistance(); }; #endif diff --git a/source/Concept/Framework/dribbler.cpp b/source/Concept/Framework/dribbler.cpp new file mode 100644 index 0000000..20557e4 --- /dev/null +++ b/source/Concept/Framework/dribbler.cpp @@ -0,0 +1 @@ +#include "dribbler.h" diff --git a/source/Concept/Framework/dribbler.h b/source/Concept/Framework/dribbler.h new file mode 100644 index 0000000..64c045a --- /dev/null +++ b/source/Concept/Framework/dribbler.h @@ -0,0 +1,118 @@ +#ifndef _DRIBBLER_H +#define _DRIBBLER_H + +#include "stdafx.h" + +class Dribbler : public IO_Module +{ +public: + Dribbler() + { + this->enabled = false; + this->curSpeed = 0; + this->parent = NULL; + this->moduleId = 0; + this->hardwarePort = NULL; + this->portPower = NULL; + this->pinForward = 0; + this->pinReverse = 0; + this->pinPower = 0; + } + + Dribbler(uint32 dribblerId) + { + this->enabled = false; + this->curSpeed = 1.0f; + this->parent = NULL; + this->moduleId = dribblerId; + + switch(dribblerId) + { + case IO_DRIBBLER_MAIN: + this->hardwarePort = &PORTD; + this->portPower = &PORTA; + this->pinForward = (1 << 6); + this->pinReverse = (1 << 7); + this->pinPower = (1 << 5); + break; + default: + this->hardwarePort = NULL; + this->portPower = NULL; + this->pinForward = 0; + this->pinReverse = 0; + this->pinPower = 0; + break; + } + + UpdateDirection(); + } + +protected: + bool enabled; + float curSpeed; + + //Hardware + volatile uint8* hardwarePort; + volatile uint8* portPower; + uint8 pinForward; + uint8 pinReverse; + uint8 pinPower; + + void UpdateDirection() + { + if(enabled) + { + if(curSpeed > 0) + { + *hardwarePort |= pinForward; + *hardwarePort &= ~pinReverse; + } + else if(curSpeed < 0) + { + *hardwarePort |= pinReverse; + *hardwarePort &= ~pinForward; + } + else + { + *hardwarePort |= pinForward; + *hardwarePort |= pinReverse; + } + + *portPower |= pinPower; + } + else + { + *hardwarePort &= ~pinForward; + *hardwarePort &= ~pinReverse; + + *portPower &= ~pinPower; + } + } + +public: + float GetSpeed() + { + return curSpeed; + } + + void SetSpeed(float newSpeed) + { + curSpeed = newSpeed; + + UpdateDirection(); + } + + bool GetEnabled() + { + return enabled; + } + + void SetEnabled(bool newStatus) + { + enabled = newStatus; + + UpdateDirection(); + } +}; + +#endif diff --git a/source/Concept/Framework/engine.cpp b/source/Concept/Framework/engine.cpp index 11856cc..5c14c17 100644 --- a/source/Concept/Framework/engine.cpp +++ b/source/Concept/Framework/engine.cpp @@ -1 +1 @@ -#include "engine.h" \ No newline at end of file +#include "engine.h" diff --git a/source/Concept/Framework/engine.h b/source/Concept/Framework/engine.h index 2d8c409..0e7cf8c 100644 --- a/source/Concept/Framework/engine.h +++ b/source/Concept/Framework/engine.h @@ -14,10 +14,8 @@ public: this->moduleId = 0; this->hardwarePort = NULL; this->pwmSpeed = NULL; - this->pwmPort = NULL; this->pinForward = 0; this->pinReverse = 0; - this->pinPwm = 0; } Engine(uint32 engineId) @@ -26,9 +24,6 @@ public: this->curSpeed = 0; this->parent = NULL; this->moduleId = engineId; - this->pwmSpeed = NULL; - this->pwmPort = NULL; - this->pinPwm = 0; switch(engineId) { @@ -38,25 +33,18 @@ public: this->pinForward = (1 << 0); this->pinReverse = (1 << 1); break; - case IO_ENGINE_DRIVE_RIGHT: + case IO_ENGINE_DRIVE_BACK: this->hardwarePort = &PORTB; this->pwmSpeed = &OCR1B; this->pinForward = (1 << 2); this->pinReverse = (1 << 3); break; - case IO_ENGINE_DRIVE_BACK: + case IO_ENGINE_DRIVE_RIGHT: this->hardwarePort = &PORTD; this->pwmSpeed = &OCR3A; this->pinForward = (1 << 5); this->pinReverse = (1 << 4); break; - case IO_ENGINE_DRIBBLER: - this->hardwarePort = &PORTD; - this->pwmPort = &PORTA; - this->pinForward = (1 << 6); - this->pinReverse = (1 << 7); - this->pinPwm = (1 << 5); - break; default: this->hardwarePort = NULL; this->pwmSpeed = NULL; @@ -77,9 +65,6 @@ protected: volatile uint16* pwmSpeed; uint8 pinForward; uint8 pinReverse; - //Dribbler only - volatile uint8* pwmPort; - uint8 pinPwm; void UpdateDirection() { @@ -118,18 +103,7 @@ public: { curSpeed = newSpeed; - if(pwmSpeed) - { - *pwmSpeed = abs(newSpeed / SPEED_PER_PWM); - } - else if(pwmPort && (uint16)(abs(newSpeed / SPEED_PER_PWM))) - { - *pwmPort |= pinPwm; - } - else if(pwmPort) - { - *pwmPort &= ~pinPwm; - } + *pwmSpeed = abs(newSpeed / SPEED_PER_PWM); UpdateDirection(); } diff --git a/source/Concept/Framework/io_module.cpp b/source/Concept/Framework/io_module.cpp index 93f78ae..3549af5 100644 --- a/source/Concept/Framework/io_module.cpp +++ b/source/Concept/Framework/io_module.cpp @@ -1 +1 @@ -#include "io_module.h" \ No newline at end of file +#include "io_module.h" diff --git a/source/Concept/Framework/ir_sensor.cpp b/source/Concept/Framework/ir_sensor.cpp index 065143e..c34feed 100644 --- a/source/Concept/Framework/ir_sensor.cpp +++ b/source/Concept/Framework/ir_sensor.cpp @@ -6,4 +6,4 @@ uint16 IR_Sensor::GetIRIntensity() if(!parent) return 0; return parent->GetADCValue(channel); -} \ No newline at end of file +} diff --git a/source/Concept/Framework/kicker.cpp b/source/Concept/Framework/kicker.cpp index 94bd711..6670efb 100644 --- a/source/Concept/Framework/kicker.cpp +++ b/source/Concept/Framework/kicker.cpp @@ -1 +1 @@ -#include "kicker.h" \ No newline at end of file +#include "kicker.h" diff --git a/source/Concept/Framework/led.cpp b/source/Concept/Framework/led.cpp index a81aaf4..687b2db 100644 --- a/source/Concept/Framework/led.cpp +++ b/source/Concept/Framework/led.cpp @@ -1 +1 @@ -#include "led.h" \ No newline at end of file +#include "led.h" diff --git a/source/Concept/Framework/main.cpp b/source/Concept/Framework/main.cpp index d6e1d92..a3cd05c 100644 --- a/source/Concept/Framework/main.cpp +++ b/source/Concept/Framework/main.cpp @@ -13,6 +13,14 @@ int main() newEngine = NULL; } + //Init Dribbler + for(uint8 i = IO_DRIBBLER_START; i < IO_DRIBBLER_END; i++) + { + Dribbler* newDribbler = new Dribbler(i); + localRobot->AddModule(newDribbler); + newDribbler = NULL; + } + //Init Kicker for(uint8 i = IO_KICKER_START; i < IO_KICKER_END; i++) { @@ -41,6 +49,16 @@ int main() newSensor = NULL; break; } + case IO_SENSOR_DISTANCE_0_DEG: + case IO_SENSOR_DISTANCE_90_DEG: + case IO_SENSOR_DISTANCE_180_DEG: + case IO_SENSOR_DISTANCE_270_DEG: + { + Distance_Sensor* newSensor = new Distance_Sensor(i); + localRobot->AddModule(newSensor); + newSensor = NULL; + break; + } //Other cases default: { @@ -60,6 +78,14 @@ int main() newLed = NULL; } + //Init Displays + for(uint8 i = IO_DISPLAY_START; i < IO_DISPLAY_END; i++) + { + Display* newDisplay = new Display(i); + localRobot->AddModule(newDisplay); + newDisplay = NULL; + } + //Run while(true) { diff --git a/source/Concept/Framework/robot.cpp b/source/Concept/Framework/robot.cpp index f14f2f7..a051dd4 100644 --- a/source/Concept/Framework/robot.cpp +++ b/source/Concept/Framework/robot.cpp @@ -18,7 +18,7 @@ Robot::Robot() PORTC = 0; //All output except PD0+1(I2C) + 2+3(RS232) - DDRD = (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7); + DDRD = (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7); PORTD = (1 << 0) | (1 << 1);//Activate pullup at PD0+1 //PE5 for input @@ -34,12 +34,12 @@ Robot::Robot() PORTG = (1 << 0) | (1 << 1); // activate channel A+B on PWM1 at 8Bit - TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM10); - TCCR1B = (1 < enable counter + TCCR1A = (1<< COM1A1) | (1<< COM1B1) | (1<< WGM10); + TCCR1B = (1< enable counter // activate Kanal A+B on PWM3 at 8Bit - TCCR3A = (1 << COM3A1) | (1 << COM3B1) | (1 << WGM10); - TCCR3B = (1 < enable counter + TCCR3A = (1<< COM3A1) | (1<< COM3B1) | (1<< WGM10); + TCCR3B = (1< enable counter //Activate interrupt sei(); diff --git a/source/Concept/Framework/stdafx.h b/source/Concept/Framework/stdafx.h index 218b774..f48adfe 100644 --- a/source/Concept/Framework/stdafx.h +++ b/source/Concept/Framework/stdafx.h @@ -8,8 +8,10 @@ #include "atmega128io.h" #include "tools.h" #include "io_module.h" +#include "display.h" #include "sensor.h" #include "engine.h" +#include "dribbler.h" #include "kicker.h" #include "led.h" #include "distance_sensor.h" diff --git a/source/Concept/Framework/tools.h b/source/Concept/Framework/tools.h index 2af60df..6519a1b 100644 --- a/source/Concept/Framework/tools.h +++ b/source/Concept/Framework/tools.h @@ -6,6 +6,34 @@ #ifndef new void* operator new(size_t sz); void operator delete(void* p); -#endif +#endif + +inline void sleep(int sec) +{ + for (int s=0; s