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() {
|
void uartdrvInit() {
|
||||||
|
|
||||||
@ -13,7 +17,7 @@ void uartdrvInit() {
|
|||||||
// TXD
|
// TXD
|
||||||
DDRD |= (1 << PD1);
|
DDRD |= (1 << PD1);
|
||||||
|
|
||||||
// transmitter enable
|
// transmitter enable
|
||||||
UCSRB = (1 << TXEN);
|
UCSRB = (1 << TXEN);
|
||||||
// 8 data bit, no parity, 1 stop bit
|
// 8 data bit, no parity, 1 stop bit
|
||||||
UCSRC = (1 << UCSZ1) | (1 << UCSZ0);
|
UCSRC = (1 << UCSZ1) | (1 << UCSZ0);
|
||||||
@ -25,8 +29,16 @@ void uartdrvInit() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void uartdrvWrite(uint8_t o) {
|
void uartdrvWrite(uint8_t o) {
|
||||||
loop_until_bit_is_set(UCSRA, UDRE);
|
// loop_until_bit_is_set(UCSRA, UDRE);
|
||||||
UDR = o;
|
// 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