Устройство измерения температуры окружающей среды, напряжения на выходах потенциометра, управление звуковым излучателем и часы

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информатика, ВТ, телекоммуникации
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    1,76 Мб
  • Опубликовано:
    2012-04-24
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Устройство измерения температуры окружающей среды, напряжения на выходах потенциометра, управление звуковым излучателем и часы

РЕФЕРАТ


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

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

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

МИКРОКОНТРОЛЛЕР, ТЕРМОДАТЧИК, MPLAB IDE, LCD-ДИСПЛЕЙ.

Введение

Первое, что привлекает внимание в PIC-контроллерах - это простота и эффективность. В основу концепции PIC, единую для всех выпускаемых семейств, была положена RISC-архитектура с системой простых однословных команд, применение встроенной памяти программ и данных и малое энергопотребление [2]. Микроконтроллеры PIC имеют симметричную систему команд, позволяющую выполнять операции с любым регистром, используя любой метод адресации. В настоящее время MICROCHIP выпускает четыре основных семейства 8-разрядных RISC-микроконтроллеров [6]:

-    базовое семейство PIC15Cx с 12-разрядными командами, простые недорогие микроконтроллеры с минимальной периферией;

-       PIC12Cxxx с 12-разрядными командами со встроенным тактовым генератором, выпускаемые в миниатюрном 8-выводном исполнении.

-       Mid-range PIC16x/7x/8x/9x с 14-разрядными командами. Наиболее многочисленное семейство, объединяющее микроконтроллеры с разнообразными периферийными устройствами, в число которых входят аналоговые компараторы, аналогово-цифровые преобразователи, контроллеры последовательных интерфейсов SPI, USART и I2C, таймеры-счётчики и так далее;

-       High-end PIC17C4x/5xx высокопроизводительные микроконтроллеры с расширенной системой команд 16-разрядного формата, работающие на частоте до 33 МГц, с объёмом памяти программ до 16 Кслов. Кроме обширной периферии почти все микроконтроллеры этого семейства имеют встроенный аппаратный умножитель 8х8, выполняющий операцию умножения за один машинный цикл.

Особый акцент Microсhip делает на максимально возможное снижение энергопотребления для выпускаемых микроконтроллеров. При работе на частоте 4 МГц PIC-контроллеры, в зависимости от модели, имеют ток потребления меньше 1,5 мА, а при работе на частоте 32,768 КГц - ниже 15 мкА. Поддерживается “спящий” режим работы. Диапазон питающих напряжений PIC-контроллеров составляет 2,0...6,0 В.

В настоящее время готовится к запуску в производство новое пятое семейство PIC-контроллеров PIC18Cxxx. Новые микроконтроллеры будут иметь расширенное RISC-ядро, оптимизированное под использование нового Си-компилятора, адресное пространство программ до 2 Мбайт, до 4 Кбайт встроенной памяти данных и производительность 10 MIPS.

Из программных средств отладки наиболее известны и доступны различные версии ассемблеров, а также интегрированная программная среда MPLAB. Для проектирования устройства был выбран микроконтроллер серии PIC18 так, как на его основе реализована демонстрационная плата PICDEM 2 PLUS.

В данной лабораторной работе было запрограммировано устройство измерения температуры на основе термодатчика TC74, настройка и снятие значений с него осуществлялась при помощи модуля SSP.

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

Была реализована работа с Piezo Buzzerом при помощи CCP в режиме широтно-импульсной модуляции, что позволило Piezo Buzzer излучать звуки различной частоты и длительности.

Также на основе тактового генератора были запрограммированы часы реального времени с использованием внешних синхросигналов от кварцевого генератора. В каждой реализованной подпрограмме осуществляется вывод на LCD текущих значений как, то напряжение, температура, текущая длительность и период сигнала, а также времени в формате чч:мм: сс.

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

1. Техническое задание

Техническое задание (ТЗ) на проектирование должно содержать исчерпывающую и однозначную информацию о требованиях, предъявляемых к проекту. Техническое задание обычно объемный документ, в котором на естественном языке описана, по сути, словесная модель проектируемой системы. Несмотря на строгость и точность формулировок ТЗ не дает однозначного описания объекта проектирования и не позволяет непосредственно переходить от описания функционирования системы к ее техническому воплощению [1].

1.1     Назначение устройства

Необходимо реализовать на микроконтроллере PIC18F4520 устройство, выполняющее периодически измерение напряжение с помощью 5 кОм потенциометра, управление динамиком, измерение температуры окружающей среды и организация часов реального времени на основе счётчика. Эти данные необходимо отображать на экране. Переключение между режимами должно осуществляться с помощью меню. Все данные передавать на внешние устройства для дальнейшей обработки через порт RS-232, например для отображения на ПК при помощи Hyper Terminal.

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

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

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

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

В соответствии со спецификацией устройства PICDEM 2 PLUS в нём реализованы последующие соответствия портов и входов/выходов устройств (табл. 1.1)[11]. Данная таблица наилучшим образом показывает назначение входов/выходов микроконтроллера.

Таблица 1.1 - Соответствие портов и входов/выходов устройств

Устройство ввода/вывода

Порты

LEDs (D2-D5)

RB3:RB0

USART

RC6:RC7

Master Reset (S1)

MCLR

User-defined (S2)

RA4

User-defined (S3)

RB0

Potentiometer (R16)

RA0

LCD1

RA3:RA1 and RD3:RD0

EEPROM (Ux)

RC3/RC4

Buzzer (P1)

RC2

ICD Connector (J5)

RB6:RB7

Temperature sensor (Ux)

RC3:RC4

Crystal oscillator (Y1)

OSC1 and OSC2

External oscillator (Y2)

OSC1


1.2     Требования к реализации

Сроки проектирования определяются сроками выполнения курсового проекта, включая разработку документации. Проект считается законченным, если проведено программирование микроконтроллера и результат соответствует техническому заданию. Основные требования к проектированию: использование свободно распространяемых микроконтроллеров PIC18F4520, описание моделей с помощью языка программирования ассемблер, использование тестового подхода к проверке исправности модели устройства. Способ проверки - физическое тестирование основных этапов программы [5].

2. Техническое предложение

Техническое предложение является частью предварительного проектирования. При этом:

1)      принимается решение об использовании микроконтроллера фирмы Microchip, серии PIC18, как, во-первых, отвечающего современным требованиям к элементной базе; во-вторых, имеющегося в наличии на момент разработки проекта;

2)      оптимизация алгоритма программы для устройства будет проводиться на этапе программирования микроконтроллера.

2.1   Элементная база

Демонстрационная плата PICDEM 2 Plus содержит следующие физические компоненты [6] (рис. 2.1).

1.     18, 28, 40-pin DIP разъем.

2.       Встроенный +5V регулятор.

.        Разъем RS-232 и дополнительное оборудование, предназначенное для прямого подключения к разъему RS-232.

.        Разъем для подключения ICD-отладчика.

.        Вход для аналоговых устройств.

.        Три кнопки для внешних воздействий и сброс.

.        Зеленый индикатор включения LED.

.        Четыре зелёных LED, подключенных к PORTB.

.        Переключатель J6 для отключения LED от PORTB.

.        Кварцевый генератор с частотой 4 МГц.

.        Разъемы, предназначенные для подключения генератора.

.        Генератор с частотой 32,768 КГц для использованием Timer1.

.        Переключатель J7 для отключения встроенного RC генератора.

.        32К х 8 серийный EEPROM.

.        LCD дисплей.

16.     Piezo buzzer.

.        Пространство для подключения дополнительного оборудования.

.        Термодатчик TC74.

Для реализации данного проекта был выбран микроконтроллер PIC18F4520.

PIC18F4520 - это высокоскоростной RISC микроконтроллер соответствую требования, предъявляемым к элементной базе [8].

1.     Оптимизированная архитектура и система команд для написания программ на языке С.

2.       Тактовая частота 4 МГц.

.        Линейное адресное пространство памяти программ 32 кбайт, 16384 команд.

.        Линейное адресное пространство памяти данных 1536 байт.

.        Память EEPROM (память данных) 256 байт.

.        Быстродействие до 10MIPS.

.        16-разрядные команды, 8-разрядные данные.

.        Система приоритетов прерывания, 17 возможных источников прерывания.

.        75 команд микроконтроллера.

.        Пять портов ввода/вывода (PORT A, B, C, D, E).

.        Аппаратное умножение 8х8 за один машинный цикл.

.        Возможность самопрограммирования.

.        Сброс по включению питания (POR), таймер включения питания (PWRT), таймер запуска генератора (OST).

.        Поддержка последовательного интерфейса адресуемого синхронно-асинхронного приемопередатчика (USART).

.        Наличие встроенного термодатчика.

.        4 модуля счетчика/таймера TMR0, TMR1, TMR2, TMR3 разрядности 8 и 16 бит.

.        Вторичный генератор синхросигнала на основе TMR1/ TMR3.

.        Программируемая защита кода программы.

.        Внутрисхемная отладка по двухпроводной линии (ICD).

.        100 000 циклов стирания/запись памяти программ.

.        Широкий диапазон напряжений питания (от 2,0 В до 5,5 В).

.        Наличие 5кОм потенциометра

.        Наличие Piezo buzzer

Рисунок 2.1 - PICDEM 2 PLUS Demo Board

2.2   Алгоритм и варианты реализации

Для программирования микроконтроллера PIC18F4520 можно использовать языки программирования С и ассемблер.

Для реализации устройство измерения температуры окружающей среды выбран язык программирования ассемблер [7,8,9].

Алгоритм работы данного устройства представлен на рисунке 2.2.

Рисунок 2.2 - Алгоритм устройства

3       
Эскизный проект

Эскизный проект - этап составления спецификаций отдельных блоков, разработка подробной функционально-блочной схемы устройства [5,6].

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

Блок инициализации выполняет функции инициализации LCD, USART универсальный синхронно-асинхронный приёмо-передатчик, CCP - модуля широтно-импульсной модуляции, таймера и кнопок управления, после чего возвращает управление в main.

Блок основного меню выполняется сразу после блока инициализации и выполняется в бесконечном цикле, что позволяет неоднократно переходить от одного реализованного устройства к другому. Блок основного меню позволяет перейти к блокам реализации вольтметра (рис 3.1), звуко-излучателя (рис 3.2), термометра (рис 3.3) и часов (рис 3.4). Каждый из блоков реализации по команде оператора возвращает управление блоку основного меню.

Рисунок 3.1 - Вывод на LCD блока основного меню, точка входа в блок реализации вольтметра

Рисунок 3.2 - Вывод на LCD блока основного меню, точка входа в блок реализации звуко-излучателя

Рисунок 3.3 - Вывод на LCD блока основного меню, точка входа в блок реализации термометра

Рисунок 3.4 - Вывод на LCD блока основного меню, точка входа в блок реализации часов

Блок реализации вольтметра осуществляет взаимодействие USART , универсального синхронно-асинхронный приёмо-передатчика, и термодатчика TC74. Выводит считанную с термодатчика информацию на LCD(рис 3.5).

Рисунок 3.5 - Вывод на LCD блока реализации вольтметра

Блок реализации звуко-излучателя позволяет излучать звуки с различной частотой и длительностью импульсов при помощи широтно-импульсного модулятора. Текущие значения, длительности импульсов и частоты их возникновения, которые пользователь может менять непосредственно во время выполнения данного блока, выводятся на LCD (рис. 3.6).

Рисунок 3.6 - Вывод на LCD блока реализации звуко-излучателя

Блок реализации термометра осуществляет взаимодействия модуля SSP, синхронного последовательного порта, и термодатчика TC 74. Текущее значение температуры полученное в результате работы блока выводится на LCD (рис. 3.7).

Рисунок 3.7 - Вывод на LCD блока реализации термометра

Блок реализации часов отображает текущее время на LCD (рис. 3.7) и позволяет вызвать блок установки текущего времени. В момент вызова блока часов из основного меню текущее время устанавливается в ноль. При возвращении из блока установки часов блок реализации часов продолжает увеличивать время, которое выставили.

Рисунок 3.8 - Вывод на LCD блока реализации часов

Блок установки часов позволяет установить текущее значение минут (рис. 3.9), часов (рис. 3.10) и вернуться в блок реализации часов (рис. 3.11).

Рисунок 3.9 - Вывод на LCD блока установки часов, установка текущего значения минут

Рисунок 3.10 - Вывод на LCD блока установки часов, установка текущего значения часов

Рисунок 3.11 - Вывод на LCD блока установки часов, предложение оператору вернуться в блок реализации часов

Рассмотрим схему взаимодействия отдельных блоков устройства (рис. 3.12).

Рисунок 3.12 - Структурная схема микроконтроллера PIC18F4520

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

3.1.1  Интерфейс I2C

I2C - это двухпроводной последовательный интерфейс, разработанный компанией Philips. К данной шине могут быть подключены устройства с различными скоростями доступа, если скорость передачи данных будет удовлетворять требованиям самого низкоскоростного устройства.

Протокол передачи данных по шине I2C разработан таким образом, чтобы гарантировать надежный качественный прием/передачу данных. При передаче данных одно устройство является «Ведущим», которое инициирует передачу данных и формирует сигналы синхронизации. Другое устройство «Ведомое», которое может начать передачу данных только по команде ведущего шины.

Модуль MSSP аппаратно поддерживает режим ведущего/ведомого I2C, адрес общего вызова и скорость обмена данными до 1 Мбит/с. Каждое устройство на шине I2C имеет уникальный адрес. Когда ведущий инициирует передачу данных, то сначала передается адрес устройства, к которому выполняется обращение. Остальные устройства проверяют адрес, переданный ведущим.

В состав байта адреса входит бит направления передачи данных (выполняется чтение из ведомого или запись) [10].

3.1.2  Аналого-цифровой преобразователь

Модуль аналого-цифрового преобразования (АЦП) имеет до восьми входных сигналов. Входной аналоговый сигнал через коммутатор каналов заряжает внутренний конденсатор АЦП Сhold.

Модуль АЦП преобразует напряжение, удерживаемое на конденсаторе Сhold, в соответствующий 8-разрядный цифровой код методом последовательного приближения. Источник опорного напряжения может быть программно выбран с вывода VDD или VREF. Допускается работа АЦП в SLEEP режиме микроконтроллера, при этом в качестве источника должен быть выбран RC генератор.

Для управления АЦП используется 3 регистра:

-   регистр результата ADRES;

-       регистр управления ADCON0;

-       регистр управления ADCON1;

-       регистр управления ADCON2.

регистр ADCON0 используются для настройки работы модуля АЦП, а с помощью регистра ADCON1 устанавливается, какие входы микроконтроллера будут использоваться модулем АЦП и в каком режиме (аналоговый вход или цифровой порт ввода/вывода) [10].

3.1.3  LCD - экран

Модуль LCD формирует все необходимые сигналы синхронизации для управления статическими ЖКИ с поддержкой до 32 сегмента, 4 общих выводов и управление пикселями ЖКИ.

Для управления модулем LCD используется три регистра (LCDCON, LCDSE и LCDPS), с помощью которых можно настроить параметры рабочего модуля, и до 16 регистров данных, в которых сохраняется массив данных пикселей.

Источником тактового сигнала для модуля LCD в режиме SLEEP или при низкой тактовой частоте микроконтроллера является внутренний RC генератор с номинальной частотой 14кГц [10].

3.1.4  Порты ввода/вывода

Все пины микроконтроллера сгруппированы. Эти группы пинов и называются портами ввода/вывода. В микроконтроллерах PIC принято, что порты перечисляются с помощью букв латинского алфавита. Например: PORTA, PORTB…, PORTE. В порт может быть сгруппировано различное количество пинов. Их количество в портах зависит от типа микроконтроллера. Также, большая часть пинов микроконтроллеров имеет альтернативные функции (стандартным считается, что пин используется либо, как дискретный вход, либо, как дискретный выход). Порты микроконтроллеров серии PIC18 управляются с использованием 3-х регистров: PORTx, TRISx, LATx. Где x - буква порта ввода/вывода. Регистр PORTx используется обычно для чтения входных дискретных сигналов. Чтобы записать бит в порт, сначала микроконтроллер читает весь порт, потом в прочитанном значении модифицирует бит, а потом обратно, весь порт записывает. Данный механизм может сыграть «плохую шутку». Если у Вас на каком - либо из битов порта висит большая токопотребляющая нагрузка, то есть вероятность прочитать ноль по этому биту, хотя Вы записали ранее на выход бита единицу. Тем самым после модификации, обратно может записаться в тот бит ноль. А в программе Вы будете считать, что на выходе у Вас единица. Чтобы избежать этого, добавлен регистр LATx. Запись в него не вызывает чтение физических уровней порта. Т.е. чтобы изменить значения на выводах порта, необходимо использовать регистр LATx. Регистр TRISx задает направление пинов порта. Если бит этого регистра установлен в единицу, то данный пин будет сконфигурирован, как вход. Если ноль - как выход.

3.1.5  Адресуемый универсальный синхронно-асинхронный приёмопередатчик (USART)

USART - это один из модулей последовательного порта ввода/вывода, который может работать в полнодуплексном режиме для связи с микросхемами ЦАП, АЦП, последовательными EEPROM и т.д.

USART может работать в одном из трёх режимов:

         Асинхронный, полный дуплекс;

         Ведомый синхронный, полудуплекс;

         Ведущий синхронный, полудуплекс.

Для работы модуля USART предусмотрено два регистра:

         TXSTA - регистр управления и статуса передатчика USART;

         RCSTA - регистр управления и статуса приёмник USART.

Регистр SPBRG влияет на скорость обмена в бодах.

4   
Технический проект

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

Выполняются следующие работы:

-    составление и описание блоков на языке программирования;

-       определяются межблоковые связи;

-       описание констант и переменных;

-       отладка проекта (пошаговое тестирование основных блоков программы в процессе написания и исправление некорректной работы);

Далее подробно описаны все вышеперечисленные этапы [3].

4.1 Построение проекта

Осуществив, все выше изложенные этапы проектирования и проанализировав эскизный проект, мы переходим к следующей стадии проектирования - технический проект, а именно к описанию проекта для ввода в микроконтроллер PIC18F4520.

При описании моделей на языках программирования большое внимание следует уделять конструкциям языка [4]. Так нужно использовать конструкции, которые воспринимаются программой программирования микроконтроллера, а также оптимизировать конструкции для достижения наименьших аппаратных затрат. Данный процесс очень трудоемкий и требует совершенного знания языка и программы проводящей программирования микроконтроллера.

Рисунок 4.1 - Связи файлов в проекте

4.2   Описание интерфейса

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

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

Начальные значения выбираются в соответствие с описанием устройства. Тип параметров - char целочисленный тип. При этом по умолчанию используется модификатор типа unsigned, который указывает, что переменная принимает неотрицательные значения.

При этом самый левый бит области памяти, выделяемой для хранения значения, используется так же, как и все остальные биты области памяти - для представления значения [7].

Таблица 4.1 Описание интерфейса всей программы

Входы

Начальные значения

Тип

Описание

ptr_pos

-

unsigned char

Переменная для указания строки из массива стандартных строк

cmd_byte

0x01

unsigned int

Переменная для организации взаимодействия SSP и TC74

temperature

-

unsigned int

Переменная для хранения значения текущей температуры

seconds, minutes, hours

-

unsigned int

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


4.3 Основные конструкции и процедуры, используемые для написания программы

При разработке проекта необходимо подключить заголовочные файлы:

1. #include <p18f4520.h> - стандартный заголовочный файл с объявлением специальных регистров и битов микроконтроллера PIC18F4520;

2. #include <delay.h> - позволяет организовать задержки;

3. #include <stdlib.h> - позволяет использовать функции преобразующие целочисленные значения в символы, которые можно вывести на LCD;

. p18lcd.asm - набор стандартных функций для работы с LCD.

Примеры наиболее значащих для проекта функций приведены в таблице 4.2.

Таблица 4.2 Описание основных функций программы.

Имя функции

Описание

main

Точка входа в программу

start

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

d_write

Производит автоматический вывод на экран содержимого глобальной переменной temp_wr

LCDInit

Выполняет настройку и разрешает доступ к LCD

LCDLine_1, LCDLine_2

Выполняет переход виртуального курсора на первую (вторую) строку экрана

stan_char_1, stan_char_2

Отображают на экране последовательность символов в зависимости от значения ptr_pos на соответственно 1ю и 2ю строках LCD

itoa

Преобразовывает целочисленные значения в символы, которые можно вывести на LCD


Разберем подробней наиболее важные функции.

void stan_char_1(void);stan_char_2(void);

 (). Функция выполняет настройку необходимых для нормальной работы устройства модулей микроконтроллера. К таковым можно отнести модуль LCD-экрана,MSSP,USART и CCP.

Функция LCDInit() описана в файле p18LCD.ASM.

void start (void)

{();=0b10100100; //initialize USART=25;=0b10010000;

.TRISC2=0; // initialize CCP=0x80;L=0x80;CONbits.CCP1X=0;CONbits.CCP1Y=0;CON=0x05;

//initialize timer2.TRISA4=1; //knopki S1 I S2 aktivni.TRISB0=1;

}

itoa(). Функция преобразует, полученную в качестве параметра переменную типа int в переменную типа *char и помещает её в массив char который обрабатывается в зависимости от входного значения int. Это стандартная функция, для обращения к ней подключаем библиотеку stdlib.h.

menu(). Функция организует в бесконечном цикле вывод на LCD меню, которое позволяет выбрать подпрограммы реализующие вольтметр, звуко-излучатель, термометр и часы.

void menu(void)

{_count=16;_pos=5;_char_1();_pos=6;_char_2();KTCYx(900);(scroll==0){};(select==0){};

//------------------ VOLT MEASUREMENT ----------------------------(1){_pos=0;_char_1();_pos=4;_char_2();(scroll==1) {if (select==0) {voltmeter();break;}} ;(select==0){};while (scroll==0){};

……….

};}

(). Функция реализует работу вольтметра измеряющего напряжение на контактах потенциометра. Задавая необходимые значения регистрам управления модуля USART, получает значения с выхода АЦП в цифровом представлении. Преобразует числовое значение температуры в строку выводим на LCD. Повторяется в цикле пока не нажата S3.

void voltmeter(void)

{

….

bits.ADON=1;=0b00001110;=0x01;

_pos=10;_char_1();

{bits.GO=1;(ADCON0bits.GO==0){};=ADRESH;*=2;(temph,tempv_char);(temph<10) {temph_char[0]=zero[0]; temph_char[2]=zero[0]; temph_char[3]=tempv_char[0];}

….._2();(i=0;i<ptr_count;i++)

{_char=temph_char[i];_wr=temp_char;_write();

} //for i

}while(select==1);

}

buzzer().Функция реализует работу звуко-излучателя с помощью модуля широтно-импульсной модуляции. Нажатие S2 приводит к увеличению длительности импульса, соответственно значение хранится в CCPR1L. Нажатие S3 приводит к увеличению периода возникновения импульсов, соответственно значение хранится в PR2. Повторяется в цикле пока одновременно не нажаты S2 и S3.

void buzzer(void)

{

….=0x80;L=0x80;

….CON=0x0f; //включение(1){=0;(select==0)

{+=1;=5;=PR2;(scroll==0) goto end;

} //if select(scroll==0)

{//inc dcL+=1;=CCPR1L;=12;(select==0) goto end;

}(n!=0) {(temph,tempv_char);(temph<10)            {tempb_char[n]=zero[0]; tempb_char[n+1]=zero[0]; tempb_char[n+2]=tempv_char[0];}

…._1();(i=0;i<ptr_count;i++)

{…._write();

} //for i

} //if n!=0

};//while: CCP1CON=0; //выключение}

(). Функция реализует работу термометра с помощью модуля SSP и термодатчика TC74. Сперва инициализируем MSSP после чего вносим последовательность изменений в управляющие регистры модуля SSP, ч то в свою очередь поток команд от MSSP к TC74 и обратно. В результате мы получаем текущее значение температуры, которое и выводим на LCD. Функция выполняется пока не нажата S3.

void temp (void)

{….

TRISCbits.TRISC3=1; //initialize MSSP module

TRISCbits.TRISC4=1;

SSPCON1=0b00101000;

SSPSTATbits.SMP=1;

SSPADD=0x05;{_temp: cmd_byte=0x01; //config register command byte_now:         SSPSTATbits.CKE=1; //SMBUS spec for TC74bits.SEN=1;  //write to TC74(SSPCON2bits.SEN==1){};=0b10011010;  //send TC74 ADDRESS (write)();(SSPCON2bits.ACKSTAT==1) {};        //ack?=cmd_byte;=WREG;      //send COMMAND byte (config)();(SSPCON2bits.ACKSTAT==1) {};      //ack?bits.RSEN=1;         //send repeated start(SSPCON2bits.RSEN==1) {};=0b10011011;     //send TC74 ADDRESS (read)();

//module idle?(SSPCON2bits.ACKSTAT==1) {};         //ack?bits.RCEN=1;       //enable receive mode(SSPCON2bits.RCEN==1) {};=SSPBUF; //retrieve config reg or temp regbits.ACKDT=1;

//send NOT-ACKbits.ACKEN=1;(SSPCON2bits.ACKEN==1){};bits.PEN=1; //stop(SSPCON2bits.PEN==1){};=WREG;(cmd_byte==1) { //config command OR temp command=tempw;

_asm 0x40   //is temp ready ?? 0x40

_endasm(STATUSbits.Z==0) {goto get_temp;}_byte=0x00;temp_now;

}

=tempw;(temperature,tempv_char);_char[6]=tempv_char[0];         tempt_char[7]=tempv_char[1];_1();(i=0;i<ptr_count;i++)

{….._write();

} //for i_2();_pos=9;_char_2();

}while(select==1);

}

clock(). Функция реализующая работу часов с помощью таймера TMR1. Инициализируем TMR1 в режим синхронизации с внешнем генератором тактового сигнала. После генерации периферийного прерывания инкрементируется численное значение секунд. После чего текущее время выводится на LCD. Из функции происходит вызов двух подфункций:

         clock_draw() - это функция, которая выводит на экран текущее значение времени;

         clock_set() - это функция, которая позволяет установить текущее время.

void clock (void)

{…CON=0x0F;=0;minutes=0;hours=0;{bits.TMR1IF=0;H=0x68;L=0x00;++;(seconds-60==0) {minutes++;seconds=0;  }(minutes-60==0){hours++;minutes=0;}(hours-13==0){         hours=0;}(scroll==0) clock_set();_draw();_2();_pos=7;_char_2();(PIR1bits.TMR1IF==0){if (scroll==0) clock_set();};

} while (select==1);

}

5       
Рабочий проект

Рабочий проект включает в себя программирование устройства и физическое тестирование.

5.1   Реализация и программирование

Разработка программного кода, его компиляция и процесс отладки проекта был выполнен в программном продукте компании Microchip, MPLAB IDE. Эта среда разработки предоставляет единую среду для разработки кода, отладки и прошивки для всех типов микроконтроллеров фирмы Microchip. Она позволяет использовать в одном проекте как код, написанный на языке низко уровня (ассемблер), так и код, написанный на языке высокого уровня (С). Это позволяет разработчику добиться желаемого соотношения между скорость работы программы и легкость ее разработки [9,12].

При запуске Mplab появиться 2 внутренних окна: Untitled Workspace и Output. В окне Workspace отображаются все файлы, прикрепленные в проект. А в окне Output выводится вся выходная информация Mplab: ошибки, результаты компиляции, результаты программирования микроконтроллера, результаты поиска в проекте и т.п. Для удобства, располагаем их в таком виде:

Рисунок 5.1 - Интерфейс главного окна среды Mplab

Для создания проекта воспользуемся мастером Project > Project Wizard. Переходим по кнопке «Далее». Появляется окно, в котором мы выбираем из выпадающего списка нужный нам микроконтроллер, в нашем случае: PIC18F4520. Снова нажимаем кнопку «Далее». Следующим, появится окно, в котором мы выбираем язык программирования, на котором будем писать программу к нашему микроконтроллеру. Окно выглядит следующим образом:

Рисунок 5.2 - Интерфейс окна помощника создания проекта

В поле «Active Toolsuite» выбирается язык программирования, на рисунке выбран язык си для микроконтроллеров PIC - Microchip C18 Toolsuit. В поле «Toolsuite Contents» показаны исполняемые модули, которые принимают участие в компиляции программы с выбранного языка. В поле «Location» указывается полный путь к выделенному исполняемому модулю. Если путь будет неверен (перед исполняемым модулем будет стоять крестик), то его нужно прописать вручную, с использованием кнопки «Browse».

Обычно, для ассемблера микроконтроллеров серии PIC18, это путь: С:\Program Files\Microchip\MPASM Suite\. Для сборщика проекта: C:\mcc18\bin\mplink.exe, для подключения библиотек: C:\mcc18\bin\mplib.exe. Так как для создания проекта выбран язык СИ, то используем, специальный компилятор MCC18, который устанавливается отдельно от среды: C:\mcc18\bin\mcc18.exe. После того, как все исполняемые модули задействованы, нажимаем кнопку «Далее».

Мы перейдем на окно, где задается имя проекта и путь к нему. Вводим любое имя (нельзя использовать русские буквы) и выбираем путь к этому проекту.

В итоге, появится окно, в котором Wizard выдаст конечную информацию о настройках и параметрах создаваемого проекта: тип микроконтроллера; путь, по которому будет лежать проект и основной язык компилятора, на котором будет писаться программа в этом проекте. Нажимаем кнопку «Готово».

В окне Workspace стал отображаться наш проект (появилось дерево файлов проекта). Если у Вас пропало окно Output, то его нужно включить через пункт меню: View > Output. А в папке появились файлы проекта *.mcw и *.mcp

Для создания файла с кодом программы запускаем пункт меню: File > New (Ctrl+N).

У нас появится новое окно в проекте - MPLAB IDE Editor.

Теперь сохраняем полученный файл.

Переходим по пункту меню: File > Save.

Появляется стандартное окно сохранения файла. Выбираем папку, пишем имя и расширение. Теперь, добавляем созданный файл в проект. Для этого, в окне проекта Workspace (теперь это окно будет называться *.mcw), находим в дереве файлов папку Source Files (файлы с исходной программой). Кликаем правой кнопкой мыши на этой папке и выбираем пункт Add Files… .Появится окно, в котором мы выбираем нашу папку и наш файл. Выбираем этот файл и нажимаем кнопку «Открыть». Мы увидим, что наш файл появился в дереве файлов проекта. Теперь сохраняем проект.

Компилируем полученную программу [12]. Переходим на пункт меню Project > Build All(Ctrl+F10). Что проект скомпилировался без ошибок, говорит окно Output. В нем будет вот такая запись: BUILD SUCCEEDED. И в нашей папке появится загрузочный файл *.hex, который зашивается в микроконтроллер программатором. Если в процессе компиляции возникли ошибки, то в этом окне они все отобразятся.

И будет вот такая запись: BUILD FAILED. Двойной клик мышкой на записи об ошибке в окне Output, автоматически указывает на строку в программе, где находится данная ошибка. После того как код был успешно скомпилирован, необходимо выполнить прошивку устройства. Для этого необходимо выбрать тип программатора. Мы использовали программатор Microchip MPLAB ICD 2.

Рисунок 5.3 - Дебаггер MPLAB-ICD2 и демо-плата PICDEM 2 Plus

Для этого, чтобы указать этот тип программатора необходимо выбрать пункт меню Programmer -> Select Programmer -> MPLAB ICD 2. После это в окне программы MPLAB ICD 2 будет отображен ход подключения программатора. Если программатор подключен к компьютеру (для коммуникации используется интерфейс USB), включено питание на плате и выбраны правильные настройки, то появиться сообщение об успешном подключении программатора.

После этого станут активными кнопки управления программатором (Запрограммировать устройство, Проверить состояние устройства и другие). Теперь необходимо нажать кнопку «Запрограммировать устройство». Если код не содержит ошибок, то появиться сообщение об успешной прошивке устройства. Нажав кнопку «Снять со сброса», мы начинаем непосредственное выполнение программы на реальном устройстве.

5.2  
Физическое тестирование

После выполнения всех вышеописанных действий, необходимо проверить соответствие полученного результата поставленной задаче[1,2].

В первую очередь проверим работоспособность алгоритмы работы с АЦП и LCD дисплеем. На экране периодически отображаются данные, считанные с АЦП:

Рисунок 5.4 - Результаты работы устройства

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

Для проверки работоспособности вольтметра проведем эксперимент: сравним его показатели с другим устройством, предназначенным для измерения напряжения. Тест показал соответствие напряжения, показанной тестером и данными с АЦП микроконтроллера. Также проверим работоспособность АЦП и потенциометра изменив положение потенциометра, последствия наших действий сразу отображаются на LCD.

Граничные значения от 0В до 5В.

Для проверки звуко-излучателя достаточно запустить его из меню, сразу излучается звук. Если нажимать кнопки управления то звук меняет тональность. Аппарат работает адекватно т.к. в момент когда длительность импульсов становится равной или больше длительности задержки между импульсами звук исчезает.

Для проверки работоспособности термометра проведем два эксперимента: сравним его показатели с другим устройством, предназначенным для измерения температуры, и изменим температуру окружающей среды. Первый тест показал соответствие температуры, показанной ртутным термометром и датчиками микроконтроллера. После этого было произведено термическое воздействие (нагревание) на датчик. Через небольшой промежуток времени показатели этого датчика возросли, а после прекращения воздействий вернулись на прежние показатели, что подтверждает работоспособность термодатчика.

Для проверки работоспособности часов необходимо оставить их включёнными на довольно длительный период, после чего сравнить результаты обычных часов и часов реализованных на PICDEM 2. Проведённый эксперимент показал что за 10 часов часы сбились на 1 секунду. Что есть приемлемым результатом.

 

Выводы


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

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

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


ПЕРЕЧЕНЬ ССЫЛОК

1. Методические указания к лабораторным работам по курсу Микроконтроллеры во встроенных системах управления для студентов всех специальностей / Составители Аврунин О.Г., Крук О.Я., Семенец В.В. - ХНУРЭ, 2005. - 105 с.

2.   В. А. Гулиус, В. Г. Лобода, В. П. Степанов, В. Ю. Цуканов. “Средства автоматизированного проектирования специализированных микропроцессорных устройств”: Учебное пособие - Харьков: ХНУРЭ, 2001. 228 с.

.     Белова Н. В., Коряк С. Ф., Лобода В. Г.. “Основы построения ориентированных ЭВМ и систем”. Под общ. ред. В. Г. Лободы. - Харьков: ООО «Компания СМИТ», 2007. - 148 с.

.     Проектирование встроенных устройств на микропроцессорах: Учеб. пособие /В. Г. Лобода, В. В. Логвин, В. Б. Таранов. - К.: УМК ВО, 1988. - 128 с.

.    Методические указания к комплексному курсовому проекту Составители: В.Г. Лобода, А.С. Шкиль, Л.К. Штец.- Харков, ХНУРЭ,2001. - 8с.

.     Документация на демонстрационную плату PICDEM 2 Plus Users Guide 51275c.pdf

7.   Руководство пользователя MPASM & MPLINK 33014g

.     MPASM Quick Reference Guide 30400f

9.   Руководство пользователя MPASM

.     Документация на семейство микроконтроллеров PIC18FXX2 manual

.     Руководство пользователя PICDEM 2 Plus Demonstration Board

.     Руководство пользователя MPLAB C18

.     Библиотеки MPLAB C18

Приложение А

Программа реализации устройств

p18main.c

#include <p18f4520.h>

#include <delays.h>

#include <stdlib.h>

#pragma config     OSC = HS           //oscillator

#pragma config     FCMEN = OFF    //Fail Safe Clock Monitor

#pragma config     IESO = OFF        //Internal External Osc. Switch Over

#pragma config     PWRT = ON       //Power Up Timer

#pragma config     BOREN = OFF    //Brown Out Reset

#pragma config     WDT = OFF        //Watchdog Postscaler

#pragma config     MCLRE = ON     //Vhod sbrosa mikrokontrollera

#pragma config     PBADEN = OFF //Port B A/D digital on Reset

#pragma config     LVP = OFF         /Lov  Voltage ICSP

#pragma config     XINST = OFF     //xinst

#define        scroll_dir     TRISAbits.TRISA4

#define        scroll           PORTAbits.RA4

#define        select_dir    TRISBbits.TRISB0

#define        select          PORTBbits.RB0near void LCDInit(void);unsigned temp_wr;near void d_write(void);near void i_write(void);near void LCDLine_1(void);near void LCDLine_2(void);unsigned char WREG;

char ptr_pos;char ptr_count;char cmd_byte;char temperature;char seconds ;char minutes         ;char hours  ;

temph;tempv_char[3],temph_char[16]={"0.00V RB0=Exit "},_char[16]={"Prd.=128 DC=128 "},tempt_char[16]={"Temp= C "},

tempc_char[16]={" 00:00:00 "};zero[1]={"0"};

rom const char stan_table[15][16]={

" Voltmeter ",       //;0

" Buzzer ",  //;1

" Temperature ",   //;2

" Clock ",    //;3

"RA4=Next RB0=Now",         //;4

" Dimasya ", //;5

" tut koviryal ",     //;6

"RA4=Set RB0=Menu", //;7

"RBO=Prd+ RA4=DC+",//;8

" RB0 = Exit ",     //;9

" Volts = ", //;10

"Prd.=128 DC=128 ",//;11

"Minutes RB0=++",//12

"Hours RB0=++",//13

"again? RB0=Exit"};//14

//functions definessprw (void);start (void);main (void);menu(void);voltmeter(void);buzzer(void);temp(void);clock(void);clock_set(void);clock_draw(void);stan_char_1(void);stan_char_2(void);

//functions workssprw (void)

{{

_asm movlw 0x00 _endasm=WREG&&SSPCON2;

_asm sublw 0x00 _endasm

} while (STATUSbits.Z==0);(SSPSTATbits.R_W==1) {};

}

void start (void)

{();=0b10100100; //initialize USART=25;=0b10010000;

.TRISC2=0; //CCP=0x80;L=0x80;CONbits.CCP1X=0;CONbits.CCP1Y=0;

CON=0x05;

.TRISA4=1;.TRISB0=1;

}main(void)

{_wr=0;_count=16;();();

}

menu(void)

{_count=16;_pos=5;_char_1();_pos=6;_char_2();KTCYx(900);(scroll==0){};(select==0){};

//------------------ VOLT MEASUREMENT ----------------------------(1){

ptr_pos=0;

stan_char_1();_pos=4;_char_2();(scroll==1) {if (select==0) {voltmeter();break;}} ;(select==0){};while (scroll==0){};

//------------------ BUZZER --------------------------------------(select==0){};_pos=1;_char_1();_pos=4;_char_2();

(scroll==1) {if (select==0) {buzzer();break;}         } ;(select==0){};while (scroll==0){};

//----------------- TEMPERATURE MEASUREMENT ----------------------(select==0){};_pos=2;_char_1();_pos=4;_char_2();(scroll==1) {if (select==0) {temp();break;}     };(select==0){};while (scroll==0){};

//------------------ CLOCK TIME ----------------------------------(select==0){};_pos=3;_char_1();_pos=4;_char_2();

(scroll==1) {if (select==0) {clock();break;}};(select==0){};while (scroll==0){};

};

}

//************* STANDARD USER CODE **********************************

//------------- Voltmeter--------------------------------------------voltmeter(void)

{

int i;temp_char;(select==0){};

bits.ADON=1;=0b00001110;=0x01;

_pos=10;_char_1();

{bits.GO=1;(ADCON0bits.GO==0){};=ADRESH;*=2;(temph,tempv_char);(temph<10)

{temph_char[0]=zero[0];temph_char[2]=zero[0];temph_char[3]=tempv_char[0];}if (temph<100)

{temph_char[0]=zero[0];temph_char[2]=tempv_char[0];temph_char[3]=tempv_char[1];} //10<=x<100{temph_char[0]=tempv_char[0];temph_char[2]=tempv_char[1];temph_char[3]=tempv_char[2];} //10<=x<100

_2();(i=0;i<ptr_count;i++)

{_char=temph_char[i];_wr=temp_char;_write();

} //for i

}while(select==1);

}

//--------------------- BUZZER --------------------------------------buzzer(void)

{temp_char;

int n,i;

while(select==0){};=0x80;L=0x80;

_1();_pos=11;_char_1();_2();_pos=8;_char_2();CON=0x0f;(1){=0;(select==0)

{+=1;=5;=PR2;

(scroll==0)end;

} //if select(scroll==0)

{//inc dcL+=1;=CCPR1L;=12;(select==0)end;

}(n!=0) {(temph,tempv_char);

(temph<10)

{tempb_char[n]=zero[0];tempb_char[n+1]=zero[0];tempb_char[n+2]=tempv

_char[0];}if (temph<100)

{tempb_char[n]=zero[0];tempb_char[n+1]=tempv_char[0];tempb_char[n+2]=tempv_char[1];} //10<=x<100

{tempb_char[n]=tempv_char[0];tempb_char[n+1]=tempv_char[1];tempb_char[n+2]=tempv_char[2];} //10<=x<100

_1();(i=0;i<ptr_count;i++)

{_char=tempb_char[i];_wr=temp_char;_write();

} //for i

} //if n!=0

};//while:      CCP1CON=0;

}

//---------------------- Temperature --------------------------------temp (void)

{tempw,temp_char;i;(select==0){};.TRISC3=1; //initialize MSSP module.TRISC4=1;=0b00101000;.SMP=1;=0x05;

bits.TMR1IF=0;   //load Timer1 for 2 sec overflowH=0;L=0;{

//GET_TEMP_temp:      cmd_byte=0x01; //config register command byte

//TEMP_NOW_now:     SSPSTATbits.CKE=1; //SMBUS spec for TC74

bits.SEN=1; //write to TC74(SSPCON2bits.SEN==1){};=0b10011010;       //send TC74 ADDRESS (write)

ssprw();

while (SSPCON2bits.ACKSTAT==1) {};   //ack?

=cmd_byte;=WREG;     //send COMMAND byte (config)();(SSPCON2bits.ACKSTAT==1) {};         //ack?

bits.RSEN=1;       //send repeated start(SSPCON2bits.RSEN==1) {};=0b10011011;     //send TC74 ADDRESS (read)();       //module idle?(SSPCON2bits.ACKSTAT==1) {};         //ack?

bits.RCEN=1;       //enable receive mode(SSPCON2bits.RCEN==1) {};

=SSPBUF; //retrieve config reg or temp reg

bits.ACKDT=1;    //send NOT-ACKbits.ACKEN=1;(SSPCON2bits.ACKEN==1){};

bits.PEN=1; //stop(SSPCON2bits.PEN==1){};=WREG;(cmd_byte==1) { //config command OR temp command=tempw;

_asm 0x40            //is temp ready ??  0x40

_endasm(STATUSbits.Z==0) {goto get_temp;}_byte=0x00;temp_now;

}

=tempw;(temperature,tempv_char);_char[6]=tempv_char[0];         tempt_char[7]=tempv_char[1];_1();(i=0;i<ptr_count;i++)

{_char=tempt_char[i];_wr=temp_char;_write();

} //for i_2();_pos=9;_char_2();

}while(select==1);

}

//----------------- CLOCK ------------------------------------------clock (void)

{temp_char;i,n;(select==0){};

CON=0x0F;=0;minutes=0;hours=0;{bits.TMR1IF=0;H=0x68;L=0x00;

++;(seconds-60==0) {++;=0;

}(minutes-60==0){++;=0;

}(hours-13==0){=0;

}(scroll==0) clock_set();

clock_draw();

_2();

ptr_pos=7;_char_2();(PIR1bits.TMR1IF==0){if (scroll==0) clock_set();};

} while (select==1);

}

clock_set(void)

{(scroll==0){};(select==1) {(scroll==1) {_draw();_2();_pos=12;_char_2();(select==0) {minutes++;}(minutes-60==0){++;=0;

} //if(hours-13==0){hours=0;}

} //while(scroll==0){};(scroll==1) {_draw();_2();_pos=13;_char_2();(select==0) {hours++;}(hours-13==0){hours=0;}

}(scroll==0){};(scroll==1) {_draw();_2();_pos=14;_char_2();(select==0)

{goto clock_set_end;}

}

}_set_end: while (select==0){};

}

clock_draw(void)

{temp_char;i,n;=seconds;=10;(temph,tempv_char);(temph<10) {tempc_char[n]=zero[0];_char[n+1]=tempv_char[0];}{tempc_char[n]=tempv_char[0];         tempc_char[n+1]=tempv_char[1];}=minutes;=7;(temph,tempv_char);(temph<10) {tempc_char[n]=zero[0];_char[n+1]=tempv_char[0];}{tempc_char[n]=tempv_char[0];         tempc_char[n+1]=tempv_char[1];}=hours;=4;(temph,tempv_char);(temph<10) {tempc_char[n]=zero[0];_char[n+1]=tempv_char[0];}{tempc_char[n]=tempv_char[0];         tempc_char[n+1]=tempv_char[1];}_1();(i=0;i<ptr_count;i++)

{_char=tempc_char[i];_wr=temp_char;_write();

} //for i

}

stan_char_1(void)

{i;temp_char;_1();(i=0;i<ptr_count;i++)

{_char=stan_table[ptr_pos][i];_wr=temp_char;_write();

}

}stan_char_2(void)

{i;temp_char;_2();(i=0;i<ptr_count;i++)

{_char=stan_table[ptr_pos][i];_wr=temp_char;_write();

}

p18lcd.asm

********************************************************************

;* Microchip Technology Inc. 2002 *

;* Revised on 5/6/03 - Removed Linker file declaration *

;* Assembler version: 2.0000 *

;* Filename: *

;* p18lcd.asm *

;********************************************************************p=18f442

#include p18f442.inc

#define LCD_D4 PORTD, 0; LCD data bits

#define LCD_D5 PORTD, 1

#define LCD_D6 PORTD, 2

#define LCD_D7 PORTD, 3

#define LCD_D4_DIR TRISD, 0 ; LCD data bits

#define LCD_D5_DIR TRISD, 1

#define LCD_D6_DIR TRISD, 2

#define LCD_D7_DIR TRISD, 3

#define LCD_E PORTA, 1; LCD E clock

#define LCD_RW PORTA, 2; LCD read/write line

#define LCD_RS PORTA, 3; LCD register select line

#define LCD_E_DIR TRISA, 1

#define LCD_RW_DIR TRISA, 2

#define LCD_RS_DIR TRISA, 3

#define LCD_INS 0

#define LCD_DATA 1_LCD_DATA UDATAres 1res 1_wr res 1_rd res 1

GLOBAL temp_wrCODE_10x80temp_wri_writeLCDLine_1_20xC0temp_wri_writeLCDLine_2

;write data_write;temp_wr,TXREG;TXSTA,TRMT;$-2LCDBusySTATUS, CLCDWrited_write;instruction_writeLCDBusySTATUS, CLCDWrite i_write

rlcd macro MYREGISTERMYREGISTER == 1STATUS, CLCDReadSTATUS, CLCDReadPORTALCD_E_DIR;configure control linesLCD_RW_DIRLCD_RS_DIRb'00001110'ADCON10xff; Wait ~15ms @ 20 MHzCOUNTER0xFFdelayDelayXCyclesCOUNTER,Flil1b'00110000'; #1 Send control sequencetemp_wrSTATUS,CLCDWriteNibble

0xff; Wait ~4ms @ 20 MHz COUNTER

lil20xFFdelayDelayXCyclesCOUNTER,Flil2b'00110000'; #2 Send control sequencetemp_wrSTATUS,CLCDWriteNibble0xFF; Wait ~100us @ 20 MHzdelayDelayXCyclesb'0011000'; #3 Send control sequencetemp_wrSTATUS,CLCDWriteNibble

;test delay0xFF; Wait ~100us @ 20 MHzdelayDelayXCyclesb'00100000'; #4 set 4-bittemp_wrSTATUS,CLCDWriteNibbleLCDBusy; Busy?b'00101000'; #5 Function settemp_wri_writeb'00001101'; #6 Display = ON temp_wr

rcall i_writeb'00000001'; #7 Display Cleartemp_wri_writeb'00000110'; #8 Entry Modetemp_wri_writeb'10000000'; DDRAM addresss 0000temp_wri_write;b'00000010';home;temp_wr;i_writeLCDInit;

_ ______________________________;_>--<______________________________;

_____;\_____________________________;

__________________;____________/ \___;

_____________ ______;_____________>--------------<______;STATUS, C; Set the register selectLCD_RSSTATUS, CLCD_RSLCD_RW; Set write modeLCD_D4_DIR; Set data bits to outputsLCD_D5_DIRLCD_D6_DIRLCD_D7_DIR; Small delayLCD_E; Setup to clock datatemp_wr, 7; Set high nibbleLCD_D7temp_wr, 7LCD_D7temp_wr, 6LCD_D6temp_wr, 6LCD_D6temp_wr, 5LCD_D5temp_wr, 5LCD_D5temp_wr, 4LCD_D4temp_wr, 4LCD_D4LCD_E; Send the data;LCDBusyLCDWriteNibbletemp_wr,FLCDWriteNibble

ПРИЛОЖЕНИЕ В. Подключаемый файл с описанием функций (продолжение)

swapf temp_wr,FLCDWrite;

_____ _____________________________________________________;_____>--<_________________________________________________;

____________________________________________________;_________/;

____________________ ____________________;____________/ \____/ \__;

_________________ __________ ___;_________________>--------------<__________>--------------<___;LCD_D4_DIR; Set data bits to inputsLCD_D5_DIRLCD_D6_DIRLCD_D7_DIRSTATUS, C; Set the register selectLCD_RSSTATUS, CLCD_RSLCD_RW; Read = 1LCD_E; Setup to clock dataLCD_D7 ; Get high nibbletemp_rd, 7LCD_D7temp_rd, 7LCD_D6temp_rd, 6LCD_D6temp_rd, 6LCD_D5temp_rd, 5LCD_D5temp_rd, 5LCD_D4temp_rd, 4LCD_D4temp_rd, 4LCD_E; Finished reading the dataLCD_E; Setup to clock dataLCD_D7; Get low nibbletemp_rd, 3LCD_D7temp_rd, 3LCD_D6 temp_rd, 2

btfsc LCD_D6temp_rd, 2LCD_D5temp_rd, 1LCD_D5temp_rd, 1LCD_D4temp_rd, 0LCD_D4temp_rd, 0LCD_E; Finished reading the data;BFLCD_INStemp_rd, 7LCDBusyLCDBusydelay,FDelayXCycles

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

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!