Make AVRISP-MKII clone project's software PDI/TPI mode more robust by keeping track of timeouts while waiting for a Tx/Rx to finish.

pull/1469/head
Dean Camera 15 years ago
parent 3c7ff36cfd
commit 85aaaf84ce

@ -156,8 +156,7 @@ void XPROGTarget_EnableTargetPDI(void)
PORTD |= (1 << 3); PORTD |= (1 << 3);
_delay_us(1); _delay_us(1);
/* Set up the synchronous USART for XMEGA communications - /* Set up the synchronous USART for XMEGA communications - 8 data bits, even parity, 2 stop bits */
8 data bits, even parity, 2 stop bits */
UBRR1 = (F_CPU / XPROG_HARDWARE_SPEED); UBRR1 = (F_CPU / XPROG_HARDWARE_SPEED);
UCSR1B = (1 << TXEN1); UCSR1B = (1 << TXEN1);
UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);
@ -172,7 +171,6 @@ void XPROGTarget_EnableTargetPDI(void)
/* Fire timer compare channel A ISR to manage the software USART */ /* Fire timer compare channel A ISR to manage the software USART */
OCR1A = BITS_BETWEEN_USART_CLOCKS; OCR1A = BITS_BETWEEN_USART_CLOCKS;
OCR1B = BITS_BETWEEN_USART_CLOCKS;
TCCR1B = (1 << WGM12) | (1 << CS10); TCCR1B = (1 << WGM12) | (1 << CS10);
TIMSK1 = (1 << OCIE1A); TIMSK1 = (1 << OCIE1A);
#endif #endif
@ -197,8 +195,7 @@ void XPROGTarget_EnableTargetTPI(void)
DDRD |= (1 << 5) | (1 << 3); DDRD |= (1 << 5) | (1 << 3);
DDRD &= ~(1 << 2); DDRD &= ~(1 << 2);
/* Set up the synchronous USART for TINY communications - /* Set up the synchronous USART for TINY communications - 8 data bits, even parity, 2 stop bits */
8 data bits, even parity, 2 stop bits */
UBRR1 = (F_CPU / XPROG_HARDWARE_SPEED); UBRR1 = (F_CPU / XPROG_HARDWARE_SPEED);
UCSR1B = (1 << TXEN1); UCSR1B = (1 << TXEN1);
UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);
@ -402,7 +399,14 @@ static void XPROGTarget_SetTxMode(void)
IsSending = true; IsSending = true;
#else #else
while (SoftUSART_BitCount); while (SoftUSART_BitCount && TimeoutMSRemaining)
{
if (TIFR0 & (1 << OCF0A))
{
TIFR0 |= (1 << OCF0A);
TimeoutMSRemaining--;
}
}
/* Wait for a full cycle of the clock */ /* Wait for a full cycle of the clock */
SoftUSART_Data = 0x0001; SoftUSART_Data = 0x0001;
@ -436,7 +440,14 @@ static void XPROGTarget_SetRxMode(void)
DDRD &= ~(1 << 3); DDRD &= ~(1 << 3);
PORTD &= ~(1 << 3); PORTD &= ~(1 << 3);
#else #else
while (SoftUSART_BitCount); while (SoftUSART_BitCount && TimeoutMSRemaining)
{
if (TIFR0 & (1 << OCF0A))
{
TIFR0 |= (1 << OCF0A);
TimeoutMSRemaining--;
}
}
if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI) if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)
{ {

Loading…
Cancel
Save