Разработка устройства показывающего время, температуру воздуха и атмосферное давление
Ознакомление с процессом замены модуля индикации, выполненного на нескольких семисегментных светодиодных индикаторах. Изучение устройства показывающего время, температуру воздуха и атмосферное давление, выполненного на языке программирования Ассемблер.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 04.05.2014 |
Размер файла | 932,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Аннотация
Настоящая курсовая работа посвящена разработке устройства показывающего текущее время, температуру воздуха и атмосферное давление, измеряющего данные величины посредством встроенных датчиков температуры и давления.
В состав курсовой работы входят расчетно-пояснительная записка и программная часть. Пояснительная записка состоит из разделов, указанных в содержании. Программная часть работы выполнена на языке программирования Ассемблер.
В приложении приведен текст программы микроконтроллера.
Содержание
Введение
1 Техническое задание
1.1 Наименование и область применения разработки
1.2. Основание для разработки
1.3. Цель и назначение разработки
1.4. Источник разработки
1.5. Режим работы устройства
1.6. Условия эксплуатации
1.7. Технические требования
1.8. Порядок контроля и приема
2. Конструкторская часть
2.1 Разработка и описание функциональной схемы
2.2. Разработка и описание принципиальной схемы
2.3. Параметры контроллера
2.4. Модуль контроллера
2.5. Программа микроконтроллера
2.6. Разработка печатной платы
3. Дополнительное описание устройства
3.1.Датчик температуры
3.1.1.Расчет схемы стабилизатора тока
3.2.Датчик давления
3.3.Модуль питания
3.4.Модуль индикации
3.4.1.Прогрммирование вывода информации на ЖКИ
Заключение
Список литературы
Приложение (программа)
Введение
В настоящее время микроконтроллеры получили широкое распространение во многих областях жизнедеятельности человека. Контроллеры получили широкое распространение и в промышленности, где они используются для решения многих прикладных задач, таких как: автоматизация диагностики, сбор и обработка информации.
Данный прибор построен на микроконтроллере AT90LS8535, он показывает не только время, но и температуру, а также атмосферное давление, заменяя таким образом три обычных бытовых прибора. Прибор должен быть связан по последовательному интерфейсу с персональным компьютером, который поможет откалибровать шкалы термометра и барометра, а при необходимости -- собрать данные для вывода на экран графиков изменения их показаний за выбранный интервал времени. Графическая часть работы выполнена при помощи программы Компас-3D V8 (принципиальная электрическая схема, структурная схема, блок-схема) и Sprint LayOut 4.0 rus (печатная плата).
1. Техническое задание
1.1 Наименование и область применения разработки
Данное устройство показывает текущее время, измеряет температуру окружающей среды и атмосферное давление, с помощью датчика давления и датчика температуры.
1.2 Основания для разработки
Основанием для разработки является учебный план для специальности 220301 "Автоматизация технологических процессов и производств", а также задание на курсовую работу по дисциплине "Общая электротехника и электроника".
В спроектированном устройстве анализ результатов производился программно, что позволило существенно снизить погрешность измерения.
1.3 Назначение разработки
Целью курсовой работы является замена модуля индикации, выполненного на нескольких семисегментных светодиодных индикаторах, на один многострочный индикатор. Устройство предназначено для определения температуры внешней среды и атмосферного давления.
Срок разработки - учебный семестр.
1.4 Источники разработки
Основным источником разработки является статья в журнале “Радио ”, 2003, №4, №5, №7.
1.5 Режим работы устройства
Данное устройство управляется со стороны управляющей программы, написанной с помощью языка программирования Assembler в соответствии с его спецификой для данного микроконтроллера. У устройства реализована связь с компьютером через СОМ-порт, посредством программы внешнего компьютера предназначенная для управления часами, калибровки термометра и барометра. Программа Lclock подготовлена с помощью пакета Delphi версии 3.0.
1.6 Условия эксплуатации
В соответствии с ГОСТ 21552-84 нормальными климатическими условиями для эксплуатации устройства являются:
· температура окружающего воздуха 20±5 0С;
· относительная влажность воздуха 60±15%;
· атмосферное давление 630-800 мм рт.ст.;
Устройство должно обеспечивать нормальное функционирование в условиях температуры окружающего воздуха от 0 0С до +200 0С.
1.7 Технические требования
Разработанное устройство должно быть реализовано на стандартных унифицированных элементах. Повышенных требований к подбору элементов не предъявляется. ассемблер давление модуль программирование
1.8 Порядок контроля и приемки
Перечень материалов проекта:
1. Пояснительная записка.
2. Графическая часть (схема электрическая принципиальная, структурная схема, печатная плата, блок схема алгоритма программы).
3. Спецификация.
Контроль и приемку курсовой работы осуществляет преподаватель.
2. Конструкторская часть
2.1 Разработка и описание функциональной схемы
Разработку функциональной схемы необходимо начинать с определения всех отдельных частей разрабатываемого устройства. Каждый отдельный элемент данного устройства должен выполнять определённые функции и взаимодействовать с другими элементами. Для согласования отдельных элементов устройства необходимо предусмотреть определённые блоки, основной функцией которых должно быть согласование блока контроллера с периферийными устройствами. Структурная схема устройства приведена в графической части расчётно-пояснительной записки.
2.2 Разработка и описание принципиальной схемы
В качестве управляющего микроконтроллера был выбран AVR микроконтроллер AT9OS8535-8JI. Данный выбор обусловлен полным соответствием уровней сигналов и достаточным быстродействием для УПИ.
Рисунок 1 - структурная схема микроконтроллера AT90LS8535
2.3 Параметры контроллеров семейства AVR
* Использована AVR расширенная RISC архитектура
* Мощный набор из 121 команды, большинство которых выполняется за один машинный цикл
* Емкость внутрисистемно программируемой Flash памяти 4 Кбайт 128, 1000 циклов стирания/записи
* SPI интерфейс внутрисистемного программирования
* Емкость встроенной EEPROM 2 Кбайт или 4 Кбайт, 100000 циклов стирания/записи
* Встроенная RAM емкостью , 256 байт или 512 байт
* 32 8-разрядных регистра общего назначения, набор регистров управления периферией
* 32 программируемых линии I/O, 8 линий выхода, 8 линий входа
* Программируемые последовательные UART и SPI интерфейсы
* Диапазон напряжений питания от 2,7 В до 6,0 В
* Нагрузочная способность выводов до 20 мА
* Диапазон тактовых частот от 0 до 4 МГц
* Производительность до 4 MIPS при частоте 4 МГц
* Встроенная система реального времени с отдельным генератором
* Два 8-разрядных таймера/счетчика с отдельным предделителем и ШИМ
* 16-разрядный таймер/счетчик с отдельным предделителем, режимами захвата/ сравнения и двойным ШИМ с разрядностью 8, 9 или 10 разрядов
* Программируемый сторожевой таймер со встроенным генератором
* Встроенный аналоговый компаратор
* 8-канальный 10-разрядный аналого-цифровой преобразователь
* Режимы энергосбережения Idle, Power Save и Power Down
* Программная установка тактовой частоты
* Программная блокировка защиты программных средств
Приборы AT90S8535-8JI являются 8-разрядными CMOS микроконтроллерами с AVR усовершенствованной RISC архитектурой. Выполняя большинство команд за один тактовый цикл, микроконтроллеры AT90S8535-JI обеспечивают производительность 1 MIPS на каждый мегагерц тактовой частоты, что позволяет разработчикам оптимизировать потребление, зависящее в основном от тактовой частоты.
AVR ядро базируется на усовершенствованной RISC архитектуре, с регистровым файлом быстрого доступа, содержащим 32 регистра общего назначения, непосредственно связанных с арифметико-логическим устройством (ALU), и мощной системой команд. За один тактовый цикл из регистрового файла извлекаются два операнда, выполняется команда и результат записывается в регистр назначения. Такая высокоэффективная архитектура обеспечивает производительность почти в десять раз большую, чем стандартные CISC микроконтроллеры.
Приборы изготавливаются по технологии энергонезависимой памяти фирмы Atmel. Встроенная ISP Flash память программ может быть перепрограммирована непосредственно в системе, с использованием последовательного SPI интерфейса, или с помощью обычных программаторов энергонезависимой памяти. Объединив 8-разрядное RISC CPU с внутрисистемно программируемой Flash памятью большого объема, фирма создала семейство мощных микроконтроллеров, обеспечивающих реализацию недорогих и очень удобных решений для большого количества встраиваемых применений. Семейство AT90S8535-8JI поддерживается большим количеством средств разработки программ и систем, включающих: С-компиляторы, макроассемблеры, отладчики/симуляторы программ, внутрисхемные эмуляторы и отладочные устройства.
2.4 Модуль контроллера
В модуле контроллера, расположены основные узлы прибора: микроконтроллер DD2; преобразователь сигналов UART микроконтроллера в стандартные уровни интерфейса RS-232 (микросхема DD1); узел преобразования сопротивления датчика температуры RK1 в напряжение (микросхемы DA1, DA2, транзисторы VT1, VT2); датчик давления (ВР1); вилки интерфейса RS-232 (XP1), программирования микроконтроллера (ХР2).
С выводов 6 (РВ5) и 7 (РВ6) микроконтроллера поступает сигнал на двухцветный светодиод, показывающий состояние батареи резервного питания.
Напряжения, пропорциональные измеряемым величинам, поступают на три вывода микроконтроллера DD2, запрограммированные как входы трех из восьми имеющихся каналов встроенного АЦП. Вывод 40 (PA0/ADC0) -- температура, 39 (PA1/ADC1) -- давление, 38 (PA2/ADC2) -- напряжение батареи. Образцовым для АЦП служит поданное на вывод 32 (AREF) микроконтроллера напряжение +5 В (А), что значительно снижает требования к стабильности последнего. Дело в том, что выходное напряжение датчиков температуры и давления пропорционально не только измеряемым параметрам, но и напряжению питания. Изменение вместе с ним образцового напряжения устраняет эту зависимость в выходном коде АЦП. Хотя отклонения образцового напряжения от номинала вносят дополнительную погрешность в результат измерения напряжения батареи, в данном случае это не так уж важно.
Цепь R7C11 обеспечивает надежную установку микроконтроллера DD2 в исходное состояние при включении питания. Конденсаторы C1-C10, C12- блокировочные, С13 и С14 необходимы для возбуждения кварцевого резонатора ZQ1.
2.5 Программа микроконтроллера
Содержимое hex-файла, получаемого в результате трансляции программы, загружается в память программ микроконтроллера DD2. Работа программы после включения питания начинается с инициализации оборудования: микроконтроллера -- установки режимов работы таймеров, системы прерываний, портов ввода-вывода, UART, а также записи в регистры и ячейки памяти данных исходных значений переменных; индикатора. После этого запускается бесконечный цикл ожидания приема команд по последовательному интерфейсу.
По ежесекундным прерываниям от таймера 1 идет счет времени. По прерываниям от таймера 0 происходит считывание результатов работы АЦП. Период прерываний от таймера 0 -- 0,5 мс. Очередной отсчет АЦП получают при обработке каждого 32-го прерывания от таймера 0. Полученные за 1024 мс 64 отсчета одного из параметров (температуры, давления или напряжения) складывают, затем сумму делят на 64, а полученное усредненное значение сохраняют в ОЗУ для дальнейших расчетов. Следующие 1024 мс АЦП измеряет другой параметр. Таким образом, полный цикл опроса датчиков -- чуть более 3 с. После этого микроконтроллер выполняет процедуры расчета физических значений измеренных величин, преобразует их в ASCII коды символов полученных значений и готовит их к выводу на индикатор.
Выводимое на индикатор число X микроконтроллер вычисляет по формуле X=K(N-Z), причем коэффициенты К и Z при вычислении температуры и давления различны. Их значения «зашиты» в программном коде и переносятся из него в ОЗУ во время инициализации. При необходимости коэффициенты можно «подогнать» под реальные характеристики датчиков с помощью подключенного к прибору компьютера. Новые значения действуют до отключения питания микроконтроллера, сохранение их в энергонезависимой памяти не предусмотрено. Микроконтроллер следит за состоянием батареи, сравнивая результат измерения ее напряжения с двумя заложенными в программе порогами. При напряжении батареи более 3,3 В уровни на выходах РВ5 и РВ6 микроконтроллера таковы, что цвет свечения светодиода HL1 (см. графическую часть расчётно-пояснительной записки) зеленый. Если напряжение батареи находится в интервале 1,25...3,3 В, полярность напряжения, приложенного к светодиоду, и цвет его свечения меняются ежесекундно. С падением напряжения ниже 1,25 В светодиод постоянно красный. Приведенные значения порогов приблизительны, так как зависят, например, от напряжения питания +5 В (А).Предусмотренные в микроконтроллере AT90LS8535 режимы сниженного энергопотребления (Idle, Power Down и Power Save) программой не используются даже при работе от резервной батареи. Ее энергии и без того достаточно для питания отключенных от сети часов в течение нескольких суток. Предусмотрены прием по интерфейсу RS-232 и выполнение шести команд. Компьютер, с СОМ-портом которого прибор соединяют нуль-модемным кабелем, подает команды передачей одного--трех указанных в таблице байтов и принимает ответы на них в режиме: скорость обмена -- 9600 Бод, число битов данных -- 8, число стоповых битов -- 1, контроль четности отключен.
2.6 Разработка печатной платы
Разработка печатной платы подразумевает предварительную разработку принципиальной схемы. При разработке данного устройства были использованы: для создания принципиальной схемы - программа KOMPAS 3D V8, для создания печатной платы - программный продукт Sprint LayOut 4.0 Rus.
Печатная плата выполнена на двухстороннем стеклотекстолите. Изготавливается комбинированным методом. Расстояние между проводниками не менее 0.3 мм. Допускается в узких местах занижение контактных площадок до 0.15 мм. Плата должна соответствовать ГОСТ23752-79.
Чертеж печатной платы расположен в графической части расчётно-пояснительной записки. Шаг координатной сетки 5 мм.
3. Дополнительное описание устройства
На индикаторе прибора можно наблюдать текущие значения времени в формате ЧЧ:ММ; температуры в месте установки выносного датчика, °С; атмосферного давления, мм рт. ст. Предусмотрена трехуровневая ("нормально -- внимание -- разряжена") индикация состояния батареи резервного питания. Температуру в интервале -50...+50 °С прибор измеряет с погрешностью 0,1...0,2 °С. Интервал измерения давления -- 700...800 мм рт. ст при погрешности 1...2 мм рт. ст.
Конструктивно устройство состоит из трех модулей (плат) -- контроллера, индикатора и питания, помещенных в корпус размерами 210x160x80 мм с прозрачным окном для индикатора, и выносного датчика температуры, соединяемого с основным блоком трех-проводным кабелем длиной до 20 м. Датчик атмосферного давления находится внутри корпуса.
3.1 Датчик температуры
Терморезистором RK1 -- датчиком температуры -- служит обмотка реле РЭС60 (паспорт РС4.569. 435-00) сопротивлением 18 Ом при 20 °С. Здесь можно применить и другие медные обмотки приблизительно такого же сопротивления, в том числе обмотки реле РЭС49 (паспорт РС4.569.421-00), РЭС79 исполнений ДЛТ4.555.011, ДЛТ4.555.011-05. Сопротивление медного провода обмотки линейно зависит от температуры и достаточно стабильно во времени. Если его величина известна при температуре То (например, при 20 °С), то при температуре Т сопротивление станет равным R(T) = R(T0)[1 + 0,004(T - То)].
На ОУ DA1.1, DA1.2 и полевых транзисторах VT1, VT2 собраны два стабилизатора тока 1 мА. Их идентичность обеспечена подачей образцового напряжения от общего делителя R1R2 и равенством сопротивлений резисторов обратной связи R3 и R4. Ток верхнего по схеме стабилизатора течет через датчик RK1 и два соединительных провода, подключенных к контактам 1 и 3 разъема Х1, ток нижнего -- через образцовое сопротивление (резистор R5) и также два провода, подключенных к контактам 2 и 3. Так как результатом измерения служит разность напряжений на истоках транзисторов VT1 и VT2, равные падения напряжения на проводах и контактах разъема при вычитании взаимно уничтожаются.
Номинал резистора R5 немного меньше сопротивления датчика RK1 при минимальной измеряемой температуре, поэтому ей соответствует почти нулевой выходной сигнал преобразователя. Если использован датчик с заметно отличающимся от 1850 Ом сопротивлением при комнатной температуре, необходимо по приведенной выше формуле вычислить его сопротивление при температуре нижней границы интервала измерения (например, -50 °С) и взять в качестве номинала R5 ближайшее меньшее значение из ряда Е24. По этому ряду выпускают резисторы с допустимым отклонением не более ±5 %, однако применять нужно прецизионный, например, С2-29В, с допуском ±1 % и менее, только такой резистор обеспечит минимальное влияние изменений температуры в месте установки прибора на его показания.
Операцию вычитания выполняет прецизионный дифференциальный усилитель постоянного тока на ОУ DA2.1, DA2.2. Необходимо точное равенство сопротивлений резисторов R8--R11, поэтому их следует подбирать с допусками не более ±0,1...±0,25 %, аналогичные допуски должны иметь и резисторы R3, R4.
Коэффициент усиления дифференциального усилителя устанавливают таким, чтобы верхнему пределу измерения температуры соответствовало максимально возможное для ОУ выходное напряжение -- приблизительно 4,4 В. Необходимое значение коэффициента усиления находят по формуле:
где Ro -- сопротивление датчика при комнатной температуре, кОм; io=1 мА -- номинальный ток через датчик и образцовый резистор; Tмакс. и Tмин. -- соответственно верхняя и нижняя границы интервала измерения, °С. Задавшись равными номиналами резисторов R8--R11 (их можно выбирать любыми от 2 до 10 кОм), вычисляют номинал резистора R6 по формуле. Требования к точности номинала этого резистора не очень высоки, погрешности могут быть скомпенсированы программно. Но как и прочие резисторы измерительного узла, он должен быть термостабильным.
3.1.1 Расчет схемы стабилизатора тока
Проверим работу схемы стабилизатора тока, рассчитав значение выходного тока.
Напряжение инвертирующего входа операционного усилителя Uвх равно выходному напряжению делителя напряжения R1, R2. Оно вычисляется по формуле:
Поскольку по цепи обратной связи операционный усилитель стремится поддержать равенство входных напряжений, получаем:
Расчетами подтвердили правильность работы схемы стабилизатора тока на 1мА.
3.2 Датчик давления
Датчик давления BP1 - MPX4115AP выпускает фирма Motorola специально для электронных барометров и барометрических высотомеров.
В интервале 0,15…1,15 кПа(112,5…862,5 мм.рт.ст.) зависимость его выходного напряжения от давления линейная с нормированным наклоном. Однако смещение нуля характеристик разных экземпляров датчиков доходит до 20 мм.рт.ст. Компенсация смещения в данном приборе возложена на программу микроконтроллера. Первый вывод датчика легко определить по полукруглому вырезу на нем.
Если в изготовленном приборе показания нестабильны, чаще всего виноваты наведенные на выходную цепь датчика BP1 помехи. Чтобы избавиться от них, достаточно установить между выводами 1 и 2 датчика не показанный на схеме конденсатор емкостью не менее 0,047 мкФ.
3.3 Модуль питания
Приведенная схема модуля, вырабатывает три напряжения: + 5 В (А) и -5 В -- для питания аналоговых узлов прибора; +5 В (Ц) -- для его цифровых узлов. Напряжения с соответствующих обмоток трансформатора Т1 после выпрямления диодными мостами VD1 -- VD3 поступают на фильтрующие конденсаторы С15--С17 и интегральные стабилизаторы DA3--DA5. В модуле имеются два вывода общего провода: Общ. (А) -- "аналоговый"; Общ. (Ц) -- "цифровой". Они соединены между собой только в одной точке на плате модуля питания, а во всех остальных модулях электрически не связаны.
Это необходимо для снижения уровня помех, создаваемых цифровыми узлами модуля контроллера аналоговым. Трансформатор Т1 -- ТП112-19 с кольцевым магнитопроводом, на который в дополнение к имеющимся обмоткам I--III намотана еще одна: IV (80 витков провода ПЭВ-2 0,2 мм). Можно применить любой другой трансформатор габаритной мощностью не менее 15 Вт с нужным числом вторичных обмоток (II--IV -- по 7...9 В/0,05 А).
Напряжение резервной гальванической батареи GB1 через переключатель SA1 и диод VD5 поступает на выход +5 В (Ц), если отсутствует соответствующее напряжение на выходе стабилизатора DA5. Этим поддерживается работа контроллера при отключении прибора от сети, что необходимо не только для защиты от сбоев при аварии сети, но и, например, для переноски прибора из одного помещения в другое.
Батарея GB1 составлена из трех гальванических элементов типоразмера АА, соединенных последовательно. Большую часть времени потребляемый от батареи ток пренебрежимо мал, поэтому лучше использовать элементы с щелочным (alkaline) электролитом, для которых характерны минимальная саморазрядка и максимальный допустимый срок хранения. Наиболее надежны «фирменные» элементы известных производителей. Они могут прослужить без замены несколько лет, а дешевые подделки иногда оказываются неработоспособными уже через несколько недель. Переключателем SA1 соединяют с общим проводом цепь контроля напряжения батареи GB1 при отсутствии последней. Это устраняет ложные показания индикатора.
Печатная плата модуля питания -- односторонняя с несколькими проволочными перемычками. Размеры платы 120x100 мм. Интегральные стабилизаторы DA3 и DA5 можно заменить любыми отечественными или импортными на положительное напряжение 5 В (КР1158ЕН5, 78L05, LM2931AZ-5.0), DA2 -- на такое же отрицательное (79L05, LM2990T-5.0). Оксидные конденсаторы -- К50-35 или их импортные аналоги. Диоды VD4, VD5 -- любые маломощные. При возможности здесь устанавливаются диоды Шоттки или германиевые. Правда, довольно большой обратный ток последних может негативно сказаться на сроке службы батареи GB1.
3.4 Модуль индикации
Целью данной курсовой работы является замена модуля индикации, выполненного на нескольких семисегментных светодиодных индикаторах, многострочным индикатором.
Для данной замены был выбран символьный жидкокристаллический индикатор PC 1602-L на базе контроллера HD44780 (2 строки по 16 символов).
Электрические характеристики индикатора:
1) напряжение питания - 5В
2) питающий ток - 2-5мА
3) максимальная скорость шины - 1ГГц
Технические характеристики индикатора:
Модель индикатора |
РС1602-L |
|
Габаритные размеры, мм |
122.0 x 44.0 |
|
Размер видимой области, мм |
99.0 х 24.0 |
|
Размер точки, мм |
0.92 х 1.10 |
|
Размер символа, мм |
4.84 х 9.66 |
Рассматриваемый ЖКИ при помощи стандартного 14-контактного разъема обменивается информацией с управляющим микроконтроллером (в нашем случае с AVR). AVR-микроконтроллер посылает в ЖКИ команды, управляющие режимами его работы, и ASCII-коды выводимых символов. В свою очередь, ЖКИ может посылать AVR-микроконтроллеру по его запросу информацию о своем состоянии и данные из своих внутренних блоков памяти.
Контроллер ЖК-дисплея обеспечивает интерфейс подобный интерфейсу процессора, который обеспечивает доступ к трем основным блокам памяти:
1) ОЗУ данных дисплея (DDRAM)
2) ПЗУ знакогенератора (CGROM)
3) ОЗУ знакогенератора (CGRAM)
CGROM содержит предопределенный набор символов для ЖК-дисплея. Коды букв и цифр сообщаются в их ASCII кодах.
Память DDRAM хранит символы, отображаемые на ЖК-дисплее. Емкость памяти DDRAM составляет 80 байт. Она приспособлена для отображения до 4 строк по 20 символов в каждом.
CGRAM - это область памяти, зарезервированная для хранения специальных знаков, определенных пользователем. Она может хранить до 8 знаков в формате 5х8 или 4 знака в формате 5х10.
Доступ к памяти CGRAM и DDRAM осуществляется посредством двух промежуточных регистров, которые служат для обмена данных между основным процессором и контроллером ЖК-дисплея. Это регистр команд (IR), и регистр данных (DR).
Регистр команд (IR) служит для приема команд, подлежащих обработке в контроллере ЖК-дисплея.
Регистр данных (DR) служит буфером между ОЗУ данных дисплея (DDRAM), ОЗУ знакогенератора (CGRAM) и внешней шиной данных.
Блок-схема модуля контроллера ЖК-дисплея:
Интерфейс с ЖК-дисплеем типа HD44780 может быть реализован в 8-битном параллельном формате либо в 4-битном двухпосылочном формате на линиях D4-D7 шины данных. Этот способ позволяет оставить 4 канала ввода-вывода и упрощает разводку печатной платы. Недостатком 4-битного интерфейса является требование передачи данных в виде двух 4-битных посылок (старшая часть следует за младшей). Результатом является увеличенное время коммуникации.
Назначение выводов ЖКИ:
№ |
Название вывода |
Описание |
|
1 |
VSS |
(-) Питание. 0 V. |
|
2 |
VDD |
(+) Питание.+5V. |
|
3 |
V0 |
Напряжение смещения, управляющее контрастностью |
|
4 |
RS |
Вход. Высокий уровень - Данные; Низкий - Команды |
|
5 |
R/W |
Вход. Высокий-Чтение, Низкий-Запись |
|
6 |
E |
Вход. Строб, сопровождающий сигналы на шине "команды/данные" |
|
7 |
DB0 |
Шина "команды/данные" |
|
8 |
DB1 |
||
9 |
DB2 |
||
10 |
DB3 |
||
11 |
DB4 |
||
12 |
DB5 |
||
13 |
DB6 |
||
14 |
DB7 |
Выводы VSS, VDD, V0 предназначены для подачи питающего напряжения и напряжения смещения, которое управляет контрастностью дисплея.
DB0 - DB7 используются для организации мультиплексированной шины "команды / данные". На выводы RS, R/W, E AVR-микроконтроллер выставляет управляющие сигналы.
При помощи сигнала на линии RS микропроцессор сообщает контроллеру индикатора о том, что именно передается по шине: команда или данные. Cигнал на линии Е является стробом, сопровождающим сигналы на шине "команды / данные". Запись информации в ЖКИ происходит по спаду этого сигнала. Потенциал на управляющем выводе R/W задает направление передачи данных: запись в RAM индикатора (R/W=0) или считывание оттуда (R/W=1).
Контроллер ЖКИ после приема байта команды или байта данных требует некоторого времени для обработки полученной информации, в течение которого AVR-микроконтроллер не должен выполнять новых передач.
Временная диаграмма операции записи команд/данных имеет вид:
Для того чтобы определить, когда контроллер ЖКИ закончит свои внутренние операции, AVR может опрашивать BUSY-флаг индикатора (команда "чтение busy-флага"), который сбросится только тогда, когда контроллер ЖКИ освободится. Второй, более простой способ заключается в том, что управляющий микроконтроллер, зная, сколько времени требуется ЖКИ на обработку той или иной команды, просто выполняет временную задержку после каждой передачи информации.
Если во время цикла записи AVR-микроконтроллер передает в контроллер индикатора код команды, то этот код записывается в регистр команд контроллера ЖКИ, и команда сразу же начинает выполняться. Если AVR-микроконтроллер передает в контроллер ЖКИ данные, которые представляют собой ASCII-коды отображаемых символов, то они записываются в буфер данных (DDRAM), который обычно содержит 80 ячеек. При записи или считывании буфера данных обращение осуществляется к ячейке, на которую в данный момент указывает курсор.
Система команд контроллера НD4478:
Код |
Описание команды |
Время исполнения команды (fosc= 250кГц) |
||||||||||
RS |
R/W |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
|||
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
Очистить дисплей и установить курсор в нулевую позицию (адрес 0) |
82мкс до 1.64мс |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
* |
Установить курсор в нулевую позицию (адрес 0). Установить дисплей относительно буфера DDRAM в начальную позицию. Содержимое DDRAM при этом не меняется. |
40мкс до 1.6мс |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
I/D |
S |
Установить направление сдвига курсора вправо (I/D=1) или влево (I/D=0) при записи/чтении очередного кода в DDRAM. Разрешить (S=1) сдвиг дисплея вместе со сдвигом курсора. |
40мкс |
|
0 |
0 |
0 |
0 |
0 |
0 |
1 |
D |
C |
B |
Включить(D=1)/выключить(D=0) дисплей. Зажечь(C=1)/погасить(C=0) курсор. Изображение курсора сделать мигающим (B=1). |
40мкс |
|
0 |
0 |
0 |
0 |
0 |
1 |
S/C |
R/L |
* |
* |
Переместить курсор (S/C=0) или сдвинуть дисплей (S/C=1) вправо (R/L=1) или влево(R/L=0). |
40мкс |
|
0 |
0 |
0 |
0 |
1 |
DL |
N |
F |
* |
* |
Установить разрядность шины данных 4 бита (DL=0) или 8 бит (DL=1), количество строк дисплея - одна (N=0) или две (N=1), шрифт - 5х7 точек (F=0) или 5х10 точек (F=1). |
40мкс |
|
0 |
0 |
0 |
1 |
ACG |
Установка адреса CGRAM. После этой команды данные будут записываться/считываться в/из CGRAM. |
40мкс |
||||||
0 |
0 |
1 |
ADD |
Установка адреса DDRAM. После этой команды данные будут записываться/считываться в/из DDRAM. |
40мкс |
|||||||
0 |
1 |
B F |
AC |
Чтение состояния busy-флага (BF) и счетчика адреса. |
1мкс |
|||||||
1 |
0 |
Данные |
Запись данных в DDRAM или CGRAM. |
40мкс |
||||||||
1 |
1 |
Данные |
Чтение данных из DDRAM или CGRAM. |
40мкс |
Условные обозначения битов:
В нашем случае интерфейс микроконтроллера AVR и ЖКИ реализован в 8-битном параллельном формате. Выводы шины данных контроллера (DB0-DB7) ЖКИ подсоеденены к порту С микроконроллера (PC0-PC7).
Подача питающего напряжения и напряжения смещения, которое управляет контрастностью дисплея осуществляется посредством схемы включения с использованием потенциометра R13.
Выбор данного типа индикатора обусловлен следущими положениями:
1) Нагрузочная способность выводов микроконтроллера AT90LS8535 составляет до 20 мА, питающий ток индикатора - 2-5мА;
2) Диапазон напряжений питания микроконтроллера от 2,7 В до 6,0 В, напряжение питания ЖКИ - 5В.
3.4.1 Программирование вывода информации на ЖКИ
Для облегчения работы с ЖКИ, программирования вывода информации предназначен набор подпрограмм, используемых в качестве процедур основной программы:
1) Main
2) Initlcd
3) Icom (вывод байта-команды в контролер ЖКИ)
4) tim0_lcd
Функцией программы "main" является задание режима работы ЖКИ в инициализирующей части программы.
В основном цикле головной программы задачей процессора является получение очередного отсчета и сохранение этого отсчета в промежуточном буфере ЖКИ "ind_buf", который организуется в RAM. Сохранение отсчета в RAM происходит приблизительно в 100 раз быстрее, чем его вывод на индикатор, так как при этом головной программе не нужно ждать после записи каждого байта.
Подпрограмма инициализации контроллера ЖКИ "initlcd", посылая в индикатор последовательность команд при помощи подпрограммы "icom", задает режим работы ЖКИ.
Подпрограмма "tim0_lcd", которую можно считать основной частью драйвера ЖКИ, вызывается по прерыванию от таймера 0 с временным интервалом, достаточным для обработки информации внутри контроллера ЖКИ.
Задачей подпрограммы "tim0_lcd" является вывод в ЖКИ очередного байта данных из буфера "ind_buf".
Таким образом, головная программа "main" быстро помещает результат в буфер, а подпрограмма обработки прерывания "tim0_lcd" по мере готовности ЖКИ байт за байтом выводит результат из буфера на индикатор.
При использовании прерываний и организации взаимодействия программ через буфер данных, в системе возникают несколько (в нашем случае два) параллельных асинхронных процесса: головная программа работает в своем ритме, зависящем от конкретной задачи, а периодичность подпрограммы обслуживания прерывания определяется быстродействием ЖКИ.
Из-за асинхронности программ возможна ситуация, когда обе программы одновременно начнут обращаться к буферу "ind_buf". Например, после того, как на индикатор выведена только часть результата, головная программа может обновить данные в буфере. И тогда последующие байты, выводимые на индикатор, будут относиться уже к новому отсчету, что, конечно, будет являться недопустимой ошибкой. Для того чтобы таких ситуаций не возникало, необходимо решить задачу взаимоисключения доступа программ к промежуточному буферу. Для решения этой задачи используют специальные биты управления, которые называют семафорами или флагами. В рассматриваемой программе в качестве такого флага выбран бит PB.0 и принято, что если PB.0=0, то открыт доступ к буферу для головной программы; если PB.0=1, то открыт доступ к буферу для подпрограммы обслуживания прерывания. В самый первый раз флаг устанавливается при инициализации, разрешая доступ к буферу головной программе, а затем каждая программа, завершив работу с буфером, переключает флаг в противоположное состояние.
Заключение
В данной курсовой работе было изучено устройство - Часы с термометром и барометром, выполненное на основе микроконтроллера AT90LS8535.
Устройство показывает не только время, но и температуру, а также атмосферное давление, заменяя, таким образом, три обычных бытовых прибора. Прибор должен быть связан по последовательному интерфейсу с персональным компьютером, который поможет откалибровать шкалы термометра и барометра, а при необходимости -- собрать данные для вывода на экран графиков изменения их показаний за выбранный интервал времени.
Имеет достоинства такие как: простота использования, удобный вид представления результатов измерений.
Недостаток: необходимость сопряжения с компьютером.
Функциональные возможности могут быть существенно расширены за счет написания дополнительных управляющих программ и дополнительных аппаратных средств.
При выполнении данной курсовой работы были выполнены основные задачи, поставленные перед разработчиком:
1.Систематизация и расширения объема теоретических знаний по дисциплине "Электроника".
2.Получение навыков активного использования теоретических положений при решении инженерных задач.
3.Получение навыков работы с литературными справочниками и патентными источниками информации.
4.Изучение и использование нормативной технической информации.
5.Получение навыков использования стандартов при оформлении работы.
Возможные варианты модернизации данного устройства:
1) Установление кнопок на устройстве, для ручного ввода часов, температуры и давления в случаях неправильности данных
2) Увеличения диапазона давления до 10 доли (имеет смысл при смене датчика)
3) Создания программы для этого устройства, которая будет показывать значения измеряемых величин на экране монитора компьютера, к которому он подключен, т.е. фактически можно упростить устройство, убрать дисплей, на котором идет отображение информации.
4) Возможность замены датчика давления, который сейчас установлен на датчик MPXY8020A . Он имеет возможность кроме измерения давления, измерять температуру, т.е. можно упростить схему заменив 2-а датчика на один.
5) Теоретически возможный вариант: добавить в данное устройство датчик влажности радиоактивности. И получится устройство с более широкими возможностями, показывающие основные параметры необходимые для человека.
6) Повысить точность измерений, уменьшить погрешность (при условии замены датчика)
7) Создание будильника
Приложение 1
Текст программы
; кварц 4096 КГц
.include "8535def.inc";включаемый файл
;=======================================================
.equ segG = 6 ;PC6,28
.equ segF = 5 ;PC5,27
.equ segE = 4 ;PC4,26
.equ segD = 3 ;PC3,25
.equ segC = 2 ;PC2,24
.equ segB =1 ;PC1,23
.equ segA = 0 ;PC0,22
.equ RazrDH = 6 ;PA6,34 дес час
.equ RazrEH = 5 ;PA5,35 ед час
.equ RazrDM = 4 ;PA4,36 дес мин
.equ RazrEM = 3 ;PA3,37 ед мин
.equ RazrTdH = 2 ;PB2,3
.equ RazrTdM = 1 ;PB1,2
.equ RazrTdL = 0 ;PB0,1
.equ drv0= 3 ;PB3,4 - мл. управл КП1
.equ drv1= 4 ;PB4,5 - ст. управл КП1
.equ RazrPdH = 4 ;PD4,18
.equ RazrPdM = 3 ;PD3,17
.equ RazrPdL = 2 ;PD2,16
.equ kod1= 6 ;PD6,20 - первый бит кода будилн с КП1
.equ kod2= 7 ;PD7,21 - второй бит кода будилн с КП1
.equconst_W = 0xA0;запись ЕЕ
.equconst_R = 0xA1;читать ЕЕ
.equconst_E = 0xA2;проверка ЕЕ
.equconst_RAM = 0xA3;читать RAM
.equConst_TZ = 0xA4;A4 читать знак T
.equConst_H = 0xA5;установка часов
.equConst_S0 = 0xA6;сброс сек
.equConst_59 =0xA7;установка сек в 59
;адреса SRAM старший байт адреса SRAM=0x01
.equTram=0x0 ;0x0,0x1 - старший и младший байты температуры
.equPram=0x2 ;0x2,0x3 - старший и младший байты давления
.equBram=0x4 ;0x4,0x5 - старший и младший байты батареи
.equTres=0x6 ;0x6,0x7 - старший и младший байты температуры ;результат
.equPres=0x8 ;0x8,0x9 - старший и младший байты давления
;результат
.equBres=0x0A;0xA,0x0B - старший и младший байты батареи ;результат
.equHh=0x0C ;часы hex
.equMh=0x0D ;мин hex
.equTdH=0x0E ;темпр старший дес
.equTdM=0x0F ;темпр средний дес
.equTdL=0x10 ;темпр младший дес
.equPdH=0x11 ;prs старший дес
.equPdM=0x12 ;prs средний дес
.equPdL=0x13 ;prs младший дес
.equDdH=0x14 ;часы старш дес
.equDeH=0x15 ;часы младш дес
.equDdM=0x16 ;мин старш дес
.equDeM=0x17 ;мин младш дес
.equtZH=0x20;ст. разряд коэффициента Z температуры
.equtZL=0x21;мл. разряд коэффициента Z температуры
.equtKH=0x22;ст. разряд коэффициента К температуры
.equtKL=0x23;мл. разряд коэффициента К температуры
.equpZH=0x24;ст. разряд коэффициента Z давления
.equpZL=0x25;мл. разряд коэффициента Z давления
.equpKH=0x26;ст. разряд коэффициента К давления
.equpKL=0x27;мл. разряд коэффициента К давления
.equdQH=0x1A;cтарший разряд делителя частоты кварца
.equdQL=0x1B;мл. разряд делителя частоты кварца
.equAtBCD0=5;address of ResL для процедуры преобразования Bin-Dec
.equAtBCD2=6;address of ResH
;переменные
.defAregH= r01 ;результат измерения hex, старший байт
.defAregL= r02 ;результат измерения hex, младший байт
.defKoeffH= r03 ;коэффициент, старший байт
.defKoeffL= r04 ;коэффициент, младший байт
.defResL= r05 ;результат измерения упакованный дес.,младший байт
.defResH= r06 ;результат измерения упакованный дес.,старший байт
.deftemp= r16 ;рабочий регистр
.deftemp1= r17 ;вспомогательная переменная
.deftemp2= r18 ;вспомогательная переменная
.defcount= r19 ;счетчик преобразований - до 64
.defcountCyk= r20 ;счетчик циклов АЦП - до 32, 32х64 = 2000 гц раз ;в сек
.defFlag= r21 ;регистр флагов биты: изм 0 - темпр, 1 - давл, ,2- ;бат, 3-batLow
; 4-мигбат
; 5 -работа от батарей (зарезервирован)
.defcRazr= r22 ;счетчик мультиплексирования разр до 10
.def cSek= r23 ;счетчик sek
.def cMin= r24 ;счетчик min
.def cHour= r25 ;счетчик hours
.equ ind_buf=$60 ;задание символического имени адресу буфера ЖКИ
.def enter_counter=r16 ;счетчик входа в подпрограмму прерывания
.include "8535def.inc"
.cseg
.org 0
rjmp main
.org OVF0addr
rjmp tim0_lcd ;установка вектора прерывания по переполнению таймера 0
.org 20 ;индикатора
;====================================================================
;прерывания
rjmp RESET ;Reset Handle ;относительный безусловный переход
;на метку RESET
reti;INT_0
;reti - возврат из подпрограммы обработки прерывания, выполняет ;возврат в то место, в котором выполнение программы было прервано в результате ;возникновения прерывания
reti;INT_1 External Interrupt1 Vector Address
reti;Timer_2 compare
reti;Timer_2 ovflow
reti;Timer_1 Capture
rjmpTIM1 ;Timer_1 compare A
reti;Timer_1 compare B
reti;Timer_1 ovflow
rjmpTIM0;Timer_0 ovflow
reti;SPI serial tramsfer complete
reti;UART Rx complete
reti;UART Data Register Empty
reti;UART Tx Transmit Complete
rjmp readADC ;ADC conversion complete
reti;EEPROM ready
reti;Analog Comparator Interrupt Vector Address
;====================================================================
;Инициализация индикатора
main:
ldi r31,$ff ;настроить порт В на вывод
out ddrb,r31
out ddrd,r31
;
ldi r25,RAMEND ;установка стека
out spl,r25
;
rcall initlcd ;инициализация ЖКИ
;
ldi r25,1 ;инициализация таймера 0
out TCCR0,r25 ;установка частоты счетных импульсов fсч=fclk
ldi r25,2 ;разрешение прерывания по переполнению Т0
out TIMSK,r25
;
sei ;установка глобального флага разрешения прерываний
initlcd:
ldi r25,$28
rcall icom_2313
rcall del
ldi r25,$0c
rcall icom_2313
rcall del
ldi r25,$28
rcall icom_2313
rcall del
ldi r25,$1
rcall icom_2313
rcall delay
;
;Основной цикл
Loop:
sbic portb,0 ;если бит PB.0 сброшен, то:
rjmp Loop
;
ldi r30,low(ind_buf) ;записать новый результат в буфер ЖКИ
ldi r31,high(ind_buf)
ldi r25,'0'
st z+,r25
st z+,r25
sbis portb,1
rjmp pcc
ldi r25,'1'
cbi portb,1
rjmp pc1
pcc: sbi portb,1
pc1: st z+,r25
;
sbi portb,0 ;установить бит PB.0
rjmp Loop ;все повторить
;
;Инициализация переменных взаимосвязи
;подпрограммы прерывания и основной программы
cbi portb,0 ;Буфер ЖКИ открыт для доступа основной программе
clr enter_counter ;Cброс счетчика входа в подпрограмму прерывания
ret
;
tim0_lcd:
sbis portb,0 ;Если бит PB.0=1, то доступ к буферу ЖКИ разрешен
rjmp indend
;
push r25
push r30
push r31
cpi enter_counter,0 ;если это нулевой вход в пп после открытия доступа
brne tim1 ;к буферу ЖКИ, то:
ldi r25,$80+72 ;установить курсор индикатора на 9-ю позицию 2-й строки
rcall icom_2313
inc enter_counter ;увеличить на 1 счетчик входов
rjmp end0 ;выход из прерывания
;
tim1: cpi enter_counter,1 ;если это первый вход в пп после открытия доступа
brne tim2 ;к буферу ЖКИ, то:
ldi r30,low(ind_buf)
ldi r31,high(ind_buf)
ld r25,z ;вывести на ЖКИ первый символ из буфера
rcall idat_2313
inc enter_counter ;увеличить на 1 счетчик входов
rjmp end0 ;выход из прерывания
tim2: cpi enter_counter,2 ;если это второй вход в пп после открытия доступа
brne tim3 ;к буферу ЖКИ, то:
ldi r30,low(ind_buf+1)
ldi r31,high(ind_buf+1)
ld r25,z ;вывести на ЖКИ второй символ из буфера
rcall inddat
inc enter_counter ;увеличить на 1 счетчик входов
rjmp end0 ;выход из прерывания
tim3: cpi enter_counter, 3 ;если это третий вход в пп после открытия доступа
brne tim4 ;к буферу ЖКИ, то:
ldi r30,low(ind_buf+2)
ldi r31,high(ind_buf+2)
ld r25,z ;вывести на ЖКИ третий символ из буфера
rcall inddat
inc enter_counter ;увеличить на 1 счетчик входов
rjmp end0 ;выход из прерывания
;
tim4: cbi portb,0
clr enter_counter
;
end0: pop r31
pop r30
pop r25
indend:
reti
;======================================================================
out_com: ;посылка байта из temp с ожид. готовности
sbisUSR,UDRE;ждем готовности буфера передатчика
;sbis A,b - проверяет состояние разряда b регистра в/в А, если разряд установлен ;команда следующая за sbis пропускается.
rjmpout_com
outUDR,temp;запись temp в порт UDR
ret
;ret - возврат из подпрограммы, выполняет возврат в то место откуда подпрограмма ;была вызвана.
in_com: ;прием байта в temp с ожид. готовности
sbisUSR,RXC ;ждем готовности буфера приемника
rjmpin_com
intemp,UDR;чтение из порта UDR в temp
ret
Mp16: ;умножение двух 16-разрядных величин
clrtemp2;clear 2 highest bytes of result
clrtemp1
;clr Rd - очистка регистра общего назначения, сбрасывает все разряды РОН путем ;выполнения операции «исключающее ИЛИ» регистра с самим собой.
ldicount,16;init loop counter
;ldi RD,k - загрузка константы в РОН, загружает 8-разрядное число в РОН
m16u_1:
lsrKoeffH
;lsr Rd - логический сдвиг вправо, разряд b7 сбрасывается в «0», а разряд b0 ;загружается в флаг С регистра SREG.
rorKoeffL
;ror RD - сдвиг вправо через перенос.
brccnoad8;if bit 0 of multiplier set
;brcc k -переход, если не было переноса, провряет флаг переноса (С), и выполняет ;переход, если этот разряд сброшен.
addtemp1,AregL;add multiplicand Low to byte 2 of res
adctemp2,AregH;add multiplicand high to byte 3 of res
;adc Rd,Rr - сложение двух РОН с переносом, Rd=Rd+Rr+C
noad8:
rortemp2;shift right result byte 3
rortemp1;rotate right result byte 2
rorResH;rotate result byte 1 and multiplier High
rorResL;rotate result byte 0 and multiplier Low
deccount;decrement loop counter
brnem16u_1;if not done, loop more
;brne k - условный относительный переход по условию «не равно», проверяет флаг нуля (Z), и выполняет переход, если этот разряд сброшен.
ret
TIM1: ;счет времени
cpicSek,60
;cpi Rd,k - сравненеие содержимого РОН с константой, путем вычитания константы ;из содержимого регистра.
breqmcontinue ;если сек не=60, то считаем дальше
;breq k - условный относительный переход по условию «равно», проверяет флаг нуля ;(Z) и выполняет переход, если этот разряд утановлен.
inccSek
reti
mcontinue: ;если сек=60 то их обнуляем и увеличиваем минуты
clrcSek
inccMin
cpicMin,60
brnemm1
clrcMin ;если мин=60, то их обнуляем
mm1:
ldi r28,Mh ;минуты в память - hex
stY,cMin
;st X,Rr - косвенная запись в память данных содержимого Rr.
mov temp,cMin
rcallbin2bcd8 ;преобразование hex-dec
ldi r28,DdM ;минуты в память - dec
stY+,temp1
;st X+,Rr - косвенная запись в память данных с постинкрементом, Х=Х+1.
stY,temp
cpicMin,0 ;минуты=0 - увеличиваем часы
brnemmcontinue
inccHour
cpicHour,24
brnemm2
clrcHour ;если часы=24 - обнуляем
mm2:
ldi r28,Hh ;часы в память - hex
stY,cHour
mov temp,cHour
rcallbin2bcd8 ;преобразование hex-dec
;rcall k - относительный вызов подпрограммы.
ldi r28,DdH ;часы в память - dec
stY+,temp1
stY,temp
mmcontinue:
reti ;TIM1
rADC:inccountCyk ;обработка АЦП
sbrscountCyk,5 ;если бит 5 в countCyk равен 1, то прошло 32 такта
;таймера 0.
;sbrs Rr,b - пропустить команду, если разряд b РОН установлен, команда следующая за sbrs пропускается.
;будем читать АЦП (см. readADC)
reti
clrcountCyk
inccount
cpicount,65 ;если прошло 64 чтения, то сразу на обработку
breq endADC
sbrc Flag,0 ;если бит 0 флага - читаем температуру
;sbrc Rr,b - пропустить следующую команду, если разряд b РОН сброшен.
lditemp,0
sbrc Flag,1 ;если бит 1 флага - читаем давление
lditemp,1
sbrc Flag,2 ;если бит 2 флага - читаем батарею
lditemp,2
outADMUX, temp ;установили АЦП канал
sbiADCSR,ADSC ;запуск нов. преобраз - на всякий
;sbi A,b - устанавливает разряд b регистра в/в, расположенного по адресу А ;пространства в/в.
reti
endADC:
;сначала мигаем
sbrsFlag,3 ;если флаг стоит будем мигать
rjmpcalcA
sbrsFlag,4
rjmpset4
cbrFlag,0b00010000
cbiPortB,5
;cbi A,b - сбрасывает разряд b регистра в/в.
sbi PortC,7 ;будем гореть зеленым
rjmpcalcA
set4:
sbrFlag,0b00010000
cbiPortC,7
sbiPortB,5 ;горим красным
calcA:;расчет по 64 значениям
clrcount
sbrc Flag,0
ldi r28,Tram ;установка адреса - T
sbrc Flag,1
ldi r28,Pram ;установка адреса - P
sbrc Flag,2
ldi r28,Bram ;установка адреса - Bat
ldAregH,Y+ ;загрузка суммы из памяти
ldAregL,Y
div64L: ;деление на 64
lsrAregH ;сдвинули старший
rorAregL;сдвинули младший
inccount
cpi count,6
brnediv64L ;сдвинули-поделили на 64
subir28,1
;subi Rd,k - вычитание константы из регистра.
clr temp
stY+,temp
stY,temp ;очистили память для следующего цикла
bat:
sbrs Flag,2 ;расчет батареи
rjmptempr
cbrFlag,0b00001000 ;гасим мигалку
;cbr Rd,k - сброс разрядов РОН в соответствии с маской, задаваемой константой к.
movtemp,AregH
cpitemp,0
brneContC ;старший 0 - если меньше 1,25 В
cbiPortC,7
sbiPortB,5 ;бат в 0 горим красным
rjmpcontPT
contC:
mov temp,AregL
cpitemp,0xAA ;3,3 В
lditemp,0x02
cpcAregH,temp
;cpc Rd,Rr - сравнение содержимого двух РОН путем вычитания регистра Rr и значения флага переноса (С) из регистра Rd.
brsh contG
;brsh k - условный относительный переход по условию «выше или равно», проверяет ;флаг переноса (С), и выполняет переход, если этот разряд сброшен.
sbrFlag,0b00001000 ;напряжение упало - мигать будем
rjmpcontPT
contG:
cbiPortB,5
sbi PortC,7 ;если норма, будем гореть зеленым
rjmpcontPT
tempr:
sbrs Flag,0 ;расчет температуры
rjmpprs
ldi r28,tZH ;установка адреса
ldtemp,Y+
movKoeffH,temp
ldtemp,Y
movKoeffL,temp ;получили коэфф Z темпер
;вычисление знака:
cpAregL,KoeffL
;cp Rd,Rr - сравнение содержимого РОН путем вычитания, Rd-Rr, содержимое ;регистров не изменяется.
cpcAregH,KoeffH
brsh b0
subKoeffL,AregL
sbcKoeffH,AregH
movAregL,KoeffL
movAregH,KoeffH
sbiPortB,6 ; знак -
rjmpm0
b0: ;если больше
subAregL,KoeffL
sbcAregH,KoeffH
cbiPortB,6 ;знак +
m0: ;умножение на коэфф К
ldi r28,tKH ;установка адреса
ldtemp,Y+
movKoeffH,temp
ldtemp,Y
movKoeffL,temp ;получили K темпер
rcall Mp16 ;умножили
;деление на 1024
mov AregL,ResH
mov AregH,temp1 ;на 256
lsrAregH ;сдвинули старший
rorAregL ;сдвинули младший
lsrAregH ;сдвинули старший
rorAregL ;сдвинули младший; еще на 4
rjmpcontPT
prs:
sbrs Flag,1 ;расчет давления
rjmpcontPT
ldi r28,pZH ;установка адреса
ldtemp,Y+
movKoeffH,temp
ldtemp,Y
movKoeffL,temp ;получили коэфф Z давления
adcAregL,KoeffL
addAregH,KoeffH ;прибавили к величине
ldi r28,pKH ;установка Y
ldtemp,Y+
movKoeffH,temp
ldtemp,Y
movKoeffL,temp ;получили коэфф. K давления
rcall Mp16 ;умножили
;деление на 1024
mov AregL,ResH
mov AregH,temp1 ;на 256
lsrAregH ;сдвинули старший
rorAregL ;сдвинули младший
lsrAregH ;сдвинули старший
rorAregL ;сдвинули младший; еще на 4
contPT:
adiwr28,5;запоминаем в памяти hex результат
;adiw Rd,k - сложение регистровой пары с константой, Rd+1:Rd= Rd+1:Rd+1
stY+,AregH
stY,AregL
sbrc Flag,0
ldi r28,TdH ;установка адреса - T
sbrc Flag,1
ldi r28,PdH ;установка адреса - P
sbrc Flag,2
rjmpeADC ;для батареи и так установлено, если флаг=2
rcall bin2BCD16 ;преобразование в двоично-десятичный
stY+,ResH ;запоминаем в памяти старший BCD
movtemp,ResL ;младший распаковываем
swap temp
;swap Rd - перестановка тетрад РОН
anditemp,0b00001111
stY+,temp
movtemp,ResL
anditemp,0b00001111
stY,temp ;и тоже сохраняем в памяти
eADC:
;установка флагов и переменных для следующего цикла
clrcount
sbrc Flag,0
rjmp_F0
sbrc Flag,1
rjmp_F1
cbr Flag,0x7
sbr Flag,0x1
reti
_F0:
cbr Flag,0x7
sbr Flag,0x2
reti
_F1:
cbr Flag,0x7
sbr Flag,0x4
reti; TIME0
readADC: ;чтение АЦП по прерыванию
sbrc Flag,0
ldi r28,Tram ;установка адреса - T
sbrc Flag,1
ldi r28,Pram ;установка адреса - P
sbrc Flag,2
ldi r28,Bram ;установка адреса - Bat
ldAregH,Y+
ldAregL,Y
in temp1,ADCL;получаем младший
in temp,ADCH ;старший
addAregL,temp1 ;суммируем
adcAregH,temp
dec r28
stY+,AregH ;запоминаем сумму
stY,AregL ;в памяти
reti ;ADC
bin2BCD16: ;преобразование 16-разрядного hex в упакованный BCD
;input: hex value low=AregL hex value high = AregH
;output: BCD value digits 1 and 0 ResL
;BCD value digits 2 and 3(=0) ResH
lditemp1,16;Init loop counter
clrResH
clrResL
clrZH;clear ZH (not needed for AT90Sxx0x)
bBCDx_1:lslAregL;shift input value
rolAregH;through all bytes
;rol Rd - сдвиг влево через перенос, в b0 заносится С, в С - b7.
rolResL
rolResH
dectemp1;decrement loop counter
brnebBCDx_2;if counter not zero
ret;return
bBCDx_2:ldir30,AtBCD2+1;Z points to result MSB + 1
bBCDx_3:
ldtemp,-Z;get (Z) with pre-decrement
subitemp,-$03;add 0x03
sbrctemp,3;if bit 3 not clear
stZ,temp; store back
ldtemp,Z;get (Z)
subitemp,-$30;add 0x30
sbrctemp,7;if bit 7 not clear
stZ,temp;store back
cpiZL,AtBCD0;done all three?
brnebBCDx_3;loop again if not
rjmpbBCDx_1
bin2bcd8: ;преобразование 8-разрядного hex в неупакованный ;BCD
;вход hex= temp, выход BCD temp1-старш; temp - младш
; эта процедура работает только для исходного меньше 100
clrtemp1;clear result MSD
bBCD8_1:
subitemp,10;input = input - 10
brcsbBCD8_2;abort if carry set
inctemp1;inc MSD
rjmpbBCD8_1;loop again
bBCD8_2:
subitemp,-10;compensate extra subtraction
ret
RESET: ;точка запуска программы после вкл
cli ;запрещаем прерывания
ldi temp,low(RAMEND) ;загрузка указателя стека
outSPL,temp
ldi temp,high(RAMEND) ;загрузка указателя стека
outSPH,temp
lditemp,1<<ACD
outACSR,temp ;выкл. аналог. компаратор на всякий
;установка UART
lditemp,26 ;9600
outUBRR,temp;скор. передачи
ldi temp,(1<<RXEN|1<<TXEN|1<<RXB8|1<<TXB8)
outUCR,temp ;разреш. приема/передачи 8бит
;установка портов вход-выход
lditemp,0b01111000 ;разр часов
outDDRA,temp
ldi temp,0b00111100 ;разр давл
outDDRD,temp
lditemp,0xFF ;PortPB6- выход для мигалки batt - зеленый, ост- ;сегменты
Подобные документы
Создание программного модуля, выполненного на языке программирования VBA (Visual Basic for Applications) и позволяющего во введенном массиве символов удалить все повторные вхождения этих символов. Разработка пользовательского интерфейса. Код программы.
курсовая работа [317,4 K], добавлен 11.10.2012Проектирование устройства контроля температуры в холодильных установках. Устройство измеряет температуру с помощью схемы измерения температуры. Значение температуры представлены в 8-битном формате. Создание компьютерной программы для устройства.
курсовая работа [29,5 K], добавлен 22.02.2008Ввод и вывод чисел при помощи подключаемого модуля IO. Особенности работы с одномерными и двухмерными массивами. Тестирование состояние флагов. Рринципы и навыки работы с компилятором и отладчиком. Разработка схемы алгоритма программы на языке ассемблер.
курсовая работа [1,3 M], добавлен 02.12.2009Проектирование устройства, выполняющего функцию определения минимального давления на основе информации о показаниях полученных от 7 датчиков. Разработка набора команд управления микроконтроллером в среде программного обеспечения Code Vision AVR.
курсовая работа [24,5 K], добавлен 28.06.2011Расчет статического модуля оперативной памяти и накопителя. Построение принципиальной схемы и временной диаграммы модуля оперативного запоминающего устройства. Проектирование арифметико-логического устройства для деления чисел с фиксированной точкой.
курсовая работа [3,2 M], добавлен 13.06.2015Задача и цели практики: модернизация сайта, разработка базы данных, отображающей время прихода и ухода сотрудников. Разработка формы представления данных на экране. Формирование данных, пригодных для вывода. Реализация технологии всплывающих подсказок.
отчет по практике [1,3 M], добавлен 16.09.2012Разработка принципиальной электрической схемы микропроцессорного устройства управления двигателем постоянного тока на базе контроллера ATmega 128. Разработка пакета подпрограмм на языке Assembler в целях регулирования и корректной работы устройства.
курсовая работа [271,5 K], добавлен 14.01.2011Изучение команд для обработки строк, приемов, используемых в работе со строками, приемы их использования. Команды префикса повторения. Приемы программирования на языке Ассемблера с использованием подпрограмм, работа с командами вызова подпрограмм.
методичка [121,0 K], добавлен 18.12.2011Изучение языка низкого уровня ассемблер для написания примера программы для 16 битного приложения. Разработка и реализация алгоритма поднесения чисел к степени чисел над полем за основанием 2 (mod 2). Иллюстрация техники создания DOS приложения.
курсовая работа [33,3 K], добавлен 08.11.2011Изучение некоторых аспектов языка Ассемблера и ЭВМ в целом. Построение алгоритмов решения поставленной задачи на языках программирования Си, Ассемблер УМ и IBM PC. Составление блок-схем решений и написание программ на каждом из перечисленных языков.
курсовая работа [691,5 K], добавлен 20.10.2014