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

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 7
Зарегистрирован: Вс сен 19, 2021 16:50:36

Сообщение 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(); каждый датчик работает нормально...

И главное что и в протеусе тоже самое!!! :oops:
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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

Полный код, и протеус в месте с проектом, в архив zip, rar не все скачивают.
Реклама
Родился
Сообщения: 7
Зарегистрирован: Вс сен 19, 2021 16:50:36

Сообщение AleksFD »

Файл добавил.
Вложения
test.7z
(694.44 КБ) 136 скачиваний
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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

Вот проект, собранный в версии 2.05.0, только не вздумайте пересобрать
test3.zip
(104.35 КБ) 130 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Стопудово проблема в функции w1_search.
Как вообще 1-wire реализовано? На таймере с прерываниями или на UART с прерываниями?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

ohmycode!
primuss3.com
Контактная информация:
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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

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

Пусть от сюда скачает 1-Wire. Работа с DS18B20. Часть 3 там и для cvavr есть проектик.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

просто снял гипс, кайфую
винавр давно отучил от пользования сторонних кривых лаиб
ohmycode!
primuss3.com
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Это не кривая либа виновата, ардуиноиде туда же.
slav0n писал(а):винавр
расскажи по подробнее, что установлено и чем пользуешься?
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

чисто винавр, даже без студии
Вложения
винавр.png
(39.36 КБ) 106 скачиваний
ohmycode!
primuss3.com
Контактная информация:
Родился
Сообщения: 7
Зарегистрирован: Вс сен 19, 2021 16:50:36

Сообщение AleksFD »

Я Вас понял! Спасибо за проверку. Буду ковырять библиотеки.
Родился
Сообщения: 7
Зарегистрирован: Вс сен 19, 2021 16:50:36

Сообщение AleksFD »

Не поверите!!! Нашел косяк и он в компиляторе.
Поменяйте две строчки местами и о чудо, заработало!!!! Но пропадает вторая строка 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:
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Мораль сей басни такова: пиши код сам!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

Скорее стэк затирает что-то.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение 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 у тебя в коде не используется, его можно убрать.

Вот здесь

Код: Выделить всё

unsigned char lcd_buf[16]
поставь не 16, а 36 символов (с запасом), а так нужно 25 символов.
Родился
Сообщения: 7
Зарегистрирован: Вс сен 19, 2021 16:50:36

Сообщение 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 символов ну или сидеть и считать динамические данные чтоб не прыгнуть на соседний регистр)))
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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

Вот вам еще одна фишка: задайте переменную

Код: Выделить всё

unsigned char count;
а потом

Код: Выделить всё

count = sprintf(lcd_buf,"%u DS1820\nDevice detected",devices);
так вы будете знать сколько символов было преобразовано в строку, +1 символ конца строки.

Кроме всего прочего перед u поставьте 1, что гарантирует 1 символ для переменной devices.
Последний раз редактировалось Dimon456 Вт сен 21, 2021 09:53:58, всего редактировалось 1 раз.
Родился
Сообщения: 7
Зарегистрирован: Вс сен 19, 2021 16:50:36

Сообщение AleksFD »

Вот вам еще одна фишка: задайте переменную

Код: Выделить всё

unsigned char count;
а потом

Код: Выделить всё

count = sprintf(lcd_buf,"%u DS1820\nDevice detected",devices);
так вы будете знать сколько символов было преобразовано в строку.

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

Лучше поставить в глобал последней и будет автоматически отрезаться хвост :wink:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

AleksFD писал(а):Лучше поставить в глобал последней и будет автоматически отрезаться хвост
не вариант, не всегда это возможно, а вдруг там стек будет расположен, кто знает куда его компилятор помещает.
И вам что, оперативки жалко?
Родился
Сообщения: 7
Зарегистрирован: Вс сен 19, 2021 16:50:36

Сообщение AleksFD »

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

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

Вернуться в «AVR»