From 0bcc82ac28ef9461f04e47f0b0885ee156d926f9 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Mon, 12 Jul 2010 07:04:19 +0000 Subject: Alter the ring buffer library headers to have both atomic and non-atomic insertion/removal routines. Modify the existing projects so that buffer operations performed in an ISR use the shorted non-atomic versions, as they are already performed in a blocking ISR. Alter USBtoSerial demo so that it does not enter a blocking loop to send data from the USB to the USART, as this can cause dropped bytes in the reception code if large amounts of data are sent in both directions at the same time. Added a flush timer to the USBtoSerial code for the USART to USB interface, so that multiple bytes can be sent in the same USB packet. --- Projects/USBtoSerial/USBtoSerial.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'Projects/USBtoSerial/USBtoSerial.c') diff --git a/Projects/USBtoSerial/USBtoSerial.c b/Projects/USBtoSerial/USBtoSerial.c index 7a0f6866a8..9189868835 100644 --- a/Projects/USBtoSerial/USBtoSerial.c +++ b/Projects/USBtoSerial/USBtoSerial.c @@ -87,16 +87,22 @@ int main(void) if (!(BUFFER_SIZE - USBtoUSART_Buffer.Count)) break; - RingBuffer_Insert(&USBtoUSART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface)); + RingBuffer_AtomicInsert(&USBtoUSART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface)); } - /* Read bytes from the USART receive buffer into the USB IN endpoint */ - while (USARTtoUSB_Buffer.Count) - CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&USARTtoUSB_Buffer)); + /* Check if the software USART flush timer has expired */ + if (TIFR0 & (1 << TOV0)) + { + TIFR0 |= (1 << TOV0); + + /* Read bytes from the USART receive buffer into the USB IN endpoint */ + while (USARTtoUSB_Buffer.Count) + CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_AtomicRemove(&USARTtoUSB_Buffer)); + } - /* Load bytes from the USART transmit buffer into the USART */ - while (USBtoUSART_Buffer.Count) - Serial_TxByte(RingBuffer_Remove(&USBtoUSART_Buffer)); + /* Load the next byte from the USART transmit buffer into the USART */ + if (USBtoUSART_Buffer.Count) + Serial_TxByte(RingBuffer_AtomicRemove(&USBtoUSART_Buffer)); CDC_Device_USBTask(&VirtualSerial_CDC_Interface); USB_USBTask(); @@ -117,6 +123,9 @@ void SetupHardware(void) Serial_Init(9600, false); LEDs_Init(); USB_Init(); + + /* Configure the UART flush timer - run at Fcpu/1024 for maximum interval before overflow */ + TCCR0B = ((1 << CS02) | (1 << CS00)); } /** Event handler for the library USB Connection event. */ -- cgit v1.2.3