Пк термометр на ds1621

Микроконтроллеры Процессоры, проекты, программирование

Nav view search

Навигация

Искать

  • Микроконтроллеры
  • Микроконтроллеры 8 бит
  • Микроконтроллеры 32 бит
  • Периферийные устройства
    • Датчики
      • Датчики давления
      • Датчики влажности
    • Устройства индикации
    • Интерфейсы
    • Драйверы двигателей
  • Проекты

Датчики

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

Микросхема DS 1621, производства Dallas Semiconductors , предназначена для выполнения функций термометра и термостата. Возможности микросхемы позволяют производить измерение в диапазоне температурот -55 до +125 градусов Цельсия. Шаг отсчета температуры составляет 0.5 градуса. DS 1621 оснащена интерфейсом I 2 C . В режиме термостата возможна автономная работа.

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

Назначение выводов

  • SDA — линия данных шины I2C
  • SCL — линия тактового сигнала шины I2C
  • Tout — выход термостата
  • Vdd — плюсовой вывод питания
  • Vss — минусовой вывод питания
  • A0..A2 — линииформирования младших битов адреса

Принцип работы

Датчик температуры DS 1621 для измерения использует принцип нестабильности частоты колебаний при изменении температуры. Для этого в ее состав входят два генератора. Первый имеет высокую температурную стабильность. Его частота соответствует температуре –55 градусов и практически не подвержена изменениям. Частота работы второго генератора, наоборот, изменяется пропорционально температуре. Специальные счетчики импульсов производят подсчет за одинаковый временной интервал и на основе разности, вычисляют значение температуры. Это значение в 9-разрядном двоичном коде доступно пользователю Данные разбиваются на старший и младший байты. Если достаточно целое значение температуры, то можно пользоваться только старшим байтом. Младший байт имеет только один информационный бит LSB , обеспечивающий дискретность 0.5 градуса. Остальные биты младшего байта всегда равны 0.

Регистр состояния

Микросхема DS 1621 имеет несколько режимов работы. Настройка и отслеживание этих режимов производится с помощью регистра состояний. Имеются следующие доступные биты:

  • DONE – флаг окончания преобразования.Устанавливается по завершении преобразования.
  • THF – флаг «высокая температура». Устанавливается при превышении порога TH . Сбрасывается программно или отключением питания.
  • TLF — флаг «низкая температура». Устанавливается при температуре меньшей, чем значение порога TL . Сбрасывается программно или отключением питания.
  • NVB – флаг записи данных в энергонезависимую память. Установленный флаг свидетельствует о незавершенности записи. Время записи ячейки составляет ориентировочно 10 мс.
  • POL – полярность выхода Tout . Высокое значение соответствует прямой полярности, низкое – обратной. Бит энергонезависим.
  • ISHOT – управление циклом измерений. При высоком логическом уровне измерение выполняется однократно. Данный режим используется в энергосберегающих системах. Низкий логический уровень бита, разрешает выполнение преобразования в непрерывном режиме. Бит энергонезависим.

Работа с DS1621

Команды обмена

Обмен данными с DS 1621 производится по стандартному протоколу I 2 C . Микросхема участвует в нем в качестве slave -устройства. Slave -адрес DS 1621 имеет вид 1001ххх, где ххх – состояние линий А0-А2 микросхемы. Для работы с DS 1621 используются следующие команды:

  • 22 h – «Останов преобразования» — команда производит завершение работы схемы преобразования температуры. Дополнительных данных для работы не требуется.
  • AAh – «Чтение температуры» — Результатом работы команды являются два байта данных, содержащих значение измеренной температуры.
  • A 1 h – «Установка TH » — команда установки верхнего порога срабатывания термостата. После данной команды требуется передача двух байтов значения порога.
  • A 2 h — «Установка TL » — команда установки нижнего порога срабатывания термостата. После данной команды требуется передача двух байтов значения порога.
  • A 8 h – «чтение температурного счетчика». Команда работает только на чтение и позволяет считать данные счетчика, частота работы которого зависит от температуры.
  • A 9 h — «чтение стабильного счетчика». Команда работает только на чтение и позволяет считать данные счетчика, частота работы которого не зависит от температуры.
  • A С h – «Регистр конфигурации». В зависимости от состояния бита R / W производится запись или чтение регистра конфигурации. Формат используемых данных – байт.
  • EEh – «Старт счетчика» — команда начала измерения температуры. Дополнительных данных не требуется.

Повышение точности измерений

Датчик температуры DS1621 допускает повышение точности измерения. Для этого пользователю доступны значения счетчиков стабильного N [ A 9 h ] и температурнозависимого N [ A 8 h ] генератора. Зная измеренное значение температуры T [ AAh ]и значения счетчиков можно воспользоваться формулой:

T=T[AAh] – 0.25 + (N[A9h]-N[A8h])/N[A9h]

Также желательна калибровка датчика с определением необходимых поправок. Учет этих поправок должен производиться в контроллере.

Режим термостата

Микросхема DS 1621 может работать в режиме термостата. Для этого имеется выход Tout , устанавливаемый в зависимости от значения температуры. Пороги включения и выключения выхода задаются значениями в регистрах TH и TL . Полярность выхода устанавливается битом POL регистра конфигурации.

ПК термометр на DS1621

Устройство простое, без калибровки и микроконтроллеров.

Это невероятно простой термометр подключается к любому свободному последовательному порту. В устройстве не применяются какие-либо программируемые компоненты и микроконтроллеры. Точность измерений составляет до 0,5°C без калибровки. Оно так дешево, что я сделал его для каждого используемого мной компьютера. Это так приятно иметь температуру на панели задач Windows, что многие друзья попросили меня сделать такое устройство!

Сделайте себе точный термометр

Данный проект достаточно легок для новичков, только, возможно могут быть трудности, связанные с аппаратной несовместимость последовательного порта на разных компьютерах. В версии с одним датчиком нужна только микросхема датчика, регулятор напряжения и несколько диодов и резисторов. Сделайте его и узнайте секреты IIC шины, как реализовать IIC шину используя только два резистора и пару стабилитронов, как управлять им на последовательном порту используя Visual Basic. Используемые компоненты легко доступны в радио интернет-магазинах.

Характеристики:
Температура отображается как на панели задач Windows, так и за её пределами(см. рисунок).
Устанавливается в любой свободный COM порт ПК.
Диапазон измерений -20 . +125°C (-4 . 257°F).
Базовая точность и разрешение 0.5°C.
Шкала Цельсия(°С) и Farenheit (°F).
Данные записываются в легко читаемый текстовый файл (хорошо для Excel).
Частота дискретизации 1, 5, 30 или 60 секунд.
Один или два датчика температуры (с возможностью расширения до 8)
Питание с COM-порта, внешний источник не требуется.
Легко сделать, не экзотические программные и аппаратные части.
Не требует калибровки.

Сделать ПК термометр легко. Я подробно опишу версию с элементами для поверхностного монтажа. Те, кто не знакомы с пайкой маленьких SMT элементов, будут рады узнать, что плата для выводных элементов также доступна.

Для начала необходимо собрать все элементы кроме плат. Вот список элементов:

Номер

Тип

Описание

DS1621 или DS1631

Цифровой датчик температуры
Пластиковый корпус SO8 (SMD) или DIP (Выводной)

Регулятор напряжения с ультра низкими потерями, корпус ТО92( в обоих вариантах)

Маленький импульсный диод(вроде 1N4148)

Стабилитрон 5,1В 0,5W.

Низковольтный керамический конденсатор (SMD 1206)

Резистор 0,25W (SMD 1206)

9-контактный разъем “мама”, прямой (SMD) или угловой (Выводной)

Это увеличенный вид собранной SMT платы (Небольшая плата это выносной датчик температуры).

Как только я собрал все элементы, я распечатал плату в её реальном размере, чтобы проверить размеры всех элементов относительно неё. Ели элемент слишком большой или маленький, я могу поправить плату или поискать подходящий элемент перед началом работы.

После того, как все элементы проверены, я делаю плату. Так как она односторонняя, вы можете легко вытравить её самостоятельно. Это занимает меньше часа и не требует никаких особых материалов по методу, описанному здесь.

Плата должна быть безупречно чистой (без следов окисления и отпечатков пальцев) для хорошего травления и пайки. Протрите её мягким абразивом до блеска (кухонная мочалка, стальная вата и даже офисный ластик). Не забывайте отзеркалить рисунок платы перед печатью! Я люблю SMT платы, потому что необходимо сверлить не так много утомительных отверстий перед пайкой.

Для пайки требуется паяльник с тонким жалом, острый пинцет и твердая рука. Я креплю плату к столу во время пайки. На самом деле я прикрепляю её к распечатке, чтобы облегчить проверку во время пайки.
Для того, чтобы случайно не перепутать элементы, держите их в оригинальной упаковке до необходимости. Я предлагаю вам начать пайку с мелких элементов (резисторы, диоды . ) и закончить большими (электролитический конденсатор), высокие элементы могут усложнить доступ к мелким.

Не наносите слишком много припоя, и будьте осторожны, чтобы не перегреть элементы (особенно диоды и микросхемы). Если необходимо, пусть элемент остынет. Большинство элементов полярные, поэтому будьте осторожны, чтобы не перепутать их. Катод диода (K) отмечен черным кольцом, отрицательный вывод электролитических конденсаторов черной полоской. Если вы предпочитаете использовать танталовые конденсаторы, помните, что их маркировка перевернута, и черной полосой обозначают положительный вывод!

Держите глаз на фотографии и всегда проверяйте два раза, пока не убедитесь в том, что нет никакой разницы.

Те, у кого нет опыта в пайке SMT элементов, могут быть обеспокоены пайкой микросхемы датчика.
Я чищу жало паяльника перед каждой точкой пайки, и использую очень тонкий припой, чтобы наносить максимально малое количество припоя. Я наношу небольшое количество припоя только на площадку предназначенную для вывода 1.

Читайте также  Самодельное противоугонное устройство на ардуино и датчике отпечатков пальцев

Я ставлю микросхему на плату, и когда её выводы совпадают с площадками, я чищу жало и грею контакт 1, пока он не припаяется. Я проверяю, что микросхема по-прежнему стоит правильно (все контакты по центру соответствующих площадок). Если она переместилась, я нагреваю контакт 1 и перемещаю её, либо я по-прежнему паяю остальные контакты, очищая жало и используя мало припоя. Последним шагом является пропайка контакта 1, изначально припаянного очень маленьким количеством припоя.

Регулятор напряжения LM2936Z5 нуждается в специальной подготовке к пайке. У меня были сквозные отверстия, но я хотел припаять его на SMT стороне платы. На рисунке показано как согнуть и укоротить контакты.

Печатная плата рассчитана на установку между контактами разъема последовательного порта. Это последняя часть пайки. Не забывайте припаять выводы 7 и 8 на противоположной стороне печатной платы.
Я обычно очищаю плату от остатков флюса при помощи растворителя, например ацетона, и позволяю плате полностью высохнуть перед включением. Как только плата проверена и работает, я наношу слой прозрачного лака-спрея для защиты меди от окисления.

Последний шаг заключается в загрузке и установке программного обеспечения. Если вас смущают подсказки Microsoft Installer (. на итальянском языке) эти скриншоты (первый и второй) помогут сделать всё правильно.

При первом запуске, необходимо выбрать номер последовательного порта, к которому подключена схема, и вы будете готовы к получению температуры. Удачи!

Как это работает?

Схема является производным от программатора Claudio Lanconelli PonyProg. Ключевым компонентом является датчик температуры DS1621 Dallas Semiconductor. Это цифровой датчик температуры, а это значит, что он измеряет температуру и превращает её в цифровые значения (двоичные числа, то есть последовательность из нулей и единиц, как байты в компьютере).

Просто подайте стабилизированное питание 5В, и DS1621 способен передавать температуры окружающей среды через последовательную шину IIC (Inter-Integrated Circuit шину, также пишется I2C). Это стандартная схема передачи разработанная Philips Semiconductors для соединения множества микросхем вместе, используя всего две линии: тактовую (SCL) и данные (SDA).

См. документация чтобы получить более подробную информацию о работе шины, а сейчас достаточно знать, что любой I2C чип имеет свой собственный адрес (число в диапазоне от 0 до 127) и набор команд. Таким образом, вы можете подключить много микросхем параллельно и все еще быть в состоянии общаться с каждой в отдельности, начиная каждое сообщение с соответствующим адресом.

Прямо с завода, все DS1621 поставляется базовым адресом ($40), но вы можете настроить его, соединяя адресные выводы (А0, А1, А2), с 5В или GND соответственно (см. таблицу). Таким образом, вы можете подключить до 8-ми микросхем датчиков параллельно на шину, хотя поставляемое программное обеспечение поддерживает и заносит в таблицу только два (вы можете добавить больше датчиков, изменив программное обеспечение).

Так что мы можем питать DS1621 от 5В постоянного тока и подключить его SCK и SDA проводам I2C интерфейса ПК, верно? К сожалению, компьютеры не имеют разъемов 5В постоянного тока и портов I2C, поэтому мы должны хакнуть их!

Хак#1: Фантомное питание COM-порта

Датчик температуры не требует много энергии для работы, так почему бы не устранить необходимость питания, «крадя» питание с сигналов уже доступных на порте RS232?
+12В от линий RS232 передаются на регулятор через диоды D1, D2, фильтруется C1 и регулируется до +5В на LM2936-Z5. Это специальный регулятор, способный работать с минимальным входным напряжением и сохранять каждый мА. LM2936 способен регулировать с таким низким входным напряжением как 5,2 (больше всего последовательных портов питаются только 6В). Для сравнения, обычные регуляторы 78L05 требуют, по крайней мере, 6.7В на входе и потребляет в 100 раз больше тока, необходимого LM2936-Z5.

Хак#2: Заставляем COM-порт делать вид, что это I2C-шина.

Программное обеспечение ПК термометра эмулирует провода I2C-шины двумя контактами COM-порта, доступного на всех материнских платах.

В качестве линии SCL используется RTS (Request To Send, контакт 7), а для SDA используется линия, первоначально разработанная для DTR последовательного порта (Data Terminal Ready, вывод 4). Эти сигналы доступны из Visual Basic установкой DTR и RTS свойств объекта MSComm.
Вы не можете подать сигнал с COM порта на DS1621 напрямую, так как уровни напряжения должны быть адаптированы. В соответствии со стандартом EIA-RS232, в большинстве компьютеров выходное напряжения достигает +15В постоянного тока и падает до -15В постоянного тока на разъеме COM порта, поэтому мы должны ограничить их более удобными напряжениями от 0 до +5В постоянного тока перед подключением к DS1621 SDA и SCL проводов. Стабилитрона 5.1В и ограничительного резистора 4700 достаточно для этой цели.

Если вы посмотрите на схему внимательно, вы заметите, что вывод SDA соединен также с контактом CTS (Clear To Send, контакт 8). Таким образом, программное обеспечение ПК термометра может контролировать логический уровень SDA, чтобы читать ответы микросхемы, что делает эту линию двунаправленной. Хотя теоретически последовательный порт требует отрицательного сигнала с входа, сигналы в диапазоне 0 . 5В постоянного тока хорошо работают практически на любом компьютере на земле.

Программное обеспечение

Программное обеспечение поставляется предварительно скомпилированным и с инсталлятором (setup.exe), но для тех, кто интересуется программированием, включен исходный код.

Я написал программу в Visual Basic. Я сделал это прямым путем, намеренно избегая оптимизации, которая сделает код менее читабельным.
Функции шины I2C сгруппированы в файл, который может быть повторно использован для других приложений. Он предоставляет функции для всех основных операций I2C шины: таких как запуск и остановка шины, или отправка и получение одного байта.

Основная программа обеспечивает функции, температуры(chipaddress), который дает I2C-шине команду, чтобы получить температуру от микросхемы.
Чтобы прочитать температуру микросхемы в Visual Basic все, что вам нужно, это запросить температуру ($&48), где $ и 48 является адресом для первой микросхемы, $H49 является адресом второй микросхемы, и так далее в соответствии с таблицей выше. Моя программа использует два датчика, но не так трудно изменить её для поддержки до 8 микросхем.

Самый первый раз, когда вы запустите программу, вы получите предупреждение о том, что не существует файла конфигурации (он будет автоматически создан в конце сессии) и настройки будут по умолчанию. Выберите последовательный (COM) порт, который вы используете, если ваше устройство включает в себя U2 для чтения температуры наружного воздуха, интервал между измерениями, единицы измерения и если вы хотите логирование температуры в файл «pc_thermometer.txt» (ASCII текстовый файл, который вы можете импортировать в Excel для обработки или построения графика).

Проверьте поле «start minimized», если оно включено, то при последующих запусках программа не будет открывать окно на рабочем столе, а будет минимизирована на панели задач, обеспечивая «иконку температуры». Это мой предпочтительный способ использования программы.
При нажатии на иконку открывается окно.

Датчик температуры DS1621. Подробное описание датчика

Микросхема DS1621 представляет собой термометр и термостат «в одном флаконе» с цифровым вводом и выводом, которая гарантирует точность измерения и контроля с погрешностью плюс – минус 0,5 гр. Цельсия. Если использовать датчик DS1621 в роли термометра, то данные должны обрабатываться через I2C/SMBus последовательную шину в дополнительном девяти — битном коде с точностью младшего разряда плюс – минус 0,5 гр. Цельсия.

Для приложений, которым нужно повышенное разрешение контролируемой величины температуры, необходимо считать дополнительные регистры и выполнить несложные арифметические операции, для того чтобы получить более чем 12-битового разрешения (при этом цена самого наименьшего разряда составляет 0,0625 гр. Цельсия). Микросхема DS1621 имеет три адресных входа, таким образом, появляется возможность подключить к одной шине до восьми датчиков DS1621.

Применяя датчик DS1621 в роли термостата, в DS1621 имеются регистры TH (повышенная температура) и TL (пониженная температура). При превышении текущей температуры уровня TH выход датчика перейдет в активное состояние, и будет продолжать оставаться в нем, пока текущая температура не опустится ниже отметки TL. Таким образом, реализуется управление с заданным гистерезисом.

Описание выводов датчика DS1621

  • SDA — вывод данных шины I2C.
  • SCL — вывод тактового сигнала шины I2C.
  • Tout — выход термостата.
  • Vdd — вывод питания, плюс.
  • GND — вывод питания, минус.
  • A0..A2 — линия младших битов.
Читайте также  Логический цифровой глубиномер

Принцип работы датчика DS1621

Принцип измерения основан на нестабильности частоты колебаний при изменении температуры. Для реализации этого принципа измерения в структуру микросхемы включены два генератора.

Первый из них обладает высокой температурной стабильностью. Его рабочая частота соответствует температуре — 55 гр. Цельсия и фактически не изменяется. Рабочая частота же второго генератора, напротив, меняется соразмерно изменению температуры. Особые счетчики совершают подсчет импульсов за равный промежуток времени и на базе разности, производится расчет текущей температуры, который представлен в виде 9-разряднго двоичного кода.

Данные делятся на старший и младший байты. Если для каких либо целей необходимо целое значение температуры, то нужно использовать, лишь старший байт. Младший же байт обладает только одним информационным битом — LSB, который реализует дискретность в 0,5 гр. Цельсия. Оставшиеся биты младшего байта постоянно равны нулю.

Регистр состояния

Микросхема DS1621 располагает несколькими режимами работы. Настройка и контроль данных режимов осуществляется с помощью регистра состояний. Существуют следующие биты:

  • DONE — флаг завершения преобразования. Устанавливается по окончанию преобразования.
  • THF — флаг «высокая температура». Устанавливается при увеличении температуры выше порога TH. Флаг сбрасывается программно или выключением питания.
  • TLF — флаг «низкая температура». Устанавливается при уменьшении температуры ниже порога TL. Флаг сбрасывается программно или выключением питания.
  • NVB — флаг записи данных в энергонезависимую память датчика. Установленный флаг указывает о том, что запись не завершена. Приблизительное время записи данных в ячейки составляет 10 мс.
  • POL — выбор полярности выхода Tout. Высокое значение отвечает прямой полярности, низкое означает обратную полярность. Данный бит энергонезависим.
  • ISHOT — бит управления циклом измерений. Однократное измерение происходит при высоком логическом уровне данного бита. Его обычно применяют при создании энергосберегающих систем. Низкий же логический уровень данного бита, позволяет выполнение преобразования в постоянном режиме. Бит этот энергонезависим.

Команды обмена

Обмен данными с датчиком DS1621 происходит по типовому протоколу I2C. Датчик принимает участие в нем в качестве SLAVE — устройства. Его SLAVE — адрес имеет вид следующий вид:

Пк термометр на ds1621

Столкнулся с непонятной проблемой.
Подключил DS1621 к 90s2313.
Процедуры эмуляции i2c взял с одного немецкого сайта. Контроллер вытягивает температуру с датчика, но значение температуры чередуется с 03h значением через один опрос. Пока соорудил затычку в виде двукратного опроса датчика.

Привожу код для i2c и опроса устройства.

Диаграммы сигналов для ds1621 смотреть здесь
Прочтите ВНИМАТЕЛЬНО Правила форума: подобные вещи надо оформлять ПРИЛОЖЕНИЕМ к вопросу. Сэр Мурр

JLCPCB, всего $2 за прототип печатной платы! Цвет — любой!

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/cwc

Подскажите, а где можно взять процедуры эмуляции i2c? Может есть у кого-то? И в чем вообще можно отлаживать работу с внешними устройствами? С Proteus все ясно, собрал схему и проверяй, а отладка в чем?

Как можно например а avrstudio сэмулировать данные приходящие извне?

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

При замене в современном автомобиле электромеханических реле на интеллектуальные силовые ключи PROFET производства Infineon необходимо учитывать особенности их коммутации по сравнению с «сухими контактами» реле, а также особенности управления с их помощью различными типами нагрузок.

Вебинар посвящен проектированию и интеграции встроенных и внешних антенн Quectel для сотовых модемов, устройств навигации и передачи данных 2,4 ГГц. На вебинаре вы познакомитесь с продуктовой линейкой и способами решения проблем проектирования. В программе: выбор типа антенны; ключевые проблемы, влияющие на эффективность работы антенны; требования к сертификации ОТА; практическое измерение параметров антенн.

К слову говоря DS1624 вообще непригоден для измерения минусовых температур.. Ниже нуля он всякую чепуху меряет из которой даже путем усреднения сложно полезную температуру выделить — на двух датчиках пробовал.. а вот где-то от 1 до +40 (больше не пробовал, но по даташиту должен до +70) меряет хорошо — колебания показаний у меня составляют+-0,03125 градуса. Единственный ньюанс — датчик надо помещать вдали от сквозняков.

Вложенный файл — снятие показаний измерений. Сначала датчик лежал в комнате, а затем выкинул его за окно, как раз вечер и температура постепенно начала опускаться.

Вообще по наблюдениям при постепенном снижении температуры датчик на каком-то определенном пороге «клинит» и он начинает выдавать большой разброс до тех пор, пока этот порог не будет пройден (см. вложенный файл). Выдаваемое значение TTT нужно множить на 0,03125, значение TXTTEMP — среднее арифметическое). В файле видно что такой порог возникал на значениях -87 и -97. Чем ниже температура — тем больше идет разброс от измерения к измерению. То -120 выдаст (-3,75 градуса), через две секунды -85 (-2,65).. Пробовал перезагрузить — не помогает..

Поскольку задача мониторинг температуры на телекоммуникационных объектах — забил на это. Если минус — это уже плохо, а сколько там минус неважно. Думаю заказать себе датчик LM92 от National Semiconductor — у него точность +-1 от минус 10 и +-1,5 от -25.. но поэкспериментировать уже наверное не получится — пока дойдет до меня уже температуры в плюс уйдут ))

Илья79, очень требуется помощь. В протоколе вроде я разобрался, но только понять одно не могу равна переменная freq в вашей программе( у меня тактовая частота равна 4 мгц).

это ваш код!
#include /*Подключение системной библиотеки= 2*/
#define SDA P1.0 /*Информационный сигнал шины i2c= 3*/
#define SCL P1.1 /*Тактовый сигнал шины i2c= 4*/
extern unsigned char freq; /*Частота ZQ1, МГц= 5*/
/*———- задержки времени————= 6*/
void pause(void) /*Задержка в зависимости от частоты= 7*/
< unsigned char p; /*Счетчик циклов= 8*/
/*Строка-разделитель= 9*/
for (p = freq; p > 0; p—); /*Цикл задержки=10*/
return; /*Возврат после выполнения функции=11*/
> /*Окончание функции

=12*/
/*———- старта для шины i2c————=13*/
void i2start(void) /*Команда START шины i2c=14*/
< SDA = 1; pause(); /*Установка логических уровней=15*/
SCL = 1; pause(); /*с паузами между ними=16*/
SDA = 0; pause(); /*=17*/
SCL = 0; pause(); /*=18*/
return; /*Возврат после выполнения функции=19*/
> /*Окончание функции =20*/
/*——-Функция записи байта через шину i2c———=21*/
void i2write(unsigned char byt) /*Команда WRITE i2c=22*/
< unsigned char k, m; /*Вспомогательные счетчики=23*/
/*Строка-разделитель=24*/
for (k = 0; k > (7 — k)); /*Значение бита=26*/
SDA = m; pause(); /*Занесение бита в линию SDA=27*/
SCL = 1; pause(); /*Формирование одного=28*/
SCL = 0; pause(); /*тактового импульса SCL=29*/
> /*Окончание цикла передачи 8 битов=30*/
return; /*Возврат после выполнения функции=31*/
> /*Окончание функции =32*/
/*——-Функция завершения работы с шиной i2c——=33*/
void i2stop(void) /*Команда STOP шины i2c=34*/
< SDA = 0; pause(); /*Установка логических уровней=35*/
SCL = 1; pause(); /*с паузами между ними=36*/
SDA = 1; pause(); /*=37*/
return; /*Возврат после выполнения функции=38*/
> /*Окончание функции =39*/
/*———Функция проверки бита подтверждения——-=40*/
unsigned char i2ack(void) /*Команда ACK шины i2c=41*/
< unsigned char check, y; /*Данные и счетчик=42*/
/*Строка-разделитель=43*/
SDA = 1; pause(); /*Установка единичных уровней=44*/
SCL = 1; /*с паузой между ними=45*/
for (y = 10; y > 0; y—) /*10 попыток чтения=46*/
< pause(); /*Задержка времени=47*/
if ((check = SDA) == 0) break; /*Досрочный выход=48*/
> /*Если за 10 чтений нет подтверждения, то ошибка=49*/
SCL = 0; pause(); /*Исходная установка линии SCL=50*/
return (check); /*Возврат (при CHECK=0 норма)=51*/
> /*Окончание функции =52*/
/*——-Функция выдачи бита подтверждения———-=53*/
void i2mack(void) /*Команда MASTER ACK шины i2c=54*/
< SDA = 0; pause(); /*Установка бита подтверждения=55*/
SCL = 1; pause(); pause(); /*Генерация тактового=56*/
SCL = 0; pause(); /*импульса на линии SCL=57*/
return; /*Возврат после выполнения функции=58*/
> /*Окончание функции =59*/
/*——-Функция отсутствия бита подтверждения——=60*/
void i2nack(void) /*Команда NO ACK шины i2c=61*/
< unsigned char y; /*Счетчик попыток=62*/
/*Строка-разделитель=63*/
SDA = 1; pause(); /*Режим чтения на линии SDA=64*/
SCL = 1; /*Начало единичного тактового импульса=65*/
for (y = 10; y > 0; y—) /*10 попыток чтения=66*/
< pause(); /*Формирование полки тактового импульса=67*/
if (SDA != 0) break; /*Досрочный выход при норме=68*/
> /*Если за 10 чтений есть подтверждение — ошибка=69*/
SCL = 0; pause(); /*Исходная установка линии SCL=70*/
return; /*Возврат после выполнения функции=71*/
> /*Окончание функции =72*/
/*——-Функция чтения байта через шину i2c———=73*/
unsigned char i2read(void) /*Команда READ шины i2c=74*/
< unsigned char k, s, d=0; /*Счетчики и данные=75*/
/*Строка-разделитель=76*/
SDA = 1; /*Перевод линии SDA в режим чтения=77*/
for (s = k = 0; k в программу=84*/
> /*Окончание функции =85*/

Project name: «Thermo Controller» v.0.2

developed by: Coder Salyahov (e-mail: kukry@list.ru)

Читайте также  Cхема управления лампой дневного света мощностью до 26 ватт

MC: ATtiny2313, PID controller, two 7digit, 2 buttons, I2C protocol

*/
// //———- старта для шины i2c————*/
void i2start(void) /*Команда START шины i2c*/
< PORT_USI|= (1 */
/*——-Функция записи байта через шину i2c———*/
void i2write(unsigned char byt) /*Команда WRITE i2c*/
< unsigned char k, m; /*Вспомогательные счетчики*/
/*Строка-разделитель*/
for (k = 0; k > (7 — k)); /*Значение бита*/
if(m) <
PORT_USI|= (1 =*/
/*——-Функция завершения работы с шиной i2c——=*/
void i2stop(void) /*Команда STOP шины i2c=*/
< PORT_USI&=

(1 =*/
/*———Функция проверки бита подтверждения——-=*/
unsigned char i2ack(void) /*Команда ACK шины i2c=*/
< unsigned char check=0, y; /*Данные и счетчик=*/
/*Строка-разделитель=*/
PORT_USI|= (1 0; y—) /*10 попыток чтения=*/
< pause(); /*Задержка времени=*/
if (((PIN_USI&(1 =*/
/*——-Функция выдачи бита подтверждения———-=*/
void i2mack(void) /*Команда MASTER ACK шины i2c=*/
< PORT_USI&=

(1 =*/
/*——-Функция отсутствия бита подтверждения——=*/
void i2nack(void) /*Команда NO ACK шины i2c=*/
< unsigned char y; /*Счетчик попыток=*/
/*Строка-разделитель=*/
PORT_USI|= (1 0; y—) /*10 попыток чтения=*/
< pause(); /*Формирование полки тактового импульса=*/
if (((PORT_USI|(1 PORT_USI_SDA) != 0) break; /*Досрочный выход при норме=*/
> /*Если за 10 чтений есть подтверждение — ошибка=*/
PORT_USI&=

(1 =*/
/*——-Функция чтения байта через шину i2c———=*/
unsigned char i2read(void) /*Команда READ шины i2c=*/
< unsigned char k, s, d=0; /*Счетчики и данные=*/
/*Строка-разделитель=*/
DDR_USI&=

(1 в программу=*/
> //Окончание функции =

void solve_digit (int number) //subscription to showing temperature on display
<
uint8_t segments[] = < 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f>;
uint8_t k;
if ((number Temp_min)) //verify number for showing on display
<
if (number = 0)
<
k = 0;
while (number >= k * 10) k++; //k — tens of
show_number[0] = segments[—k];
show_number[1] = segments[number — k * 10];
>

>
else //invalid mean of the temperature show «Er»
<
show_number [0] = 0x79; //»E»
show_number[1] = 0x50; //»r»
>
>

void butt_and_display ()
<
/* show 2 digits on display */
//solve_digit (contr_temp);

int time;
int time_show;
int butt;
char temp;
uint8_t term;
if (time_show > 0) //show temperature of the control
time_show—;
if (time_show == 0) //show env (real) temperature on display
if (time & 1) temp =

show_number[1]; //show first digit
else temp =

show_number[0]; //show second digit
if((time_show > 0 && contr_temp > 5) & 0x07);
// Negativ Temperature
//PORTD = ((

STM32 и DS1621 измерение температуры. Взрывается моск!

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Датчик температуры DS1621
Вот есть такой датчик. Подключил к AVR. У меня вывод идет прямо в двоичном коде на мониторчик.. но.

Измерение температуры процессора
Господа есть WinApi — шная функция для измерения температуры процессора (желательно Intel и Amd ) .

Измерение температуры светодиода
Добрый день. Имеется задача — необходимо измерять температуру вставленного в некоторый разъем на.

Задача: измерение температуры с точностью до 0.1 мК
Доброго времени суток. Обращаюсь за информацией к опытным людям. Задача следующая: надо.

ну и к чему столько текста?

все значения достаточно перевести к знаковым переменным в частности signed char
и при LSBне равной 0 добавить 1

Может всё-таки C/C++?

Господа!! Спасибо за оперативные ответы и желание помочь! Пожалуйста, не пинайте.. Давайте сначала сообща разберёмся как эта сволочь, DS1621 выдаёт температуру. Кто из Вас как это понимает и трактует для себя. Вот здесь самая главная собака порылась. Мне нужно понять эту самую область отрицательных температур, а уж с выводом и кодом преобразования я постараюсь разобраться сам. Смотрите, вот таблица преобразования из даташита:
Temperature Digital Output(Двоичный) Digital Output(Hex)
+125с 01111101 7D00h
+25c 00011001 1900h
+1/2c 00000000 0080h
+0c 00000000 0000h
-1/2c 11111111 FF80h
-25c 11100111 E700h
-55с 11001001 C900h

Я читаю из датчика MSB, отправляю значение в переменную uint8_t TMSBSlv0
читаю LSB, отправляю значение в переменную uint8_t TLSBSlv0
Преобразовываю отрицательное значение TMSBSlv0 таким образом:

scan11, пользуйтесь тегами форматирования кода, а то буду карать
выделяешь код и жмешь кнопочку на шапке окна быстрого ответа, для Си это кнопка «С»

Добавлено через 58 секунд

Сердечное Вам спасибо. Будем общаться.

Добавлено через 3 минуты
Витальич! ЧТО это за код?? ужс какой-то. Вы меня видать добить решили своей продвинутостью.

Добавлено через 10 минут
Если пожелаете, то я завтра выложу полный код программы, чтобы народ посмотрел, обсудил, может попинал в своё удовольствие. Как скажете так и будет

с одновременным форматированием данных в 16 разрядный формат.
Также массив adc_data хранит 320 предыдущих отсчета АЦП.
Ну что есть куда Вам стремиться?

Добавлено через 1 минуту

ValeryS спасибо за код обязательно протестирую и отпишусь, также на всеобщее обозрение подготовлю код своих I2C-шных потуг. Может поржёте а может кто и слово доброе молвит..

Добавлено через 5 минут
Витальич! я на фоне вчерашней сначала подумал было, что этот код касается моей проблемы, но потом посмотрел повнимательнее и не понял, к чему это было вообще. А оказалось это типа так здесь народ может прикалываться

..ХеХ..
Издеваться изволили.

Добавлено через 2 часа 9 минут
Ага. так так так. Вот «откопал» даташит подобного датчика ADT7410 от Analog Devices и вот что там пишут (гуд), в отличие от даташита DS1621 (не гуд):

TEMPERATURE CONVERSION FORMULAS
16-Bit Temperature Data Format
Positive Temperature = ADC Code (dec)/128
Negative Temperature = (ADC Code (dec) − 65,536)/128
where ADC Code uses all 16 bits of the data byte, including the
sign bit.
Negative Temperature = (ADC Code (dec) − 32,768)/128
where Bit 15 (sign bit) is removed from the ADC code.
13-Bit Temperature Data Format
Positive Temperature = ADC Code (dec)/16
Negative Temperature = (ADC Code (dec) − 8192)/16
where ADC Code uses the first 13 MSBs of the data byte,
including the sign bit.
Negative Temperature = (ADC Code (dec) − 4096)/16
where Bit 15 (sign bit) is removed from the ADC code.
10-Bit Temperature Data Format
Positive Temperature = ADC Code (dec)/2
Negative Temperature = (ADC Code (dec) − 1024)/2
where ADC Code uses all 10 bits of the data byte, including the
sign bit.
Negative Temperature = (ADC Code (dec) − 512)/2
where Bit 9 (sign bit) is removed from the ADC code.
9-Bit Temperature Data Format
Positive Temperature = ADC Code (dec)
Negative Temperature = ADC Code (dec) − 512
where ADC Code uses all nine bits of the data byte, including
the sign bit.
Negative Temperature = ADC Code (dec) − 256
where Bit 8 (sign bit) is removed from the ADC code.

В последней фразе сказано что нужно сначала удалить бит 8 (бит знака) а уже потом вычитать из него 256 (это как я понял то же самое что инверсия значения +1
Вот сейчас буду пробовать считать на калькуляторе (Win) потом по результатам буду писать код.
Я эту фигню всё равно порву.

Добавлено через 1 час 32 минуты
Так, господа программисты. Век живи, век учись. Хреновато, что ощущаешь жажду знаний ближе к 50. Это б желание да лет в 20. Но так устроен мир;(;(
Я осмыслил процесс преобразования 9-битного кода. Полностью. посидел, почитал талмуд, скачанный ранее, посчитал на калькуляторе и понял что нужно делать.
Итак, преобразование кода отрицательных температур должно быть следующим: (потребуется работа с плавающей запятой)
-С неудалённым знаковым битом: tC=(ADCcode-512)/2
-С удалённым знаковым битом: tC=(ADCcode-256)/2
Первый вариант проверен на калькуляторе, всё преобразовывается так как надо! (просто я — тормоз )
Теперь какова последовательность моих действий в программе.. (если где-то неправ, то поправьте пожалуйста)

Это если я всё ж «сподоблюсь» работать через 9-битный код:
1. Создаю переменную uint16_t xxx (возможно и скорее всего это будет float)
2. «Вытаскиваю» и сохраняю в служебном флаге знак температуры. Потом через его значение вывожу «+» и «-«. (скорее всего через float это не понадобится, но пока на всякий случай)
2. «Задвигаю» в переменную этот 9-битный код
3. Проделываю с переменной вот это: (xxx-512)/2
4. Полученное значение с запятой преобразовываю в строку через sprintf
5. Вывожу его на LCD.

Но я сейчас вот поразмыслил, что проще будет оставить всё как есть, только в соответствии с приобретёнными знаниями в соответствующие моменты выводить «,0» и «,5»
..В любом случае проблема можно сказать решена. Теперь только программная реализация. Но это уже мелочи.
Как только получу позитивный результат — выложу код «детища».
. Поржёте.. Попинаете..