//------------------------- Чтение термометра: -------------------------------
void Th_Read(void)
{
static char Th_Crc; //контрольная сумма термометра
if(Th_Present)
{
TReset(); //импульс сброса
if(Th_Present)
{
TByte(0xCC); //skip ROM
TByte(0xBE); //read scratchpad
Th_Crc = 0; //инициализация CRC
for(char i = 0; i < 9; i++)
{
char b = TByte(0xFF); //чтение данных
Th_Crc8(b, &Th_Crc); //обновление CRC
Th_Data[i] = b; //сохранение данных
}
}
}
Th_Ready = Th_Present && !Th_Crc; //готовность данных
}
//--------------------- Вычисление контрольной суммы: ------------------------
void Th_Crc8(char b, char *crc)
{
for(char i = 0; i < 8; b = b >> 1, i++)
if((b ^ *crc) & 1) *crc = ((*crc ^ 0x18) >> 1) | 0x80;
else *crc = (*crc >> 1) & ~0x80;
}