|
|
@ -49,18 +49,18 @@ volatile uint16_t SoftUSART_Data;
|
|
|
|
#define SoftUSART_BitCount GPIOR2
|
|
|
|
#define SoftUSART_BitCount GPIOR2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** ISR to manage the rising edge of the PDI/TPI software USART when bit-banged USART mode is selected. */
|
|
|
|
/** ISR to manage the PDI software USART when bit-banged PDI USART mode is selected. */
|
|
|
|
ISR(TIMER1_COMPA_vect, ISR_BLOCK)
|
|
|
|
ISR(TIMER1_COMPA_vect, ISR_BLOCK)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
/* Toggle CLOCK pin in a single cycle (see AVR datasheet) */
|
|
|
|
/* Toggle CLOCK pin in a single cycle (see AVR datasheet) */
|
|
|
|
BITBANG_PDICLOCK_PIN |= BITBANG_PDICLOCK_MASK;
|
|
|
|
BITBANG_PDICLOCK_PIN |= BITBANG_PDICLOCK_MASK;
|
|
|
|
TIFR1 |= (1 << OCF1B);
|
|
|
|
|
|
|
|
TIMSK1 = (1 << OCIE1B);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* If not sending or receiving, just exit */
|
|
|
|
/* If not sending or receiving, just exit */
|
|
|
|
if (!(SoftUSART_BitCount))
|
|
|
|
if (!(SoftUSART_BitCount))
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (BITBANG_PDICLOCK_PORT & BITBANG_PDICLOCK_MASK)
|
|
|
|
|
|
|
|
{
|
|
|
|
/* If at rising clock edge and we are in send mode, abort */
|
|
|
|
/* If at rising clock edge and we are in send mode, abort */
|
|
|
|
if (IsSending)
|
|
|
|
if (IsSending)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -76,16 +76,9 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK)
|
|
|
|
|
|
|
|
|
|
|
|
SoftUSART_Data >>= 1;
|
|
|
|
SoftUSART_Data >>= 1;
|
|
|
|
SoftUSART_BitCount--;
|
|
|
|
SoftUSART_BitCount--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
/** ISR to manage the falling edge of the PDI/TPI software USART when bit-banged USART mode is selected. */
|
|
|
|
{
|
|
|
|
ISR(TIMER1_COMPB_vect, ISR_BLOCK)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
/* Toggle CLOCK pin in a single cycle (see AVR datasheet) */
|
|
|
|
|
|
|
|
BITBANG_PDICLOCK_PIN |= BITBANG_PDICLOCK_MASK;
|
|
|
|
|
|
|
|
TIFR1 |= (1 << OCF1A);
|
|
|
|
|
|
|
|
TIMSK1 = (1 << OCIE1A);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* If not sending or receiving, just exit */
|
|
|
|
/* If not sending or receiving, just exit */
|
|
|
|
if (!(SoftUSART_BitCount))
|
|
|
|
if (!(SoftUSART_BitCount))
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -102,6 +95,7 @@ ISR(TIMER1_COMPB_vect, ISR_BLOCK)
|
|
|
|
|
|
|
|
|
|
|
|
SoftUSART_Data >>= 1;
|
|
|
|
SoftUSART_Data >>= 1;
|
|
|
|
SoftUSART_BitCount--;
|
|
|
|
SoftUSART_BitCount--;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** ISR to manage the TPI software USART when bit-banged TPI USART mode is selected. */
|
|
|
|
/** ISR to manage the TPI software USART when bit-banged TPI USART mode is selected. */
|
|
|
@ -183,7 +177,6 @@ void XPROGTarget_EnableTargetPDI(void)
|
|
|
|
OCR1A = BITS_BETWEEN_USART_CLOCKS;
|
|
|
|
OCR1A = BITS_BETWEEN_USART_CLOCKS;
|
|
|
|
OCR1B = BITS_BETWEEN_USART_CLOCKS;
|
|
|
|
OCR1B = BITS_BETWEEN_USART_CLOCKS;
|
|
|
|
TCCR1B = (1 << WGM12) | (1 << CS10);
|
|
|
|
TCCR1B = (1 << WGM12) | (1 << CS10);
|
|
|
|
TCCR1C = (1 << FOC1B);
|
|
|
|
|
|
|
|
TIMSK1 = (1 << OCIE1A);
|
|
|
|
TIMSK1 = (1 << OCIE1A);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
@ -253,7 +246,6 @@ void XPROGTarget_DisableTargetPDI(void)
|
|
|
|
#else
|
|
|
|
#else
|
|
|
|
/* Turn off software USART management timer */
|
|
|
|
/* Turn off software USART management timer */
|
|
|
|
TCCR1B = 0;
|
|
|
|
TCCR1B = 0;
|
|
|
|
TCCR1C = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Set /RESET high for a one millisecond to ensure target device is restarted */
|
|
|
|
/* Set /RESET high for a one millisecond to ensure target device is restarted */
|
|
|
|
BITBANG_PDICLOCK_PORT |= BITBANG_PDICLOCK_MASK;
|
|
|
|
BITBANG_PDICLOCK_PORT |= BITBANG_PDICLOCK_MASK;
|
|
|
|