#define UART_BAUD 9600
#define UBRR_VAL ((F_CPU + 8UL * UART_BAUD) / (16UL*UART_BAUD) - 1)
-#define wait_one_byte() _delay_us(10*1000000/UART_BAUD)
/*
* According to Wikipedia, it is indeed 28 bits = 3.5 bytes without
}
}
+ISR(USART_TX_vect)
+{
+ UCSR0B &= ~_BV(TXCIE0); // disable further IRQs
+ ctl_pin_off();
+}
+
ISR(USART_UDRE_vect)
{
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
if (tx_head == tx_tail) {
+ UCSR0B |= _BV(TXCIE0); // enable xmit complete irq
UCSR0B &= ~_BV(UDRIE0);
tx_tail = tx_head = 0;
- wait_one_byte(); // FIXME: too long busy-wait
- ctl_pin_off();
} else {
UDR0 = txbuf[tx_tail];
tx_tail = bufptr_inc(tx_tail);
#define UART_BAUD 9600
#define UBRR_VAL ((F_CPU + 8UL * UART_BAUD) / (16UL*UART_BAUD) - 1)
-#define wait_one_byte() _delay_us(10*1000000/UART_BAUD)
void rs485_init()
{
sei();
}
+ISR(USART_TX_vect)
+{
+ UCSR0B &= ~_BV(TXCIE0); // disable further IRQs
+ ctl_pin_off();
+}
+
ISR(USART_UDRE_vect)
{
cli();
if (tx_head == tx_tail) {
+ UCSR0B |= _BV(TXCIE0); // enable xmit complete irq
UCSR0B &= ~_BV(UDRIE0);
- wait_one_byte();
- ctl_pin_off();
} else {
UDR0 = txbuf[tx_tail];
tx_tail = bufptr_inc(tx_tail);