logo
Автомат світлових ефектів на мікроконтролері AVR

4. Розробка програми на мові програмування C

Для розробки програми на С використаємо IDE CodeVisionAVR.

CodeVisionAVR - інтегроване середовище розробки програмного забезпечення для мікроконтролерів сімейства Atmel AVR [18].

CodeVisionAVR включає в себе наступні компоненти:

· компілятор С - подібного мови для AVR;

· компілятор мови асемблер для AVR;

· генератор початкового коду програми, що дозволяє зробити ініціалізацію периферійних пристроїв;

· модуль взаємодії з отладочной платою STK - 500;

· модуль взаємодії з програматором;

· редактор вихідного коду з підсвічуванням синтаксису;

· термінал.

Вихідними файлами CodeVisionAVR є:

· HEX, BIN або ROM- файл для завантаження в мікроконтролер допомогою програматора;

· COFF - файл, що містить інформацію для відладчика;

· OBJ - файл, в якому зберігається проміжний код компіляції, так званий обєктний код;

CodeVisionAVR є комерційним програмним забезпеченням. Існує безкоштовна ознайомча версія з обмеженням ряду можливостей, зокрема, розмір програмного коду обмежений 4-ма кілобайтами і не включений ряд бібліотек.

Компілятор С, що входить до складу CodeVisionAVR, має деякі відмінності від AVR- GCC (WinAVR), у тому числі власний синтаксис, набір підтримуваних серій мікроконтролерів (останні версії підтримують в тому числі серію ATXMega), а також генерує відрізняється за швидкодією вихідний код.

Згідно розробленого алгоритму, було розроблено на мові С програму мікропроцесорного пристрою світлової індикації, повний варіант якої представлений в додатку Б.

Рисунок 4.1 - Вид вікна під час створення проекту

Для розробки програми на мові С скористаємося середовищем

CodeVisionAVR. Для початку створимо проект, в якому напишемо програму: запускаємо CodeVisionAVR > на панелі "меню" вибираємо вкладку "File" > "New" > ставимо галочку навпроти "Project" > "Ok" > "Yes" > вибираємо вкладку "Project information" > в полі "Project name" записуємо назву свого проекту та копіюємо її, вибираємо вкладку "File" > "Save" > вставляємо назву, вибираємо папку створення та зберігання проекту > "Ok" > знову вибираємо вкладку "File" > вибираємо "Generate, Save and Exit" > вставляємо скопійовану назву проекта в кожному вікні у відповідну стрічку та тиснемо "Сохранить"(рис. 4.1).

Тепер можна написати саму програму, завдяки створеному шаблону це буде набагато простіше та швидше ніж в AVR Studio Assembler.

#include <90s2313.h> #include <delay.h>

Програма void vuvod забезпечує вивдененя буферної змінної на порт. void main(void)

Головний цикл: while (1)

{

Спочатку виконується режим 1

delay_ms(100);

PORTB=0b11111111;

delay_ms(100);

PORTB=0b00000000;

Цикл, який перевіряє чи нажата кнопка 1 і чи нажата кнопка 2, якщо так, то відбувається одна із програм в циклі, режим 2 чи режим 3

if (PIND.0==1)

if (PIND.1==1)

Цикл, який перевіряє чи не нажата кнопка 1. Якщо кнопка нажата, то тіло циклу не виконується.

while(PIND.0==0)

Цикл, який перевіряє чи не нажата кнопка 1. Якщо кнопка нажата, то тіло циклу не виконується.

while(PIND.1==0)

Режим 2, який виводиться на світлові діоди.

PORTB=0b01111111;

if (zatr_perev_kn() == 1)goto label1;

else if (zatr_perev_kn() == 2)goto label2;

PORTB=0b00111111

if (zatr_perev_kn() == 1)goto label1;

else if (zatr_perev_kn() == 2) goto label2;

PORTB=0b00011111;

if (zatr_perev_kn() == 1)goto label1;

else if (zatr_perev_kn() == 2)goto label2;

PORTB=0b00001111;

if (zatr_perev_kn() == 1)goto label1;

else if (zatr_perev_kn() == 2)goto label2;

PORTB=0b00000111;

if (zatr_perev_kn() == 1)goto label1;

else if (zatr_perev_kn() == 2)goto label2;

PORTB=0b00000011;

if (zatr_perev_kn() == 1)goto label1;

else if (zatr_perev_kn() == 2)goto label2;

PORTB=0b00000001;

if (zatr_perev_kn() == 1)goto label1;

else if (zatr_perev_kn() == 2)goto label2;

PORTB=0b00000000;

if (zatr_perev_kn() == 1)goto label1;

else if (zatr_perev_kn() == 2)goto label2;

Режим 3, який виводиться на світлові діоди.

PORTB=0b01111110;

if (zatr_perev_kn() == 1)goto label1;

else if (zatr_perev_kn() == 2)goto label2;

PORTB=0b00111100;

if (zatr_perev_kn() == 1)goto label1;

else if (zatr_perev_kn() == 2)goto label2;

PORTB=0b00011000;

if (zatr_perev_kn() == 1)goto label1;

else if (zatr_perev_kn() == 2)goto label2;

PORTB=0b00000000;

if (zatr_perev_kn() == 1)goto label1;

else if (zatr_perev_kn() == 2)goto label2;

PORTB=0b00011000;

if (zatr_perev_kn() == 1)goto label1;

else if (zatr_perev_kn() == 2)goto label2;

PORTB=0b00111100;

if (zatr_perev_kn() == 1)goto label1;

else if (zatr_perev_kn() == 2)goto label2;

PORTB=0b01111110;

if (zatr_perev_kn() == 1)goto label1;

else if (zatr_perev_kn() == 2)goto label2;

PORTB=0b11111111;

if (zatr_perev_kn() == 1)goto label1;

else if (zatr_perev_kn() == 2)goto label2;

Первірка кнопок і затримка реалізовуеться за допомогою

if (zatr_perev_kn() == 1)goto label1;

else if (zatr_perev_kn() == 2)goto label2;

int zatr_perev_kn()

{

int count;

for(count=0; count<100; count++)

{

delay_ms(10);

if(PIND.0 == 1) return 1;

else if(PIND.1 == 1) return 2;

else return 0;

}