3 Эскизный проект
Эскизный проект – этап составления спецификаций отдельных блоков, разработка подробной структурно-блочной схемы устройства. На рисунке 3.1 изображена функциональная модель.
Рисунок 3.1 – Функциональная модель
Блок обмена информации – в данном блоке производится обмен информации через Com-port. Работа этого блока осуществляется в полудуплексном режиме – поочередна передавая данные о положении управляемой ракетки. Также этот блок отвечает за установление и проверку сетевого соединения. Проверка проводится по схеме «Рукопожатие» при этом один контроллер посылает запросный маркер «123», второй, в свою очередь, получив данный маркер, отсылает ответный «321» если маркер не получен или искажен, то на дисплее выдастся ошибка. Первый контроллер, получив маркер «321» ,отправляет сигнал на начало игры, если же ответный маркер не пришел или искажен на экране также выведется сообщение об ошибке.
Блок перемещения ракеток отвечает за перемещение ракеток по игровому полю начиная с начальных координат. Передвижение происходит по координате у.
Блок перемещения шарика отвечает за перемещение шарика по игровому полю начиная с начальных координат. Обеспечивает непрерывное передвижение шарика по двум осям х и у.
Блок сравнения координат отвечает за сравнение координат с константами которые определяют: края поля, рамки ракетки и ее местоположения, местоположения шарика относительно ракеток, относительно краёв игрового поля. В том случае если шарик пересёк координаты ракетки и не был отбит, управление передается блоку определения результата, в противном случае мы продолжаем работу в блоке сравнения координат.
Блок определения результата считает количество промахов для каждого игрока.
Блок подсветки диодов выполняет индикацию диодов в соответствии с общим количеством пропущенных очков.
Блок индикации победителя сообщает о победителе и подаёт сигнал на блок задержки.
Блок задержки выполняет задержку на 10 секунд и этим определяет завершение игры. После чего передаёт управление блоку движения шарика и блоку перемещения ракеток, начиная тем самым новую игру.
4 Технический проект
На данном этапе происходит описание и моделирование функций языка программирования, выбор организации проекта и принципов построения моделей и т.д.
Основными моментами данного этапа являются:
– составление и описание блоков на языке программирования;
– определяются межблоковые связи;
– описание констант и переменных;
– отладка проекта (пошаговое тестирование основных блоков программы в процессе написания и исправление некорректной работы).
4.1 Разработка проекта
При описании моделей на языках программирования большое внимание следует уделять конструкциям языка. Так нужно использовать конструкции, которые воспринимаются программой программирования микроконтроллера, а также оптимизировать конструкции для достижения наименьших аппаратных затрат.
Рисунок 4.1 – Связи файлов
4.2 Описание интерфейса
Принципы построения модели включает методологию написания языкового кода. Спецификация составляется на всю программу, состоящую из основных блоков в соответствие со следующими этапами.
Необходимо выполнить анализ требуемых входных параметров и констант, а также определить их тип и начальные значения.
Начальные значения выбираются в соответствие с описанием устройства. Тип параметров – int целочисленный тип. При этом по умолчанию используется модификатор типа unsigned, который указывает, что переменная принимает неотрицательные значения. При этом самый левый бит области памяти, выделяемой для хранения значения, используется так же, как и все остальные биты области памяти – для представления значения.
Таблица 4.1 – Описание интерфейса всей программы
Входы |
Тип |
Начальные значения |
Описание |
х |
int |
65 |
Начальная координата шарика по оси х |
у |
int |
63 |
Начальная координата шарика по оси у |
f |
int |
0 |
Флаг определяющий отражение шарика |
d |
int |
0 |
Общие очки игроков |
g2 |
int |
0 |
Очки игрока 1 |
g1 |
int |
0 |
Очки игрока 2 |
lx1 |
int |
239 |
Начальные координаты ракетки игрока 2 по оси х |
ly1 |
int |
53 |
Начальные координаты ракетки игрока 2 по оси у |
lx2 |
int |
5 |
Начальные координаты ракетки игрока 1 по оси х |
ly2 |
int |
53 |
Начальные координаты ракетки игрока 1 по оси у |
r |
int |
5 |
Размер шарика |
t |
int |
3 |
Размер ракеток игроков |
4.3 Основные конструкции и процедуры, используемые для написания программы
При разработке проекта необходимо подключить заголовочные файлы:
1. #include "mega128.h" – для регистрации вводов-выводов для ATMEGA128;
2. #include "delay.h" – для использования задержек;
3. #include "graphics.h" – для вызова функций используемых в главном файле source.c. Сами функции описаны в файле «graphics.c».
Ниже приведены примеры наиболее значащих для проекта функций:
Листинг 4.1 – Функция определяющая порты
void init_cpu(void)
{
DDRB = 0xff; // Регистр направления данных порта B
PORTB = 0xff; // Регистр данных порта В
DDRD = 0xff; // Регистр направления данных порта D
PORTD = 0xff; // Регистр данных порта D
DDRF = 0x00; // Регистр направления данных порта F
PORTF = 0x00; // Регистр данных порта F
DDRE = 0xf0; // Регистр направления данных порта E
MCUCR = 0x8a; // Регистр управления микроконтроллером
XMCRA = 0xff; // Регистр А управления внешней памятью
SFIOR = 0x10; // Регистр специальных функций ввода-вывода
}
Листинг 4.2 – Функция отображения
void init_display(void);
{
write_command(0xB2); // Автоматический перезапуск
set_graphic_window(GRAPHICS_HOME0);
write_data(GRAPHICS_WIDTH); // Младший бит
write_data(0x00); // Старший бит
write_command(0x43); // Установка длинны графической линии
set_text_window(TEXT_HOME0);
write_data(TEXT_WIDTH); // Младший бит
write_data(0x00); // Старший бит
write_command(0x41); // Длинна линии текста
write_command(0b10000000); // Способ набора
write_command(0b10011100); // Способ показа
write_command(0xA3); // Выбор образца курсора
write_command(0x01);
write_command(0x00);
write_command(0x21); // Установка позиции курсора
return;
}
Листинг 4.3 – Функция перерисовки текста
void clear_text(void)
{
unsigned int i=0; // Положительное целое число
set_address(TEXT_HOME0); // Установить адресс
for (i;i<TEXT_WIDTH*TEXT_LINES;i++)// Определить ширину и длину
{
write_data(0); // Запись данных
write_command(0xC0); // Вывод данных
}
return;
}
При написании программы использовался оператор условия if/else, который позволяет выполнять одно из двух действий в зависимости от условия.
Листинг 4.4 – Использование оператора if/else
if (g2>g1) // если пропущенных очков у игрока 2 больше чем //у игрока 1
{sprintf(string,"WINNER: Player 1");// то игрок 1 победил
write_string(10, 7, string);
delay_ms(10000);}
С помощью этого оператора были описаны условия отражения шарика от границ экрана и от ракеток игроков.
Для рисования шарика и ракеток использовался оператор цикла с параметром for, когда заранее известно количество итераций цикла, что позволяло задать размер и заливку шарика, а также ширину ракеток.
Листинг 4.5 – Использование цикла for для отрисовки ракеток
for (t=0;t<3;t++)
{
Line(lx2-t,ly2,lx2-t,ly2+20,1); // ракетка игрока 1
Line(lx1-t,ly1,lx1-t,ly1+20,1); // ракетка игрока 2
}
В программе используется флаг необходимый для определения начальных координат и направления движения шарика и для предотвращения одновременного выполнения более чем одного условия изменения направления движения по координатам х и у одновременно.
Листинг4.6 – Задание начальных координат и движения
if(x<=0 && y>=63)
{f=0;}
if(f==0)
{
x=x+4;
y=y+4;
…
}
Проект содержит файл source.map, который генерируется компилятором и находится в одном каталоге с исходным модулем программы. В нём указывается размещение переменных (в регистрах процессора или памяти данных) поскольку часто в ассемблерных подпрограммах возникает необходимость получить доступ к значениям переменных, объявленных в С–программе.
