42 #include <avr/interrupt.h>
43 #include <avr/pgmspace.h>
52 #define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1)
53 #define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1)
55 #if ( UART_RX_BUFFER_SIZE & UART_RX_BUFFER_MASK )
56 #error RX buffer size is not a power of 2
58 #if ( UART_TX_BUFFER_SIZE & UART_TX_BUFFER_MASK )
59 #error TX buffer size is not a power of 2
62 #if defined(__AVR_AT90S2313__) \
63 || defined(__AVR_AT90S4414__) || defined(__AVR_AT90S4434__) \
64 || defined(__AVR_AT90S8515__) || defined(__AVR_AT90S8535__) \
65 || defined(__AVR_ATmega103__)
68 #define UART0_RECEIVE_INTERRUPT SIG_UART_RECV
69 #define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA
70 #define UART0_STATUS USR
71 #define UART0_CONTROL UCR
72 #define UART0_DATA UDR
73 #define UART0_UDRIE UDRIE
74 #elif defined(__AVR_AT90S2333__) || defined(__AVR_AT90S4433__)
77 #define UART0_RECEIVE_INTERRUPT SIG_UART_RECV
78 #define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA
79 #define UART0_STATUS UCSRA
80 #define UART0_CONTROL UCSRB
81 #define UART0_DATA UDR
82 #define UART0_UDRIE UDRIE
83 #elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \
84 || defined(__AVR_ATmega8515__) || defined(__AVR_ATmega8535__) \
85 || defined(__AVR_ATmega323__)
88 #define UART0_RECEIVE_INTERRUPT USART_RXC_vect
89 #define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect
90 #define UART0_STATUS UCSRA
91 #define UART0_CONTROL UCSRB
92 #define UART0_DATA UDR
93 #define UART0_UDRIE UDRIE
94 #elif defined(__AVR_ATmega163__)
97 #define UART0_RECEIVE_INTERRUPT SIG_UART_RECV
98 #define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA
99 #define UART0_STATUS UCSRA
100 #define UART0_CONTROL UCSRB
101 #define UART0_DATA UDR
102 #define UART0_UDRIE UDRIE
103 #elif defined(__AVR_ATmega162__)
105 #define ATMEGA_USART0
106 #define ATMEGA_USART1
107 #define UART0_RECEIVE_INTERRUPT SIG_USART0_RECV
108 #define UART1_RECEIVE_INTERRUPT SIG_USART1_RECV
109 #define UART0_TRANSMIT_INTERRUPT SIG_USART0_DATA
110 #define UART1_TRANSMIT_INTERRUPT SIG_USART1_DATA
111 #define UART0_STATUS UCSR0A
112 #define UART0_CONTROL UCSR0B
113 #define UART0_DATA UDR0
114 #define UART0_UDRIE UDRIE0
115 #define UART1_STATUS UCSR1A
116 #define UART1_CONTROL UCSR1B
117 #define UART1_DATA UDR1
118 #define UART1_UDRIE UDRIE1
119 #elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
121 #define ATMEGA_USART0
122 #define ATMEGA_USART1
123 #define UART0_RECEIVE_INTERRUPT SIG_UART0_RECV
124 #define UART1_RECEIVE_INTERRUPT SIG_UART1_RECV
125 #define UART0_TRANSMIT_INTERRUPT SIG_UART0_DATA
126 #define UART1_TRANSMIT_INTERRUPT SIG_UART1_DATA
127 #define UART0_STATUS UCSR0A
128 #define UART0_CONTROL UCSR0B
129 #define UART0_DATA UDR0
130 #define UART0_UDRIE UDRIE0
131 #define UART1_STATUS UCSR1A
132 #define UART1_CONTROL UCSR1B
133 #define UART1_DATA UDR1
134 #define UART1_UDRIE UDRIE1
135 #elif defined(__AVR_ATmega161__)
137 #error "AVR ATmega161 currently not supported by this libaray !"
138 #elif defined(__AVR_ATmega169__)
141 #define UART0_RECEIVE_INTERRUPT SIG_USART_RECV
142 #define UART0_TRANSMIT_INTERRUPT SIG_USART_DATA
143 #define UART0_STATUS UCSRA
144 #define UART0_CONTROL UCSRB
145 #define UART0_DATA UDR
146 #define UART0_UDRIE UDRIE
147 #elif defined(__AVR_ATmega48__) ||defined(__AVR_ATmega88__) || defined(__AVR_ATmega168__)
149 #define ATMEGA_USART0
150 #define UART0_RECEIVE_INTERRUPT SIG_USART_RECV
151 #define UART0_TRANSMIT_INTERRUPT SIG_USART_DATA
152 #define UART0_STATUS UCSR0A
153 #define UART0_CONTROL UCSR0B
154 #define UART0_DATA UDR0
155 #define UART0_UDRIE UDRIE0
156 #elif defined(__AVR_ATtiny2313__)
158 #define UART0_RECEIVE_INTERRUPT SIG_USART0_RX
159 #define UART0_TRANSMIT_INTERRUPT SIG_USART0_UDRE
160 #define UART0_STATUS UCSRA
161 #define UART0_CONTROL UCSRB
162 #define UART0_DATA UDR
163 #define UART0_UDRIE UDRIE
164 #elif defined(__AVR_ATmega329__) ||defined(__AVR_ATmega3290__) ||\
165 defined(__AVR_ATmega649__) ||defined(__AVR_ATmega6490__) ||\
166 defined(__AVR_ATmega325__) ||defined(__AVR_ATmega3250__) ||\
167 defined(__AVR_ATmega645__) ||defined(__AVR_ATmega6450__)
169 #define ATMEGA_USART0
170 #define UART0_RECEIVE_INTERRUPT SIG_UART_RECV
171 #define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA
172 #define UART0_STATUS UCSR0A
173 #define UART0_CONTROL UCSR0B
174 #define UART0_DATA UDR0
175 #define UART0_UDRIE UDRIE0
176 #elif defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega640__)
178 #define ATMEGA_USART0
179 #define ATMEGA_USART1
180 #define UART0_RECEIVE_INTERRUPT SIG_USART0_RECV
181 #define UART1_RECEIVE_INTERRUPT SIG_USART1_RECV
182 #define UART0_TRANSMIT_INTERRUPT SIG_USART0_DATA
183 #define UART1_TRANSMIT_INTERRUPT SIG_USART1_DATA
184 #define UART0_STATUS UCSR0A
185 #define UART0_CONTROL UCSR0B
186 #define UART0_DATA UDR0
187 #define UART0_UDRIE UDRIE0
188 #define UART1_STATUS UCSR1A
189 #define UART1_CONTROL UCSR1B
190 #define UART1_DATA UDR1
191 #define UART1_UDRIE UDRIE1
192 #elif defined(__AVR_ATmega644__)
194 #define ATMEGA_USART0
195 #define UART0_RECEIVE_INTERRUPT SIG_USART_RECV
196 #define UART0_TRANSMIT_INTERRUPT SIG_USART_DATA
197 #define UART0_STATUS UCSR0A
198 #define UART0_CONTROL UCSR0B
199 #define UART0_DATA UDR0
200 #define UART0_UDRIE UDRIE0
201 #elif defined(__AVR_ATmega164P__) || defined(__AVR_ATmega324P__) || defined(__AVR_ATmega644P__)
203 #define ATMEGA_USART0
204 #define ATMEGA_USART1
205 #define UART0_RECEIVE_INTERRUPT SIG_USART_RECV
206 #define UART1_RECEIVE_INTERRUPT SIG_USART1_RECV
207 #define UART0_TRANSMIT_INTERRUPT SIG_USART_DATA
208 #define UART1_TRANSMIT_INTERRUPT SIG_USART1_DATA
209 #define UART0_STATUS UCSR0A
210 #define UART0_CONTROL UCSR0B
211 #define UART0_DATA UDR0
212 #define UART0_UDRIE UDRIE0
213 #define UART1_STATUS UCSR1A
214 #define UART1_CONTROL UCSR1B
215 #define UART1_DATA UDR1
216 #define UART1_UDRIE UDRIE1
218 #error "no UART definition for MCU available"
227 static volatile unsigned char UART_TxHead;
228 static volatile unsigned char UART_TxTail;
229 static volatile unsigned char UART_RxHead;
230 static volatile unsigned char UART_RxTail;
231 static volatile unsigned char UART_LastRxError;
233 #if defined( ATMEGA_USART1 )
236 static volatile unsigned char UART1_TxHead;
237 static volatile unsigned char UART1_TxTail;
238 static volatile unsigned char UART1_RxHead;
239 static volatile unsigned char UART1_RxTail;
240 static volatile unsigned char UART1_LastRxError;
250 unsigned char tmphead;
253 unsigned char lastRxError;
260 #if defined( AT90_UART )
261 lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
262 #elif defined( ATMEGA_USART )
263 lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
264 #elif defined( ATMEGA_USART0 )
265 lastRxError = (usr & (_BV(FE0)|_BV(DOR0)) );
266 #elif defined ( ATMEGA_UART )
267 lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
273 if ( tmphead == UART_RxTail ) {
278 UART_RxHead = tmphead;
280 UART_RxBuf[tmphead] = data;
282 UART_LastRxError = lastRxError;
292 unsigned char tmptail;
295 if ( UART_TxHead != UART_TxTail) {
298 UART_TxTail = tmptail;
300 UART0_DATA = UART_TxBuf[tmptail];
303 UART0_CONTROL &= ~_BV(UART0_UDRIE);
320 #if defined( AT90_UART )
322 UBRR = (
unsigned char)baudrate;
325 UART0_CONTROL = _BV(RXCIE)|_BV(RXEN)|_BV(TXEN);
327 #elif defined (ATMEGA_USART)
329 if ( baudrate & 0x8000 )
331 UART0_STATUS = (1<<U2X);
334 UBRRH = (
unsigned char)(baudrate>>8);
335 UBRRL = (
unsigned char) baudrate;
338 UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN);
342 UCSRC = (1<<URSEL)|(3<<UCSZ0);
347 #elif defined (ATMEGA_USART0 )
349 if ( baudrate & 0x8000 )
351 UART0_STATUS = (1<<U2X0);
354 UBRR0H = (
unsigned char)(baudrate>>8);
355 UBRR0L = (
unsigned char) baudrate;
358 UART0_CONTROL = _BV(RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
362 UCSR0C = (1<<URSEL0)|(3<<UCSZ00);
364 UCSR0C = (3<<UCSZ00);
367 #elif defined ( ATMEGA_UART )
369 if ( baudrate & 0x8000 )
371 UART0_STATUS = (1<<U2X);
374 UBRRHI = (
unsigned char)(baudrate>>8);
375 UBRR = (
unsigned char) baudrate;
378 UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN);
392 unsigned char tmptail;
396 if ( UART_RxHead == UART_RxTail ) {
402 UART_RxTail = tmptail;
405 data = UART_RxBuf[tmptail];
407 return (UART_LastRxError << 8) + data;
418 unsigned char tmphead;
423 while ( tmphead == UART_TxTail ){
427 UART_TxBuf[tmphead] = data;
428 UART_TxHead = tmphead;
431 UART0_CONTROL |= _BV(UART0_UDRIE);
456 while ( (c = pgm_read_byte(progmem_s++)) )
465 #if defined( ATMEGA_USART1 )
471 SIGNAL(UART1_RECEIVE_INTERRUPT)
473 unsigned char tmphead;
476 unsigned char lastRxError;
483 lastRxError = (usr & (_BV(FE1)|_BV(DOR1)) );
488 if ( tmphead == UART1_RxTail ) {
493 UART1_RxHead = tmphead;
495 UART1_RxBuf[tmphead] = data;
497 UART1_LastRxError = lastRxError;
505 SIGNAL(UART1_TRANSMIT_INTERRUPT)
507 unsigned char tmptail;
510 if ( UART1_TxHead != UART1_TxTail) {
513 UART1_TxTail = tmptail;
515 UART1_DATA = UART1_TxBuf[tmptail];
518 UART1_CONTROL &= ~_BV(UART1_UDRIE);
536 if ( baudrate & 0x8000 )
538 UART1_STATUS = (1<<U2X1);
541 UBRR1H = (
unsigned char)(baudrate>>8);
542 UBRR1L = (
unsigned char) baudrate;
545 UART1_CONTROL = _BV(RXCIE1)|(1<<RXEN1)|(1<<TXEN1);
549 UCSR1C = (1<<URSEL1)|(3<<UCSZ10);
551 UCSR1C = (3<<UCSZ10);
563 unsigned char tmptail;
567 if ( UART1_RxHead == UART1_RxTail ) {
573 UART1_RxTail = tmptail;
576 data = UART1_RxBuf[tmptail];
578 return (UART1_LastRxError << 8) + data;
589 unsigned char tmphead;
594 while ( tmphead == UART1_TxTail ){
598 UART1_TxBuf[tmphead] = data;
599 UART1_TxHead = tmphead;
602 UART1_CONTROL |= _BV(UART1_UDRIE);
627 while ( (c = pgm_read_byte(progmem_s++)) )
void uart1_puts_p(const char *s)
Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ...
#define UART_RX_BUFFER_SIZE
void uart1_putc(unsigned char data)
Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) ...
void uart_puts(const char *s)
Put string to ringbuffer for transmitting via UART.
unsigned int uart_getc(void)
Get received byte from ringbuffer.
void uart1_init(unsigned int baudrate)
Initialize USART1 (only available on selected ATmegas)
#define UART_TX_BUFFER_SIZE
#define UART_TX_BUFFER_MASK
#define UART_BUFFER_OVERFLOW
void uart_puts_p(const char *progmem_s)
Put string from program memory to ringbuffer for transmitting via UART.
void uart_init(unsigned int baudrate)
Initialize UART and set baudrate.
#define UART_RX_BUFFER_MASK
unsigned int uart1_getc(void)
Get received byte of USART1 from ringbuffer. (only available on selected ATmega)
SIGNAL(UART0_RECEIVE_INTERRUPT)
void uart_putc(unsigned char data)
Put byte to ringbuffer for transmitting via UART.
void uart1_puts(const char *s)
Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) ...