interrupt driven sending

This commit is contained in:
hg
2013-01-28 11:17:27 +01:00
parent c820a6f9fc
commit da140addba

View File

@ -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() {
@ -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);
}
}