/***************************************************************************** * Function name : DS18B20_ReadDevice * Returns : коды - READ_CRC_ERROR, если считанные данные не прошли проверку * READ_SUCCESSFUL, если данные прошли проверку * Parameters : bus - вывод микроконтроллера, который выполн¤ет роль 1WIRE шины * *id - им¤ массива из 8-ми элементов, в котором хранитс¤ * адрес датчика DS18B20 * *temperature - указатель на шестнадцати разр¤дную переменную * в которой будет сохранено считанного зн. температуры * Purpose : ћетод только считывает значение ”∆≈ »«ћ≈–≈ЌЌќ… температуры из scratchpad, * Ќ≈ ¬џѕќЋЌя≈“ »«ћ≈–≈Ќ»≈ * јдресует датчик DS18B20, считывает его пам¤ть - scratchpad, провер¤ет CRC, * сохран¤ет значение температуры в переменной, возвращает код ошибки *****************************************************************************/ unsigned char DS18B20_ReadDevice(unsigned char bus, unsigned char* id, signed int* temperature){ unsigned char scratchpad[9]; OWI_DetectPresence(bus); OWI_MatchRom(id, bus); OWI_SendByte(DS18B20_READ_SCRATCHPAD, bus); for (unsigned char i = 0; i <= 8; i++){ scratchpad[i] = OWI_ReceiveByte(bus); } if(OWI_CheckScratchPadCRC(scratchpad) != OWI_CRC_OK){ return READ_CRC_ERROR; } *temperature = (unsigned int)scratchpad[0]; *temperature |= ((unsigned int)scratchpad[1] << 8); if ((*temperature & 0x8000) != 0){ *temperature = -(~(*temperature) + 1); } //*temperature *= 0.625f; *temperature *= 5; //0.625 = 5/8 *temperature /= 8; return READ_SUCCESSFUL; }
/***************************************************************************** * Function name : DS18B20_ReadTemperature * Returns : коды - READ_CRC_ERROR, если считанные данные не прошли проверку * READ_SUCCESSFUL, если данные прошли проверку * Parameters : bus - вывод микроконтроллера, который выполняет роль 1WIRE шины * *id - имя массива из 8-ми элементов, в котором хранится * адрес датчика DS18B20 * *ds18b20_temperature - указатель на шестнадцати разрядную переменную * в которой будет сохранено считанного зн. температуры * Purpose : Адресует датчик DS18B20, дает команду на преобразование температуры * ждет, считывает его память - scratchpad, проверяет CRC, * сохраняет значение температуры в переменной, возвращает код ошибки *****************************************************************************/ BYTE DS18B20_ReadTemperature(BYTE bus, BYTE * id, WORD* ds18b20_temperature) { unsigned char scratchpad[9]; unsigned char i; /*подаем сигнал сброса команду для адресации устройства на шине подаем команду - запук преобразования */ OWI_DetectPresence(bus); OWI_MatchRom(id, bus); OWI_SendByte(DS18B20_CONVERT_T ,bus); /*ждем, когда датчик завершит преобразование*/ while (!OWI_ReadBit(bus)); /*подаем сигнал сброса команду для адресации устройства на шине команду - чтение внутренней памяти затем считываем внутреннюю память датчика в массив */ OWI_DetectPresence(bus); OWI_MatchRom(id, bus); OWI_SendByte(DS18B20_READ_SCRATCHPAD, bus); for (i = 0; i<=8; i++){ scratchpad[i] = OWI_ReceiveByte(bus); } if(OWI_CheckScratchPadCRC(scratchpad) != OWI_CRC_OK){ return READ_CRC_ERROR; } *ds18b20_temperature = MAKEWORD(scratchpad[0], scratchpad[1]); return READ_SUCCESSFUL; }