diff --git a/src/uartdrv.c b/src/uartdrv.c index 0239993..05a0568 100644 --- a/src/uartdrv.c +++ b/src/uartdrv.c @@ -6,6 +6,10 @@ +#define BUFFER_SIZE 128 +volatile uint8_t buffer[BUFFER_SIZE+5]; +volatile uint8_t bufferReadIdx = 0; +volatile uint8_t bufferWriteIdx = 0; void uartdrvInit() { @@ -13,7 +17,7 @@ void uartdrvInit() { // TXD DDRD |= (1 << PD1); - // transmitter enable + // transmitter enable UCSRB = (1 << TXEN); // 8 data bit, no parity, 1 stop bit UCSRC = (1 << UCSZ1) | (1 << UCSZ0); @@ -25,8 +29,16 @@ void uartdrvInit() { } void uartdrvWrite(uint8_t o) { - loop_until_bit_is_set(UCSRA, UDRE); - UDR = o; +// loop_until_bit_is_set(UCSRA, UDRE); +// UDR = o; + if (bufferWriteIdx == BUFFER_SIZE - 1) { + while (bufferReadIdx == BUFFER_SIZE); + } else { + while (bufferReadIdx == bufferWriteIdx + 1); + } + buffer[bufferWriteIdx] = o; + bufferWriteIdx++; + UCSRB |= (1 << UDRIE); } @@ -38,4 +50,14 @@ int uartdrvPutchar(char c, FILE *stream) { } - +ISR(USART_UDRE_vect) { + if (bufferReadIdx != bufferWriteIdx) { + UDR = buffer[bufferReadIdx]; + bufferReadIdx++; + if (bufferReadIdx > BUFFER_SIZE) { + bufferReadIdx = 0; + } + } else { + UCSRB &= ~(1 << UDRIE); + } +}