Аппаратно-программный комплекс измерения влажности пара

дипломная работа

2.4 Разработка программного кода

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

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

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

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

Чаще всего готовый скомпилированный файл программы для микроконтроллера имеет расширение *.hex и предполагает загрузку в микроконтроллер, либо использование в любой среде симулирования процесса работы реального микроконтроллера.

Разработка программного кода, реализующего необходимые функции слежения, оповещения и контроля, для микроконтроллера PIC18F4458 велась с использованием среды разработки, предоставляемой самим разработчиком микроконтроллера - компанией MicroChip. Функционала этой среды разработки вполне достаточно (поскольку среда разработки поставляется самими производителем микроконтроллеров, то данный пункт является аксиоматичным), имеется удобный интерфейс, позволяющий отслеживать расход ресурсов микроконтроллера, таких как объем свободной и занятой памяти (энергонезависимой EEPROM, памяти случайного доступа RAM, флэш-памяти FLASH). Помимо вышеперечисленных достоинств этой среды разработки, можно упомянуть встроенный отладчик и симулятор работы выбранного микроконтроллера, работа которого практически идентична работе реального микроконтроллера за исключением очень специфических операций, которые не может отработать программный симулятор (к примеру, не во всех случаях корректно отрабатывается переход в самое начало флэш-памяти, одним их таких случаев является случай с наличием загрузчика в микроконтроллере, располагающегося в ячейках памяти, начиная с нулевой).

Далее представлено описание наиболее важных элементов и функций, описанных в программе. Программа написана на языке С++ и скомпилирована для работы с микроконтроллером PIC18F4553. Весь исходный код программы контроля сухости пара приведен в приложении Б.

2.4.1 Модули, включенные в программу

#include <pic18xxxx.h> - включает в программу модуль, описывающей для компилятора логику работы контроллера, опции компиляции готового файла «прошивки», прерывания, зарезервированных имен и функций. Является основным модулем, выбор которого зависит от модели микроконтроллера, с помощью которого реализуется будущий аппаратно-программный комплекс. Необходимо верно указывать подключаемый модуль, поскольку неверное указание может никак не отобразиться на процессе компиляции и, возможно, на процессе дальнейшей загрузки готовой откомпилированной программы в микроконтроллер, но при этом не только отрабатывать инструкции некорректно или в корне ошибочно, или полностью вывести из строя микроконтроллер.

#include <delays.h> - включает в программу модуль с функциями задержки по времени. Используется для создания задержек срабатывания аналогово-цифрового преобразователя с целью стабилизации входного напряжения и задержек в работе релейных механизмов (поправка на время срабатывания и аналогичные случаи).

#include <alcd.h> - модуль, позволяющий использовать цифробуквенные ЖК-дисплеи под управлением контроллера графического дисплея Hitachi HD44780. Взят и адаптирован из среды разработки для микроконтроллеров компании ATMEL Code Vision AVR, поскольку имеющаяся в наборе стандартная библиотека для работы с дисплеем <xlcd.h> в процессе отладки и запуска программы в симуляторе давала некорректные результаты. Библиотека <alcd.h> не давала аналогичных сбоев и некорректных обработок. С помощью этого модуля отправляются специальном образом закодированные символы, которые «понимает» контроллер самого дисплея и выводит в указанную ячейку на нем;

#include <stdio.h> - стандартная библиотека организации вода/вывода микроконтроллера.

#include <natively.h> - модуль, подменяющий названия регистров, заданные производителем на названия, которые более понятны человеку. К примеру, регистр опций использования аналогово-цифрового преобразователя микроконтроллера, по умолчанию заданный как ARSRCA, будет иметь имя ADC_usage_options, что значительно упрощает разработку и запоминание сложных заводских имен регистров. Так же этот модуль не отменяет использования оригинальных названий регистров, как, например, ARSRCA, что остается на усмотрение разработчика программы. Как и модуль <alcd.h>, взят и адаптирован из среды разработки Code Vision AVR.

2.4.2 Основные функции и их назначение

Interrupt void int0(void) - прерывание от внешнего источника, переключателя. Используется для инкрементирования настраиваемой величины времени. Иными словами, создан графический указатель на единицу времени (часы, минуты, секунды), который циклически сдвигается по принципу час -> минута -> секунда -> скрытое состояние. Скрытое состояние используется, как понятно из названия, для скрытия графического указателя для снижения избыточной информационной нагрузки на оператора и исключения возможности случайного изменения системного астрономического времени, уже заданного оператором.

Interrupt void int1(void) - прерывание от внешнего источника, переключателя. Используется для выбора настраиваемой величины времени (час, минута, секунда), которое графически выглядит как указатель под настраиваемой величиной, в скрытом состоянии не дает какого-либо эффекта. Циклически перемещается слева направо, в случае сдвига указателя, находящегося в позиции «секунды», переходит в скрытое состояние. Указатель, установленный на изменение минут показан на рисунке ниже (симуляция запущена в программной среде Proteus v7.7):

Рисунок 2.6 - Отображение указателя настройки времени.

Interrupt void timer2_comp_isr(void) - прерывание по внутреннему асинхронному восьмиразрядному таймеру, срабатывает по совпадению значения таймера с заданным значением, а именно - раз в одну секунду. Обеспечивает точное астрономическое время и инициирует вывод информации на ЖКИ. Таймер настроен и синхронизирован с использованием внешнего кварцевого резонатора с частотой резонанса 32 КГц.

void humid_calc(void) - функция расчета влажности водяного пара в процентах.

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

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

2.4.3 Вспомогательные функции и их назначение

lcd_clear() - вызывается при необходимости устранить информацию, в данный момент находящуюся на дисплее, поскольку, в связи с особенностями отображения информации на ЖКИ, более короткая строка при выводе заменит лишь ту часть уже выведенной информации, какова длина этой строки. Например, строка «ПОГОДА» заменит только часть строки «ИНФОРМАЦИЯ», в результате чего на дисплее отобразится «ПОГОДААЦИЯ». Для недопущения подобных случаев и используется команда очистки цифробуквенного ЖК-дисплея.

sprintf(lcd_buffer, "%2i:%2i:%2i", hour,min,sec) - запись каких-либо необходимых данных (например hour,min,sec) в буфер lcd_buffer для последующего (не-)форматированного вывода на ЖКИ. Имеет большое количество доступных опций форматирования выводимой строки. Например, sprintf(lcd_buffer, "%2i:%2i:%2i", hour,min,sec) выведет на дисплей три группы целых чисел, разделенных символом двоеточия. Для каждой группы отведено ровно две ячейки. В случае, если число будет занимать менее двух разрядов, возможно опционально указать замещение недостающего старшего разряда пустым символом либо нулем.

lcd_puts(lcd_buffer) - вывод данных из буфера lcd_buffer, в котором находится некоторая строка, на ЖКИ.

lcd_gotoxy(0,0) - перемещение курсора печати символа по строками и столбцам ЖКИ. Координаты Х, Y соответствуют порядковому номеру строки и столбца символа на ЖКИ, то есть ячейки. Например, команда lcd_gotoxy(1,0) перемещает курсор вывода символа на вторую строку, первый столбец (нумерация строк и столбцов идет не с единицы, а с нуля).

lcd_putsf("FIRMWARE v1.14") - помещает на ЖКИ символ или строку в ячейку, указанную курсором в данный момент. Если строка не помещается на соответствующую строку дисплея, то она не переносится на следующую, а обрезается по правому краю. Таким образом, на дисплее окажутся только то количество символов, которое можно отобразить в одной строке.

delay_us(10) - процедура задержки по времени. Возможно указание конкретных единиц времени задержки. Например delay_us(10) даст задержку в 10 микросекунд, delay_ms(10) - задержку в 10 миллисекунд, delay_s(10) - задержку в 10 секунд соответственно.

Делись добром ;)