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