/*************************************************************************
Title: Interrupt UART library with receive/transmit circular buffers
Author: Andy Gock
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 README.md and Doxygen manual
Based on original library by Peter Fluery, Tim Sharpe, Nicholas Zambetti.
https://github.com/andygock/avr-uart
Updated UART library (this one) by Andy Gock
https://github.com/andygock/avr-uart
Based on updated UART library (this one) by Tim Sharpe
http://beaststwo.org/avr-uart/index.shtml
Based on original library by Peter Fluery
http://homepage.hispeed.ch/peterfleury/avr-software.html
*************************************************************************/
/*************************************************************************
LICENSE:
Copyright (C) 2012 Andy Gock
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.
*************************************************************************/
/************************************************************************
uart_available, uart_flush, uart1_available, and uart1_flush functions
were adapted from the Arduino HardwareSerial.h library by Tim Sharpe on
11 Jan 2009. The license info for HardwareSerial.h is as follows:
HardwareSerial.cpp - Hardware serial library for Wiring
Copyright (c) 2006 Nicholas Zambetti. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Modified 23 November 2006 by David A. Mellis
************************************************************************/
/************************************************************************
Changelog for modifications made by Tim Sharpe, starting with the current
library version on his Web site as of 05/01/2009.
Date Description
=========================================================================
05/11/2009 Changed all existing UARTx_RECEIVE_INTERRUPT and UARTx_TRANSMIT_INTERRUPT
macros to use the "_vect" format introduced in AVR-Libc
v1.4.0. Had to split the 3290 and 6490 out of their existing
macro due to an inconsistency in the UART0_RECEIVE_INTERRUPT
vector name (seems like a typo: USART_RX_vect for the 3290/6490
vice USART0_RX_vect for the others in the macro).
Verified all existing macro register names against the device
header files in AVR-Libc v1.6.6 to catch any inconsistencies.
05/12/2009 Added support for 48P, 88P, 168P, and 328P by adding them to the
existing 48/88/168 macro.
Added Arduino-style available() and flush() functions for both
supported UARTs. Really wanted to keep them out of the library, so
that it would be as close as possible to Peter Fleury's original
library, but has scoping issues accessing internal variables from
another program. Go C!
05/13/2009 Changed Interrupt Service Routine label from the old "SIGNAL" to
the "ISR" format introduced in AVR-Libc v1.4.0.
************************************************************************/
/*
* constants and macros
*/
/* size of RX/TX buffers */
/* old AVR classic or ATmega103 with one UART */
/* old AVR classic with one UART */
/* ATmega with one USART */
/* ATmega with one USART, but is called USART1 (untested) */
/* ATmega with one USART */
/* ATmega163 with one UART */
/* ATmega with two USART */
/* ATmega with two USART */
/* ATmega with UART */
/* ATmega with one USART */
/* TLS-Added 48P/88P/168P/328P */
/* ATmega with one USART */
/* ATmega with one USART */
/* TLS-Separated these two from the previous group because of inconsistency in the USART_RX */
/* ATmega with one USART */
/* ATmega with four USART */
/* ATmega with one USART */
/* ATmega with two USART */
/*
* Module global variables
*/
static volatile uint8_t UART_TxBuf;
static volatile uint8_t UART_RxBuf;
static volatile uint16_t UART_TxHead;
static volatile uint16_t UART_TxTail;
static volatile uint16_t UART_RxHead;
static volatile uint16_t UART_RxTail;
static volatile uint8_t UART_LastRxError;
static volatile uint8_t UART_TxHead;
static volatile uint8_t UART_TxTail;
static volatile uint8_t UART_RxHead;
static volatile uint8_t UART_RxTail;
static volatile uint8_t UART_LastRxError;
static volatile uint8_t UART1_TxBuf;
static volatile uint8_t UART1_RxBuf;
static volatile uint16_t UART1_TxHead;
static volatile uint16_t UART1_TxTail;
static volatile uint16_t UART1_RxHead;
static volatile uint16_t UART1_RxTail;
static volatile uint8_t UART1_LastRxError;
static volatile uint8_t UART1_TxHead;
static volatile uint8_t UART1_TxTail;
static volatile uint8_t UART1_RxHead;
static volatile uint8_t UART1_RxTail;
static volatile uint8_t UART1_LastRxError;
static volatile uint8_t UART2_TxBuf;
static volatile uint8_t UART2_RxBuf;
static volatile uint16_t UART2_TxHead;
static volatile uint16_t UART2_TxTail;
static volatile uint16_t UART2_RxHead;
static volatile uint16_t UART2_RxTail;
static volatile uint8_t UART2_LastRxError;
static volatile uint8_t UART2_TxHead;
static volatile uint8_t UART2_TxTail;
static volatile uint8_t UART2_RxHead;
static volatile uint8_t UART2_RxTail;
static volatile uint8_t UART2_LastRxError;
static volatile uint8_t UART3_TxBuf;
static volatile uint8_t UART3_RxBuf;
static volatile uint16_t UART3_TxHead;
static volatile uint16_t UART3_TxTail;
static volatile uint16_t UART3_RxHead;
static volatile uint16_t UART3_RxTail;
static volatile uint8_t UART3_LastRxError;
static volatile uint8_t UART3_TxHead;
static volatile uint8_t UART3_TxTail;
static volatile uint8_t UART3_RxHead;
static volatile uint8_t UART3_RxTail;
static volatile uint8_t UART3_LastRxError;
/*************************************************************************
Function: UART Receive Complete interrupt
Purpose: called when the UART has received a character
**************************************************************************/
/*************************************************************************
Function: UART Data Register Empty interrupt
Purpose: called when the UART is ready to transmit the next byte
**************************************************************************/
/*************************************************************************
Function: uart0_init()
Purpose: initialize UART and set baudrate
Input: baudrate using macro UART_BAUD_SELECT()
Returns: none
**************************************************************************/
void /* uart0_init */
/*************************************************************************
Function: uart0_getc()
Purpose: return byte from ringbuffer
Returns: lower byte: received byte from ringbuffer
higher byte: last receive error
**************************************************************************/
uint16_t /* uart0_getc */
/*************************************************************************
Function: uart0_peek()
Purpose: Returns the next byte (character) of incoming UART data without
removing it from the ring buffer. That is, successive calls to
uartN_peek() will return the same character, as will the next
call to uartN_getc()
Returns: lower byte: next byte in ring buffer
higher byte: last receive error
**************************************************************************/
uint16_t /* uart0_peek */
/*************************************************************************
Function: uart0_putc()
Purpose: write byte to ringbuffer for transmitting via UART
Input: byte to be transmitted
Returns: none
**************************************************************************/
void /* uart0_putc */
/*************************************************************************
Function: uart0_puts()
Purpose: transmit string to UART
Input: string to be transmitted
Returns: none
**************************************************************************/
void /* uart0_puts */
/*************************************************************************
Function: uart0_puts_p()
Purpose: transmit string from program memory to UART
Input: program memory string to be transmitted
Returns: none
**************************************************************************/
void /* uart0_puts_p */
/*************************************************************************
Function: uart0_available()
Purpose: Determine the number of bytes waiting in the receive buffer
Input: None
Returns: Integer number of bytes in the receive buffer
**************************************************************************/
uint16_t /* uart0_available */
/*************************************************************************
Function: uart0_flush()
Purpose: Flush bytes waiting the receive buffer. Actually ignores them.
Input: None
Returns: None
**************************************************************************/
void /* uart0_flush */
/* defined(USART0_ENABLED) */
/*
* these functions are only for ATmegas with two USART
*/
/*************************************************************************
Function: UART1 Receive Complete interrupt
Purpose: called when the UART1 has received a character
**************************************************************************/
/*************************************************************************
Function: UART1 Data Register Empty interrupt
Purpose: called when the UART1 is ready to transmit the next byte
**************************************************************************/
/*************************************************************************
Function: uart1_init()
Purpose: initialize UART1 and set baudrate
Input: baudrate using macro UART_BAUD_SELECT()
Returns: none
**************************************************************************/
void /* uart_init */
/*************************************************************************
Function: uart1_getc()
Purpose: return byte from ringbuffer
Returns: lower byte: received byte from ringbuffer
higher byte: last receive error
**************************************************************************/
uint16_t /* uart1_getc */
/*************************************************************************
Function: uart1_peek()
Purpose: Returns the next byte (character) of incoming UART data without
removing it from the ring buffer. That is, successive calls to
uartN_peek() will return the same character, as will the next
call to uartN_getc()
Returns: lower byte: next byte in ring buffer
higher byte: last receive error
**************************************************************************/
uint16_t /* uart1_peek */
/*************************************************************************
Function: uart1_putc()
Purpose: write byte to ringbuffer for transmitting via UART
Input: byte to be transmitted
Returns: none
**************************************************************************/
void /* uart1_putc */
/*************************************************************************
Function: uart1_puts()
Purpose: transmit string to UART1
Input: string to be transmitted
Returns: none
**************************************************************************/
void /* 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 */
/*************************************************************************
Function: uart1_available()
Purpose: Determine the number of bytes waiting in the receive buffer
Input: None
Returns: Integer number of bytes in the receive buffer
**************************************************************************/
uint16_t /* uart1_available */
/*************************************************************************
Function: uart1_flush()
Purpose: Flush bytes waiting the receive buffer. Actually ignores them.
Input: None
Returns: None
**************************************************************************/
void /* uart1_flush */
/* defined(USART1_ENABLED) */
/*
* these functions are only for ATmegas with four USART
*/
/*************************************************************************
Function: UART2 Receive Complete interrupt
Purpose: called when the UART2 has received a character
**************************************************************************/
/*************************************************************************
Function: UART2 Data Register Empty interrupt
Purpose: called when the UART2 is ready to transmit the next byte
**************************************************************************/
/*************************************************************************
Function: uart2_init()
Purpose: initialize UART2 and set baudrate
Input: baudrate using macro UART_BAUD_SELECT()
Returns: none
**************************************************************************/
void /* uart_init */
/*************************************************************************
Function: uart2_getc()
Purpose: return byte from ringbuffer
Returns: lower byte: received byte from ringbuffer
higher byte: last receive error
**************************************************************************/
uint16_t /* uart2_getc */
/*************************************************************************
Function: uart2_peek()
Purpose: Returns the next byte (character) of incoming UART data without
removing it from the ring buffer. That is, successive calls to
uartN_peek() will return the same character, as will the next
call to uartN_getc()
Returns: lower byte: next byte in ring buffer
higher byte: last receive error
**************************************************************************/
uint16_t /* uart2_peek */
/*************************************************************************
Function: uart2_putc()
Purpose: write byte to ringbuffer for transmitting via UART
Input: byte to be transmitted
Returns: none
**************************************************************************/
void /* uart2_putc */
/*************************************************************************
Function: uart2_puts()
Purpose: transmit string to UART2
Input: string to be transmitted
Returns: none
**************************************************************************/
void /* uart2_puts */
/*************************************************************************
Function: uart2_puts_p()
Purpose: transmit string from program memory to UART2
Input: program memory string to be transmitted
Returns: none
**************************************************************************/
void /* uart2_puts_p */
/*************************************************************************
Function: uart2_available()
Purpose: Determine the number of bytes waiting in the receive buffer
Input: None
Returns: Integer number of bytes in the receive buffer
**************************************************************************/
uint16_t /* uart2_available */
/*************************************************************************
Function: uart2_flush()
Purpose: Flush bytes waiting the receive buffer. Actually ignores them.
Input: None
Returns: None
**************************************************************************/
void /* uart2_flush */
/* defined(USART2_ENABLED) */
/*
* these functions are only for ATmegas with four USART
*/
/*************************************************************************
Function: UART3 Receive Complete interrupt
Purpose: called when the UART3 has received a character
**************************************************************************/
/*************************************************************************
Function: UART3 Data Register Empty interrupt
Purpose: called when the UART3 is ready to transmit the next byte
**************************************************************************/
/*************************************************************************
Function: uart3_init()
Purpose: initialize UART3 and set baudrate
Input: baudrate using macro UART_BAUD_SELECT()
Returns: none
**************************************************************************/
void /* uart_init */
/*************************************************************************
Function: uart3_getc()
Purpose: return byte from ringbuffer
Returns: lower byte: received byte from ringbuffer
higher byte: last receive error
**************************************************************************/
uint16_t /* uart3_getc */
/*************************************************************************
Function: uart3_peek()
Purpose: Returns the next byte (character) of incoming UART data without
removing it from the ring buffer. That is, successive calls to
uartN_peek() will return the same character, as will the next
call to uartN_getc()
Returns: lower byte: next byte in ring buffer
higher byte: last receive error
**************************************************************************/
uint16_t /* uart3_peek */
/*************************************************************************
Function: uart3_putc()
Purpose: write byte to ringbuffer for transmitting via UART
Input: byte to be transmitted
Returns: none
**************************************************************************/
void /* uart3_putc */
/*************************************************************************
Function: uart3_puts()
Purpose: transmit string to UART3
Input: string to be transmitted
Returns: none
**************************************************************************/
void /* uart3_puts */
/*************************************************************************
Function: uart3_puts_p()
Purpose: transmit string from program memory to UART3
Input: program memory string to be transmitted
Returns: none
**************************************************************************/
void /* uart3_puts_p */
/*************************************************************************
Function: uart3_available()
Purpose: Determine the number of bytes waiting in the receive buffer
Input: None
Returns: Integer number of bytes in the receive buffer
**************************************************************************/
uint16_t /* uart3_available */
/*************************************************************************
Function: uart3_flush()
Purpose: Flush bytes waiting the receive buffer. Actually ignores them.
Input: None
Returns: None
**************************************************************************/
void /* uart3_flush */
/* defined(USART3_ENABLED) */