Ви не увійшли.
Проблема решена.
Дело было не в конфликте прерываний. Ни какого конфликта не происходит (по крайней мере, разработчики библиотек позаботились об этом). Точнее, если правильно использовать данные протоколы. Причина оказалась в том, что я обрабатывал данные с COM-порта, проверяя наличие принятых данных через Serial.available(). А делать это нужно было обязательно в serialEvent(). ...
Я ничего не имею против разработчиков библиотек. Они разработаны или адаптированы специально под Ардуино, с целью упрощения тестов и прототипирования программ. А serialEvent() делает то же, что делали вы, только сразу по завершению тела функции loop(). Я не могу судить о вашем проекте, поскольку не имею хрустального шара. А для многих применений программной эмуляции 1Wire вполне достаточно.
Конфликт прерываний существует всегда, если источников больше двух. И разрешается он системой приоритетного обслуживания. Одно обслуживается раньше, другое позже. Если вам удалось досигнуть желаемого с библиотеками Ардуино - ваше счастье.
Проблема решена.
Дело было не в конфликте прерываний. Ни какого конфликта не происходит (по крайней мере, разработчики библиотек позаботились об этом). Точнее, если правильно использовать данные протоколы. Причина оказалась в том, что я обрабатывал данные с COM-порта, проверяя наличие принятых данных через Serial.available(). А делать это нужно было обязательно в serialEvent(). Изначально я отказался от этого потому, что данная функция может вызываться в любой момент времени. А поскольку у меня выполняются несколько параллельных задач, то мне нужно было обрабатывать данные только в нужный мне момент времени, когда все будет к этому готово. И до того момента, пока я не стал использовать датчик температуры с протоколом 1Ware, проблем не возникало. Похоже, что при вызове serialEvent(), разработчики предусмотрели возможность конфликта и обошли это. Соответственно, с ресетом проблема тоже решилась.
Спасибо. В принципе, я уже тоже логически дошел до этого вывода. Попробую что-нить помудрить. Пока мысль такая - добавить примерно такой алгоритм в протокол обмена данными:
1. Ардуина сообщает компу, что хочет измерить температуру;
2. Комп перестает посылать запросы, сообщая об этом Ардуине;
3. Ардуина делает измерение, при этом не приостанавливает все остальные задачи;
4. Сообщает компу, что померила и передает значение;
5. Комп подтверждает и они дружно продолжают обмениваться данными.
Сейчас пока некогда. Как сделаю, напишу.
С этим программным обеспечением вы не добьётесь нормальной параллельной работы, особенно на высоких скоростях UART-a. Это происходит из-за конфликтов прерываний. Сигналы 1Wire формируются программно, а прерывание Serial мешает. DS2482-100 может спасти, да и аналоговый фронтенд у неё получше чем у порта микроконтроллера.
Всё правильно, так и должно быть. Корень зла совсем в другом, Ардуино ни при чём.
Данную проблемку обошел. Сделал так. После команды ресет с компа, перестаем пытаться обмениваться данными с ардуино, пока ардуина не пошлет специальную команду, что она перезапустилась и готова работать. Сначала показалось, что проблема решена, но тут вскрылся сам "корень зла". Показания с датчика периодически "замерают". Т.е. такое ощущение, что датчик не делает новое измерение (или не получает команду на измерение) и возвращает всегда одно и тоже значение. Эти "замирания" могут продолжаться до нескольких минут. Уже начал грешить на датчик, но выяснилась такая штука. Если выключить обмен данными по com-порту (а у меня он идет постоянно), то датчик замечательно работает без каких-либо проблем.
Попробуй поставить в сетапе, в самом начале, самой первой командой, задержку, для начала, скажем в секунду. Пропадёт эффект?
Такое ощущение, что датчик "зависает" в каком-то неопределенном положении и перестает реагировать на команды. Можно ли его как-то физически ребутнуть, управляя непосредственно уровнем на пине ардуино, а не методом reset в OneWare?
Если всё правильно сделано, то "моргание DTR" - это и есть нажатие кнопки ресет и должно работать одинаково. Если работает по разному, то надо смотреть схему, как моргает, как обрабатывается и т.п.
Всем привет.
Есть некоторое устройство на базе Ардуины, которое передает информацию с датчиков на комп через USB-COM адаптер.
В том числе и датчик температуры DS1820.
Есть необходимость переодически с компа перезапускать ардуину. Сначала использовал софтовый ресет. Но тут много заморочек с восстановлением состояния портов. Поэтому, решил ребутать его "моргание" DTR на COM-порту. Все замечательно работает. Но после такого ресета перестает читаться данные с 1820. Всегда получаем ноль. Но через небольшой промежуток времени (примерно 50 сек) все восстанавливается и работает. При простом нажатии ресета на плате, проблем не возникает.
Данные с датчика читаю обычным OneWare (0xCC - 0x44 - 0xCC - 0xBE).
Помогите разобраться.