
5 Рабочий проект
5.1 Компиляция
Данный проект реализован с помощью программы CodeVisionAVR.
Интегрированная среда CodeVisionAVR представляет собой кросс-компилятор языка С ориентированный на семейство микроконтроллеров AVR и содержит: графическую оболочку для управления ресурсами проекта; текстовый редактор исходного модуля программы; кросс-компилятор; отладчик, программатор; автоматический генератор программного кода; терминал для работы с последовательным интерфейсом RS232C (USART). Полученный в результате компиляции исходного кода программы на языке С исполняемый модуль (файл прошивки) может быть непосредственно записан в память программ микроконтроллера.
Рисунок 5.1 – Окно студии CodeVisionAVR
5.2 Прошивка
Прошивка микроконтроллера реализуется с помощью пользовательского интерфейса среды программирования CodeVisionAVR.
Далее необходимо выполнить компиляцию проекта – создать исполняемый программный модуль, пригодный для исполнения микроконтроллером. Для этого необходимо нажать клавишу Shift+F9. При завершении этапа компиляции активизируется окно Information (см. рисунок 5.2), содержащее информацию о скомпилированном проекте. Если компиляция прошла успешно, то для записи программы в память микроконтроллера необходимо нажать кнопку Program, расположенную в нижней части окна Information.
Выявленные в результате компиляции сообщения об ошибках отображаются в левой части главного рабочего окна, где располагаются данные о ресурсах проекта. При активизации сообщения об ошибке компилятор выводит подробные сведения о локализации и возможных причинах ошибки.
Рисунок 5.2 – Окно отображения информации о результатах компиляции проекта
В некоторых случаях для проверки работоспособности загруженной программы необходимо выполнить сброс микроконтроллера (Reset Chip) или удалить программу из памяти (Erase Chip).
Рисунок 5.3 – Окно отображения настроек программатора
5.2 Физическое тестирование
Таблица 5.1 – План тестирования
Воздействие |
Ожидаемое |
Реальное |
|
Количество очков у игрока 1 больше чем у игрока 2 |
Индикация: player 1 win |
Индикация: player 1 win |
|
Количество очков у игрока 2 больше чем у игрока 1 |
Индикация: player 2 win |
Индикация: player 2 win |
|
Координаты шарика по x и y совпали с координатами ракетки |
Шарик отбился |
Шарик отбился |
|
Координаты шарика по x и y не совпали с координатами ракетки |
Шарик не отбился |
Шарик не отбился |
|
Шарик пропущен игроком |
Высвечивается победитель раунда и загорается светодиод |
Высвечивается победитель раунда и загорается светодиод |
|
Координаты шарика по x или y совпали с координатами границы экрана |
Шарик отбился |
Шарик отбился |
|
Координаты шарика по x или y не совпали с координатами границы экрана |
Шарик не отбился |
Шарик не отбился |
|
Количество общих пропущенных очков превышает 8 |
Определение победителя, завершение и начало новой игры через 10 сек |
Определение победителя, завершение и начало новой игры через 10 сек |
Рисунок 5.4 – Соединение двух микроконтроллеров в сеть
Рисунок 5.5 – Результат выполнения программы
ВЫВОДЫ
Данный курсовой проект позволил более детально ознакомится с микроконтроллерами типа AVR компании ATMEL. В процессе разработки проекта были получены навыки проектирования, реализации и внедрение проекта в реальную модель.
В проекте не удалось реализовать функцию позволяющую отражать шарик от ракеток игроков и от границ экрана под случайным углом. Эта функция была описана не полностью и требует доработок.
Перемещение ракеток игроков возможно только по строгой последовательности, поскольку для них используется единая система координат.
Не был реализован полностью универсальный код для двух микроконтроллеров, так как это приводило к увеличению кода и ухудшению работы проекта, поэтому были реализованы два кода со специализированными блоками, предназначенными для определённого контроллера.
ПЕРЕЧЕНЬ ССЫЛОК
Методические указания к лабораторным работам по курсу “Микроконтроллеры во встроенных системах управления для студентов всех специальностей / Составители Аврунин О.Г., Крук О.Я., Семенец В.В. – ХНУРЭ, 2005. – 105 с.
Голубцов М.С., Кириченкова А.В. Микроконтроллеры AVR: от простого к сложному.- М.: СОЛОН-Пресс, 2004. – 304 с.
Баранов В.Н. Применение микроконтроллеров AVR: схемы, алгоритмы, программы.- М.: Издательский дом “Додэка-XXI”, 2004. – 288 с.
Аврунин О.Г.,. Крук О.Я, Семенец В.В. Микроконтроллеры во встроенных системах управления: Учебное пособие – ХНУРЭ, 2005. – 105 с.
5. Техническая документация к микрокрнтроллеру AVR ATmega 128
6. http://www.atmel.ru/ – описание микроконтроллеров фирмы ATMEL на русском языке.
ПРИЛОЖЕНИЕ А
Код программы
#include "graphics.h"
#include "source.h"
unsigned char string[30];
int x=65;//nachalnaja koordinata warika po x
int y=63;//nachalnaja koordinata warika po y
int f=0;//flag
int d=0;//obwie ochki
int g2=0;//ochki player 2
int g1=0;//ochki player 1
int lx1=239,ly1=53;//nachalnue koordinatu player 2
int lx2=5,ly2=53;//nachalnue koordinatu player 1
void game(void)
{
int r;
int t;
UCSR0A=0x00; //установка стандартного режима задания скорости передачи данных
UCSR0B=0x90; //установка 7-го и 4-го битов регистра UCSR0B для
инициализации USART0 в режиме приемника и разрешения
прерывания по завершению приема кадра
UCSR0C=0x06;// установка формата кадра: 8 бит данных с отключенным режимом четности
UBRR0H=0x00; // установка значения делителя (47) соответствующего
UBRR0L=35; // скорости приема данных 19200 бит/с
UCSR1A=0x00;
UCSR1B=0x08; // установка 3-го бита регистра UCSR1B для
инициализации USART1 в режиме передатчика
UCSR1C=0x06;
UBRR1H=0x00;
UBRR1L=35;
//инициализация отрисовки
init_cpu();
init_display();
clear_text();
clear_graphics();
while(1)
{
PORTE = 0b11011111;
if (PINE.0==0 && ly1+20<120) //движение ракетки 2 по у
{
ly1=ly1+3;
UDR1 = ly1;
}
PORTE = 0b10111111;
if (PINE.1==0 && ly1>5) //движение ракетки 2 по у
{
ly1=ly1-3;
UDR1 = ly1;
}
PORTE = 0b10111111;
if (ly2+20<120) //движение ракетки 1 по у
{
//ly2=ly2+3;
//UDR0 = ly2;
}
PORTE = 0b11011111;
if (ly2>5) //движение ракетки 1 по у
{
//ly2=ly2-3;
//UDR0 = ly2;
}
ly2 = UDR0;
/////////////////////
clear_graphics();
for (r=0;r<=5;r++)
{
lcd_circle(x,y,r,1); //шарик
}
///////////////////////////////////////////
///////////отражение///////////////////////
///////////////////////////////////////////
if(x<=0 && y>=63) //pojavlenie warika v na4alnoj to4ke i na4alnoe dvigenie
{
f=0;
}
if(f==0)
{
x=x+4;
y=y+4;
sprintf(string," "); //stiranie gameover2 player 2
write_string(0, 14, string);
sprintf(string," "); //stiranie gameover1 player 1
write_string(0, 14, string);
sprintf(string," ");//stiranie player 1 or 2 WIN
write_string(10, 7, string);
}
/////////////////////////
if(x<=230 && y>=120) //yslovie otragenija
{
f=1;
}
if(f==1)//dvigenie
{
x=x+3;
y=y-3;
}
///////////////////
if(x>=lx1 && x<=lx1+5 && y>=ly1 && y<=ly1+20)//коорд отбивания ракетки player 2
{
f=2;
}
if(f==2)//dvigenie
{
x=x-2;
y=y-3;
}
/////////////////////
if(x>=119 && y<=0) //yslovie otragenija
{
f=3;
}
if(f==3)//dvigenie
{
x=x-3;
y=y+3;
}
////////////////////////
if(y>=120 && x<=119) //yslovie otragenija
{
f=4;
}
if(f==4)//dvigenie
{
x=x-3;
y=y-3;
}
////////////////////////
if(x>=lx2 && x<=lx2+5 && y>=ly2 && y<=ly2+20)//коорд отбивания ракетки player 1
{
f=5;
}
if(f==5) //dvigenie
{
x=x+3;
y=y-3;
}
//////////////////////////////
if(y<=0 && x<=119)//делает нежелателный возврат
{
f=6;
}
if(f==6)//dvigenie
{
x=x+3;
y=y+3;
}
///////////////////////////
if(x>=239) //проиграл player 2 и шарик появляется снова
{
f=7;
}
if(f==7)
{
x=65;
y=63;
f=0;
g2=g2+1; //s4itaet o4ki igroka player 2
d=d+1; //s4itaet o4ki obwie
sprintf(string,"player2 loose");
write_string(0, 14, string);
delay_ms(1000);
}
///////////////////////////
if(x<=0) //проиграл player 1 и шарик появляется снова
{
f=8;
}
if(f==8)
{
x=65;
y=63;
f=0;
d=d+1; //s4itaet o4ki obwie
g1=g1+1; //s4itaet o4ki igroka player 1
sprintf(string,"player1 loose");
write_string(0, 14, string);
delay_ms(1000);
}
////////////////////////////////
if (x>118 && y<=5 && f==5) //otragenie player 1 na svou storony vverh
{
f=0;
}
////////////////////////////////
if (x<118 && y<=5 && f==2) //otragenie player 2 na svou storony vniz
{
f=3;
}
/////////////////////////////
////////ракетки//////////////
/////////////////////////////
for (t=0;t<3;t++)
{
Line(lx1-t,ly1,lx1-t,ly1+20,1); //игрок 1
Line(lx2-t,ly2,lx2-t,ly2+20,1); //игрок 2
}
///////////////////////////////
/////индикация на светодиоды///
///////////////////////////////
if (d==1)
{
PORTD=0b11111110;
}
if (d==2)
{
PORTD=0b11111100;
}
if (d==3)
{
PORTD=0b11111000;
}
if (d==4)
{
PORTD=0b11110000;
}
if (d==5)
{
PORTD=0b11100000;
}
if (d==6)
{
PORTD=0b11000000;
}
if (d==7)
{
PORTD=0b10000000;
}
if (d==8)
{
PORTD=0b00000000;
}
if (d==0 || d==9)
{
PORTD=0b11111111;
}
//////////////////////////
///////вывод текста//////
////////////////////////
sprintf(string,"player 1");//player 1
write_string(1, 1, string);
sprintf(string,"player 2");// player 2
write_string(20, 1, string);
//////////////////////////
/////результаты///////////
//////////////////////////
if (d>8)
{
d=0;
if (g1>g2) // esli player 1 bolwe player 2
{
sprintf(string,"WINNER: player 2");
write_string(10, 7, string);
delay_ms(10000);
}
if (g2>g1) // esli player 2 bolwe player 1
{
sprintf(string,"WINNER: player 1");
write_string(10, 7, string);
delay_ms(10000);
}
}
}
}