- ПРОЕКТИРОВАНИЕ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
4.1 Разработка схемы работы
системы на Си
Так как алгоритм есть точно
определенная процедура, предписывающая
микроконтроллеру однозначно определенные
действия по преобразованию исходных
данных в обработанные выходные данные,
то разработка блок-схемы алгоритма требует
предельной точности и однозначности.
В основе разработки блок-схемы алгоритма
лежит принцип модульного проектирования
– метод декомпозиции, при котором функциональные
модули, полученные на этапе предварительного
проектирования, последовательно разделяются
на меньшие функциональные модули, каждый
из которых можно анализировать, разрабатывать
и отлаживать отдельно от других. При выполнении
прикладной программы в микроконтроллере
управление однозначно передается от
одного функционального модуля к другому.
Схема связности этих функциональных
модулей, каждый из которых реализует
некоторую процедуру, образует общую блок-схему
алгоритма прикладной программы. Разделение
на модули выполняется последовательно
до такого уровня, который обеспечивает
получение простого и понятного алгоритма
модуля.
Программные модули должны
иметь только одну точку входа и одну точку
выхода. Только в этом случае отдельные
модули можно разрабатывать и отлаживать
независимо, а затем объединять в законченную
прикладную программу с минимальными
проблемами их взаимосвязей. Источником
подавляющего большинства ошибок программирования
это использование модулей, имеющих один
вход и несколько выходов. При необходимости
организации множественных ветвлений
в программе условные переходы или включают
внутрь модуля, объединяя их с операциями
обработки, или выносят в систему межмодульных
связей, формируя тем самым блок-схемы
алгоритма более высокого уровня или используя
систему программных флагов.
Разработка блок-схемы алгоритма
функционального модуля программы имеет
ярко выраженный итеративный характер,
т.е. требует многократных проб, прежде
чем возникает уверенность, что алгоритм
реализации процедуры правильный и завершенный.
Вне зависимости от функционального назначения
процедуры при разработке ее блок-схемы
алгоритма необходимо придерживаться
следующей последовательностей действий:
- определить, что должен
делать модуль
- определить способы получения
модулем исходных данных
- определить необходимость
какой-либо предварительной обработки
введенных исходных данных
- определить способ преобразования
входных данных в требуемые
выходные
- определить способы выдачи
из модуля обработанных данных
- определить необходимость
какой-либо постобработки выводимых
данных
Преобразование разработанной
блок схемы алгоритма в исходный текст
программы – относительно несложный процесс.
Прежде, чем преступить к написанию программы,
необходимо выполнить распределение памяти
и рабочих регистров.
Распределение памяти и рабочих
регистров заключается в определении
адреса первой команды прикладной программы,
действительных начальных адресов стека,
таблиц данных, переменных, областей передачи
параметров между подпрограммами, подпрограмм
обслуживания прерываний и т.п. При этом
следует помнить, что в микроконтроллере
память программ и память данных физически
и логически разделены.
Используя советы, которые были
приведены ранее, составим блок схему
нашей программы, которая изображена на
рисунке 4.1:
Рисунок 4.1 – Блок-схема алгоритма
работы системы велокомпьютера
Далее необходимо написать
код программы микроконтроллера, а также
проверить работу системы. Для проверки
работоспособности велокомпьютера будем
использовать систему автоматического
проектирования Proteus. Proteus VSM — пакет программ
для автоматизированного проектирования
(САПР) электронных схем. Разработка
компании Labcenter Electronics (Великобритания).
Пакет представляет собой
систему схемотехнического моделирования,
базирующуюся на основе моделей электронных
компонентов принятых в PSpice. Отличительной чертой
пакета PROTEUS VSM является возможность моделирования
работы программируемых устройств: микроконтроллеров, микропроцессоров
и прочего. Библиотека компонентов содержит
справочные данные. Дополнительно в пакет
PROTEUS VSM входит система проектирования печатных плат. Пакет Proteus состоит
из двух частей, двух подпрограмм: ISIS —
программа синтеза и моделирования непосредственно
электронных схем и ARES — программа разработки
печатных плат. Вместе с программой устанавливается
набор демонстрационных проектов для
ознакомления.
Пакет является коммерческим.
Бесплатная ознакомительная версия характеризуется
полной функциональностью, но не имеет
возможности сохранения файлов. Примечательной
особенностью является то, что в ARES можно
увидеть 3D-модель печатной платы, что позволяет
разработчику оценить своё устройство
ещё на стадии разработки.
Схема, собранная в системе
САПР Proteus предоставлена на рисунке 4.2:
Рисунок 4.2 – Система «Велокомпьютер»
в САПР PROTEUS
Поскольку идеальный герконовый
датчик генерирует прямоугольные импульсы,
то в качестве датчика был использован
генератор прямоугольных импульсов. Также,
стоит обратить внимание на то, что в схеме
на рис. 8 нету источника питания микроконтроллера,
это один из положительных моментов системы
автоматического проектирования Proteus.
Программа автоматически подключает выводы
микроконтроллера к питанию и земле, чтобы
облегчить работу разработчика, также
можно увидеть, что все порты микроконтроллера
расположены рядом друг с другом, что также
является достоинством данной программы.
Код программы для микроконтроллера
на языках программирования Си и Ассемблер
можно увидеть в ПРИЛОЖЕНИИ А и в ПРИЛОЖЕНИИ
Б соответственно.
4.2 Описание работы системы
и программы
В начале программы МК происходит
подключение библиотек векторов прерываний,
дисплея, задержки. Происходит задание
необходимых переменных. После перечисленных
действий в подпрограмме настройки
записи и чтения в/из ПЗУ (ПРИЛОЖЕНИЕ
А) происходит настройка процессов записи
и чтения ПЗУ, в процессе которой МК производится
запись основных параметров в данную память.
Если они уже были записаны ранее, то МК
сразу переходит в основной цикл программы,
в котором он будет находиться постоянно,
пока не придет запрос на прерывание. Пока
МК находится в основном цикле программы,
в подпрограмме настройки
условий прерываний происходит настройка
внутреннего прерывания по сравнению
таймера/счетчика 0 и внешнего по отношению
к МК прерывания по приходу событию на
вывод INT1 МК, а также в подпрограмме настройки
диаметра колеса производится выбор
диаметра с дальнейшей записью это значения
в ПЗУ. Все это время таймер/счётчик 0 ведёт
счёт до специально заданного числа. Время
счёта до данного числа составляет одну
секунду реального времени. После того,
как таймер/счётчик 0 досчитает до данного
числа, произойдёт событие сравнения,
по которому будет произведён запрос на
прерывание. В подпрограмме обработки
прерывания по сравнению таймера/счетчика
0 производится подсчет количества
прерываний, что будет соответствовать
количеству секунд реального времени.
Также в обработчике делается подсчет
минут и часов в соответствии с подсчитанным
количеством секунд. Таймер/счетчик 1 ведет
счет до тех пор, пока не произойдет прерывание
по событию на выводе INT1 МК. Как только
оно происходит, МК переходит в подпрограмму обработки
прерывания по событию на выводе INT1,
в которой определяется первое ли это
прерывание. Если оно оказывается первым,
происходит обнуление регистра счета
таймера/счетчика 1 без расчетов функции
скорости. Обнуление происходит по той
причине, что первое насчитанное число
счетчиком 1 не будет соответствовать
времени полного оборота колеса. Все дальнейшие
подсчеты таймером/счетчиком 1 используются
для расчета скорости движения велосипеда
с последующим обнулением регистра счета.
После обработки первого либо второго
прерывания происходит переход МК к подпрограмме опроса
кнопок. Опросив кнопки МК начинает
выполнять соответствующую подпрограмму.
Это могут быть подпрограмма настройки
диаметра колеса, либо подпрограмма расчета
и вывода на дисплей скорости, пройденного
пути, потраченных калорий либо вывод
значения таймера. Если МК осуществляет
переход к подпрограмме настройки
радиуса колеса, то происходит очистка
в ПЗУ всех расчетов и измерений, а затем
обновляется значение записанного диаметра
колеса. После этого все измерения и расчеты
производятся заново. Если же МК переходит
к выполнению подпрограммы расчета
и вывода на дисплей скорости, пройденного
пути, потраченных калорий либо вывод
значения таймера, то в каждой из них
соответственно осуществляется подсчет
требуемой функции с последующей записью
результата в ПЗУ и выводом на дисплей.
ЗАКЛЮЧЕНИЕ
Результатом выполнения
данной курсовой работы является разработка
устройства велокомпьютера на основе
микропроцессорной системы, на базе микроконтроллера
ATmega8L.
Осуществлена разработка
аппаратной части устройства, а также
разработка программного обеспечения.
Проведена проверка работоспособности
разработанной системы в системе автоматического
проектирования Proteus. Таким образом, можно
было убедиться в том, что разработка данной
системы является материально не затратной,
а также данная система имеет ряд преимуществ
по сравнению с другими системами.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1) Atmel [Электронный
ресурс]. – Спецификация МК ATmega 8, 8L. –Режим доступа:
http://www.atmel.com/Images/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf
2) Datasheetlib [Электронный ресурс]. – Спецификация LM016L. –
Режим доступа: http://www.datasheetlib.com/datasheet/692161/lm016l_renesas-technology.html.
3) Lib.chipdip
[Электронный ресурс]. – Спецификация МКА10110А. –
Режим доступа: http://lib.chipdip.ru/250/DOC000250842.pdf.
4) Интеграл [Электронный ресурс].
– Спецификация IZ9261-50. –
Режим доступа: http://www.vishay.com/docs/81011/tsal6400.pdf.
5) Википедия [Электронный
ресурс]. – Информация о герконе. –
Режим доступа: https://ru.wikipedia.org/wiki/Геркон.
6) ВелоСтиль [Электронный ресурс].
– Информация о велокомпьютерах. – Режим
доступа: http://www.velostyle.ru/blogs/6/287/-.
5) Википедия [Электронный
ресурс]. – Информация о велосипедном
колесе. – Режим доступа: https://ru.wikipedia.org/wiki/Велосипедное_колесо.
ПРИЛОЖЕНИЕ А
Код программы микроконтроллера
на Си
//==============
//шапка для mega8, задание
задержки и адресов векторов прерываний,
//подключение библиотеки дисплея
//=============
#define F_CPU 4000000UL
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "LCD.h"
//==============
// Подпрограмма задания переменных
//==============
int msec = 0;
int sec = 0;
int min = 0;
int hour = 0;
int temp2 = 0;
int Period = 0;
int qdist = 0;
float D = 0.; //////////диаметр колеса
float SPEED = 0.; /////////скорость
//=============
//Подпрограмма настройки записи
и чтения в/из ПЗУ
//=============
void EEPROM_write(unsigned int uiAddress, float ucData)
{
while(EECR & (1<<EEWE));
EEAR = uiAddress;
EEDR = ucData;
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
}
float EEPROM_read(unsigned int uiAddress)
{
while(EECR & (1<<EEWE));
EEAR = uiAddress;
EECR |= (1<<EERE);
return EEDR;
}
//=============
//Подпрограмма обработки прерывания
по сравнению таймера/счетчика 0
//=============
ISR(TIMER0_OVF_vect)
{
++msec;
if(msec == 15)
{ ++sec;msec = 0;}
if(sec == 60)
{ ++min;sec = 0;}
if(min == 60)
{ ++hour;min = 0;}
}
//=============
//Подпрограмма обработки прерывания
по событию на выводе INT1
//=============
ISR(INT1_vect)
{
if(temp2==0)
{
TCNT1=0; //обнуляем регистр TCNT1 (счетчик).Запускаем
таймер.
temp2=1;
}
if(temp2==1)
{
Period=TCNT1;
//записываем значение (счетчик)
SPEED=(3.14*D*36)/(0.16*Period);
++qdist;
Period=0;
TCNT1=0; //обнуляем регистр TCNT1 (счетчик).Запускаем
таймер.
}
}
//==============
//Основной цикл программы
//==============
int main (void)
{
unsigned char str16[16];
char freq = 0; //////////////////частота
вращения колеса
char temp = 0;
char s4et = 0;
float distance = 0.;
float i = 0.;
i = EEPROM_read(2);
float qdistance = 0.;
float cal = 0.;
//===========
//Подпрограмма настройки условий
прерываний
//===========
GICR=0b10000000; // прерывание
на int1
TCCR1B=0b00000011; // clk/64
MCUCR=0b00001100; // прерывание первого
таймера
LCDinit(); // инициализация дисплея
TIMSK=0b00000001; // таймер 0,прерывание
по переполнению.
TCCR0=0b00000101; // clk/1024
sei();
//===========
//Подпрограмма настройки диаметра
колеса
//===========
if((D=EEPROM_read(1)) == 0)
{
MENU:
s4et = temp = 0;
LCDclear();
while(1)
{
LCDstring("Choose D:",0,0); // выбор
в дюймах,1 см = 2,56 дюйма.
LCDstring("duim",3,1);
temp = PINC & 0b00011100;
_delay_ms(800);
if(temp==0x08) // если нажата
кнопка +1
++s4et;
if(temp==0x04) // если нажата
кнопка -1
--s4et;
if(s4et==0)
LCDstring("19",0,1); ////// 48,64 см
if(s4et==1)
LCDstring("24",0,1); ////// 61,64 см
if(s4et==2)
LCDstring("26",0,1); ////// 66,56 см
if(s4et==3)
LCDstring("28",0,1); ////// 71,68 см
if(s4et!=0 && s4et!=1 && s4et!=2
&& s4et!=3)
s4et=0;
if(s4et==0 && temp==0x10)
{D = 48.64;goto metka;}
if(s4et==1 && temp==0x10)
{D = 61.64;goto metka;}
if(s4et==2 && temp==0x10)
{D = 66.56;goto metka;}
if(s4et==3 && temp==0x10)
{D = 71.68;goto metka;}
EEPROM_write(1,D); // запись в ПЗУ
}
}
metka:
s4et = temp = 0;
while(1)
{
temp = PINC & 0b00011101;
_delay_ms(800); /////задержка,во избежание
дребезга.
//==============
//Подпрограмма опроса
кнопок
//==============
if(temp==0x08 || temp==0x09) /////кнопка 2
(вправо).
++s4et;
if(temp==0x04 || temp==0x05) /////кнопка 1
(влево).
--s4et;
if(temp==0x10 || temp==0x11)
/////кнопка 3 (меню,выбор).
goto MENU;
//=============
//Подпрограмма расчета
и вывода на дисплей скорости
//=============
if(s4et==0)
{
LCDclear();
LCDstring("Speed",0,0);
LCDstring("km/h",6,1);
sprintf(str16,"%.2f",SPEED);
LCDstring(str16,0,1);
SPEED=0.;
}