aboutsummaryrefslogtreecommitdiffstats
path: root/Projects/AVRISP/Lib/ISPTarget.c
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2009-12-20 22:33:48 +0000
committerDean Camera <dean@fourwalledcubicle.com>2009-12-20 22:33:48 +0000
commit37c9ba7fa980472406625973f0ee32719b5a8997 (patch)
tree0db6f97496255b576cb150068f904b23b4554cb5 /Projects/AVRISP/Lib/ISPTarget.c
parent8b7565956380c558bb309732c1d7d2cb58b193ea (diff)
downloadlufa-37c9ba7fa980472406625973f0ee32719b5a8997.tar.gz
lufa-37c9ba7fa980472406625973f0ee32719b5a8997.tar.bz2
lufa-37c9ba7fa980472406625973f0ee32719b5a8997.zip
Fixed AVRISP project timeouts not checking for the correct timeout period (thanks to Carl Ott).
Diffstat (limited to 'Projects/AVRISP/Lib/ISPTarget.c')
-rw-r--r--Projects/AVRISP/Lib/ISPTarget.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/Projects/AVRISP/Lib/ISPTarget.c b/Projects/AVRISP/Lib/ISPTarget.c
index fbe8ad31c..ce364c6cc 100644
--- a/Projects/AVRISP/Lib/ISPTarget.c
+++ b/Projects/AVRISP/Lib/ISPTarget.c
@@ -123,16 +123,25 @@ uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint1
case PROG_MODE_WORD_VALUE_MASK:
case PROG_MODE_PAGED_VALUE_MASK:
TCNT0 = 0;
+ TIFR0 = (1 << OCF1A);
+
+ uint8_t TimeoutMS = TARGET_BUSY_TIMEOUT_MS;
do
{
SPI_SendByte(ReadMemCommand);
SPI_SendByte(PollAddress >> 8);
- SPI_SendByte(PollAddress & 0xFF);
+ SPI_SendByte(PollAddress & 0xFF);
+
+ if (TIFR0 & (1 << OCF1A))
+ {
+ TIFR0 = (1 << OCF1A);
+ TimeoutMS--;
+ }
}
- while ((SPI_TransferByte(0x00) != PollValue) && (TCNT0 < TARGET_BUSY_TIMEOUT_MS));
+ while ((SPI_TransferByte(0x00) != PollValue) && TimeoutMS);
- if (TCNT0 >= TARGET_BUSY_TIMEOUT_MS)
+ if (!(TimeoutMS))
ProgrammingStatus = STATUS_CMD_TOUT;
break;
@@ -153,6 +162,9 @@ uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint1
uint8_t ISPTarget_WaitWhileTargetBusy(void)
{
TCNT0 = 0;
+ TIFR0 = (1 << OCF1A);
+
+ uint8_t TimeoutMS = TARGET_BUSY_TIMEOUT_MS;
do
{
@@ -160,10 +172,16 @@ uint8_t ISPTarget_WaitWhileTargetBusy(void)
SPI_SendByte(0x00);
SPI_SendByte(0x00);
+
+ if (TIFR0 & (1 << OCF1A))
+ {
+ TIFR0 = (1 << OCF1A);
+ TimeoutMS--;
+ }
}
- while ((SPI_ReceiveByte() & 0x01) && (TCNT0 < TARGET_BUSY_TIMEOUT_MS));
+ while ((SPI_ReceiveByte() & 0x01) && TimeoutMS);
- if (TCNT0 >= TARGET_BUSY_TIMEOUT_MS)
+ if (!(TimeoutMS))
return STATUS_RDY_BSY_TOUT;
else
return STATUS_CMD_OK;