вот решил самостоятельно написать код для работы с датчиком.начал с первых строчек разбирать и вникать почему да как....оказывается не все так просто как кажется изначально. так вот возник очередной вопрос:
мне никак не понятно каким образом происходит притягивание шины к нулю
#define OWI_LOW OWI_DDR |= 1<<OWI_BIT //притягиваем шину к 0
упрощу написанное и запишу так: DDRD|=1<<0
и разложу как DDRD=0b 0000 0000 // я так полагаю что раз мы никак не сконфигурировали этот регистр он имеет значение 0 далее: 1<<0 =0b 0000 0001 //ну тут вроде все ясно
выполняю сложение: 0b 0000 0000|0b 0000 0001
получаю в регистре DDRD 0b 0000 0001 // что я понимаю как BIT0 у PORTD настроен на выход
так как происходит тот самый нулевой уровень на общей шине???? знаю что в покое на общей шине 1...
вот тот отрывок с рабочего кода)) #define OWI_PORT PORTD #define OWI_DDR DDRD #define OWI_PIN PIND #define OWI_BIT 0
Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650.
Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.
...так как происходит тот самый нулевой уровень на общей шине????....
помимо регистра направления порта, смотрите что изначально было выведено в данный порт. т.е. идёт управление не выводом в порт а именно направлением, чтобы не мешать выставлению уровня "0" датчику (ну или через резистор идёт подтяжка к "1")
удачи вам (круглый) ЗЫ Ещё обратите внимание как идёт чтение каждого бита в протоколе 1-Wire. Более того - рекомендую прочитать именно текст, а не рассматривать картинку.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Всем доброго. зарылся я тут с 1wire и ds18b20 в частности. попытался получить хоть байт от датчика-и ни в какую на линии приходит сплошная единица. Тестирую на 100% рабочей плате.Используется PIC16F628A у которого на выводе RA4 подключен датчик..импульсы reset и presence проходят нормально-и далее ничего.Писал и свой код и брал с AppNote у Microchip"а.Не хочет сотрудначать и все тут.Так как железо рабочее- видимо ошибка в коде,может кто посмотрит на досуге и подскажет где её искать
Вложения:
Комментарий к файлу: файлы программы С 1wire.rar [3.97 KiB]
Скачиваний: 158
Может читаете поздно. Код удерживает линию 6мкс в 0, потом отпускает линию и только через 9мкс идет опрос. По мне, т.к. нижняя граница валидности не указана, лучше опрашивать несколько раз, допустим через 1мкс, на интервале 6...15мкс.
На АВР я бы свою библиотеку выложил.. А в ПИК, там подругому ассемблер команды называет. )))) К моей же самописанной библиотеке надо добавить только подсчет контрольной суммы. Но с одним датчиком температуры работает и без контрольной суммы, хоть это и не правильно. Там просто надо быть очень точным во всех задержках.
Зарегистрирован: Ср сен 07, 2016 15:19:47 Сообщений: 2
Рейтинг сообщения:0
Доброго времени суток. Никак не могу понять как вывести адрес датчика на LCD. Имеется "unsigned char * id" с записанным туда адресом. Что делать далее - не могу понять
Адрес датчика - это набор из восьми 8-битных чисел. Вот и выводите эти числа (id[0], id[1] и т.д.), лучше в шестнадцатеричном виде - получится 2 символа на байт, как раз в 16 позиций поместится.
В досье на 18В20 (да и на других его родственников наверное) написано, что после команды 0х44 (начать преобразование) датчик сажает шину в ноль на все время преобразования. На практике я такого не замечаю. Можно конечно тупо вставить паузу по ДШ (от 100 до 750 мс в зависимости от битности), а потом температуру читать, но...
Сразу скажу, что все работает и читается, но вот мысль, что либо ДШ врет, либо я туплю не дает мне покоя. То есть если я делаю так
Код:
if (init_ds()) { send_ds(0xCC); // Skip ROM send_ds(0x44); // Start conversion } else return 0; // Ждем окончания преобразования. t1over = tconv/100; // Количество переполнений Т1. t1set(0x3CAF); // 100ms to overflow while (t1over);
то всё работает.
Если же добавляю проверку, кто отработает первым - шина или таймаут:
Код:
if (init_ds()) { send_ds(0xCC); // Skip ROM send_ds(0x44); // Start conversion } else return 0; _nop(); // Ждем окончания преобразования, на время которого DQ дожен быть в 0. if (DQ) return 0; // Датчик не отвечает. Почему не 0 как говорит ДШ?????!!! else { t1over = tconv/100; // Количество переполнений Т1. t1set(0x3CAF); // 100ms to overflow while (DQ ^ t1over); // Пока 0 и 1 результат будет 1. }
то получаю в ответ отсутствие датчика.
Кто-то реально заморачивался этим вопросом? Должен или не должен датчик сажать шину на все время преобразования? На всякий случай цитата из ДШ на 18В20 (стр.11):
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
В досье на 18В20 (да и на других его родственников наверное) написано, что после команды 0х44 (начать преобразование) датчик сажает шину в ноль на все время преобразования.
это не правда, там такого не написано. читайте внимательно: там написано, что в течение всего времени преобразования на тайм-слот чтения датчик всегда отвечает низким уровнем, т.е. нулем - это совсем не то же самое, что "сажает в 0 линию"! подавая время от времени тайм-слоты чтения вы можете определить конец преобразования более точно, чем просто подождав сколько-то там миллисекунд... но делать это нет особого смысла...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется... скушно, бабоньки!
Вчера случайно воткнул 1820 с обратной полярностью на несколько секунд в рабочую схему. Сперва не понял, с чего это вдруг упала яркость 7-сегментника. Спохватился, выдернул, вставил правильно. Работает
При этом абсолютно новый, правда очень давно купленный, 18В20 не желает работать. Причем в двух разных схемах, на двух абсолютно разных контроллерах. Проверял 2 штуки 1820 и один (другой уже) 18В20. Они работают без проблем, а этот выдает 85. Его я переполюсовкой не баловал
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Другой 18В20 работает же. Тем более я использую 9-битный режим, там 100 мс хватает, но пробовал и 800 с тем же результатом. И с тайм-слотами все должно быть нормально, если три других датчика работают.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
датчик всегда выдает 85, если не принял команду старта измерения. так что либо с процессом обмена что-то не то (адрес, например, не тот), либо вообще не начинается измерение
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется... скушно, бабоньки!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения