Приведу пример использования.
Проводим инициализацию датчиков
ds18b20_pin(0); //сначало определили линию с которой будем работать 0 init_w1_ds(-55,125,DS18B20_12BIT); //настроили 1 датчик из найденых ром кодов на 12 бит ds18b20_pin(2); //сначало определили линию с которой будем работать 2 init_w1_ds(-55,125,DS18B20_12BIT); //настроили 1 датчик из найденых ром кодов на 9 бит
Далее прописываем функции:
void pr() { #asm ("cli"); // t1 = temp_18b20(0); //t2 = temp_18b20(2); tf1 = Ftemp_18b20(0); tf2 = Ftemp_18b20(2); #asm ("sei"); if(t1 > 1000) //если температура <0 { t1 = 4096 - t1 ; t1 = -t1 ; } if(t2 > 1000) //если температура <0 { t2 = 4096 - t2 ; t2 = -t2 ; } //lcd_gotoxy(1,0); sprintf(buff,"%i.%iC ",t1/10,t1%10); lcd_puts(buff); //lcd_gotoxy(1,1); sprintf(buff,"%i.%iC ",t2/10,t2%10); lcd_puts(buff); lcd_gotoxy(1,0); sprintf(buff,"%0.1fC ",tf1); lcd_puts(buff); lcd_gotoxy(1,1); sprintf(buff,"%0.1fC ",tf2); lcd_puts(buff); delay_ms(150); }
Это пример работы с функцией ожидания.
Результат симуляции в Proteus 8:
Чтобы воспользоватся раздельными функциями без ожидания действуем по такому алгоритму:
- Определяем пин с которым будем работать в данный момент функцией : ds18b20_pin(unsigned char pin_ds)
- ds18b20_convert_t_rom() // запустить конвертирование температуры
- тут что то делаем в течении секунды или меньше, в зависимости от разрядности датчика или же можно проверять состояние шины на результат функцией ds18b20_convert_ok(unsigned char pin_ds) — возратит «1» когда можно будет забирать результат.
- Забираем результат преобразования int ds18b20_result_t_rom()
Вот и все 🙂
В архиве проект тестовый и библиотека)
Скачать Библиотека работы с DS18B20 с возможностью работы нескольких датчиков на разных портах Скачали 3569 раз
Пожалуй единственное решение которое вменяемо заработало 🙂 Единственный косяк, если вдруг какой то из датчиков замкнет на минус (ну мыши там провод перегрызут) то из-за того что присутствие датчика определяется только по наличию минуса на сигнальном проводе через 70мс то зависает все это дело при попытке считать температуру на функции ds18b20_convert_ok. Она никогда не отработает потому что датчика то нет. Решение в скриншоте. Добавил пару строк.
Огромное спасибо!
То что искал!