Присоединюсь к совету
vesago: организуйте все-таки вывод полученных данных (независимо от кривости CRC) в терминал.
По остальному коду:
имхо, зря дергаете в 0/1 сам пин - если не требуется strong pull-up (а для чтения таблеток он не требуется), достаточно установить пин в 0 и переключать только DDR;
имхо, перед сбросом стОит контролировать шину на 1;
имхо, удобнее биты передавать/принимать как-то так:
Код
BYTE bitmask;
Data = 0x33;
// если да - передача команды
for(bitmask = 1; bitmask; bitmask <<= 1)
{
SETBIT(DDR_TM, TM); // выход
if(!(Data & bitmask))
__delay_cycles(clkMhz * 45);
CLRBIT(DDR_TM, TM); // вход
else
{
__delay_cycles(clkMhz * 5);
CLRBIT(DDR_TM, TM); // вход
__delay_cycles(clkMhz * 40);
}
__delay_cycles(clkMhz * 10);
}
Неплохо бы узнать точность эмуляции ванварного слейва в CPZ. Для этого, н-р, заводите в двухмиллисекундном цикле сначала только ResetPulse - PresenceDetect, определяете допуски по таймингам для них, потом добавляете в цикл передачу ReadROM и чтение только первого байта, определяете остальные допуски.
На 2-хмс развертке осциллографа все будет хорошо видно.