датчик всегда выдает 85, если не принял команду старта измерения. так что либо с процессом обмена что-то не то (адрес, например, не тот), либо вообще не начинается измерение
Тестовая плата с одной 3-контактной колодкой. Прошивка неизменна. По очереди вставляю "на горячую" две 1820 и две 18В20. Из этих четырех датчиков один и только один показывает 85. Программа не может работать избирательно только для одного датчика, отсутствие датчика также индицируется.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
P.S. я бы не советовал на горячую перетыкивать датчики... мало того, что можно попутать питание, так датчики обычно не очень любят, когда GND не подключен, а другие 2 пина подключены... в моей практике после такого включения на некоторое время датчик выходил из строя.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Ещё не факт, что кирдык. Всё-таки, проблема может быть во временах тайм-слотов - где-то на грани находятся. Одни датчики работают, другие нет. Zhuk72, а не могли бы Вы привести нам фрагменты кода обслуживания протокола ? Авось что-нибудь и увидим.
Ещё не факт, что кирдык. Всё-таки, проблема может быть во временах тайм-слотов - где-то на грани находятся
Скорее всего. С год назад у наших местных производителей всяких типа терморегуляторов для инкубаторов на DS18B20 возникла похожая проблема - у продавцов DS пошли датчики которые не работали, у некоторых вообще. По утверждению одного из производителей - при увеличении тактовой частоты с помощью калибровочной константы (микроконтроллер PIC16) начинало работать. Не знаю, насчет показывали ли они 85С, но у тех которые теперь у нас продаются, по умолчанию включен 9-битный режим,а в документации должно быть 12 бит. Лично наблюдал сей эффект при смене старого типа датчика на "новый" выборочно из большой упаковки. Причем местный разработчик инкубаторов утверждал, что если записать в еепром датчика 12 бит, со временем еепром сбивается и возвращает режим 9 бит, это я не проверял. Своим заказчикам-производителям пришлось переделать прошивку, с проверкой в каком режиме находится датчик.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Надо б на сайтец максим-даллас заглянуть... Может действительно чего нового "доупростили"...?
И не стоит забывать, что было выпущено и несколько разновидностей датчиков с весьма различными структурами блокнота, плюс "паразитные"... (ds1820, ds18b20, ds18s20, ds18b20-par...) что конкретно в лапы попало - вряд-ли кито точно скажет... Сейчас также чегось про ds18b20s указано... читаньки надо... самое последнее:
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Меня эти графики заинтересовали тем, что почему-то идут 2 запроса подряд вместо одного. По коду такого быть не должно, придется в Проте пошагать, чтоб отловить. А вообще опрос датчика делаю каждые 5 секунд (1000 обновлений индикатора).
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Не много 20 us до чтения бита ? 5-7 us максимум нужно, как показала практика. Не будет сенсор столько удерживать линию в нуле.
Цитата:
Код:
ds_rx[byte_cnt]
Не пишите таких весомых кодов там, где каждый такт проца играет огромную роль. Добавьте ещё одну функцию - чтения байта и вызывайте её сколь угодно раз.
Это что на первый взгляд. Вообще, у Вас всё как то запутанно, можно всё упростить и привести к нормальному виду. Могу помочь, если нужно ?
PS:
Цитата:
ведь в защёлке до этого прописался 0. Типа RMW.
Пофиг, что там было в защёлке Если речь идёт, как я понял, о мелких PIC'ах. В защёлке всегда будет то состояние, которое было на входе ПИНа (физически !) с предыдущего обращения к порту. По этому, рулить просто направлением, как делают некоторые - косяк. Необходимо ещё обновлять содержимое защёлки, после установки ПИНа на выход.
Нужно сначала установить направление, а потом уже защёлкой рулить.
Поменял местами.
Цитата:
Функция read_ds. Не много 20 us до чтения бита ?
Судя по графику, не много, хотя согласен, что можно меньше. Это остатки экспериментов, когда я мучился с этим нерабочим датчиком. Увеличивал тайминги, решив, что он не воспринимает команды.
Цитата:
Код:
ds_rx[byte_cnt]
Не пишите таких весомых кодов там, где каждый такт проца играет огромную роль. Добавьте ещё одну функцию - чтения байта и вызывайте её сколь угодно раз.
В термометре на асм так же делал, через косвенную адресацию. Сейчас пробежался по асм выхлопу компилятора этой функции (оптимизация ПРО). Он конечно понаписал побольше, чем я писал на асм. Пересмотрю код, хотя не знаю, что я там смогу оптимизировать. К тому же при чтении байта отдельным куском тоже будет перерасход тактов на call и return (retlw). И здесь опять-таки косвенная адресация останется.
Цитата:
Вообще, у Вас всё как то запутанно, можно всё упростить и привести к нормальному виду. Могу помочь, если нужно?
Чужой код - потемки Но я в нем хорошо ориентируюсь. Помочь только советом, если можно, писать я должен сам. Пусть я лучше буду эволюционировать естественным путем (если получится)
Цитата:
Пофиг, что там было в защёлке Если речь идёт, как я понял, о мелких PIC'ах.
Старик 876. Даже без буквы.
Цитата:
В защёлке всегда будет то состояние, которое было на входе ПИНа (физически !) с предыдущего обращения к порту. По этому, рулить просто направлением, как делают некоторые - косяк. Необходимо ещё обновлять содержимое защёлки, после установки ПИНа на выход.
Ну я так и сделал. DQ_OUT -> DQ0 -> pause -> DQ_IN -> DQ1, который суть (PORTB &= 0xFF) - обновление содержимого защелки.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:1 Медали: 1
Zhuk72 писал(а):
К тому же при чтении байта отдельным куском тоже будет перерасход тактов на call и return (retlw). И здесь опять-таки косвенная адресация останется.
А это уже не важно. Самое главное - выдержать временные интервалы в пределах работы с одним битом. Время между тайм-слотами (чтение/запись бита) не оговорено и может быть сколь угодно большим. А между байтами и подавно... В реализации 1-Wire протокола, достаточно реализовать одну базовую функцию работы с битом, остальное - дело вкуса. Причём она может быть одной и для чтения и для записи, т.к. тайм-слоты, в обоих случаях, ничем не отличаются. На вскидку :
Код:
bool wire_bit(bool tx){ bool ret=0; GIE=0; DQ_OUT(0); // Линию в 0 __delay_us(2); // Задержка стартового импульса DQ_OUT(tx); // Выводим в линию из tx __delay_us(5); // Задержка до чтения бита if(DQ_IN) ret=1; // Читаем линию __delay_us(60); // Задержка до окончания тайм-слота DQ_OUT(1); // Отпускаем линию GIE=1; return ret; }
Ну а дальше уже работаем с этой единственной функцией, не парясь на счёт времён. Создаём функцию для работы с байтом. Причём она, также, может быть одна единственная, и для чтения, и для записи.
Alex, спасибо большое за такой развернутый ответ! Я предполагаю, что все это должно работать, но у меня пока в мозгах все это не укладывается Мне требуется время, чтоб в это вникнуть и переварить, т.к., не будучи программистом, не могу схватить это на лету. Плюс еще мозги другим (не электронным) заняты, не дают сосредоточиться.
Отложу все это на некоторое время, пока не созрею.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
да вот трактовать можно по разному, интересно то, что при сдвиге вправо на 1, температура примерно правильная (разница с другим термоментром цифровим не более 0,5 С). Если не сдвигать явно туфта, вместо 23 считает 44 С.
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Умножать нужно на 0.0625, а не на 0.125. Т.б. - делить на 16. Вот Вам и лишний сдвиг (аля деление ещё на 2)... Т.е. Вы сдвинули (поделили на 2), затем умножили на число, в 2 раза больше нужного. Двойки сократились, получился верный результат. Только в точности потеряли при сдвиге, на цену младшего бита. Но при меньшей битности, это не имеет никакого значения.
Умножать нужно на 0.0625, а не на 0.125. Т.б. - делить на 16. Вот Вам и лишний сдвиг (аля деление ещё на 2)... Т.е. Вы сдвинули (поделили на 2), затем умножили на число, в 2 раза больше нужного. Двойки сократились, получился верный результат. Только в точности потеряли при сдвиге, на цену младшего бита. Но при меньшей битности, это не имеет никакого значения.
т.е выходит все верно, сдвинул вправо на 1(разделил на 2) при 11 битном разрешении (0,125 град/деление). см. ниже
берем из таблички строку с разрешением 0,125 -> +10,125 С = 00A2h, что равно числу 162. Теперь 162*0,125= 20,25/2=10,125 С или
Код:
(0хА2>>1)*0.125 // = 10.125 C
или
Код:
0хА2*0.0625 // = 10.125 C
тогда выходит, что изменяя разрешающую способность датчика, мы только сокращаем время преобразования, но считаем как и при максимальной разр способности, т.е. 0,0625....что то я туплю...
_________________ 32-х ядерный процессор из П213В
Последний раз редактировалось wellcom Чт окт 20, 2016 20:15:26, всего редактировалось 1 раз.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения