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
- SoftUSART_Data |= (1 << BITS_IN_FRAME);\r
+ SoftUSART_Data |= (1 << (BITS_IN_FRAME - 1));\r
\r
SoftUSART_Data >>= 1;\r
SoftUSART_BitCount--;\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
bool EvenParityBit = false;\r
uint8_t ParityData = Byte;\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
+ while (ParityData)\r
{\r
- EvenParityBit ^= ParityData & 0x01;\r
- ParityData >>= 1;\r
+ EvenParityBit ^= true;\r
+ ParityData &= (ParityData - 1);\r
}\r
\r
+ /* Calculate the new USART frame data here while while we wait for a previous byte (if any) to finish sending */\r
+ uint16_t NewUSARTData = ((1 << 11) | (1 << 10) | ((uint16_t)EvenParityBit << 9) | ((uint16_t)Byte << 1) | (0 << 0));\r
+\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
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
+ return (uint8_t)SoftUSART_Data;\r
#endif\r
}\r
\r
\r
/* Defines: */\r
#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))\r
- #define PDI_VIA_HARDWARE_USART\r
+// #define PDI_VIA_HARDWARE_USART\r
+\r
+ #define BITBANG_PDIDATA_PORT PORTD\r
+ #define BITBANG_PDIDATA_DDR DDRD\r
+ #define BITBANG_PDIDATA_PIN PIND\r
+ #define BITBANG_PDIDATA_MASK (1 << 3)\r
+ \r
+ #define BITBANG_PDICLOCK_PORT PORTD\r
+ #define BITBANG_PDICLOCK_DDR DDRD\r
+ #define BITBANG_PDICLOCK_PIN PIND\r
+ #define BITBANG_PDICLOCK_MASK (1 << 5)\r
#else\r
#define BITBANG_PDIDATA_PORT PORTB\r
#define BITBANG_PDIDATA_DDR DDRB\r