X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/229935184b3ca7eda9edd6b7d7851f53b2441a65..ad4308b1d123c36df674f553bb0c43f23cd7a99a:/Projects/XPLAINBridge/Lib/SoftUART.c?ds=inline diff --git a/Projects/XPLAINBridge/Lib/SoftUART.c b/Projects/XPLAINBridge/Lib/SoftUART.c index 458a505cd..b96b45f4d 100644 --- a/Projects/XPLAINBridge/Lib/SoftUART.c +++ b/Projects/XPLAINBridge/Lib/SoftUART.c @@ -51,7 +51,7 @@ static uint8_t RX_BitsRemaining; /** Temporary data variable to hold the byte being received as it is shifted in */ static uint8_t RX_Data; -/** Initializes the software UART, ready for data transmission and reception into the global ring buffers. */ +/** Initialises 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 */ @@ -63,12 +63,13 @@ void SoftUART_Init(void) EICRA = (1 << ISC01); EIMSK = (1 << INT0); - /* Set reception timer compare period and enable compare ISR */ - OCR1A = BIT_TIME; + /* Set the transmission and reception timer compare values for the default baud rate */ + SoftUART_SetBaud(9600); + + /* Setup reception timer compare ISR */ TIMSK1 = (1 << OCIE1A); - /* Set transmission timer compare period, enable compare ISR and start the timer */ - OCR3A = BIT_TIME; + /* Setup transmission timer compare ISR and start the timer */ TIMSK3 = (1 << OCIE3A); TCCR3B = ((1 << CS30) | (1 << WGM32)); } @@ -76,15 +77,21 @@ void SoftUART_Init(void) /** ISR to detect the start of a bit being sent to the software UART. */ ISR(INT0_vect, ISR_BLOCK) { - /* Reset and start the reception timer */ - TCNT1 = 0; - TCCR1B = ((1 << CS10) | (1 << WGM12)); - /* Reset the number of reception bits remaining counter */ RX_BitsRemaining = 8; + + /* Reset the bit reception timer */ + TCNT1 = 0; - /* Disable start bit detection ISR while the next byte is received */ - EIMSK = 0; + /* Check to see that the pin is still low (prevents glitches from starting a frame reception) */ + if (!(SRXPIN & (1 << SRX))) + { + /* Disable start bit detection ISR while the next byte is received */ + EIMSK = 0; + + /* Start the reception timer */ + TCCR1B = ((1 << CS10) | (1 << WGM12)); + } } /** ISR to manage the reception of bits to the software UART. */ @@ -118,7 +125,7 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK) } /** ISR to manage the transmission of bits via the software UART. */ -ISR(TIMER3_COMPA_vect, ISR_NOBLOCK) +ISR(TIMER3_COMPA_vect, ISR_BLOCK) { /* Check if transmission has finished */ if (TX_BitsRemaining) @@ -133,7 +140,7 @@ ISR(TIMER3_COMPA_vect, ISR_NOBLOCK) TX_Data >>= 1; TX_BitsRemaining--; } - else if (USBtoUART_Buffer.Count) + else if (!(RX_BitsRemaining) && !(RingBuffer_IsEmpty(&USBtoUART_Buffer))) { /* Start bit - TX line low */ STXPORT &= ~(1 << STX);