[C++, Разработка под Arduino] Разработка средств измерения температуры
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Объект. Микроконтроллер ATmega16.Предмет. Измерение температурыЦель. Измерение температуры контактным методом.Задачи. Измерение температуры контактным методом, обработка измерительного сигнала с помощью микроконтроллера и вывода значения температуры на 7-сегментный дисплей.Программное обеспечение:1. Программная среда разработки AVRStudio или AtmelStudio, для разработки программ для МК AtmelAVR® (Atmel).2. Стандартный Windows-приложение - калькулятор (Microsoft).3. Пакет программ для автоматизированного проектирования электронных схем – Proteus DesignSuite CAD Software (Labcenter electronics).Ход работы предусматривает последовательное выполнение рекомендаций и действий, описанных далее в этом проекте по пунктам. СОДЕРЖАНИЕ1. ВСТУПЛЕНИЕ2. АППАРАТНАЯ РЕАЛИЗАЦИЯ ПРОЕКТА2.1 Микроконтролер ATmega162.2 Датчик температуры DS18B202.3 Четырехразрядный семисегментный индикатор2.4 Моделирование электронной схемы проекта3. ПРОГРАМННАЯ РЕАЛИЗАЦИЯ ПРОЕКТА3.1 Среда разработки AtmelStudio3.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 Технические характеристики:СерияAVRATmegaЯдроAVRШирина шины данных8-бітТактова частота16 МГцКоличество входов / выходов32Объем памяти программ16 кбайт (8k*16)Тип памяти программFlashОбъем EEPROM512*8Объем SRAM1k*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 Датчик температуры DS18B20DS18B20 - цифровой температурный датчик, имеет много функций. По сути, DS18B20 - это целый микроконтроллер, который может хранить значения измерений, сигнализировать о выходе температуры за установленные пределы (сами границы мы можем устанавливать и изменять), менять точность измерений, способ взаимодействия с контроллером и многое другое. Все это в очень небольшом корпусе, который, к тому же, может быть в водонепроницаемом исполнении.Описание выводов датчика:
датчик DS18B20VDD – питание. 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Для корректной работы между 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 ºC2.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 Среда разработки AtmelStudioAtmelStudio (ранее 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 ++.Данную работу, мне помогал мой однокурсник и коллега, Коваль Игорь. Спасибо, может кому-то пригодиться в будущем.
===========
Источник:
habr.com
===========
Похожие новости:
- [Разработка на Raspberry Pi, Компьютерное железо] Raspberry Pi Foundation представила микроконтроллеры Pi Pico за $4 на своем кремнии
- [Информационная безопасность, C++, C, Разработка для интернета вещей] Espressif IoT Development Framework: 71 выстрел в ногу
- [Информационная безопасность, C++, C, Разработка для интернета вещей] Espressif IoT Development Framework: 71 Shots in the Foot
- [Программирование микроконтроллеров, Гаджеты, 3D-принтеры, Интернет вещей, DIY или Сделай сам] Mark gauntlet v4.2: мануал по созданию
- [Open source, Программирование, C++] Проект arataga: реальный пример использования SObjectizer и RESTinio для работы с большим количеством HTTP-соединений
- [Космонавтика] НАСА отказалось от попыток установить термометр под грунтом Марса
- [Разработка под Linux, Программирование микроконтроллеров, Компьютерное железо, Процессоры] BeagleBoard представила доступный одноплатный компьютер на RISC-V
- [Разработка под Arduino, DIY или Сделай сам] Крутые часы на адресных диодах (часть 2)
- [Разработка под Arduino, DIY или Сделай сам] Крутые часы на адресных диодах (часть 3)
- [Системное программирование, C, Разработка под Linux, Программирование микроконтроллеров] Сюрпризы в коде на Си (перевод)
Теги для поиска: #_c++, #_razrabotka_pod_arduino (Разработка под Arduino), #_arduino (ардуино), #_temperatura (температура), #_mikrokontroller (микроконтроллер), #_c++, #_razrabotka_pod_arduino (
Разработка под Arduino
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 15:24
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Объект. Микроконтроллер ATmega16.Предмет. Измерение температурыЦель. Измерение температуры контактным методом.Задачи. Измерение температуры контактным методом, обработка измерительного сигнала с помощью микроконтроллера и вывода значения температуры на 7-сегментный дисплей.Программное обеспечение:1. Программная среда разработки AVRStudio или AtmelStudio, для разработки программ для МК AtmelAVR® (Atmel).2. Стандартный Windows-приложение - калькулятор (Microsoft).3. Пакет программ для автоматизированного проектирования электронных схем – Proteus DesignSuite CAD Software (Labcenter electronics).Ход работы предусматривает последовательное выполнение рекомендаций и действий, описанных далее в этом проекте по пунктам. СОДЕРЖАНИЕ1. ВСТУПЛЕНИЕ2. АППАРАТНАЯ РЕАЛИЗАЦИЯ ПРОЕКТА2.1 Микроконтролер ATmega162.2 Датчик температуры DS18B202.3 Четырехразрядный семисегментный индикатор2.4 Моделирование электронной схемы проекта3. ПРОГРАМННАЯ РЕАЛИЗАЦИЯ ПРОЕКТА3.1 Среда разработки AtmelStudio3.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 Технические характеристики:СерияAVRATmegaЯдроAVRШирина шины данных8-бітТактова частота16 МГцКоличество входов / выходов32Объем памяти программ16 кбайт (8k*16)Тип памяти программFlashОбъем EEPROM512*8Объем SRAM1k*8Наличие АЦП/ЦАПАЦП 8*10bВстроенные интерфейсыI2C, SPI, UARTВстроенная периферияBrown-outdetect/reset, POR, PWM, WDTНапряжение питания4.5…5.5 ВРабочая температура-40…+85 ºCОтличительные особенности:Прогрессивная RISC архитектура
Описание выводов микроконтроллера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 Датчик температуры DS18B20DS18B20 - цифровой температурный датчик, имеет много функций. По сути, DS18B20 - это целый микроконтроллер, который может хранить значения измерений, сигнализировать о выходе температуры за установленные пределы (сами границы мы можем устанавливать и изменять), менять точность измерений, способ взаимодействия с контроллером и многое другое. Все это в очень небольшом корпусе, который, к тому же, может быть в водонепроницаемом исполнении.Описание выводов датчика: датчик DS18B20VDD – питание. 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Для корректной работы между 2 и 3 выводами датчика (VDDта DO) необходимо устанавливать резистор номиналом 4,7 кОм.Особенности датчика:
Семисегментный индикаторСемисегментный индикатор - устройство отображения цифровой информации. Это наиболее простая реализация индикатора, который может отображать арабские цифры. Для отображения букв используются более сложные многосегментные и матричные индикаторы.Семисегментный индикатор, как понятно из его названия, состоит из семи элементов индикации (сегментов), включаемых и исключаются отдельно. Включая их в различных комбинациях, из них можно составить упрощенные изображения арабских цифр. Часто семисегментный индикаторы делают в курсивное начертание.Сегменты обозначаются буквами от A до G; восьмой сегмент - десятичная точка (decimalpoint, DP), предназначенная для отображения чисел с плавающей точкой. Расположение выводов 4-разрядного семисегментного индикатора: 4-разрядный 7-сегментный индикатор имеет 12 выводов. Выводы A-G отвечают сегментам, обозначенные этими буквами, decimal - точка, D1-D4 соответствуют номеру разряда справа налево.Технические характеристики:Напряжение питания1,8 ВРабочий ток20 мАКоличество разрядов4Рабочая температура-35…+85 ºC2.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иснуе много сред разработки. Некоторые из них приведены в списке ниже:
.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 Симуляция работы проектаЗаключениеИтак, я разработал проект средства измерения температуры в диапазоне от -10 до +85 ºCз абсолютной погрешностью ≤ 0,5 ºC, отражающий значение температуры на четырехразрядному семисегментному индикаторе.Датчик температуры DS18B20передае значение температуры в микроконтроллер ATmega16, который его обрабатывает, конвертирует в десятинный формат и выводит на четырехразрядный семисегментный индикатор.Для моделирования электронной схемы были использованы программный пакет ProteusDesignSuiteCADSoftware, который позволяет проектировать и симулировать работу электронных схем.Для разработки программного обеспечения были использованы программный пакет AtmelStudio, который позволяет разрабатывать программное обеспечение для любых микроконтроллеров семейства AVR. ПО разработано с использованием языка программирования AVRAssembler, что обеспечивает высочайшее быстродействие, но достаточно сложным по сравнению с C / C ++.Данную работу, мне помогал мой однокурсник и коллега, Коваль Игорь. Спасибо, может кому-то пригодиться в будущем. =========== Источник: habr.com =========== Похожие новости:
Разработка под Arduino ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 15:24
Часовой пояс: UTC + 5