#include <util/atomic.h>
#include <util/delay.h>
+#include "clock.h"
#include "modbus.h"
#define BUFSIZE 128 // must be a power of two
#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)
-#define get_clock() (TCNT1)
-#define CLOCK_SPEED (F_CPU/1024)
/*
* According to Wikipedia, it is indeed 28 bits = 3.5 bytes without
* start- and stopbits.
*/
-#define TIMEOUT (28*CLOCK_SPEED/UART_BAUD)
+#define REQ_TIMEOUT (28*CLOCK_HZ/UART_BAUD)
uint16_t hold_regs[MB_N_HOLD_REGS];
if (rx_bytes == 0) // nothing received yet
return;
- if (get_clock() - last_rx < TIMEOUT) // still receiving
+ if (get_clock() - last_rx < REQ_TIMEOUT) // still receiving
return;
if (rx_bytes < 4) { // too short
}
}
+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);