void DS18B20_Execute() { /* -флаг сброшен - выполнить поиск 1Wire устройств -если количество заданных устройсв совпадает с колличеством найденных - устанавливаем флаг, чтобы функция поиска больше не запускалась */ if (ds18b20_searchFlag == SEARCH_SENSORS){ ds18b20_num = 0; ds18b20_crcFlag = OWI_SearchDevices(ds18b20_AllDevices, MAX_DEVICES, BUS, &ds18b20_num); if ((ds18b20_num == MAX_DEVICES)&&(ds18b20_crcFlag != SEARCH_CRC_ERROR)){ ds18b20_searchFlag = SENSORS_FOUND; } } /* считать температуру первого найденного датчика если возвращена ошибка CRC, вывести строку "not" и сбросить флаг, чтобы функция поиска снова произвела опрос шины */ ds18b20_crcFlag = DS18B20_ReadTemperature(BUS, ds18b20_AllDevices[0].id, &(ds18b20_temperature[0])); if (ds18b20_crcFlag != READ_CRC_ERROR){ // DS18B20_PrintTemperature(ds18b20_temperature); } else{ ds18b20_searchFlag = SEARCH_SENSORS; } /* считать температуру второго найденного датчика если возвращена ошибка CRC, вывести строку "not" и сбросить флаг, чтобы функция поиска снова произвела опрос шины */ // LCD_Goto(7,1); ds18b20_crcFlag = DS18B20_ReadTemperature(BUS, ds18b20_AllDevices[1].id, &(ds18b20_temperature[1])); if (ds18b20_crcFlag != READ_CRC_ERROR){ // DS18B20_PrintTemperature(ds18b20_temperature); } else{ // LCD_SendString(" not "); ds18b20_searchFlag = SEARCH_SENSORS; } }
/* * Инициализирует поиск устройств на шине 1-Wire * и возвращает кол-во найденных устройств * или -1 в случае ошибки */ char oneWireSearch(OWI_device* devices){ //итак, методы работы с 1-wire содержат //sei() и cli(), что будет убивать текущую передачу по clunet (если она есть) //поэтому дождемся ее конца и начнем обращаться к 1-wire clunet_wait_sending(); unsigned char num = 0; if (OWI_SearchDevices(devices, OWI_MAX_BUS_DEVICES, OWI_BUS, &num) == SEARCH_CRC_ERROR){ return -1; }else{ return num; } }