summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2012-07-10 17:41:51 +0200
committerFlorian Bruhin <me@the-compiler.org>2012-07-10 17:41:51 +0200
commit17f366268538db66ee812b09cd0ee7d3f4294c0c (patch)
tree5b78d7067439d879b620515446f12105541c4d79
parentdb146ea98b0a673fe9fd3504f353e87b2e49a31e (diff)
downloadschreimaschine-17f366268538db66ee812b09cd0ee7d3f4294c0c.tar.gz
schreimaschine-17f366268538db66ee812b09cd0ee7d3f4294c0c.zip
Add microcontroller sources
-rwxr-xr-xatmega/default/Makefile80
-rwxr-xr-xatmega/schreimaschine.aps1
-rwxr-xr-xatmega/schreimaschine.aws1
-rwxr-xr-xatmega/schreimaschine.c202
-rwxr-xr-xatmega/uart.c651
-rwxr-xr-xatmega/uart.h194
6 files changed, 1129 insertions, 0 deletions
diff --git a/atmega/default/Makefile b/atmega/default/Makefile
new file mode 100755
index 0000000..d70a0dc
--- /dev/null
+++ b/atmega/default/Makefile
@@ -0,0 +1,80 @@
+###############################################################################
+# Makefile for the project schreimaschine
+###############################################################################
+
+## General Flags
+PROJECT = schreimaschine
+MCU = atmega324p
+TARGET = schreimaschine.elf
+CC = avr-gcc
+
+CPP = avr-g++
+
+## 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 -std=gnu99 -DF_CPU=20000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
+CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d
+
+## Assembly specific flags
+ASMFLAGS = $(COMMON)
+ASMFLAGS += $(CFLAGS)
+ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2
+
+## Linker flags
+LDFLAGS = $(COMMON)
+LDFLAGS += -Wl,-Map=schreimaschine.map
+
+
+## Intel Hex file production flags
+HEX_FLASH_FLAGS = -R .eeprom -R .fuse -R .lock -R .signature
+
+HEX_EEPROM_FLAGS = -j .eeprom
+HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
+HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings
+
+
+## Objects that must be built in order to link
+OBJECTS = schreimaschine.o uart.o
+
+## Objects explicitly added by the user
+LINKONLYOBJECTS =
+
+## Build
+all: $(TARGET) schreimaschine.hex schreimaschine.eep schreimaschine.lss size
+
+## Compile
+schreimaschine.o: ../schreimaschine.c
+ $(CC) $(INCLUDES) $(CFLAGS) -c $<
+
+uart.o: ../uart.c
+ $(CC) $(INCLUDES) $(CFLAGS) -c $<
+
+##Link
+$(TARGET): $(OBJECTS)
+ $(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET)
+
+%.hex: $(TARGET)
+ avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@
+
+%.eep: $(TARGET)
+ -avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0
+
+%.lss: $(TARGET)
+ avr-objdump -h -S $< > $@
+
+size: ${TARGET}
+ @echo
+ @avr-size -C --mcu=${MCU} ${TARGET}
+
+## Clean target
+.PHONY: clean
+clean:
+ -rm -rf $(OBJECTS) schreimaschine.elf dep/* schreimaschine.hex schreimaschine.eep schreimaschine.lss schreimaschine.map
+
+
+## Other dependencies
+-include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)
+
diff --git a/atmega/schreimaschine.aps b/atmega/schreimaschine.aps
new file mode 100755
index 0000000..7a278d8
--- /dev/null
+++ b/atmega/schreimaschine.aps
@@ -0,0 +1 @@
+<AVRStudio><MANAGEMENT><ProjectName>schreimaschine</ProjectName><Created>26-Aug-2011 23:16:35</Created><LastEdit>25-Oct-2011 19:33:02</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>26-Aug-2011 23:16:35</Created><Version>4</Version><Build>4, 17, 0, 655</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\schreimaschine.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>C:\Users\Virus\Documents\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Dragon</CURRENT_TARGET><CURRENT_PART>ATmega324P.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0><Variables>dec</Variables><Variables>bin</Variables><Variables>out</Variables><Variables>uart_buffer</Variables><Variables>uart</Variables><Variables>mod</Variables><Variables>altout</Variables><Variables>ormod</Variables></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><modules><module></module></modules><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>schreimaschine.c</SOURCEFILE><SOURCEFILE>uart.c</SOURCEFILE><HEADERFILE>uart.h</HEADERFILE><OTHERFILE>default\schreimaschine.lss</OTHERFILE><OTHERFILE>default\schreimaschine.map</OTHERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega324p</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>schreimaschine.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>0</ISDIRTY><OPTIONS/><INCDIRS/><LIBDIRS/><LIBS/><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -std=gnu99 -DF_CPU=20000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR-20090313\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR-20090313\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><ProjectFiles><Files><Name>C:\Users\Virus\Documents\uart.h</Name><Name>C:\Users\Virus\Documents\schreimaschine.c</Name><Name>C:\Users\Virus\Documents\uart.c</Name></Files></ProjectFiles><IOView><usergroups/><sort sorted="0" column="0" ordername="0" orderaddress="0" ordergroup="0"/></IOView><Files><File00000><FileId>00000</FileId><FileName>schreimaschine.c</FileName><Status>259</Status></File00000><File00001><FileId>00001</FileId><FileName>uart.c</FileName><Status>259</Status></File00001><File00002><FileId>00002</FileId><FileName>uart.h</FileName><Status>1</Status></File00002></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio>
diff --git a/atmega/schreimaschine.aws b/atmega/schreimaschine.aws
new file mode 100755
index 0000000..bf83758
--- /dev/null
+++ b/atmega/schreimaschine.aws
@@ -0,0 +1 @@
+<AVRWorkspace><IOSettings><CurrentRegisters/></IOSettings><part name="ATMEGA324P"/><Files><File00000 Name="C:\Users\Virus\Documents\schreimaschine.c" Position="136 96 940 315" LineCol="37 0"/><File00001 Name="C:\Users\Virus\Documents\uart.c" Position="169 173 965 362" LineCol="0 0"/><File00002 Name="C:\Users\Virus\Documents\uart.h" Position="180 140 976 329" LineCol="0 0"/></Files></AVRWorkspace>
diff --git a/atmega/schreimaschine.c b/atmega/schreimaschine.c
new file mode 100755
index 0000000..3884698
--- /dev/null
+++ b/atmega/schreimaschine.c
@@ -0,0 +1,202 @@
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <avr/eeprom.h>
+#include <util/delay.h>
+#include <inttypes.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include "uart.h"
+#include <avr/wdt.h>
+#include <stdlib.h>
+#include <avr/sleep.h>
+#include <avr/pgmspace.h> //include libraries
+
+#ifndef F_CPU
+#define F_CPU = 20000000UL //define system clock: 20Mhz
+#endif
+
+#define UART_BAUD_RATE 9600 //define RS-232 baud rate: 9600baud
+#define MOD1 'S'
+#define MOD2 'L'
+#define MOD3 '#'
+
+volatile uint8_t ormod=255;
+volatile uint8_t altout;
+volatile uint8_t secure = 0;
+volatile uint8_t j = 0;
+volatile uint16_t uart;
+volatile unsigned char out = 255;
+volatile unsigned char dec = 255; //store decimal input signal, [range] = 0;1;2;4;8;16;32;64;128
+volatile unsigned char bin = 7; //store binary input signal, [range] = 0-7
+volatile uint8_t kb_buffer; //KB output buffer
+volatile uint8_t mod = 0; //modifier flag
+volatile uint8_t lookup[1024];
+volatile uint16_t uart_buffer; //UART input buffer
+
+int main(void)
+{
+
+
+ uint16_t i;
+ for(i=0; i<1024; i++) lookup[i]=255;
+
+lookup[(',' << 3) | 0] = 0;
+lookup[('.' << 3) | 1] = 0;
+lookup[('U' << 3) | 2] = 0;
+lookup[('A' << 3) | 3] = 0;
+lookup[('\'' << 3) | 4] = 0;
+lookup[('O' << 3) | 5] = 0;
+lookup[(' ' << 3) | 6] = 0;
+lookup[('S' << 3) | 7] = 0;
+lookup[('-' << 3) | 0] = 1;
+lookup[('$' << 3) | 1] = 1;
+lookup[('q' << 3) | 2] = 1;
+lookup[('y' << 3) | 3] = 1;
+lookup[('w' << 3) | 4] = 1;
+lookup[('a' << 3) | 5] = 1;
+lookup[('\n' << 3) | 6] = 1;
+lookup[('C' << 3) | 7] = 1;
+lookup[('1' << 3) | 0] = 2;
+lookup[('2' << 3) | 1] = 2;
+lookup[('e' << 3) | 2] = 2;
+lookup[('f' << 3) | 3] = 2;
+lookup[('r' << 3) | 4] = 2;
+lookup[('g' << 3) | 5] = 2;
+lookup[('I' << 3) | 6] = 2;
+lookup[('L' << 3) | 7] = 2;
+lookup[('3' << 3) | 0] = 3;
+lookup[('4' << 3) | 1] = 3;
+lookup[('t' << 3) | 2] = 3;
+lookup[('h' << 3) | 3] = 3;
+lookup[('z' << 3) | 4] = 3;
+lookup[('j' << 3) | 5] = 3;
+lookup[('R' << 3) | 6] = 3;
+lookup[('X' << 3) | 7] = 3;
+lookup[('7' << 3) | 0] = 4;
+lookup[('8' << 3) | 1] = 4;
+lookup[('o' << 3) | 2] = 4;
+lookup[('s' << 3) | 3] = 4;
+lookup[('p' << 3) | 4] = 4;
+lookup[('d' << 3) | 5] = 4;
+lookup[('W' << 3) | 6] = 4;
+lookup[('Y' << 3) | 7] = 4;
+lookup[('5' << 3) | 0] = 5;
+lookup[('6' << 3) | 1] = 5;
+lookup[('u' << 3) | 2] = 5;
+lookup[('k' << 3) | 3] = 5;
+lookup[('i' << 3) | 4] = 5;
+lookup[('l' << 3) | 5] = 5;
+lookup[('B' << 3) | 6] = 5;
+lookup[('Z' << 3) | 7] = 5;
+lookup[('?' << 3) | 0] = 6;
+lookup[('`' << 3) | 1] = 6;
+lookup[('n' << 3) | 2] = 6;
+lookup[('x' << 3) | 3] = 6;
+lookup[('m' << 3) | 4] = 6;
+lookup[('H' << 3) | 5] = 6;
+lookup[('D' << 3) | 6] = 6;
+lookup[('V' << 3) | 7] = 6;
+lookup[('9' << 3) | 0] = 7;
+lookup[('0' << 3) | 1] = 7;
+lookup[('v' << 3) | 2] = 7;
+lookup[('c' << 3) | 3] = 7;
+lookup[('b' << 3) | 4] = 7;
+lookup[('T' << 3) | 5] = 7;
+lookup[('#' << 3) | 6] = 7;
+lookup[('Q' << 3) | 7] = 7;
+
+
+
+
+
+ DDRD |= (1<<PD6) | (1<<PD7); //LEDs output
+ DDRC &=~ (1<<PC0); //switch input
+ PORTC |= (1<<PC0); //switch pullup
+ PORTB = 255; //kb_scan pullup
+ PORTA = 255; //kb_out output
+ DDRA = 255; //kb_out high
+ uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU)); //initialize UART with defined parameters
+ PCMSK1 = 255; //alle 8pins aktiviert
+ PCICR |= (1<<PCIE1); //PCINT1 aktivieren
+ sei();
+ uart_buffer = 0x100; //enable all interrupts
+ while(1)
+ {
+ //uart_putc(mod);
+ uart = uart_getc();
+ if(uart != UART_NO_DATA) //data here?
+ {
+ uart_buffer = uart;
+ j=0;
+ uart_putc(uart_buffer);
+ if((uart_buffer==MOD1)||(uart_buffer==MOD2)||(uart_buffer==MOD3)) //modifier recognized?
+ {
+ mod = uart_buffer; //set modifier flag
+ }
+
+
+ PORTD |= (1<<PD6);
+ PORTD &=~ (1<<PD7);
+ _delay_ms(10);
+
+ }
+ else
+ {
+ PORTD &=~ (1<<PD6);
+ PORTD |= (1<<PD7);
+ }
+ uart = 0x100;
+ }
+}
+
+ISR(PCINT1_vect)
+{
+
+ if(j<32)
+ {
+ j++;
+ dec = ~PINB;
+ if(dec!=0)
+ {
+ for(bin=7; dec!=128; dec*=2) bin--; //convert decimal input to binary
+ if(uart_buffer != UART_NO_DATA)
+ {
+ out = lookup[(uart_buffer<<3)|bin];
+ //if(mod)altout = lookup[(mod<<3)|bin];
+ altout = lookup[('S'<<3)|bin];
+ //else altout = 255;
+ if (out != 255) {
+ if (altout != 255) {
+ ormod = (1<<altout);
+ } else {
+ ormod = 0;
+ }
+ PORTA = ~((1<<out)|ormod);
+ //mod = 0;
+ }
+ else {
+ PORTA = 255;
+ }
+ }
+ else
+ {
+ PORTA = 255;
+ }
+ }
+
+ }
+ else PORTA = 255;
+}
+
+/*ISR(PCINT1_vect)
+{
+ bin = 7; //maximum value
+ dec = ~PINA; //read KB_scan
+
+ if(~dec) DDRB = 255; //any input=1? -> enable output
+ else DDRB = 0; //else -> disable output
+
+ for(dec=0; dec!=128; dec*=2) bin--; //convert decimal input to binary
+}
+*/
diff --git a/atmega/uart.c b/atmega/uart.c
new file mode 100755
index 0000000..6034070
--- /dev/null
+++ b/atmega/uart.c
@@ -0,0 +1,651 @@
+/*************************************************************************
+Title: Interrupt UART library with receive/transmit circular buffers
+Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
+File: $Id: uart.c,v 1.6.2.2 2009/11/29 08:56:12 Peter Exp $
+Software: AVR-GCC 4.1, AVR Libc 1.4.6 or higher
+Hardware: any AVR with built-in UART,
+License: GNU General Public License
+
+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
+
+LICENSE:
+ Copyright (C) 2006 Peter Fleury
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+*************************************************************************/
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <avr/pgmspace.h>
+#include "uart.h"
+
+
+/*
+ * 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__) || defined(__AVR_ATmega48P__) || defined(__AVR_ATmega88P__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P__)
+ /* ATmega with one USART */
+ #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
+#elif defined(__AVR_ATmega329__) ||defined(__AVR_ATmega3290__) ||\
+ defined(__AVR_ATmega649__) ||defined(__AVR_ATmega6490__) ||\
+ defined(__AVR_ATmega325__) ||defined(__AVR_ATmega3250__) ||\
+ defined(__AVR_ATmega645__) ||defined(__AVR_ATmega6450__)
+ /* ATmega with one USART */
+ #define ATMEGA_USART0
+ #define UART0_RECEIVE_INTERRUPT SIG_UART_RECV
+ #define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA
+ #define UART0_STATUS UCSR0A
+ #define UART0_CONTROL UCSR0B
+ #define UART0_DATA UDR0
+ #define UART0_UDRIE UDRIE0
+#elif defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega640__)
+/* 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_ATmega644__)
+ /* ATmega with one USART */
+ #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_ATmega164P__) || defined(__AVR_ATmega324P__) || defined(__AVR_ATmega644P__)
+ /* ATmega with two USART */
+ #define ATMEGA_USART0
+ #define ATMEGA_USART1
+ #define UART0_RECEIVE_INTERRUPT SIG_USART_RECV
+ #define UART1_RECEIVE_INTERRUPT SIG_USART1_RECV
+ #define UART0_TRANSMIT_INTERRUPT SIG_USART_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
+#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<<U2X); //Enable 2x speed
+ baudrate &= ~0x8000;
+ }
+ UBRRH = (unsigned char)(baudrate>>8);
+ UBRRL = (unsigned char) baudrate;
+
+ /* Enable USART receiver and transmitter and receive complete interrupt */
+ UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN);
+
+ /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
+ #ifdef URSEL
+ UCSRC = (1<<URSEL)|(3<<UCSZ0);
+ #else
+ UCSRC = (3<<UCSZ0);
+ #endif
+
+#elif defined (ATMEGA_USART0 )
+ /* Set baud rate */
+ if ( baudrate & 0x8000 )
+ {
+ UART0_STATUS = (1<<U2X0); //Enable 2x speed
+ baudrate &= ~0x8000;
+ }
+ UBRR0H = (unsigned char)(baudrate>>8);
+ UBRR0L = (unsigned char) baudrate;
+
+ /* Enable USART receiver and transmitter and receive complete interrupt */
+ UART0_CONTROL = _BV(RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
+
+ /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
+ #ifdef URSEL0
+ UCSR0C = (1<<URSEL0)|(3<<UCSZ00);
+ #else
+ UCSR0C = (3<<UCSZ00);
+ #endif
+
+#elif defined ( ATMEGA_UART )
+ /* set baud rate */
+ if ( baudrate & 0x8000 )
+ {
+ UART0_STATUS = (1<<U2X); //Enable 2x speed
+ baudrate &= ~0x8000;
+ }
+ UBRRHI = (unsigned char)(baudrate>>8);
+ UBRR = (unsigned char) baudrate;
+
+ /* Enable UART receiver and transmitter and receive complete interrupt */
+ UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN);
+
+#endif
+
+}/* uart_init */
+
+
+/*************************************************************************
+Function: uart_getc()
+Purpose: return byte from ringbuffer
+Returns: lower byte: received byte from ringbuffer
+ higher byte: last receive error
+**************************************************************************/
+unsigned int uart_getc(void)
+{
+ unsigned char tmptail;
+ unsigned char data;
+
+
+ if ( UART_RxHead == UART_RxTail ) {
+ return UART_NO_DATA; /* no data available */
+ }
+
+ /* calculate /store buffer index */
+ tmptail = (UART_RxTail + 1) & UART_RX_BUFFER_MASK;
+ UART_RxTail = tmptail;
+
+ /* get data from receive buffer */
+ data = UART_RxBuf[tmptail];
+
+ return (UART_LastRxError << 8) + data;
+
+}/* uart_getc */
+
+
+/*************************************************************************
+Function: uart_putc()
+Purpose: write byte to ringbuffer for transmitting via UART
+Input: byte to be transmitted
+Returns: none
+**************************************************************************/
+void uart_putc(unsigned char data)
+{
+ unsigned char tmphead;
+
+
+ tmphead = (UART_TxHead + 1) & UART_TX_BUFFER_MASK;
+
+ while ( tmphead == UART_TxTail ){
+ ;/* wait for free space in buffer */
+ }
+
+ UART_TxBuf[tmphead] = data;
+ UART_TxHead = tmphead;
+
+ /* enable UDRE interrupt */
+ UART0_CONTROL |= _BV(UART0_UDRIE);
+
+}/* uart_putc */
+
+
+/*************************************************************************
+Function: uart_puts()
+Purpose: transmit string to UART
+Input: string to be transmitted
+Returns: none
+**************************************************************************/
+void uart_puts(const char *s )
+{
+ while (*s)
+ uart_putc(*s++);
+
+}/* uart_puts */
+
+
+/*************************************************************************
+Function: uart_puts_p()
+Purpose: transmit string from program memory to UART
+Input: program memory string to be transmitted
+Returns: none
+**************************************************************************/
+void uart_puts_p(const char *progmem_s )
+{
+ register char c;
+
+ while ( (c = pgm_read_byte(progmem_s++)) )
+ uart_putc(c);
+
+}/* uart_puts_p */
+
+
+/*
+ * these functions are only for ATmegas with two USART
+ */
+#if defined( ATMEGA_USART1 )
+
+SIGNAL(UART1_RECEIVE_INTERRUPT)
+/*************************************************************************
+Function: UART1 Receive Complete interrupt
+Purpose: called when the UART1 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 = UART1_STATUS;
+ data = UART1_DATA;
+
+ /* */
+ lastRxError = (usr & (_BV(FE1)|_BV(DOR1)) );
+
+ /* calculate buffer index */
+ tmphead = ( UART1_RxHead + 1) & UART_RX_BUFFER_MASK;
+
+ if ( tmphead == UART1_RxTail ) {
+ /* error: receive buffer overflow */
+ lastRxError = UART_BUFFER_OVERFLOW >> 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<<U2X1); //Enable 2x speed
+ baudrate &= ~0x8000;
+ }
+ UBRR1H = (unsigned char)(baudrate>>8);
+ UBRR1L = (unsigned char) baudrate;
+
+ /* Enable USART receiver and transmitter and receive complete interrupt */
+ UART1_CONTROL = _BV(RXCIE1)|(1<<RXEN1)|(1<<TXEN1);
+
+ /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
+ #ifdef URSEL1
+ UCSR1C = (1<<URSEL1)|(3<<UCSZ10);
+ #else
+ UCSR1C = (3<<UCSZ10);
+ #endif
+}/* uart_init */
+
+
+/*************************************************************************
+Function: uart1_getc()
+Purpose: return byte from ringbuffer
+Returns: lower byte: received byte from ringbuffer
+ higher byte: last receive error
+**************************************************************************/
+unsigned int uart1_getc(void)
+{
+ unsigned char tmptail;
+ unsigned char data;
+
+
+ if ( UART1_RxHead == UART1_RxTail ) {
+ return UART_NO_DATA; /* no data available */
+ }
+
+ /* calculate /store buffer index */
+ tmptail = (UART1_RxTail + 1) & UART_RX_BUFFER_MASK;
+ UART1_RxTail = tmptail;
+
+ /* get data from receive buffer */
+ data = UART1_RxBuf[tmptail];
+
+ return (UART1_LastRxError << 8) + data;
+
+}/* uart1_getc */
+
+
+/*************************************************************************
+Function: uart1_putc()
+Purpose: write byte to ringbuffer for transmitting via UART
+Input: byte to be transmitted
+Returns: none
+**************************************************************************/
+void uart1_putc(unsigned char data)
+{
+ unsigned char tmphead;
+
+
+ tmphead = (UART1_TxHead + 1) & UART_TX_BUFFER_MASK;
+
+ while ( tmphead == UART1_TxTail ){
+ ;/* wait for free space in buffer */
+ }
+
+ UART1_TxBuf[tmphead] = data;
+ UART1_TxHead = tmphead;
+
+ /* enable UDRE interrupt */
+ UART1_CONTROL |= _BV(UART1_UDRIE);
+
+}/* uart1_putc */
+
+
+/*************************************************************************
+Function: uart1_puts()
+Purpose: transmit string to UART1
+Input: string to be transmitted
+Returns: none
+**************************************************************************/
+void uart1_puts(const char *s )
+{
+ while (*s)
+ uart1_putc(*s++);
+
+}/* uart1_puts */
+
+
+/*************************************************************************
+Function: uart1_puts_p()
+Purpose: transmit string from program memory to UART1
+Input: program memory string to be transmitted
+Returns: none
+**************************************************************************/
+void uart1_puts_p(const char *progmem_s )
+{
+ register char c;
+
+ while ( (c = pgm_read_byte(progmem_s++)) )
+ uart1_putc(c);
+
+}/* uart1_puts_p */
+
+
+#endif
diff --git a/atmega/uart.h b/atmega/uart.h
new file mode 100755
index 0000000..b9a9761
--- /dev/null
+++ b/atmega/uart.h
@@ -0,0 +1,194 @@
+#ifndef UART_H
+#define UART_H
+/************************************************************************
+Title: Interrupt UART library with receive/transmit circular buffers
+Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
+File: $Id: uart.h,v 1.8.2.1 2007/07/01 11:14:38 peter Exp $
+Software: AVR-GCC 4.1, AVR Libc 1.4
+Hardware: any AVR with built-in UART, tested on AT90S8515 & ATmega8 at 4 Mhz
+License: GNU General Public License
+Usage: see Doxygen manual
+
+LICENSE:
+ Copyright (C) 2006 Peter Fleury
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+************************************************************************/
+
+/**
+ * @defgroup pfleury_uart UART Library
+ * @code #include <uart.h> @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 8
+#endif
+/** Size of the circular transmit buffer, must be power of 2 */
+#ifndef UART_TX_BUFFER_SIZE
+#define UART_TX_BUFFER_SIZE 8
+#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
+ * <br>no receive data available
+ * - \b UART_BUFFER_OVERFLOW
+ * <br>Receive ringbuffer overflow.
+ * We are not reading the receive buffer fast enough,
+ * one or more received character have been dropped
+ * - \b UART_OVERRUN_ERROR
+ * <br>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
+ * <br>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 // UART_H
+