Цитата(Qwertty @ Jan 20 2007, 15:02)

В CV они на C. Но вот сама возможность подключения нескольких датчиков, с использованием в дальнейшем их поиска на шине, кмк вещь бесполезная. Как их отличать? Простейший пример - один датчик на улице, другой в квартире. Хочется не просто получить две температуры, но и знать, какая из них на улице, а какая в доме. Или есть способ? Подключение по очереди с запоминанием серийного номера - простейший, но это не требует поиска на шине, то есть не совсем то.
Возможно Вы правы, хотя абсолютных решений не бывает. Вы предлагаете использовать по одному входу на каждый датчик. Тогда каждый датчик чётко связан со своим местом(номером). Это тоже выход. Но у меня их до 10. Использовать 10 входов не всегда возможно. А программа позволяет использовать колличество датчиков ограниченное только свободной памятью (точнее памятью кучи). Например у меня в проекте под кучу выделено 256 байт. Это позволяет использовать 31 датчик из под меги 8.
А вообще я писал проект как учебный. (В смысле я использовал п/п для него в реальном проекте, а этот использовал для отладки) На мой взгляд он простой и наглядный. Возможно кто-нибудь найдёт в нём что-нибудь для себя интересное. Или оптимизирует его для себя и почуствует радость первой победы.

С ним просто можно проводить эксперименты. Я применил динамическое выделение памяти, хотя мог бы просто ограничить число датчиков разумным и создать массив. Зато некоторые увидят, как используется динамическая память и указатели.
В программировании не всё очевидно. Вот пример прототипа который я брал за основу.
Код
//Чтение температуры
uint8_t read_temp(void)
{
uint8_t scratchpad[9];
uint8_t crc = 0;
// initiate array to 0
for (uint8_t a1 = 0; a1 < 9; a1++) scratchpad[a1] = 0;
// __delay_cycles(F_CLK); //time measurement temperature in DS18B20 (780ms)
OW_reset();
OW_write_byte(SKIP_ROM); // skip ROM
OW_write_byte(READ_SCRATCHPAD); // read scratchpad 0xBE
//Recive data in 1 Wire
for (uint8_t c1 = 0; c1 < 9; c1++)
{
scratchpad[c1] = OW_read_byte();
}
//Check CRC8 to 1 Wire data
for(uint8_t i = 0; i < 8; i++)
{
crc = OW_ComputeCRC8(scratchpad[i], crc);
}
if (crc == scratchpad[8])
{
return ((scratchpad[1] << 4) | (scratchpad[0] >> 4));
}
return ( ERROR_CRC); // Message -80
}
А вот что получилось у меня.
Код
//Чтение температуры
int8_t read_scratchpad(uint8_t tip)
{
uint8_t scratchpad[8];
uint8_t crc = 0;
OW_write_byte(READ_SCRATCHPAD); // читаем scratchpad 0xBE
for (uint8_t c1 = 0; c1 < 8; c1++)
{
scratchpad[c1] = OW_read_byte(); // Принять данные с 1 Wire шины
crc = OW_crc8(crc, scratchpad[c1]); // Посчитать CRC8 для 1 Wire шины
}
crc=OW_crc8(crc, OW_read_byte());
OW_reset();
if (crc == 0) // Проверить CRC8 для 1 Wire шины
{
if(tip==DS18B20TIP)
return ((scratchpad[1] << 4) | ((scratchpad[0]+8) >> 4));
else
return ((scratchpad[1] & 0x80) | ((scratchpad[0]+1) >> 1));
}
else return ( ERROR_CRC); // Message -80
}
//Чтение температуры (для одного датчика на шине)
int8_t read_temp_short(void)
{
OW_reset();
OW_write_byte(SKIP_ROM); // пропусь ROM
return (read_scratchpad(DS18B20TIP)); // Чтение температуры
}
Найдите три различия.
Не забывайте - это проект для начинающих.