#include <avr/io.h>
#include <avr/interrupt.h>
#define BUFFER_SIZE 4
#define MOD(n) ((n) & (BUFFER_SIZE-1))
#define INC(idx) idx = (MOD(idx+1))
#define IS_BUFFER_EMPTY(buf) (buf.inIdx == buf.outIdx)
#define IS_BUFFER_FULL(buf) (MOD(buf.inIdx-1) == buf.outIdx)
typedef struct {
uint8_t buffer[BUFFER_SIZE];
uint8_t inIdx;
uint8_t outIdx;
} CircularBuffer_t;
//UART. 527000, 7 ,O, 2
CircularBuffer_t txBuffer;
CircularBuffer_t rxBuffer;
void UART_Init(void) {
UBRR0 = 1;
UCSR0A = 0;
UCSR0B = (1 << RXCIE0) | (3 << TXEN0);
UCSR0C = (3 << UPM00) | (1 << USBS0) | (2 << UCSZ00);
sei();
}
ISR (USART0_UDRE_vect) {
if (!(IS_BUFFER_EMPTY(txBuffer))) { //if not empty
UDR0 = txBuffer.buffer[txBuffer.outIdx];
INC(txBuffer.outIdx);
} else {
UCSR0B &= ~(1 << UDRIE0);
}
}
ISR(USART0_RX_vect) {
rxBuffer.buffer[rxBuffer.inIdx] = UDR0;
INC(rxBuffer.inIdx);
}
void delay(void) {
volatile uint16_t cnt = 0xFFFF;
while (cnt--);
}
void UART_putchar(char data) {
txBuffer.buffer[txBuffer.inIdx] = data;
INC(txBuffer.inIdx);
UCSR0B |= (1 << UDRIE0);
}
int main(void) {
txBuffer.inIdx = 0;
txBuffer.outIdx = 0;
UART_Init();
//delay();
UART_putchar('U');
delay();
UART_putchar('A');
UART_putchar('B');
UART_putchar('C');
while(1);
return 0;
}