Commit a5e79333 authored by Dean Camera's avatar Dean Camera
Browse files

Switch back to C based timeout ISR in the AVRISP project - assembly version...

Switch back to C based timeout ISR in the AVRISP project - assembly version was failing, and only one or two cycles could be shaved off the compiler generated code.
parent 3d28d53c
This diff is collapsed.
#include <avr/io.h>
#include "V2Protocol.h"
.global TIMER0_COMPA_vect
TIMER0_COMPA_vect:
sei
push r24
in r24, 0x3f
push r24
in r24, TimeoutMSRemaining
and r24, r24
breq Epilogue
subi r24, 0x01
out TimeoutMSRemaining, r24
Epilogue:
pop r24
out 0x3f, r24
pop r24
reti
\ No newline at end of file
...@@ -43,6 +43,12 @@ uint32_t CurrentAddress; ...@@ -43,6 +43,12 @@ uint32_t CurrentAddress;
bool MustSetAddress; bool MustSetAddress;
ISR(TIMER0_COMPA_vect, ISR_NOBLOCK)
{
if (TimeoutMSRemaining)
TimeoutMSRemaining--;
}
/** Initializes the hardware and software associated with the V2 protocol command handling. */ /** Initializes the hardware and software associated with the V2 protocol command handling. */
void V2Protocol_Init(void) void V2Protocol_Init(void)
{ {
......
...@@ -165,6 +165,10 @@ void XPROGTarget_EnableTargetPDI(void) ...@@ -165,6 +165,10 @@ void XPROGTarget_EnableTargetPDI(void)
BITBANG_PDIDATA_DDR |= BITBANG_PDIDATA_MASK; BITBANG_PDIDATA_DDR |= BITBANG_PDIDATA_MASK;
BITBANG_PDICLOCK_DDR |= BITBANG_PDICLOCK_MASK; BITBANG_PDICLOCK_DDR |= BITBANG_PDICLOCK_MASK;
/* Set DATA line low for at least 90ns to ensure that the device is ready for PDI mode to be entered */
BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK;
_delay_us(1);
/* Set DATA line high for at least 90ns to disable /RESET functionality */ /* Set DATA line high for at least 90ns to disable /RESET functionality */
BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK; BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK;
_delay_us(1); _delay_us(1);
...@@ -314,6 +318,9 @@ void XPROGTarget_SendByte(const uint8_t Byte) ...@@ -314,6 +318,9 @@ void XPROGTarget_SendByte(const uint8_t Byte)
SoftUSART_Data = NewUSARTData; SoftUSART_Data = NewUSARTData;
SoftUSART_BitCount = BITS_IN_USART_FRAME; SoftUSART_BitCount = BITS_IN_USART_FRAME;
#endif #endif
if (TimeoutMSRemaining)
TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
} }
/** Receives a byte via the software USART, blocking until data is received. /** Receives a byte via the software USART, blocking until data is received.
...@@ -369,6 +376,9 @@ void XPROGTarget_SendBreak(void) ...@@ -369,6 +376,9 @@ void XPROGTarget_SendBreak(void)
SoftUSART_Data = 0x0FFF; SoftUSART_Data = 0x0FFF;
SoftUSART_BitCount = BITS_IN_USART_FRAME; SoftUSART_BitCount = BITS_IN_USART_FRAME;
#endif #endif
if (TimeoutMSRemaining)
TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
} }
static void XPROGTarget_SetTxMode(void) static void XPROGTarget_SetTxMode(void)
...@@ -405,6 +415,9 @@ static void XPROGTarget_SetTxMode(void) ...@@ -405,6 +415,9 @@ static void XPROGTarget_SetTxMode(void)
} }
#endif #endif
if (TimeoutMSRemaining)
TimeoutMSRemaining = COMMAND_TIMEOUT_MS;
IsSending = true; IsSending = true;
} }
......
...@@ -66,7 +66,7 @@ MCU = at90usb1287 ...@@ -66,7 +66,7 @@ MCU = at90usb1287
# Target board (see library "Board Types" documentation, NONE for projects not requiring # 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 # LUFA board drivers). If USER is selected, put custom board drivers in a directory called
# "Board" inside the application directory. # "Board" inside the application directory.
BOARD = USBKEY BOARD = XPLAIN
# Processor frequency. # Processor frequency.
...@@ -157,7 +157,7 @@ CPPSRC = ...@@ -157,7 +157,7 @@ CPPSRC =
# Even though the DOS/Win* filesystem matches both .s and .S the same, # Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does # it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line. # care about how the name is spelled on its command-line.
ASRC = Lib/Timeout.S ASRC =
# Optimization level, can be [0, 1, 2, 3, s]. # Optimization level, can be [0, 1, 2, 3, s].
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment