Страница 1 из 2
DS18B20 не определяется первый датчик в массиве
Добавлено: Вс сен 19, 2021 17:03:34
AleksFD
Доброго дня всем.
На днях столкнулся с не приятностью. Подключил датчики DS18B20 параллельно (3 шт.) и прописал поиск w1_search. Поиск показывает 3 устройства. Начинаю читать и тут прикол... Первый датчик выдает белеберду а остальные текущую температуру. Убрал датчик косячный, остались нормальные. Включаю и находится 2 шт. отлично но читается с первого датчика тоже самое. Но он то целый!!! (((
Вопрос что я делаю не так?
Код стандартный!
поиск:
devices=w1_search(DS18B20_SEARCH_ROM_CMD,rom_code);
чтение:
temp=ds18b20_temperature(&rom_code
[0]);
через devices=w1_init(); каждый датчик работает нормально...
И главное что и в протеусе тоже самое!!! 
Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Вс сен 19, 2021 18:59:07
Dimon456
Так вам ни кто не поможет.
У каждого свой "стандартный код".
Полный код, и протеус в месте с проектом, в архив zip, rar не все скачивают.
Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Вс сен 19, 2021 19:13:45
AleksFD
Файл добавил.
Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Вс сен 19, 2021 21:39:15
Dimon456
Ух сколько много скачали.
В общем это цена за бесплатный компилятор. Проблема в функции w1_read(), которая, к сожалению, куда-то уходит в cvavr_Final_Crack.exe.
Вот проект, собранный в версии 2.05.0, только не вздумайте пересобрать
Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Вс сен 19, 2021 21:40:48
Eddy_Em
Стопудово проблема в функции w1_search.
Как вообще 1-wire реализовано? На таймере с прерываниями или на UART с прерываниями?
Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Пн сен 20, 2021 06:08:31
slav0n
Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Пн сен 20, 2021 06:43:36
Dimon456
slav0n, что ты егозишь.
cvavr не бесплатный.
Единственно что я из него использую, это генератор начального кода.
Пусть от сюда скачает
1-Wire. Работа с DS18B20. Часть 3 там и для cvavr есть проектик.
Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Пн сен 20, 2021 08:11:20
slav0n
просто снял гипс, кайфую
винавр давно отучил от пользования сторонних кривых лаиб
Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Пн сен 20, 2021 08:33:22
Dimon456
Это не кривая либа виновата, ардуиноиде туда же.
slav0n писал(а):винавр
расскажи по подробнее, что установлено и чем пользуешься?
Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Пн сен 20, 2021 09:15:36
slav0n
чисто винавр, даже без студии
Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Пн сен 20, 2021 09:17:45
AleksFD
Я Вас понял! Спасибо за проверку. Буду ковырять библиотеки.
Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Пн сен 20, 2021 22:00:29
AleksFD
Не поверите!!! Нашел косяк и он в компиляторе.
Поменяйте две строчки местами и о чудо, заработало!!!! Но пропадает вторая строка LCD
unsigned char lcd_buf[16], lcd_buf1[16];
unsigned char rom_code[MAX_DEVICES][9];
Перенос переменной из глобал в локал (unsigned char rom_code[MAX_DEVICES][9]

Соблюдается очередность и вторая строка появляется на LCD....
Разработчики прикольнулись
И не важно это 3,12 или 2,05 везде одинаково!!! Убил весь вечер на поиски истины
Миссия выполнена

Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Пн сен 20, 2021 23:30:36
Eddy_Em
Мораль сей басни такова: пиши код сам!
Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Пн сен 20, 2021 23:32:40
Карбофос
Скорее стэк затирает что-то.
Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Вт сен 21, 2021 06:55:26
Dimon456
Карбофос писал(а):Скорее стэк затирает что-то.
И ни кто на это не обратил внимание.
Было
Код: Выделить всё
unsigned char lcd_buf[16], lcd_buf1[16];
unsigned char rom_code[MAX_DEVICES][9];
вот в этом коде
Код: Выделить всё
sprintf(lcd_buf,"%u DS1820\nDevice detected",devices);
больше 16 символов, в строку то lcd_buf не влазит.
ТС lcd_buf1 у тебя в коде не используется, его можно убрать.
Вот здесь
поставь не 16, а 36 символов (с запасом), а так нужно 25 символов.
Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Вт сен 21, 2021 09:00:15
AleksFD
[uquote="Карбофос",url="/forum/viewtopic.php?p=4094390#p4094390"]Скорее стэк затирает что-то.[/uquote]
Да совершенно верно. Две переменные были объединены и получили один массив регистров. А у контроллера видимо нет проверки соблюдения распределения регистров. Поэтому он наезжал на следущий регистр при записи текста в регистр lcd_buf.
Я программист промышленных плк. И у промышленных плк такое возможно когда используешь память косвенно на заранее распределенную память или меркеры памяти которые уже представлены в виде готового набора регистров.
Перенос на локалку, сожрало следующие регистры, поэтому и появилась вторая строка.
Добавлено after 23 minutes 27 seconds:
Скорее всего это касается настроек компелятора. Будет время поковыряю его.
Добавлено after 48 minutes 44 seconds:
Если не мучаться то расширить массив lcd_buf до 32 символов ну или сидеть и считать динамические данные чтоб не прыгнуть на соседний регистр)))
Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Вт сен 21, 2021 09:43:19
Dimon456
AleksFD писал(а):до 32 символов
мало, может не хватить.
\n то же символ, а так же 0 символ конца строки.
Так что лучше сидеть и считать.
Вот вам еще одна фишка: задайте переменную
а потом
Код: Выделить всё
count = sprintf(lcd_buf,"%u DS1820\nDevice detected",devices);
так вы будете знать сколько символов было преобразовано в строку, +1 символ конца строки.
Кроме всего прочего перед
u поставьте 1,
что гарантирует 1 символ для переменной devices.
Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Вт сен 21, 2021 09:51:43
AleksFD
Вот вам еще одна фишка: задайте переменную
а потом
Код: Выделить всё
count = sprintf(lcd_buf,"%u DS1820\nDevice detected",devices);
так вы будете знать сколько символов было преобразовано в строку.
Уже будет поздно

Мы только узнаем сколько лишнего затели.
Лучше поставить в глобал последней и будет автоматически отрезаться хвост

Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Вт сен 21, 2021 09:56:43
Dimon456
AleksFD писал(а):Лучше поставить в глобал последней и будет автоматически отрезаться хвост
не вариант, не всегда это возможно, а вдруг там стек будет расположен, кто знает куда его компилятор помещает.
И вам что, оперативки жалко?
Re: DS18B20 не определяется первый датчик в массиве
Добавлено: Вт сен 21, 2021 10:04:20
AleksFD
Оперативки вообще не жалко! Главное избежать такой мины.
Добавлено after 3 minutes 5 seconds:
А лучше написать функцию по проверке длины текста до склейки.