From 5e12d436fa31399ba6b5c8cab484d4a7b5adf7e7 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sun, 21 Feb 2010 22:11:49 +0000 Subject: [PATCH] Remove dual ISR for software PDI mode, use a single ISR instead to reduce code complexity. --- Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c | 74 +++++++++----------- Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h | 22 +++++- Projects/AVRISP-MKII/makefile | 2 +- 3 files changed, 55 insertions(+), 43 deletions(-) diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c index 7bef25e6e0..85a750454e 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c @@ -49,59 +49,53 @@ volatile uint16_t SoftUSART_Data; #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) { /* Toggle CLOCK pin in a single cycle (see AVR datasheet) */ BITBANG_PDICLOCK_PIN |= BITBANG_PDICLOCK_MASK; - TIFR1 |= (1 << OCF1B); - TIMSK1 = (1 << OCIE1B); /* If not sending or receiving, just exit */ if (!(SoftUSART_BitCount)) return; - /* If at rising clock edge and we are in send mode, abort */ - if (IsSending) - return; - - /* 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) - ((uint8_t*)&SoftUSART_Data)[1] |= (1 << (BITS_IN_USART_FRAME - 9)); - - SoftUSART_Data >>= 1; - SoftUSART_BitCount--; -} + if (BITBANG_PDICLOCK_PORT & BITBANG_PDICLOCK_MASK) + { + /* If at rising clock edge and we are in send mode, abort */ + if (IsSending) + return; + + /* Wait for the start bit when receiving */ + if ((SoftUSART_BitCount == BITS_IN_USART_FRAME) && (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK)) + return; -/** 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); + /* 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) + ((uint8_t*)&SoftUSART_Data)[1] |= (1 << (BITS_IN_USART_FRAME - 9)); - /* If not sending or receiving, just exit */ - if (!(SoftUSART_BitCount)) - return; + SoftUSART_Data >>= 1; + SoftUSART_BitCount--; + } + 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; + /* If at falling clock edge and we are in receive mode, abort */ + if (!IsSending) + return; - /* Set the data line to the next bit value */ - if (((uint8_t*)&SoftUSART_Data)[0] & 0x01) - BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK; - else - BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK; + /* Set the data line to the next bit value */ + if (((uint8_t*)&SoftUSART_Data)[0] & 0x01) + BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK; + else + BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK; - SoftUSART_Data >>= 1; - SoftUSART_BitCount--; + SoftUSART_Data >>= 1; + SoftUSART_BitCount--; + } } /** 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; OCR1B = BITS_BETWEEN_USART_CLOCKS; TCCR1B = (1 << WGM12) | (1 << CS10); - TCCR1C = (1 << FOC1B); TIMSK1 = (1 << OCIE1A); #endif @@ -253,7 +246,6 @@ void XPROGTarget_DisableTargetPDI(void) #else /* Turn off software USART management timer */ TCCR1B = 0; - TCCR1C = 0; /* Set /RESET high for a one millisecond to ensure target device is restarted */ BITBANG_PDICLOCK_PORT |= BITBANG_PDICLOCK_MASK; diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h index 0c54ad4cf3..7ebed129c7 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h @@ -57,7 +57,27 @@ /* Defines: */ #if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1)) - #define XPROG_VIA_HARDWARE_USART +// #define XPROG_VIA_HARDWARE_USART + + #define BITBANG_PDIDATA_PORT PORTD + #define BITBANG_PDIDATA_DDR DDRD + #define BITBANG_PDIDATA_PIN PIND + #define BITBANG_PDIDATA_MASK (1 << 3) + + #define BITBANG_PDICLOCK_PORT PORTD + #define BITBANG_PDICLOCK_DDR DDRD + #define BITBANG_PDICLOCK_PIN PIND + #define BITBANG_PDICLOCK_MASK (1 << 5) + + #define BITBANG_TPIDATA_PORT PORTB + #define BITBANG_TPIDATA_DDR DDRB + #define BITBANG_TPIDATA_PIN PINB + #define BITBANG_TPIDATA_MASK (1 << 3) + + #define BITBANG_TPICLOCK_PORT PORTB + #define BITBANG_TPICLOCK_DDR DDRB + #define BITBANG_TPICLOCK_PIN PINB + #define BITBANG_TPICLOCK_MASK (1 << 1) #else #define BITBANG_PDIDATA_PORT PORTB #define BITBANG_PDIDATA_DDR DDRB diff --git a/Projects/AVRISP-MKII/makefile b/Projects/AVRISP-MKII/makefile index b0b26c24c1..b2c139cec8 100644 --- a/Projects/AVRISP-MKII/makefile +++ b/Projects/AVRISP-MKII/makefile @@ -66,7 +66,7 @@ MCU = at90usb1287 # Target board (see library "Board Types" documentation, NONE for projects not requiring # LUFA board drivers). If USER is selected, put custom board drivers in a directory called # "Board" inside the application directory. -BOARD = USBKEY +BOARD = XPLAIN # Processor frequency.