interrupt driven sending
This commit is contained in:
@ -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);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user