#1 2019-08-17 17:48:57

VadimE
Учасник
Зареєстрований: 2019-08-17
Повідомлень: 5

Датчик температуры и Reset

Всем привет.
Есть некоторое устройство на базе Ардуины, которое передает информацию с датчиков на комп через USB-COM адаптер.
В том числе и датчик температуры DS1820.
Есть необходимость переодически с компа перезапускать ардуину. Сначала использовал софтовый ресет. Но тут много заморочек с восстановлением состояния портов. Поэтому, решил ребутать его "моргание" DTR на COM-порту. Все замечательно работает. Но после такого ресета перестает читаться данные с 1820. Всегда получаем ноль. Но через небольшой промежуток времени (примерно 50 сек) все восстанавливается и работает. При простом нажатии ресета на плате, проблем не возникает.
Данные с датчика читаю обычным OneWare (0xCC - 0x44 - 0xCC - 0xBE).
Помогите разобраться.

Неактивний

#2 2019-08-17 18:27:16

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Датчик температуры и Reset

Если всё правильно сделано, то "моргание DTR" - это и есть нажатие кнопки ресет и должно работать одинаково. Если работает по разному, то надо смотреть схему, как моргает, как обрабатывается и т.п.

Неактивний

#3 2019-08-17 18:58:48

VadimE
Учасник
Зареєстрований: 2019-08-17
Повідомлень: 5

Re: Датчик температуры и Reset

Такое ощущение, что датчик "зависает" в каком-то неопределенном положении и перестает реагировать на команды. Можно ли его как-то физически ребутнуть, управляя непосредственно уровнем на пине ардуино, а не методом reset в OneWare?

Неактивний

#4 2019-08-17 21:00:06

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Датчик температуры и Reset

Попробуй поставить в сетапе, в самом начале, самой первой командой, задержку, для начала, скажем в секунду. Пропадёт эффект?

Неактивний

#5 2019-08-29 09:55:13

VadimE
Учасник
Зареєстрований: 2019-08-17
Повідомлень: 5

Re: Датчик температуры и Reset

Данную проблемку обошел. Сделал так. После команды ресет с компа, перестаем пытаться обмениваться данными с ардуино, пока ардуина не пошлет специальную команду, что она перезапустилась и готова работать. Сначала показалось, что проблема решена, но тут вскрылся сам "корень зла". Показания с датчика периодически "замерают". Т.е. такое ощущение, что датчик не делает новое измерение (или не получает команду на измерение) и возвращает всегда одно и тоже значение. Эти "замирания" могут продолжаться до нескольких минут. Уже начал грешить на датчик, но выяснилась такая штука. Если выключить обмен данными по com-порту (а у меня он идет постоянно), то датчик замечательно работает без каких-либо проблем.

Неактивний

#6 2019-08-29 11:21:32

Watchdog
Гість

Re: Датчик температуры и Reset

Всё правильно, так и должно быть. Корень зла совсем в другом, Ардуино ни при чём.  lol

#7 2019-08-29 14:22:30

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: Датчик температуры и Reset

С этим программным обеспечением вы не добьётесь нормальной параллельной работы, особенно на высоких скоростях UART-a. Это происходит из-за конфликтов прерываний. Сигналы 1Wire формируются программно, а прерывание Serial мешает. DS2482-100 может спасти, да и аналоговый фронтенд у неё получше чем у порта микроконтроллера.

Неактивний

#8 2019-08-30 18:22:42

VadimE
Учасник
Зареєстрований: 2019-08-17
Повідомлень: 5

Re: Датчик температуры и Reset

Спасибо. В принципе, я уже тоже логически дошел до этого вывода. Попробую что-нить помудрить. Пока мысль такая - добавить примерно такой алгоритм в протокол обмена данными:
1. Ардуина сообщает компу, что хочет измерить температуру;
2. Комп перестает посылать запросы, сообщая об этом Ардуине;
3. Ардуина делает измерение, при этом не приостанавливает все остальные задачи;
4. Сообщает компу, что померила и передает значение;
5. Комп подтверждает и они дружно продолжают обмениваться данными.
Сейчас пока некогда. Как сделаю, напишу.

Неактивний

#9 2019-09-01 17:44:08

VadimE
Учасник
Зареєстрований: 2019-08-17
Повідомлень: 5

Re: Датчик температуры и Reset

Проблема решена.
Дело было не в конфликте прерываний. Ни какого конфликта не происходит (по крайней мере, разработчики библиотек позаботились об этом). Точнее, если правильно использовать данные протоколы. Причина оказалась в том, что я обрабатывал данные с COM-порта, проверяя наличие принятых данных через Serial.available(). А делать это нужно было обязательно в serialEvent(). Изначально я отказался от этого потому, что данная функция может вызываться в любой момент времени. А поскольку у меня выполняются несколько параллельных задач, то мне нужно было обрабатывать данные только в нужный мне момент времени, когда все будет к этому готово. И до того момента, пока я не стал использовать датчик температуры с протоколом 1Ware, проблем не возникало. Похоже, что при вызове serialEvent(), разработчики предусмотрели возможность конфликта и обошли это. Соответственно, с ресетом проблема тоже решилась.

Неактивний

#10 2019-09-01 19:31:13

Watchdog
Гість

Re: Датчик температуры и Reset

Конфликт прерываний существует всегда, если источников больше двух. И разрешается он системой приоритетного обслуживания. Одно обслуживается раньше, другое позже. Если вам удалось досигнуть желаемого с библиотеками Ардуино - ваше счастье.

#11 2019-09-01 19:53:40

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: Датчик температуры и Reset

VadimE пише:

Проблема решена.
Дело было не в конфликте прерываний. Ни какого конфликта не происходит (по крайней мере, разработчики библиотек позаботились об этом). Точнее, если правильно использовать данные протоколы. Причина оказалась в том, что я обрабатывал данные с COM-порта, проверяя наличие принятых данных через Serial.available(). А делать это нужно было обязательно в serialEvent(). ...

Я ничего не имею против разработчиков библиотек. Они разработаны или адаптированы специально под Ардуино, с целью упрощения тестов и прототипирования программ. А serialEvent() делает то же, что делали вы, только сразу по завершению тела функции loop(). Я не могу судить о вашем проекте, поскольку не имею хрустального шара. А для многих применений программной эмуляции 1Wire вполне достаточно.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму