Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая_Павелко.doc
Скачиваний:
7
Добавлен:
15.08.2019
Размер:
5.51 Mб
Скачать

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. В процессе разработки проекта были получены навыки проектирования, реализации и внедрение проекта в реальную модель.

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

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

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

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

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

  2. Голубцов М.С., Кириченкова А.В. Микроконтроллеры AVR: от простого к сложному.- М.: СОЛОН-Пресс, 2004. – 304 с.

  3. Баранов В.Н. Применение микроконтроллеров AVR: схемы, алгоритмы, программы.- М.: Издательский дом “Додэка-XXI”, 2004. – 288 с.

  4. Аврунин О.Г.,. Крук О.Я, Семенец В.В. Микроконтроллеры во встроенных системах управления: Учебное пособие – ХНУРЭ, 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);

}

}

}

}