Разработка средств измерения температуры

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Объект. Микроконтроллер ATmega16.

Предмет. Измерение температуры

Цель. Измерение температуры контактным методом.

Задачи. Измерение температуры контактным методом, обработка измерительного сигнала с помощью микроконтроллера и вывода значения температуры на 7-сегментный дисплей.

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

1. Программная среда разработки AVRStudio или AtmelStudio, для разработки программ для МК AtmelAVR® (Atmel).

2. Стандартный Windows-приложение - калькулятор (Microsoft).

3. Пакет программ для автоматизированного проектирования электронных схем – Proteus DesignSuite CAD Software (Labcenter electronics).

Ход работы предусматривает последовательное выполнение рекомендаций и действий, описанных далее в этом проекте по пунктам.

СОДЕРЖАНИЕ

1.     ВСТУПЛЕНИЕ

2.     АППАРАТНАЯ РЕАЛИЗАЦИЯ ПРОЕКТА

2.1  Микроконтролер ATmega16

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

2.3  Четырехразрядный семисегментный индикатор

2.4  Моделирование электронной схемы проекта

3.     ПРОГРАМННАЯ РЕАЛИЗАЦИЯ ПРОЕКТА

3.1  Среда разработки AtmelStudio

3.2  Разработка программы

ЗАКЛЮЧЕНИ

1. Вступление

Температура - физическая величина, являющаяся мерой интенсивности теплового движения атомов и молекул.

Контактный метод измерения температуры метод измерения температуры при теплового контакта между объектами измерения и чувствительным элементом измерительного оборудования.

Измерительная система - разновидность информационно-измерительной системы в виде совокупности измерительных каналов, измерительных устройств и других технических средств, объединенных для создания сигналов измерительной информации о нескольких измеряемых физических величин. Перечисленные элементы измерительной системы объединены общим алгоритмом функционирования для получения данных о величинах, характеризующих состояние объекта исследования. Информационные системы могут быть составляющими развитых структур измерительных информационных систем и систем управления, на которые возлагаются функции контроля, диагностики, распознавания образов, автоматического управления научными экспериментами, испытаниями сложных объектов и технологическими процессами.

Средство измерения делаем на базе микроконтроллера AVRATmega16.

AVR - семья восьмибитных микроконтроллеров фирмы Atmel.

Микроконтроллеры AVR имеют гарвардскую архитектуру и систему команд, близкую к идеологии RISC. Процессоры AVR имеют 32 8-битных регистров общего назначения. Максимальная тактовая частота - 20 мегагерц, короткие команды выполняются за один такт.

Разработка аппаратного обеспечения и моделирования работы измерительной системы может быть выполнена с помощью пакета программ Proteus DesignSuite CAD Software (Labcenterelectronics).

2. Аппаратная реализация проекта

Средство измерения температуры создаем на базе микроконтролера AVR ATmega16.

AVR - семейство восьмибитных микроконтроллеров, ранее выпускались фирмой Atmel, затем Microchip.

Микроконтроллеры AVR имеют гарвардскую архитектуру (программа и данные находятся в разных адресных пространствах) и систему команд, близкую к идеологии RISC. Процессор AVR имеет 32 8-битных регистра общего назначения, объединенных в регистровый файл. В отличие от «идеального» RISC, регистры не абсолютно ортогональны.

Система команд микроконтроллеров AVR очень развита и насчитывает в разных моделях от 90 до 133 различных инструкций. Большая часть  команд Занимает всего 1 ячейку памяти (16 бит). Большинство команд выполняется за 1 такт.

Управление периферийными устройствами осуществляется через Адресное пространство данных.Для измерения температуры используем цифровой датчик температуры DS18B20. Если нет особых требований к датчику температуры по параметрам, условиям работы, цене, то очевидным решением является выбор цифрового датчика для совместной работы с микроконтроллером. Цифровые датчики могут подключаться через довольно длинные проводные линии; в отличие от слабых аналоговых сигналов, поступающих из других типов датчиков, цифровой сигнал устойчив к воздействию помех. Используемые интерфейсы позволяют в одной линии подключить сразу несколько цифровых датчиков. Цифровая форма передачи данных позволяет использовать цифровые датчики температуры совместно с совсем простыми микроконтроллерами, не имеющих АЦП и даже не имеют нужного цифрового интерфейса - используемые интерфейсы достаточно просты и легко реализуются программно.

Значение температуры должно отражаться на 4-разрядном 7-сегментном индикаторе.

2.1 Микроконтролер ATmega16

 ATmega16 - 8-разрядный высокопроизводительный AVR микроконтроллер с

малым энергопотреблением.

Микроконтролер ATmega16
Микроконтролер ATmega16

Технические характеристики:

Серия

AVRATmega

Ядро

AVR

Ширина шины данных

8-біт

Тактова частота

16 МГц

Количество входов / выходов

32

Объем памяти программ

16 кбайт (8k*16)

Тип памяти программ

Flash

Объем EEPROM

512*8

Объем SRAM

1k*8

Наличие АЦП/ЦАП

АЦП 8*10b

Встроенные интерфейсы

I2C, SPI, UART

Встроенная периферия

Brown-outdetect/reset, POR, PWM, WDT

Напряжение питания

4.5…5.5 В

Рабочая температура

-40…+85 ºC

Отличительные особенности:

Прогрессивная RISC архитектура

  • 130 высокопроизводительных команд, большинство команд выполняется за один тактовый цикл

  • 32 8-разрядных рабочих регистра общего назначения

  • Полностью статическая работа

  • Производительность приближается к 16 MIPS (при тактовой частоте 16 МГц)

  • Встроенный 2-цикловийперемножувач

    Энергонезависимая память программ и данных

  • Обеспечивает 1000 циклов стирания / записуFlashи 100000 циклов стирания / записи EEPROM

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

  • внутрисистемных программирования встроенной программой загрузки

  • Обеспечена режим одновременного чтения / записи (Read-While-Write)

  • Программируемый блокировки, обеспечивает защиту программных средств пользователя

    Интерфейс JTAG (совместим с IEEE 1149.1)

  • Возможность сканирования периферии, соответствует стандарту JTAG

  • Расширенная поддержка встроенной отладки

    Программирование через JTAG интерфейс: Flash, EEPROM памяти, перемычек и битов блокировки

Встроенная периферия

  • Один 16-разрядный таймер / счетчик с отдельным предварительным делителем и режимами захвата и сравнения

  • Счетчик реального времени с отдельным генератором

  • Четыре канала PWM (ШИМ)

  • 8-канальный 10-разрядный аналого-цифровой преобразователь

  • Два 8-разрядных таймера / счетчика с отдельным предварительным делителем, один с режимом сравнения

  • 8 несимметричных каналов

  • 7 дифференциальных каналов (только в корпусе TQFP)

2 дифференциальных канала с программируемым усилением в 1, 10 или 200 раз (только в корпусе TQFP)

  • Байт-ориентированный 2-проводной последовательный интерфейс

  • Программируемый последовательный USART

  • Последовательный интерфейс SPI (ведущий / ведомый)

  • Программируемый сторожевой таймер с отдельным встроенным генератором

  • Встроенный аналоговый компаратор

Специальные микроконтроллерные функции

  • Сброс по подаче питания и программируемый детектор кратковременного снижения напряжения питания

  • Встроенный калиброванный RC-генератор

  • Внутренние и внешние источники прерываний

  • Шесть режимов пониженного потребления: Idle, Power-save, Power-down, Standby, ExtendedStandby и снижение шумов ADC

Выводы I / O и корпуса

  • 32 программируемые линии ввода / вывода

  • 40-выводной корпус PDIP и 44-выводной корпус TQFP

Описание выводов микроконтроллера
Описание выводов микроконтроллера

VCC -питание.

GND - земля.

Port A (PA7..PA0) служит в качестве аналоговых входов преобразователя A / D.

Port A также служит в качестве 8-битный двунаправленный порт ввода / вывода, если преобразователь A / D не используется.

Port B (PB7..PB0) является 8-битным двунаправленным портом ввода / вывода с внутренними  подтягуючемые резисторы (выбранными для каждого бита).

Port B также выполняет функции различных специальных функций ATmega16.

Port C (PC7..PC0) является 8-битным двунаправленным портом ввода / вывода с внутренними подтягуючимые резисторами (выбранными для каждого бита).

 Port C также выполняет функции интерфейса JTAG и других специальных функций ATmega16.

Port D (PD7..PD0) является 8-битным двунаправленным портом ввода / вывода с внутренними подтягивающий резистор (выбранными для каждого бита).

Port D также выполняет функции различных специальных функций ATmega16.

RESET - сброс входных данных. Низкий уровень на этом выводе дольше минимальной длины импульса приведет к сбросу.

XTAL1 - вход на инвертирующий усилитель осциллятора и вход во внутреннюю схемы работы часов.

XTAL2 - выход из инвертирующего усилителя осциллятора.

AVCC - это контактный разъем питания для порта A и A / D преобразователя. Она должна быть внешне подключена к VCC, даже если АЦП не используется. Если используется АЦП, он должен быть подключен к VCC через фильтр низких частот.

AREF- это аналоговый контрольный пин для A / D-преобразователя.

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

DS18B20 - цифровой температурный датчик, имеет много функций. По сути, DS18B20 - это целый микроконтроллер, который может хранить значения измерений, сигнализировать о выходе температуры за установленные пределы (сами границы мы можем устанавливать и изменять), менять точность измерений, способ взаимодействия с контроллером и многое другое. Все это в очень небольшом корпусе, который, к тому же, может быть в водонепроницаемом исполнении.

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

датчик DS18B20
датчик DS18B20

VDD – питание.

GND – земля.

DO–цифровой выход.

Микросхема имеет три выхода, из которых для данных используется только один, два других - это земля и питание. Число проводов можно сократить до двух, если использовать схему с позитивным питанием и соединить VDD с землей. К одному провода данным можно подключить сразу несколько датчиков DS18B20 и в микроконтроллере ATmega16 будет задействован только один пин.

Технические характеристики:

Напряжение питания

3,0…5,5 В

Потребляемый ток

1,5 мА (рабочий режим)

1 мкА (спящий режим)

Диапазон измеряемых температур

-55…+125 ºC

Разрешение АЦП

9…12 біт

Абсолютная погрешность

±0.5 ºC (в диапазоне от -10 до +85 ºC)

±2ºC (в диапазоне от -55 до +125 ºC)

Максимальное время полного 12-Разрядного преобразования

~750 мс

Интерфейс

1-Wire

Схема подключення:

DS18B20
DS18B20

Для корректной работы между 2 и 3 выводами датчика (VDDта DO) необходимо устанавливать резистор номиналом 4,7 кОм.

Особенности датчика:

  • Интерфейс 1-Wire® требует только одного порта для связи

  • Каждое устройство имеет уникальный 64-битный серийный код, хранящийся в бортовом ПЗУ

  • Возможность многоканального подключения упрощает измерения температуры

  • Питание может осуществляться от линии данных

  • Разрешение термометра по выбору от 9 до 12 бит

  • Микросхема имеет встроенный механизм сигнализации о выходе температуры за один из выбранных диапазонов.

2.3 Четырехразрядный семисегментный индикатор 

Результаты измерения отображаются на 4-разрядном 7-сегментном LED индикаторе.

Семисегментный индикатор
Семисегментный индикатор

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

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

Сегменты обозначаются буквами от A до G; восьмой сегмент - десятичная точка (decimalpoint, DP), предназначенная для отображения чисел с плавающей точкой.

Расположение выводов 4-разрядного семисегментного индикатора:

4-разрядный 7-сегментный индикатор имеет 12 выводов. Выводы A-G отвечают сегментам, обозначенные этими буквами, decimal - точка, D1-D4 соответствуют номеру разряда справа налево.

Технические характеристики:

Напряжение питания

1,8 В

Рабочий ток

20 мА

Количество разрядов

4

Рабочая температура

-35…+85 ºC

2.4 Моделирование электронной схемы проекта

Моделирование электронной схемы проекта выполняем с помощью пакета программ ProteusDesignSuiteCADSoftware (Labcenterelectronics).

ProteusDesign - пакет программ для автоматизированного проектирования (САПР) электронных схем. Разрабатывается компанией LabcenterElectronics (Великобритания).

Пакет представляет собой систему схемотехнического моделирования, базирующуюся на основе моделей электронных компонентов, принятых в PSpice. Отличительной чертой пакета ProteusDesign является возможность моделирования работы программируемых устройств: микроконтроллеров, микропроцессорных систем, DSP и ин. Причем в Proteus полностью реализована концепция сквозного проектирования, когда например инженер меняет что-то в логике работы схемотехники и программный пакет тут же «подхватывает» данные изменения в системе трассировки. Библиотека компонентов содержит справочные данные. Дополнительно в пакет PROTEUS VSM входит система проектирования печатных плат. Пакет Proteus состоит из двух частей, двух подпрограмм: ISIS - программа синтеза и моделирования непосредственно электронных схем и ARES - программа разработки печатных плат. Вместе с программой устанавливается набор демонстрационных проектов для ознакомления.

Также в состав восьмой версии входит среда разработки VSM Studio, что позволяет быстро написать программу для микроконтроллера, используемого в проекте, и скомпилировать.

Пакет является коммерческим. Бесплатная ознакомительная версия характеризуется полной функциональностью, но не имеет возможности сохранения файлов.

Примечательной особенностью является то, что в ARES можно увидеть 3D-модель печатной платы, позволяет разработчику оценить устройство еще на стадии разработки.

Система поддерживает подключение новых элементов (SPICE) и подключения различных компиляторов (PICOLO, ARM-образные, AVR и т.д.).

Также программа включает в себя инструменты USBCONN и COMPIM, которые позволяют подключить виртуальное устройство к USB- и COM-портов компьютера.

Моделирование аппаратного обеспечения проекта начнем с запуска программы ProteusDesignSuiteCADSoftware. Для этого необходимо дважды кликнуть по ярлыку Proteus.

Создаем новый проект. Для этого в строке меню находится в верхней части окна выбираем File → NewProject. Задаем имя проекта, путь к файлам проекта, выбираем шаблон формата бумажного документа DEFAULT, шаблон монтажной платы пропускаем, создаем проект с использованием встроенных в Proteusпрограм для семейства микроконтроллеров AVR, микроконтроллера ATmega16; компилятор AVRASM (Proteus) файл быстрого старта не создаем.

Все необходимые в проекте компоненты выбираем из списка библиотеки компонентов, которую открываем с меню Library → Pickpartsfromlibraries. Открывается окно PickDevices. Выбранный компонент добавляется в список компонентов в окне DEVICES. В дальнейшем, компоненты из этого списка размещаем в рабочем окне проекта.

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

Выбираем микроконтроллер. Вводим ключевое слово ATMEGA, и в списке результатов поиска выбираем необходимый компонент - ATMEGA16. Подтверждаем выбор, два раза кликнув левой кнопкой мыши на элемент списка, после чего, избранный компонент появляется в окне DEVICES.

Далее по аналогии добавляем в окно DEVICES другие компоненты.

Список необходимых компонентов:

· ATMEGA16 – микроконтролер ATmega16

· DS18B20 – цифровой датчик температуры

· 7SEG-MPX4-CA – четырехразрядный семисегментный индикатор с общим анодом

· RES – резистор

· OSCILLOSCOPE – осциллограф

Размещаем все выбранные компоненты в окне проекта.

На вертикальной панели инструментов расположена кнопка TerminalsMode, что открывает окно TERMINALS, из которого выбираем компоненты POWER (питание) и GROUND (земля), и располагаем их в рабочем окне проекта.

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

На вертикальной панели инструментов нажимаем кнопку SelectionMode и соединяем между собой компоненты линиями-проводами следующим образом:

Электронная схема проекта
Электронная схема проекта

После создания электронной схемы сохраняем проект и закрываем программу Proteus.

3. ПРОГРАМННАЯ РЕАЛИЗАЦИЯ ПРОЕКТА

 Для разработки программного обеспечения для микроконтроллеров AVRиснуе много сред разработки. Некоторые из них приведены в списке ниже:

  • WinAVR- программный пакет под Windows, включающий в себя компилятор, ассемблер, компоновщик и другие инструменты.

  • AlgorithmBuilder- алгоритмическая среда разработки программного обеспечения для микроконтроллеров с архитектурой AVR.

  • Code :: Blocks – кросс платформенного среду разработки.

  • Avrdude- средство для прошивки микроконтроллеров.

  • AVR-Eclipse-плагин для среды разработки Eclipse, позволяет разрабатывать программы на С / С ++ и ассемблере, программировать и отлаживать контроллеры, используя внешний набор инструментов (WinAVR, Atmel AVR Toolchain)

  • AtmelStudio- бесплатная IDE от самой Atmel

  • ArduinoIDE - бесплатная среда разработки для плат Arduinoна базе микроконтроллеров AVR.

Программное обеспечение для средства измерения температуры создаем в программной среде разработки AVRStudio или AtmelStudio, используемый для разработки программ для МК AtmelAVR® (Atmel).

Программное обеспечение с помощью AtmelStudio можно разработать с использованием следующих языков программирования:

  • AVR Assembler

  • C / C ++

Программу создаем с использованием языка программирования AVRAssembler.

 

3.1 Среда разработки AtmelStudio

AtmelStudio (ранее AVRStudio) - основанное на VisualStudio бесплатное проприетарное интегрированную среду разработки (IDE) для разработки приложений для 8- и 32-битных микроконтроллеров семейства AVR и 32-битных микроконтроллеров семейства ARM от компании Atmel, работающий под управлением операционных систем Windows NT / 2000 / XP / Vista / 7/8/10. AtmelStudio содержит компилятор GNU C / C ++ и эмулятор, позволяющий наладить выполнения программы без загрузки в микроконтроллер.

Ранее среда разработки носило название AVR Studio, но начиная с версии 6.0, вышедшей в 2012 году, в нее была добавлена ​​поддержка разработки для микроконтроллеров архитектуры ARM, также выпускаются фирмой Atmel, и среда разработки получило новое название AtmelStudio. Текущая версия (AtmelStudio 7) поддерживает все микроконтроллеры архитектур AVR, AVR32 и ARM, выпускаемые на сегодняшний день фирмой Atmel.

AtmelStudio содержит в себе менеджер проектов, редактор исходного кода, инструменты виртуальной симуляции и внутрисхемного наладка, позволяет писать программы на ассемблере или на C / C ++.

Характеристики AVRStudio:

  • Интегрированный компилятор C / C ++;

  • Интегрированный симулятор;

  • С помощью плагина возможна поддержка компилятора GCC в виде сборника WinAVR;

  • Поддержка инструментов Atmel, совместимых с 8-разрядной AVR архитектурой, в том числе AVR ONE !, JTAGICE mkI, JTAGICE mkII, AVR Dragon, AVRISP, AVR ISPmkII, AVR Butterfly, STK500 и STK600;

  • Поддержка плагина AVR RTOS;

  • Поддержка AT90PWM1 и ATtiny40;

  • Интерфейс командной строки с поддержкой TPI.

3.2 Разработка программы 

Создаем проект, используя интегрированную платформу разработки AtmelStudioдля разработки и отладку программ для МК AtmelAVR.

Загружаем AtmelStudio. Создаем новый проект:

  • Выбираем тип проекта, Atmel AVR Assembler (AVR Assembler Project)

  • Вводим имя проекта

  • Вводим местоположение проекта

  • Выбираем отладочных платформу, AVRSimulator

  • Выбираем МК, ATmega16

  • Нажимаем кнопку Finish

Окно редактора программы можно открыть, дважды кликнув на имя выходного файла * .ASM окне Project.

В окне редактора программы набираем следующий программный код:

.include "m16def.inc" // подключаете заголовочный файл
.deftemp = r16 // Присваиваем регистр символические имена
.defrazr1 = r17
.defrazr2 = r18
.defrazr3 = r19
.defsys = r20
.deftry = r21
.defcount = r22

.equch0 = 0x03 // 0 для отображения
.equFREQ = 8000000 // Частота процессора
.equW1_DDR = DDRA // Регистр порта датчика
.equW1_PORT = PORTA // Регистр порта датчика
.equW1_PIN = PINA // Регистр порта датчика
.equW1_BIT = 0 // Бит порта на котором датчик

.dseg // ОЗУ
Trm: // 2 комирку под температуру
.byte2
Visible: // 4 ячейки под отображение на индикатор
.byte4
Otobr: // 4 ячейки под промежуточные вычисления
.byte4

.cseg // Программный сегмент
.org0 // Вектор прерывания Reset
jmpReset // Переходим на Reset
.org $ 012 // Вектор прерывания запереполненнием таймера 0
jmpTIM0_OVF // динамично индикация

Reset: // Предустановки
lditemp, 128
outMCUCSR, temp // Вимкнемо JTAG, бит JTD в MCUCSR = 1
lditemp, high (RAMEND) // Инициализуемо в стек
out sph, temp
lditemp, low (RAMEND)
out spl, temp
lditemp, 0xFF // Порты DиCна выход, там семисегментный индикатор
out DDRD, temp
out DDRC, temp
lditemp, 128
outMCUCSR, temp // Выключим JTAG, бит JTD = 1
lditemp, 0b00000010
outTCCR0, temp // Установим предделитель таймера, биты CS
lditemp, 1
outTIFR, temp // Позволим прерывания запереповненням, битTOV0 = 1
outTIMSK, temp
ldisys, 0b10000000 // Установим sys на первый разряд индикатора
Proga_Pred:
rcallW1_Sbros // Сбрасываем шину и проверяем есть ли датчик
cpir17 0 // После сброса, если датчик евr17 будет 1
breqProga_Pred // Если этого нет, идем в бесконечность проверки
rcallW1_Init_12bit // Перестроюемо конфигурационный байт на 9 битную схему работы
sei // позволяется прерывания

Proga:
cli // Запрещаем прерывания на время работы с датчиком
rcallW1_Sbros // Сбрасываем шину и перевиряемочы есть датчик
cpir17 0 // После сброса, если датчик есть в r17 будет 1
breqProga // Если этого нет, идем в бесконечность проверки
rcallW1_ConvTemp // Говорим датчику конвертировать температуру
sei // позволяется прерывания и ждем
rcallDelay // Подождем несколько секунд, пока датчик закончит конвертировать

Proga 0:
cli // Запрещаем прерывания на время работы с датчиком
rcallW1_Sbros // Сбрасываем шину и перепроверяем есть датчик
cpir17 0
breqProga0 // Если этого нет, идем в нескончаемость проверки
rcallW1_ReadMem // Читаем в ОЗУ текущую температуру
sei // позволяется прерывания и начинаем пересчет температуры

lditemp, 0x00 // обнуляем ячейки, где будет температура
stsOtobr + 1, temp
stsOtobr + 2, temp
stsOtobr + 3, temp
ldstemp, Trm // Загружаем старший регистр температуры
sbrstemp, 7 // Проверим положительная у нас температура
rjmpProga_Plusovay // если 7 бит установлен пропускаем эту срока, то есть температура -
lditemp, 0b11111101 // Запишем в Otobr отображения сегменту G, то есть "-"
stsOtobr, temp // Сохраним в 1 разряд
ldstemp, Trm // Загружаем в temp старший регистр температуры
anditemp, 0b00001111 // Выполняем логическое И с константой, отсекаем 4 бита слева
ldirazr1, 0x0F // Записываем число 0x0F в razr1
subrazr1, temp // Отнимаем от 0x0F число из старшего регистра датчика
ldstemp, Trm + 1 // Загружаем в temp младший регистр температуры
anditemp, 0b11110000 // Выполняем логическое И с константой, отсекаем 4 бита справа
ldirazr2, 0xF0 // Записываем число 0xF0 в razr2
subrazr2, temp // Вычитаем от 0xF0 число с младшего регистра датчика
swaprazr2 // Меняем тетради младшего регистра датчика
incrazr2 // Увеличиваем мона 1
swaprazr2 // Изменение назад тетради младшего регистра датчика

rcallRasch_Decimal // Вызываем под программу пересчета температуры в десятинный вид
rcallRasch_Otobr // Вызываем под программу конвертации учитаемий вид
rcallOtobr_Visible// Вызываем подпрограмму перезаписи ячеек
rjmpProga // Переходим на Proga

Proga_Plusovay: // Пришли, если температура +
lditemp, 0b11111111 // Запишем в Otobr отображения "Ничего", то есть "+"
stsOtobr, temp
ldsrazr1, Trm // Загрузим старший регистр температуры
ldsrazr2, Trm + 1 // Загрузим младший регистр температуры
andirazr2, 0b11110000 // Выполняем логическое С константой, отсекаем 4 бита справа
// Этим мы от Сика с младшего бита мусора десятинности температуры

rcallRasch_Decimal // Вызываем подпрограмму пересчете температуры в десятинный вид
rcallRasch_Otobr // Вызываем подпрограмму преобразования в читабельный вид
rcallOtobr_Visible // Вызываем подпрограмму перезаписи ячеек
rjmpProga // Переходим на Proga

Rasch_Decimal: // Пересчет регистра на десятинную форму
swaprazr1 // Изменим тетради в razr1 (старший регистр)
swaprazr2 // Изменим тетради в razr2 (молодшийрегистр)
addrazr1, razr2 // Просуммируем регистры, теперь получена температура в razr1
cpirazr1 0 // Проверим, не 0 градусов
breqNULL_Temp // Перейдемоякщо 0 градусов

Rasch_Decimal0:
ldiXH, High (Otobr + 3) // Загрузим ячейку Otobr + 3 в регистр косвенной адресации X
ldiXL, Low (Otobr + 3)
ldtemp, X // Загрузим с Otobr + 3 значения
inctemp // Увеличим на 1
stX, temp // Сохраним назад в Otobr + 3
cpitemp, 10 // Проверим на 10
brneRasch_Decimal1 // Если не равно перейдем по метке
lditemp 0 // если же = 10, тогда обнулить Otobr + 3
stX, temp
ldtemp, -X // А здесь уже загрузим Otobr + 2 и проведем те же манипуляции
inctemp
stX, temp
cpitemp, 10
brneRasch_Decimal1
lditemp 0
stX, temp
ldtemp, -X
inctemp
stX, temp
Rasch_Decimal1:
decrazr1 // Зменшимона 1 razr1
brneRasch_Decimal0 // Если не = 0 перейдем заметкой
ret // иначе все пересчитали и выходим из подпрограммы

Rasch_Otobr: // Пересчет регистров вчитабельну форму
ldstemp, Otobr + 3 // Загрузим в temp значение ячейки Otobr + 3
rcallRasch_Otobr_Podp // Вызовем подпрограмму пересчете
stsOtobr + 3, razr1 // Сохраним полученное значение в Otobr + 3, ниже по аналогии
ldstemp, Otobr + 2
rcallRasch_Otobr_Podp
stsOtobr + 2, razr1
ldstemp, Otobr + 1
rcallRasch_Otobr_Podp
stsOtobr + 1, razr1ret

Rasch_Otobr_Podp: // Подпрограмма пересчете в читабельную форму
ldiZH, High (CH * 2) // Загрузим в Z наш адрес цифр у памяти программ
ldiZL, Low (CH * 2)
inctemp // Увеличим temp на 1
Rasch_Otobr_Podp0:
lpmrazr1, Z + // Загрузим с программно и памяти число вrazr1
dectemp // Снизим temp
brneRasch_Otobr_Podp0 // Если temp не = 0 перейдем
ret // Если же = 0, выйдем из подпрограммы и в razr1 у нас полученное число

NULL_Temp: // т.к. уOtobr ячейках и так 0, просто выйдем из подпрограммы
ret
Otobr_Visible: // Переписываем готовы ячейки с Otobr у Visible
cli // Запретим прерывания
ldstemp, Otobr
stsVisible, temp
ldstemp, Otobr + 1
stsVisible + 1, temp
ldstemp, Otobr + 2
stsVisible + 2, temp
ldstemp, Otobr + 3
stsVisible + 3, temp
sei // Позволим прерывания
ret

TIM0_OVF: // Динамическая индикация
cli // Запрещаем прерывания
pushtemp // Записываем temp в стек
intemp, SREG // Достаем значение SREG в temp
pushtemp // и сохраняем в стеке
lsrsys // Логический сдвиг вправо
cpisys, 0b00001000 // Проверяем не вышло за границы сегментов
brneTIM0_OVF_Vix // если не получилось переход моза меткой
ldiYH, High (Visible) // а если вышло за границы, обнулить регистровую пару Y
ldiYL, Low (Visible)
ldisys, 0b10000000 // Поставим 7 бит регистра sys, он контролирует который разряд включительно.
TIM0_OVF_Vix:
ldtemp, Y + // Загрузим значение Y и повысим его адрес
outPORTD, sys // Отправим сегмент в порт
outPORTC, temp // И число или знак который выводим
poptemp // Достаем из стека значенния SREG
outSREG, temp // инадсилаемо назад в SREG
poptemp // Достаем значення temp
sei // позволяется прерывания
reti // Выходим из прерывания


//////////////////////////// Начало подпрограмм 1-Wire
W1_Sbros: // Сложения шины и проверка на месте датчик
ldsr16, W1_BIT // Записываем в r16 ножку де датчик
sbiW1_DDR, W1_BIT // Ножку на выход
cbiW1_PORT, W1_BIT // Опракидуем вывод на землю
rcallW1_DelayH // Задержка 480 мкс, для сброса
cbiW1_DDR, W1_BIT // Ножку на вход
rcallW1_DelayI // Ждем тайм слот 70 мкс
sbisW1_PIN, W1_BIT // Пропускает мо следующею срока, если бит порта в 1
ldir17, 1 // И установим сигнальный регистр в 1
sbicW1_PIN, W1_BIT // Пропускаем следующую строку, если бит порта в 0
ldir17 0 // И установим сигнальный регистр в 0
rcallW1_DelayJ // Ждем тайм слот 410 мкс
ret // Если датчик на месте, в r17 по выходе отсюда будет 1, в противном случае 0

W1_ReadMem: // Чтения памяти регистре в температуры
ldir16, 0xCC // Вышлем команду 0xCC, это пропустить уникальный номер датчика
rcallds_byte_wr // Так как он у нас один на проводе
ldir16, 0xBE // Говорим датчику, мы сейчас будем читать
rcallds_byte_wr // Запуливаемо байт
rcallds_byte_rd // А здесь уже начинаем читать, прочитали первый (младший)
stsTrm + 1, r16 // И запулилы его в память, по метке Trm + 1
rcallds_byte_rd // Читаем второй (старший)
stsTrm, r16 // И запулилы его в память, по метке Trm
ret

W1_ConvTemp: // Подпрограмма преобразования температуры
ldir16, 0xCC // Пропускаем уникальный номер датчика
rcallds_byte_wr
ldir16, 0x44 // Говорим что нужно сконвертировать температуру, этот процесс занимает 750 мс
rcallds_byte_wr
ret

W1_Init_12bit: // Подпрограмма перестройки на 12 бит температуры
ldir16, 0xCC // Пропускаем уникальный номер датчика
rcallds_byte_wr // Спуливаемо в датчик
ldir16, 0x4E // Говорим что сейчас будем писать в RAM регистры датчика
rcallds_byte_wr // Спуливаемо в датчик
ldir16, 0xFF // 0xFF записываем в первые 2 регистры, это регистры температуры, они нам не нужны
rcallds_byte_wr // поэтому их оставляем в стандартном состоянии
ldir16, 0xFF // 0xFF второй байт температуры
rcallds_byte_wr // Спуливаемо на порт
ldir16, 0x1F // Говорит мощо 12 бит - 7F, или 1F - 9бит, 3F - 10 бит, 5F - 11 бит
rcallds_byte_wr // Спуливаемо на порт
ret

ds_byte_rd: // Подпрограмма чтения данных в регистр r16 с 1 Wire
ldir17, 8 // Пишем в r17 - 8, т.к. у нас 8 бит в регистре
clrr16 // Чистимоr16, сюда будем читать данные
ds_byte_rd_0:
sbiW1_DDR, W1_BIT // Вывод на выход
cbiW1_PORT, W1_BIT // Опрокидуемо вывод на землю
rcallW1_DelayA // Ждем 6 микросекунд
cbiW1_DDR, W1_BIT // Вывод на вход
rcallW1_DelayE // Ждем 9 микросекунд
sbisW1_PIN, W1_BIT
clc // Очищаем бит C = 0
sbicW1_PIN, W1_BIT
sec // Очищаем бит C = 1
rorr16 // Выполняем циклический сдвиг вправо через С
rcallW1_DelayF // Ждем 55 микросекунд
decr17 // Снижаем на 1 регистр r17
brneds_byte_rd_0 // Если не равно 0 обращаемся в цикле
ret

ds_byte_wr: // Подпрограмма записи данных с региструr16 в датчик
ldir17, 8 // Пишем в r17 - 8, т.к. у нас 8 бит в регистре
ds_byte_wr0: 
sbiW1_DDR, W1_BIT // Вывод на выход
cbiW1_PORT, W1_BIT // Опрокидаем вывод на землю
sbrcr16 0 // Проверим, в r16 бит 0 очищено или установлена
rjmpds_byte_write_1 // Если установлено перейдем по этой метке
rjmpds_byte_write_0 // Если очищено перейдем по этой метке
ds_byte_wr1:
lsrr16 // Логический сдвиг вправо
decr17 // Знижуемоr17 на 1
brneds_byte_wr0 // Если не равно 0, обращаемся в цикле
ret // Выход из подпрограммы

ds_byte_write_0: // Запись 0
rcallW1_DelayC // Ждем 60 микросекунд
cbiW1_DDR, W1_BIT // Вывод на вход
rcallW1_DelayD // Ждем 10 микросекунд
rjmpds_byte_wr1

ds_byte_write_1: // Запись 1
rcallW1_DelayA // Ждем 6 микросекунд
cbiW1_DDR, W1_BIT // Вывод на вход
rcallW1_DelayB // Ждем 64 микросекунд
rjmpds_byte_wr1

W1_DelayA: // Задержка 6 mcs
ldiXH, high (FREQ / 1000000)
ldiXL, low (FREQ / 1000000)
rcallW1_Delay
ret
W1_DelayB: // Задержка 64 mcs
ldiXH, high (FREQ / 65000)
ldiXL, low (FREQ / 65000)
rcallW1_Delay
ret
W1_DelayC: // Задержка 60 mcs
ldiXH, high (FREQ / 68000)
ldiXL, low (FREQ / 68000)
rcallW1_Delay
ret
W1_DelayD: // Задержка 10 mcs
ldiXH, high (FREQ / 500000)
ldiXL, low (FREQ / 500000)
rcallW1_Delay
ret
W1_DelayE: // Задержка 9 mcs
ldiXH, high (FREQ / 600000)
ldiXL, low (FREQ / 600000)
rcallW1_Delay
ret
W1_DelayF: // Задержка 55 mcs
ldiXH, high (FREQ / 75000)
ldiXL, low (FREQ / 75000)
rcallW1_Delay
ret
W1_DelayH: // Задержка 480 mcs
ldiXH, high (FREQ / 8332)
ldiXL, low (FREQ / 8332)
rcallW1_Delay
ret
W1_DelayI: // Задержка 70 mcs
ldiXH, high (FREQ / 58000)
ldiXL, low (FREQ / 58000)
rcallW1_Delay
ret
W1_DelayJ: // Задержка 410 mcs
ldiXH, high (FREQ / 9756)
ldiXL, low (FREQ / 9756)
rcallW1_Delay
ret
W1_Delay: // Подпрограмма задержки
sbiwXH: XL, 1 // Отнимаем единицу с регистровой пары
brneW1_Delay // Если не равно 0 крутимся в цикле
ret // Выход из подпрограммы
//////////////////////////// Конец подпрограммы 1-Wire

Delay: // Стандартная задержка
ldirazr1, 255
ldirazr2, 255
ldirazr3, 10
Pdelay:
decrazr1
brnePdelay
decrazr2
brnePdelay
decrazr3
brnePdelay
ret

CH: // Цифры динамической индикации от 0 до 9
.db0x03, 0x9F, 0x25, 0x0D, 0x99, 0x49, 0x41, 0x1F, 0x01, 0x09

После ввода кода программу необходимо сохранить и скомпилировать в * .hex-файл.

4. Симуляция работы проекта

Для симуляции работы проекта воспользуемся пакетом программ ProteusDesignSuiteCADSoftware.

Откроем у Proteus созданный ранее проект термометра.

Дважды кликните по микроконтроллера ATmega16 для редактирования. В появившемся окне, в разделе ProgramFile указываем * .hex-файл программы и нажимаем кнопку ОК.

На нижней панели инструментов нажимаем кнопку Runtimesimulation.

Симуляция работы проекта
Симуляция работы проекта

Заключение

Итак, я разработал проект средства измерения температуры в диапазоне от -10 до +85 ºCз абсолютной погрешностью ≤ 0,5 ºC, отражающий значение температуры на четырехразрядному семисегментному индикаторе.

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

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

Для разработки программного обеспечения были использованы программный пакет AtmelStudio, который позволяет разрабатывать программное обеспечение для любых микроконтроллеров семейства AVR. ПО разработано с использованием языка программирования AVRAssembler, что обеспечивает высочайшее быстродействие, но достаточно сложным по сравнению с C / C ++.

Данную работу, мне помогал мой однокурсник и коллега, Коваль Игорь. Спасибо, может кому-то пригодиться в будущем.

Источник: https://habr.com/ru/post/538526/


Интересные статьи

Интересные статьи

В нынешних условиях все больше компаний задумываются, как перевести сотрудников на удаленную работу. В свою очередь мы решили им помочь и написали подробные инструкции по настройке удаленного...
Привет, друзья! Меня зовут Петр, я представитель малого белорусского бизнеса со штатом чуть более 20 сотрудников. В данной статье хочу поделиться негативным опытом покупки 1С-Битрикс. ...
Бизнес-смыслы появились в Битриксе в начале 2016 года, но мало кто понимает, как их правильно использовать для удобной настройки интернет-магазинов.
Приступая к животрепещущей теме резервного копирования на «Битрикс», прежде всего хотелось бы поблагодарить разработчиков, реализовавших автоматическое резервное копирование в облачное хранилище в вер...
Задумывая технологический стартап, вы совсем не обязаны быть асом в электронике, гораздо больше шансов на хорошую идею имеет узкий специалист со знанием основ маркетинга, но, даже заказывая к...