X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/331e8dece66e632ef3f91b052674948fd74e62a1..5e12d436fa31399ba6b5c8cab484d4a7b5adf7e7:/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c index e77d77bd5..85a750454 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c @@ -59,7 +59,6 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK) if (!(SoftUSART_BitCount)) return; - /* Check to see if we are at a rising or falling edge of the clock */ if (BITBANG_PDICLOCK_PORT & BITBANG_PDICLOCK_MASK) { /* If at rising clock edge and we are in send mode, abort */ @@ -69,7 +68,7 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK) /* Wait for the start bit when receiving */ if ((SoftUSART_BitCount == BITS_IN_USART_FRAME) && (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK)) return; - + /* Shift in the bit one less than the frame size in position, so that the start bit will eventually * be discarded leaving the data to be byte-aligned for quick access (subtract 9 as we are ORing to the MSB) */ if (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK) @@ -80,6 +79,10 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK) } else { + /* If not sending or receiving, just exit */ + if (!(SoftUSART_BitCount)) + return; + /* If at falling clock edge and we are in receive mode, abort */ if (!IsSending) return; @@ -91,7 +94,7 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK) BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK; SoftUSART_Data >>= 1; - SoftUSART_BitCount--; + SoftUSART_BitCount--; } } @@ -172,6 +175,7 @@ void XPROGTarget_EnableTargetPDI(void) /* Fire timer compare channel A ISR to manage the software USART */ OCR1A = BITS_BETWEEN_USART_CLOCKS; + OCR1B = BITS_BETWEEN_USART_CLOCKS; TCCR1B = (1 << WGM12) | (1 << CS10); TIMSK1 = (1 << OCIE1A); #endif @@ -240,6 +244,9 @@ void XPROGTarget_DisableTargetPDI(void) DDRD &= ~((1 << 5) | (1 << 3)); PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2)); #else + /* Turn off software USART management timer */ + TCCR1B = 0; + /* Set /RESET high for a one millisecond to ensure target device is restarted */ BITBANG_PDICLOCK_PORT |= BITBANG_PDICLOCK_MASK; _delay_ms(1); @@ -250,7 +257,7 @@ void XPROGTarget_DisableTargetPDI(void) /* Tristate DATA and CLOCK lines */ BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK; - BITBANG_PDICLOCK_PORT &= ~BITBANG_PDICLOCK_MASK; + BITBANG_PDICLOCK_PORT &= ~BITBANG_PDICLOCK_MASK; #endif } @@ -270,6 +277,9 @@ void XPROGTarget_DisableTargetTPI(void) DDRD &= ~((1 << 5) | (1 << 3)); PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2)); #else + /* Turn off software USART management timer */ + TCCR1B = 0; + /* Set DATA and CLOCK lines to inputs */ BITBANG_TPIDATA_DDR &= ~BITBANG_TPIDATA_MASK; BITBANG_TPICLOCK_DDR &= ~BITBANG_TPICLOCK_MASK; @@ -332,12 +342,32 @@ uint8_t XPROGTarget_ReceiveByte(void) #if defined(XPROG_VIA_HARDWARE_USART) /* Wait until a byte has been received before reading */ - while (!(UCSR1A & (1 << RXC1)) && TimeoutMSRemaining); + while (!(UCSR1A & (1 << RXC1)) && TimeoutMSRemaining) + { + /* Manage software timeout */ + if (TIFR0 & (1 << OCF0A)) + { + TIFR0 |= (1 << OCF0A); + TimeoutMSRemaining--; + } + } + return UDR1; #else /* Wait until a byte has been received before reading */ SoftUSART_BitCount = BITS_IN_USART_FRAME; - while (SoftUSART_BitCount && TimeoutMSRemaining); + while (SoftUSART_BitCount && TimeoutMSRemaining) + { + /* Manage software timeout */ + if (TIFR0 & (1 << OCF0A)) + { + TIFR0 |= (1 << OCF0A); + TimeoutMSRemaining--; + } + } + + if (TimeoutMSRemaining) + TimeoutMSRemaining = COMMAND_TIMEOUT_MS; /* Throw away the parity and stop bits to leave only the data (start bit is already discarded) */ return (uint8_t)SoftUSART_Data; @@ -431,9 +461,20 @@ static void XPROGTarget_SetRxMode(void) } /* Wait until DATA line has been pulled up to idle by the target */ - while (!(BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK) && TimeoutMSRemaining); + while (!(BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK) && TimeoutMSRemaining) + { + /* Manage software timeout */ + if (TIFR0 & (1 << OCF0A)) + { + TIFR0 |= (1 << OCF0A); + TimeoutMSRemaining--; + } + } #endif + if (TimeoutMSRemaining) + TimeoutMSRemaining = COMMAND_TIMEOUT_MS; + IsSending = false; }