/* Includes */ #include #include #include #include /* UART Buffer Defines */ #define USART_RX_BUFFER_SIZE 128 /* 2,4,8,16,32,64,128 or 256 bytes */ #define USART_TX_BUFFER_SIZE 128 /* 2,4,8,16,32,64,128 or 256 bytes */ #define USART_RX_BUFFER_MASK ( USART_RX_BUFFER_SIZE - 1 ) #define USART_TX_BUFFER_MASK ( USART_TX_BUFFER_SIZE - 1 ) #if ( USART_RX_BUFFER_SIZE & USART_RX_BUFFER_MASK ) #error RX buffer size is not a power of 2 #endif #if ( USART_TX_BUFFER_SIZE & USART_TX_BUFFER_MASK ) #error TX buffer size is not a power of 2 #endif /* Static Variables */ static unsigned char USART_RxBuf[USART_RX_BUFFER_SIZE]; static volatile unsigned char USART_RxHead; static volatile unsigned char USART_RxTail; static unsigned char USART_TxBuf[USART_TX_BUFFER_SIZE]; static volatile unsigned char USART_TxHead; static volatile unsigned char USART_TxTail; /* Prototypes */ void USART0_Init( unsigned int baudrate ); unsigned char USART0_Receive( void ); void USART0_Transmit( unsigned char data ); /* Main - a simple test program*/ void main( void ) { USART0_Init( 11 ); /* Set the baudrate to 19,200 bps using a 3.6864MHz crystal */ sei(); /* Enable interrupts => enable UART interrupts */ for( ; ; ) /* Forever */ { USART0_Transmit( USART0_Receive() ); /* Echo the received character */ } } /* Initialize USART */ void USART0_Init( unsigned int baudrate ) { unsigned char x; /* Set the baud rate */ UBRR0H = (unsigned char) (baudrate>>8); UBRR0L = (unsigned char) baudrate; /* Enable UART receiver and transmitter */ UCSR0B = ( ( 1 << RXCIE0 ) | ( 1 << RXEN0 ) | ( 1 << TXEN0 ) ); /* Set frame format: 8 data 2stop */ UCSR0C = (1<