#define F_CPU 16000000UL // Defining the CPU Frequency
#include <avr/io.h> // Contains all the I/O Register Macros
#include <util/delay.h> // Generates a Blocking Delay
#include <avr/interrupt.h> // Contains all interrupt vectors
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd1(0x27, 16, 2); // I2C lcd
#define USART_BAUDRATE 9600 // Desired Baud Rate
#define BAUD_PRESCALER (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
#define ASYNCHRONOUS (0<<UMSEL00) // USART Mode Selection
#define DISABLED (0<<UPM00)
#define EVEN_PARITY (2<<UPM00)
#define ODD_PARITY (3<<UPM00)
#define PARITY_MODE DISABLED // USART Parity Bit Selection
#define ONE_BIT (0<<USBS0)
#define TWO_BIT (1<<USBS0)
#define STOP_BIT ONE_BIT // USART Stop Bit Selection
#define FIVE_BIT (0<<UCSZ00)
#define SIX_BIT (1<<UCSZ00)
#define SEVEN_BIT (2<<UCSZ00)
#define EIGHT_BIT (3<<UCSZ00)
#define DATA_BIT EIGHT_BIT // USART Data Bit Selection
#define RX_COMPLETE_INTERRUPT (1<<RXCIE0)
#define DATA_REGISTER_EMPTY_INTERRUPT (1<<UDRIE0)
unsigned char GlobalTransmit;
unsigned char USART_ReceiveBuffer; // Global Buffer
unsigned char ReceiveBuffer[50];
static uint8_t p;
static uint8_t Received_Complete_Flag;
void USART_TransmitPolling(char * DataByte)
{
uint8_t i;
while(*DataByte!='\0')
{
while (( UCSR0A & (1<<UDRE0)) == 0) {}; // Do nothing until UDR is ready
UDR0 = DataByte[i];
DataByte++;
}
}
void UART_transmit_interrupt(char *data)
{
while(*data!='\0')
{
GlobalTransmit=data[p];
UCSR0B |= DATA_REGISTER_EMPTY_INTERRUPT; // Enables the Interrupt
}
}
void print_on_lcd(char *bufferData)
{
lcd1.setCursor(0, 1);
while(*bufferData!='\0')
{
lcd1.print(*bufferData);
bufferData++;
}
}
void USART_Init()
{
// Set Baud Rate
UBRR0H = BAUD_PRESCALER >> 8;
UBRR0L = BAUD_PRESCALER;
// Set Frame Format
UCSR0C = ASYNCHRONOUS | PARITY_MODE | STOP_BIT | DATA_BIT;
// Enable Receiver and Transmitter
UCSR0B = (1<<RXEN0) | (1<<TXEN0)| RX_COMPLETE_INTERRUPT;
//Enable Global Interrupts
sei();
USART_TransmitPolling("Treel");
}
void setup()
{
lcd1.init(); // initialize the I2C lcd
lcd1.backlight();
USART_Init();
//UCSR0B |= RX_COMPLETE_INTERRUPT;
}
void loop()
{
// USART_TransmitPolling(ReceiveBuffer);
lcd1.setCursor(0, 0);
lcd1.print("Data received:");
print_on_lcd(ReceiveBuffer);
//if( Received_Complete_Flag==0)
// {
UART_transmit_interrupt(ReceiveBuffer);
// }
}
ISR(USART_RX_vect)
{
USART_ReceiveBuffer= UDR0;
if(USART_ReceiveBuffer!=0)
{
if(USART_ReceiveBuffer!='\n')
{
ReceiveBuffer[p]=USART_ReceiveBuffer;
}
p++;
}
else
{
if( USART_ReceiveBuffer='\0')
{
Received_Complete_Flag=1;
ReceiveBuffer[p]=USART_ReceiveBuffer;
p=0;
// memset(ReceiveBuffer,0,50*sizeof(ReceiveBuffer[0]));
}
// memset(ReceiveBuffer,0,50*sizeof(ReceiveBuffer[0]));
}
USART_ReceiveBuffer=0;
// UDR0=USART_ReceiveBuffer[0];
// UART_transmit_interrupt( ReceiveBuffer[p]);
}
ISR(USART_UDRE_vect)
{
UDR0 =GlobalTransmit;
p++;
if(GlobalTransmit=='\0')
{
p=0;
memset(ReceiveBuffer,0,50*sizeof(ReceiveBuffer[0]));
Received_Complete_Flag=0;
}
UCSR0B &= ~DATA_REGISTER_EMPTY_INTERRUPT; // Disables the Interrupt, uncomment for one time transmission of data
GlobalTransmit=0;
//print_on_lcd(ReceiveBuffer);
}