|
|
@ -6,16 +6,11 @@
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#include "UART.h"
|
|
|
|
#include "UART.h"
|
|
|
|
|
|
|
|
CircularBuffer TxBuffer;
|
|
|
|
|
|
|
|
CircularBuffer* pTxBuffer = &TxBuffer;
|
|
|
|
|
|
|
|
CircularBuffer RxBuffer;
|
|
|
|
|
|
|
|
CircularBuffer* pRxBuffer = &RxBuffer;
|
|
|
|
|
|
|
|
|
|
|
|
#define SIZE_BUFFER 500
|
|
|
|
|
|
|
|
struct CircularBuffer{
|
|
|
|
|
|
|
|
volatile char data[SIZE_BUFFER];
|
|
|
|
|
|
|
|
volatile uint16_t Readpointer;
|
|
|
|
|
|
|
|
volatile uint16_t Writepointer;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct CircularBuffer TxBuffer;
|
|
|
|
|
|
|
|
struct CircularBuffer RxBuffer;
|
|
|
|
|
|
|
|
volatile uint8_t TxActive;
|
|
|
|
volatile uint8_t TxActive;
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
@ -34,10 +29,10 @@ uart_init(void)
|
|
|
|
(1<<TXEN0)|(1<<RXEN0)| /* enable send and receive */
|
|
|
|
(1<<TXEN0)|(1<<RXEN0)| /* enable send and receive */
|
|
|
|
(1<<RXCIE0); /* enable Receive interrupts */
|
|
|
|
(1<<RXCIE0); /* enable Receive interrupts */
|
|
|
|
|
|
|
|
|
|
|
|
TxBuffer.Readpointer = 0;
|
|
|
|
pTxBuffer->Readpointer = 0;
|
|
|
|
TxBuffer.Writepointer = 0;
|
|
|
|
pTxBuffer->Writepointer = 0;
|
|
|
|
RxBuffer.Readpointer = 0;
|
|
|
|
pRxBuffer->Readpointer = 0;
|
|
|
|
RxBuffer.Writepointer = 0;
|
|
|
|
pRxBuffer->Writepointer = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ------------------------ */
|
|
|
|
/* ------------------------ */
|
|
|
@ -57,28 +52,30 @@ uart_send_string(char* string)
|
|
|
|
void
|
|
|
|
void
|
|
|
|
uart_send_byte(char c)
|
|
|
|
uart_send_byte(char c)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
UCSR0B&=~(1<<TXCIE0);
|
|
|
|
/* Disable the TX Interrupt */
|
|
|
|
|
|
|
|
UCSR0B &= ~(1<<TXCIE0);
|
|
|
|
|
|
|
|
|
|
|
|
if(TxActive){
|
|
|
|
if(TxActive){
|
|
|
|
TxBuffer.data[TxBuffer.Writepointer++] = c;
|
|
|
|
pTxBuffer->data[pTxBuffer->Writepointer++] = c;
|
|
|
|
if (TxBuffer.Writepointer>=SIZE_BUFFER){
|
|
|
|
if (pTxBuffer->Writepointer>=SIZE_BUFFER){
|
|
|
|
TxBuffer.Writepointer = 0;
|
|
|
|
pTxBuffer->Writepointer = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
TxActive = 1;
|
|
|
|
TxActive = 1;
|
|
|
|
UDR0 = c;
|
|
|
|
UDR0 = c;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Enable the TX Interrupt again*/
|
|
|
|
UCSR0B |= (1<<TXCIE0);
|
|
|
|
UCSR0B |= (1<<TXCIE0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ISR(USART0_TX_vect)
|
|
|
|
ISR(USART0_TX_vect)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if(TxBuffer.Readpointer != TxBuffer.Writepointer)
|
|
|
|
if(pTxBuffer->Readpointer != pTxBuffer->Writepointer)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
UDR0 = TxBuffer.data[TxBuffer.Readpointer++];
|
|
|
|
UDR0 = pTxBuffer->data[pTxBuffer->Readpointer++];
|
|
|
|
|
|
|
|
|
|
|
|
if(TxBuffer.Readpointer >= SIZE_BUFFER){
|
|
|
|
if(pTxBuffer->Readpointer >= SIZE_BUFFER){
|
|
|
|
TxBuffer.Readpointer = 0;
|
|
|
|
pTxBuffer->Readpointer = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
TxActive = 0;
|
|
|
|
TxActive = 0;
|
|
|
@ -94,7 +91,7 @@ uart_data_available(void)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
uint8_t dataAvailabel = 0;
|
|
|
|
uint8_t dataAvailabel = 0;
|
|
|
|
UCSR0B &= ~(1<<RXCIE0);
|
|
|
|
UCSR0B &= ~(1<<RXCIE0);
|
|
|
|
if(RxBuffer.Readpointer != RxBuffer.Writepointer){
|
|
|
|
if(pRxBuffer->Readpointer != pRxBuffer->Writepointer){
|
|
|
|
dataAvailabel = 1;
|
|
|
|
dataAvailabel = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
UCSR0B |= (1<<RXCIE0);
|
|
|
|
UCSR0B |= (1<<RXCIE0);
|
|
|
@ -106,11 +103,11 @@ uart_get_data(void)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
char data = 0;
|
|
|
|
char data = 0;
|
|
|
|
UCSR0B &= ~(1<<RXCIE0);
|
|
|
|
UCSR0B &= ~(1<<RXCIE0);
|
|
|
|
if(RxBuffer.Readpointer != RxBuffer.Writepointer)
|
|
|
|
if(pRxBuffer->Readpointer != pRxBuffer->Writepointer)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
data = RxBuffer.data[RxBuffer.Readpointer++];
|
|
|
|
data = pRxBuffer->data[pRxBuffer->Readpointer++];
|
|
|
|
if(RxBuffer.Readpointer >= SIZE_BUFFER){
|
|
|
|
if(pRxBuffer->Readpointer >= SIZE_BUFFER){
|
|
|
|
RxBuffer.Readpointer = 0;
|
|
|
|
pRxBuffer->Readpointer = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
UCSR0B |= (1<<RXCIE0);
|
|
|
|
UCSR0B |= (1<<RXCIE0);
|
|
|
@ -123,9 +120,9 @@ ISR(USART0_RX_vect)
|
|
|
|
uint8_t data = UDR0;
|
|
|
|
uint8_t data = UDR0;
|
|
|
|
|
|
|
|
|
|
|
|
if((status & ((1<<DOR0) | (1>>FE0))) == 0){
|
|
|
|
if((status & ((1<<DOR0) | (1>>FE0))) == 0){
|
|
|
|
RxBuffer.data[RxBuffer.Writepointer++] = data;
|
|
|
|
pRxBuffer->data[pRxBuffer->Writepointer++] = data;
|
|
|
|
if(RxBuffer.Writepointer >= SIZE_BUFFER) {
|
|
|
|
if(pRxBuffer->Writepointer >= SIZE_BUFFER) {
|
|
|
|
RxBuffer.Writepointer = 0;
|
|
|
|
pRxBuffer->Writepointer = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|