Обсуждаем контроллеры компании Atmel.
Ответить

DS18B20 не определяется первый датчик в массиве

Вс сен 19, 2021 17:03:34

Доброго дня всем.

На днях столкнулся с не приятностью. Подключил датчики DS18B20 параллельно (3 шт.) и прописал поиск w1_search. Поиск показывает 3 устройства. Начинаю читать и тут прикол... Первый датчик выдает белеберду а остальные текущую температуру. Убрал датчик косячный, остались нормальные. Включаю и находится 2 шт. отлично но читается с первого датчика тоже самое. Но он то целый!!! (((

Вопрос что я делаю не так?
Код стандартный!

поиск:
devices=w1_search(DS18B20_SEARCH_ROM_CMD,rom_code);
чтение:
temp=ds18b20_temperature(&rom_code[i][0]);

через devices=w1_init(); каждый датчик работает нормально...

И главное что и в протеусе тоже самое!!! :oops:

Re: DS18B20 не определяется первый датчик в массиве

Вс сен 19, 2021 18:59:07

Так вам ни кто не поможет.
У каждого свой "стандартный код".

Полный код, и протеус в месте с проектом, в архив zip, rar не все скачивают.

Re: DS18B20 не определяется первый датчик в массиве

Вс сен 19, 2021 19:13:45

Файл добавил.
Вложения
test.7z
(694.44 KiB) Скачиваний: 95

Re: DS18B20 не определяется первый датчик в массиве

Вс сен 19, 2021 21:39:15

Ух сколько много скачали.
В общем это цена за бесплатный компилятор. Проблема в функции w1_read(), которая, к сожалению, куда-то уходит в cvavr_Final_Crack.exe.

Вот проект, собранный в версии 2.05.0, только не вздумайте пересобрать
test3.zip
(104.35 KiB) Скачиваний: 86

Re: DS18B20 не определяется первый датчик в массиве

Вс сен 19, 2021 21:40:48

Стопудово проблема в функции w1_search.
Как вообще 1-wire реализовано? На таймере с прерываниями или на UART с прерываниями?

Re: DS18B20 не определяется первый датчик в массиве

Пн сен 20, 2021 06:08:31

WTF?!!

Re: DS18B20 не определяется первый датчик в массиве

Пн сен 20, 2021 06:43:36

slav0n, что ты егозишь.

cvavr не бесплатный.
Единственно что я из него использую, это генератор начального кода.

Пусть от сюда скачает 1-Wire. Работа с DS18B20. Часть 3 там и для cvavr есть проектик.

Re: DS18B20 не определяется первый датчик в массиве

Пн сен 20, 2021 08:11:20

просто снял гипс, кайфую
винавр давно отучил от пользования сторонних кривых лаиб

Re: DS18B20 не определяется первый датчик в массиве

Пн сен 20, 2021 08:33:22

Это не кривая либа виновата, ардуиноиде туда же.
slav0n писал(а):винавр
расскажи по подробнее, что установлено и чем пользуешься?

Re: DS18B20 не определяется первый датчик в массиве

Пн сен 20, 2021 09:15:36

чисто винавр, даже без студии
Вложения
винавр.png
(39.36 KiB) Скачиваний: 77

Re: DS18B20 не определяется первый датчик в массиве

Пн сен 20, 2021 09:17:45

Я Вас понял! Спасибо за проверку. Буду ковырять библиотеки.

Re: DS18B20 не определяется первый датчик в массиве

Пн сен 20, 2021 22:00:29

Не поверите!!! Нашел косяк и он в компиляторе.
Поменяйте две строчки местами и о чудо, заработало!!!! Но пропадает вторая строка LCD :dont_know:
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 везде одинаково!!! Убил весь вечер на поиски истины :write:
Миссия выполнена :beer:

Re: DS18B20 не определяется первый датчик в массиве

Пн сен 20, 2021 23:30:36

Мораль сей басни такова: пиши код сам!

Re: DS18B20 не определяется первый датчик в массиве

Пн сен 20, 2021 23:32:40

Скорее стэк затирает что-то.

Re: DS18B20 не определяется первый датчик в массиве

Вт сен 21, 2021 06:55:26

Карбофос писал(а):Скорее стэк затирает что-то.
И ни кто на это не обратил внимание.
Было
Код:
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 у тебя в коде не используется, его можно убрать.

Вот здесь
Код:
unsigned char lcd_buf[16]
поставь не 16, а 36 символов (с запасом), а так нужно 25 символов.

Re: DS18B20 не определяется первый датчик в массиве

Вт сен 21, 2021 09:00:15

Скорее стэк затирает что-то.

Да совершенно верно. Две переменные были объединены и получили один массив регистров. А у контроллера видимо нет проверки соблюдения распределения регистров. Поэтому он наезжал на следущий регистр при записи текста в регистр lcd_buf.
Я программист промышленных плк. И у промышленных плк такое возможно когда используешь память косвенно на заранее распределенную память или меркеры памяти которые уже представлены в виде готового набора регистров.

Перенос на локалку, сожрало следующие регистры, поэтому и появилась вторая строка.

Добавлено after 23 minutes 27 seconds:
Скорее всего это касается настроек компелятора. Будет время поковыряю его.

Добавлено after 48 minutes 44 seconds:
Если не мучаться то расширить массив lcd_buf до 32 символов ну или сидеть и считать динамические данные чтоб не прыгнуть на соседний регистр)))

Re: DS18B20 не определяется первый датчик в массиве

Вт сен 21, 2021 09:43:19

AleksFD писал(а):до 32 символов
мало, может не хватить.
\n то же символ, а так же 0 символ конца строки.
Так что лучше сидеть и считать.

Вот вам еще одна фишка: задайте переменную
Код:
unsigned char count;
а потом
Код:
count = sprintf(lcd_buf,"%u DS1820\nDevice detected",devices);
так вы будете знать сколько символов было преобразовано в строку, +1 символ конца строки.

Кроме всего прочего перед u поставьте 1,
Код:
%1u
что гарантирует 1 символ для переменной devices.
Последний раз редактировалось Dimon456 Вт сен 21, 2021 09:53:58, всего редактировалось 1 раз.

Re: DS18B20 не определяется первый датчик в массиве

Вт сен 21, 2021 09:51:43

Вот вам еще одна фишка: задайте переменную
Код:
unsigned char count;
а потом
Код:
count = sprintf(lcd_buf,"%u DS1820\nDevice detected",devices);
так вы будете знать сколько символов было преобразовано в строку.

Уже будет поздно :roll: Мы только узнаем сколько лишнего затели.

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

Re: DS18B20 не определяется первый датчик в массиве

Вт сен 21, 2021 09:56:43

AleksFD писал(а):Лучше поставить в глобал последней и будет автоматически отрезаться хвост
не вариант, не всегда это возможно, а вдруг там стек будет расположен, кто знает куда его компилятор помещает.
И вам что, оперативки жалко?

Re: DS18B20 не определяется первый датчик в массиве

Вт сен 21, 2021 10:04:20

Оперативки вообще не жалко! Главное избежать такой мины.

Добавлено after 3 minutes 5 seconds:
А лучше написать функцию по проверке длины текста до склейки.
Ответить