Прошу прощения, что вмешиваюсь. Посмотрел Ваш проект термометра. У Вас в ds18b20.h все в куче, по правилам файл .h не должен содержать реализации функций и объявление переменных. Если этот ds18b20.h будет добавлен в несколько модулей - при компиляции появится ошибка.
Возникли сложности при обработке температуры с ds18b20 в модели протеуса, подскажите плз, может кто сталкивался. Эффект проявляется при отрицательных температурах с долями градуса. Допустим, на датчике стоит -1, тогда младший бит приходящий с датчика 1111 0000, все верно. Выставляю на датчике температуру -1.1, младший бит становится 1110 1111, дробная часть (правая половина байта) правильная, но при этом изменяется и значение целой части температуры в левой половине байта, после пересчета получится уже не 1 а 2. Точно так же и с другими температурами, если стоит любое целое значение, -5, -10, какое угодно, все верно. Но добавляем любое значение в десятые и значение самой температуры увеличивается на 1. Это баг протеуса? Или фича, смысла которой я не понял?
Все правильно. Цена младшего разряда = 1/16 градуса. Т.е. с датчика получаете результат в градусах, умноженный на 16. -1.1 * 16 = -17.6, дробная часть откидывается.
-17 в двоичном виде = 1111 1111 1110 1111 (16 бит)
Для проверки: -17 / 16 = -1.0625 Конечно, учитываем ошибки округления, т.к. -1.1 точно передать не получится, следующее значение будет -1,125 (1111 1111 1110 1110).
Никакие единицы градусов не теряются и не прибавляются.
Вроде бы все логично. Но в таком случае, это означает что все выложенные в сети алгоритмы пересчета значений 18b20 страдают этим косяком и все реализованные на их основе термометры при отрицательной температуре и не круглых ее значениях врут на градус вниз?
Алгоритмов я нашел много, на разных языках и для разных платформ, везде они одинаковые: 1. Читаем младший и старший байты, допустим пусть они будут байт1 и байт2 2. четыре младших бита байта1 - значение десятых долей, выносятся в отдельную переменную 3. четыре старших бита байта2 - признак отрицательной температуры, он тоже выносится отдельно 4. оставшиеся значения объединяются в один байт, младшие биты байта2 становятся старшими битами итоговой переменной, старшие биты байта1 младшими ее битами 5. в случае если температура отрицательна, итоговая переменная инвертируется и к ней прибавляется единица.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Не понимаете. Это - стандартное представление чисел со знаком. И если не выдумывать отсебятину, то всё работает совершенно верно. Для инвертирования знака числа надо выполнить инверсию всех бит числа и прибавить единицу к младшему разряду. Для проверки можете провести проверку для 0:
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Есть код на асме, в Proteus работает превосходно. А в железе не хочет. Подключаю как с паразитным питанием. В протеусе работает нормально, а STK500 выдает зашкал. Частота в протеусе 4Мгц, у стк500 3,68 (для прошивки пересчитал). В чем проблема не понимаю
Зарегистрирован: Вс сен 06, 2009 20:17:20 Сообщений: 20
Рейтинг сообщения:0
Изучаю датчик ds18b20 не получается команда копировать из озу в пзу 0x48.Вот програмка. OWI_DetectPresence(BUS);//959 мкс OWI_SendByte(OWI_ROM_SKIP, BUS);// 576 мкс команда 0xcc только для 1 датчика // пропуск rom OWI_SendByte(DS18B20_WRITE_SCRATCHPAD ,BUS);//3334 мкс OWI_SendByte(27 ,BUS);//3334 мкс Отсылаем TH OWI_SendByte(25 ,BUS);//3334 мкс TL OWI_SendByte(127 ,BUS);//3334 мкс байт конфигурации OWI_SendByte(DS18B20_COPY_SCRATCHPAD,BUS); // Вот и сама команда 0x48
Теперь считываем из ПЗУ в ОЗУ Командой 0xB8 OWI_DetectPresence(BUS);//959 мкс OWI_SendByte(OWI_ROM_SKIP, BUS); OWI_SendByte(DS18B20_RECALL_E, BUS);// Команда 0xB8 while (!OWI_ReadBit(BUS)); //ждем пока перезапишет
while(1){
/*подаем сигнал сброса команду пропуска ROM команду - чтение внутренней памяти затем считываем внутреннюю память датчика в массив*/ OWI_DetectPresence(BUS); OWI_SendByte(OWI_ROM_SKIP, BUS); OWI_SendByte(DS18B20_READ_SCRATCHPAD, BUS); for(char z=0;z<10;z++) { scratchpad[z] = OWI_ReceiveByte(BUS); }; }; При этом в массив scratchpad записывается в байт TH=0 TL=0 и байт конф.=95 .Это то что у меня было в самом датчике изначально. Все проганяю с в AVR Studio с помощью Jtag-Ice на atmege 16
Изучайте внимательно диаграммы. Откуда контроллер знает, что "вот и сама команда", что это команда??????????
Freerider писал(а):
OWI_DetectPresence(BUS);//959 мкс OWI_SendByte(OWI_ROM_SKIP, BUS);// 576 мкс команда 0xcc только для 1 датчика // пропуск rom OWI_SendByte(DS18B20_WRITE_SCRATCHPAD ,BUS);//3334 мкс OWI_SendByte(27 ,BUS);//3334 мкс Отсылаем TH OWI_SendByte(25 ,BUS);//3334 мкс TL OWI_SendByte(127 ,BUS);//3334 мкс байт конфигурации
--- тут надо вставить снова сброс шины и команды выбора устройства OWI_DetectPresence(BUS);//959 мкс OWI_SendByte(OWI_ROM_SKIP, BUS);// 576 мкс команда 0xcc только для 1 датчика // пропуск rom OWI_SendByte(DS18B20_COPY_SCRATCHPAD,BUS); // Вот и сама команда 0x48
Ну и не забудьте правильно дождаться выполнения этой команды (или читая статус при нормальном питании, или устанавливая strong pullup выдерживать определенное время указанное в даташите)
Но самое интересное это я щас начал писать в IARe ,а до этого использовал cvavr так вот там в библиотеке есть функция инициализации этого датчика где отстутствует повторный сигнал сброса и пропуска Rom вот функция сия unsigned char ds18b20_init(unsigned char *addr,signed char temp_low,signed char temp_high, unsigned char resolution) { if (ds18b20_select(addr)==0) return 0; resolution=(resolution<<5) | 0x1f; w1_write(0x4e); w1_write(temp_high); w1_write(temp_low); w1_write(resolution); if (ds18b20_read_spd(addr)==0) return 0; if ((__ds18b20_scratch_pad.temp_low!=temp_low) || (__ds18b20_scratch_pad.temp_high!=temp_high) || (__ds18b20_scratch_pad.conf_register!=resolution)) return 0; if (ds18b20_select(addr)==0) return 0; w1_write(0x48); delay_ms(15); return w1_init(); }
Не знаю, что там у них за функции, я предпочитаю разбираться с низким уровнем. Поэтому 13-14 станицы даташита в руки и изучать диаграммы. Любое обращение к устройству 1-wire начинается со сброса шины, затем выбора устройства: read-rom, match-rom или skip-rom (с соответсвующими сопутствующими действиями), и даём команду с необходимыми аргументами. После чего датчик больше ничего не воспринимает, пока снова не произойдёт сброс шины и команда выбора датчика не укажет пальцем, что это к нему относится. Всё остальное - игнорируется.
Для CVAVR это значит, что глючит сенсор или ошибка на шине. Может быть следствием: *плохого контакта *длинного или неудачно выбранного кабеля *неправильной последовательности команд обращения к датчику *невыдерживания временных интервалов и т.д.
Карма: 67
Рейтинг сообщений: 1012
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 18805 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Кто-нибудь работал с сабжем или другим 1-Wire с тактовой МК 128 кГц (собака)? 1 такт получается 7.8 мкс, а в даташитах рисуют что хорошо бы считать данные до 15 мкс...
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Зарегистрирован: Вс мар 30, 2014 21:41:24 Сообщений: 170 Откуда: Украина
Рейтинг сообщения:0
Здравствуйте. Извините если данный вопрос уже обсуждался. Пишу типа термостат: Atmega8, ds18b20. Я новичок и довольно долго мучился чтобы заставить программу хоть как-то работать. Проблема заключается в том что периодически на индикаторе появляется число 83, пока на индикаторе 83 на PORTC.5 - единица, потом опять показывает норм. температуру, PORTC.5=0 и опять 83..... Точность нужна до 1 градуса. Еще очень плохо производить настройку, а конкретно добавлять или отнимать temper_down, temper_up - после нажатия на кнопку изменения на индикатор доходят как то долго, хотя переключение между режимами происходит мгновенно. Исходник: Спойлер
Сейчас этот форум просматривают: balan и гости: 25
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения