Fixed broken USE_RAM_DESCRIPTORS compile time option when the FIXED_NUM_CONFIGURATION...
[pub/USBasp.git] / Projects / XPLAINBridge / Lib / SoftUART.c
index 9df42c5..f71686f 100644 (file)
@@ -1,6 +1,6 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
+     Copyright (C) Dean Camera, 2015.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
@@ -9,7 +9,7 @@
 /*
   Copyright 2010  David Prentice (david.prentice [at] farming [dot] uk)
   Copyright 2010  Peter Danneger
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2015  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
@@ -20,7 +20,7 @@
   advertising or publicity pertaining to distribution of the
   software without specific, written prior permission.
 
-  The author disclaim all warranties with regard to this
+  The author disclaims all warranties with regard to this
   software, including all implied warranties of merchantability
   and fitness.  In no event shall the author be liable for any
   special, indirect or consequential damages or any damages
@@ -51,7 +51,8 @@ static uint8_t RX_BitsRemaining;
 /** Temporary data variable to hold the byte being received as it is shifted in */
 static uint8_t RX_Data;
 
-/** Initialises the software UART, ready for data transmission and reception into the global ring buffers. */
+
+/** Initializes the software UART, ready for data transmission and reception into the global ring buffers. */
 void SoftUART_Init(void)
 {
        /* Set TX pin to output high, enable RX pull-up */
@@ -67,10 +68,10 @@ void SoftUART_Init(void)
        SoftUART_SetBaud(9600);
 
        /* Setup reception timer compare ISR */
-       TIMSK1 = (1 << OC1E1A);
+       TIMSK1 = (1 << OCIE1A);
 
        /* Setup transmission timer compare ISR and start the timer */
-       TIMSK3 = (1 << OC1E3A);
+       TIMSK3 = (1 << OCIE3A);
        TCCR3B = ((1 << CS30) | (1 << WGM32));
 }
 
@@ -80,8 +81,10 @@ ISR(INT0_vect, ISR_BLOCK)
        /* Reset the number of reception bits remaining counter */
        RX_BitsRemaining = 8;
 
-       /* Reset the bit reception timer */
-       TCNT1 = 0;
+       /* Reset the bit reception timer to -(1/2) of the total bit time, so that the first data bit is
+        * sampled mid way through the total bit time, making reception more robust.
+        */
+       TCNT1 = -(OCR1A >> 1);
 
        /* Check to see that the pin is still low (prevents glitches from starting a frame reception) */
        if (!(SRXPIN & (1 << SRX)))