projects
/
pub
/
USBasp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Added CPU Usage monitor host app to the LEDNotifier project.
[pub/USBasp.git]
/
Projects
/
AVRISP
/
Lib
/
PDITarget.c
diff --git
a/Projects/AVRISP/Lib/PDITarget.c
b/Projects/AVRISP/Lib/PDITarget.c
index
1bbb4d5
..
afcf8b8
100644
(file)
--- a/
Projects/AVRISP/Lib/PDITarget.c
+++ b/
Projects/AVRISP/Lib/PDITarget.c
@@
-39,14
+39,15
@@
#if defined(ENABLE_PDI_PROTOCOL) || defined(__DOXYGEN__)
\r
\r
/** Flag to indicate if the USART is currently in Tx or Rx mode. */
\r
#if defined(ENABLE_PDI_PROTOCOL) || defined(__DOXYGEN__)
\r
\r
/** Flag to indicate if the USART is currently in Tx or Rx mode. */
\r
-volatile bool IsSending;
\r
+volatile bool
IsSending;
\r
\r
#if !defined(PDI_VIA_HARDWARE_USART)
\r
/** Software USART raw frame bits for transmission/reception. */
\r
\r
#if !defined(PDI_VIA_HARDWARE_USART)
\r
/** Software USART raw frame bits for transmission/reception. */
\r
-volatile uint16_t SoftUSART_Data;
\r
+volatile uint16_t
SoftUSART_Data;
\r
\r
/** Bits remaining to be sent or received via the software USART - set as a GPIOR for speed. */
\r
\r
/** Bits remaining to be sent or received via the software USART - set as a GPIOR for speed. */
\r
-#define SoftUSART_BitCount GPIOR2
\r
+#define SoftUSART_BitCount GPIOR2
\r
+
\r
\r
/** ISR to manage the software USART when bit-banged USART mode is selected. */
\r
ISR(TIMER1_COMPA_vect, ISR_BLOCK)
\r
\r
/** ISR to manage the software USART when bit-banged USART mode is selected. */
\r
ISR(TIMER1_COMPA_vect, ISR_BLOCK)
\r
@@
-69,8
+70,10
@@
ISR(TIMER1_COMPA_vect, ISR_BLOCK)
if ((SoftUSART_BitCount == BITS_IN_FRAME) && (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK))
\r
return;
\r
\r
if ((SoftUSART_BitCount == BITS_IN_FRAME) && (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK))
\r
return;
\r
\r
+ /* Shift in the bit one less than the frame size in position, so that the start bit will eventually
\r
+ * be discarded leaving the data to be byte-aligned for quick access */
\r
if (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK)
\r
if (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK)
\r
- SoftUSART_Data |= (1 <<
BITS_IN_FRAME
);
\r
+ SoftUSART_Data |= (1 <<
(BITS_IN_FRAME - 1)
);
\r
\r
SoftUSART_Data >>= 1;
\r
SoftUSART_BitCount--;
\r
\r
SoftUSART_Data >>= 1;
\r
SoftUSART_BitCount--;
\r
@@
-81,6
+84,7
@@
ISR(TIMER1_COMPA_vect, ISR_BLOCK)
if (!IsSending)
\r
return;
\r
\r
if (!IsSending)
\r
return;
\r
\r
+ /* Set the data line to the next bit value */
\r
if (SoftUSART_Data & 0x01)
\r
BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK;
\r
else
\r
if (SoftUSART_Data & 0x01)
\r
BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK;
\r
else
\r
@@
-192,20
+196,22
@@
void PDITarget_SendByte(uint8_t Byte)
IsSending = true;
\r
}
\r
\r
IsSending = true;
\r
}
\r
\r
- bool EvenParityBit = false;
\r
- uint
8_t ParityData = Byte
;
\r
+ /* Calculate the new USART frame data here while while we wait for a previous byte (if any) to finish sending */
\r
+ uint
16_t NewUSARTData = ((1 << 11) | (1 << 10) | (0 << 9) | ((uint16_t)Byte << 1) | (0 << 0))
;
\r
\r
\r
- /* Compute Even parity bit */
\r
- for (uint8_t i = 0; i < 8; i++)
\r
+ /* Compute Even parity - while a bit is still set, chop off lowest bit and toggle parity bit */
\r
+ uint8_t ParityData = Byte;
\r
+ while (ParityData)
\r
{
\r
{
\r
-
EvenParityBit ^= ParityData & 0x01
;
\r
- ParityData
>>= 1
;
\r
+
NewUSARTData ^= (1 << 9)
;
\r
+ ParityData
&= (ParityData - 1)
;
\r
}
\r
\r
}
\r
\r
+ /* Wait until transmitter is idle before writing new data */
\r
while (SoftUSART_BitCount);
\r
\r
/* Data shifted out LSB first, START DATA PARITY STOP STOP */
\r
while (SoftUSART_BitCount);
\r
\r
/* Data shifted out LSB first, START DATA PARITY STOP STOP */
\r
- SoftUSART_Data =
((uint16_t)EvenParityBit << 9) | ((uint16_t)Byte << 1) | (1 << 10) | (1 << 11)
;
\r
+ SoftUSART_Data =
NewUSARTData
;
\r
SoftUSART_BitCount = BITS_IN_FRAME;
\r
#endif
\r
}
\r
SoftUSART_BitCount = BITS_IN_FRAME;
\r
#endif
\r
}
\r
@@
-251,8
+257,8
@@
uint8_t PDITarget_ReceiveByte(void)
SoftUSART_BitCount = BITS_IN_FRAME;
\r
while (SoftUSART_BitCount);
\r
\r
SoftUSART_BitCount = BITS_IN_FRAME;
\r
while (SoftUSART_BitCount);
\r
\r
- /* Throw away the
start, parity and stop bits to leave only the data
*/
\r
- return (uint8_t)
(SoftUSART_Data >> 1)
;
\r
+ /* Throw away the
parity and stop bits to leave only the data (start bit is already discarded)
*/
\r
+ return (uint8_t)
SoftUSART_Data
;
\r
#endif
\r
}
\r
\r
#endif
\r
}
\r
\r
@@
-273,7
+279,7
@@
void PDITarget_SendBreak(void)
}
\r
\r
/* Need to do nothing for a full frame to send a BREAK */
\r
}
\r
\r
/* Need to do nothing for a full frame to send a BREAK */
\r
- for (uint8_t i = 0; i <
=
BITS_IN_FRAME; i++)
\r
+ for (uint8_t i = 0; i < BITS_IN_FRAME; i++)
\r
{
\r
/* Wait for a full cycle of the clock */
\r
while (PIND & (1 << 5));
\r
{
\r
/* Wait for a full cycle of the clock */
\r
while (PIND & (1 << 5));
\r