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

курсовая работа

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

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

Для розробки програми на мові Assembler скористаємося середовищем AVR Studio 4, так як програмувати будемо мікроконтролер серії AVR ATmega8. Для початку створимо проект, в якому напишемо програму. Для цього: запускаємо AVR Studio 4 > вибираємо New project (рис 3.1) > вибираємо Atmel AVR Assembler (рис 3.2) > записуємо у відповідних полях імя проекту та місце розташування > натискаємо кнопку "Next" > вибираємо необхідний мікроконтролер та натискаємо кнопку "Finish"(рис. 3.2)

Рисунок 3.1 - Створення проекту в AVR Studio

Рисунок 3.2 - Вибір типу проекту

Рисунок 3.3 - Вибір типу мікроконтролера

Після закінчення створення проекту зявиться файл проекту (рис. 3.4),

в якому буде записана програма. Почнемо програму із запуску бібліотеки мікроконтролера та ініціалізації портів для кнопок(вводу) та світлодіодів(виводу). На порту D будуть кнопки, а на порту В світлодіоди.

Рисунок 3.4 - Файл тексту програми

Крім того на рис. 3.5 представлено емулятор периурії вибраного та вказаного при створення проекту мікроконтролера. Даний емулятор буже зручно використовувати при програмування та відладці роботи мікроконтролера.

Рисунок 3.2 - Вибір мікроконтролера для його програмування

За допомогою директиви ".include "…"" відкриваємо бібліотеку програмуємого мікроконтролера, команда "ser" встановлює одиниці всіх бітів регістра, а команда "clr" їх очищує [11-17]. Команда "out" задає

значення регістра в вибраний регістр, в даній ситуації в регістри: PORT(дані порта); DDR(стан порта); PIN(стан виводів).

Через досить часте використання регістрів, присвоїмо їм назви для зручності. Нам необхідно буде 3 регістри: для виводу значень в порт В, для зміщення "1" в необхідний біт.

Підключення заголовного файлу з описом регістрів, констант тощо:

include "m8mega.inc"

Приведений фрагмент програми відповідає за призначення імен регістрів.

def temp = r16

Фрагмент програми, який відповідає за ініціалізацію стека представлений нижче.

ldi r31,low(ramend) out spl,r31

Налаштування портів вводу виводу забезпечується наступним чином:

ldi temp, 0x00

out DDRD, temp ldi temp, 0xff out DDRB, temp out PortD, temp

Перед початком роботи всі світло діоди вмикаються та після затримки гаснуть. Це реалізується фрагментом програми, який представлений нижче.

ldi r16,0b11111111

out portb,r16

rcall fff

ldi r16,0b00000000

out portb,r16

Фрагмент програми, який відповідає за перевірку стану кнопки наведений нижче. Считуєм і перевіряєм нульовий розряд, якщо кнопка не натиснута, то програма буде зациклена в даному фрагменті і очікувати зміни положення кнопки. Після нажмання кнопки в PIND буде "0", після чого відбувається перехід на програму індикації.

kn1:

ldi r16,0b00000000

out portb,r16

in r17,pind

sbrc r17,0

Програма індикації "режим 2 " в послідовності вимкнення світлодіодів VD0, VD7, VD1, VD6, VD2, VD5, VD3, VD4.

ind1:

ldi r18,0b10000000

out portb,r18

rcall fff

ldi r18,0b00000001

out portb,r18

rcall fff

ldi r18,0b01000000

out portb,r18

rcall fff

ldi r18,0b00000010

out portb,r18

rcall fff

ldi r18,0b00100000

out portb,r18

rcall fff

ldi r18,0b00000100

out portb,r18

rcall fff

ldi r18,0b00010000

out portb,r18

rcall fff

ldi r18,0b0001000

out portb,r18

rcall fff

rjmp loop

Програма індикації "режим 3" в послідовності вимкнення світлодіодів VD0, VD4, VD3, VD5, VD2, VD6, VD1, VD7, VD0.

ldi r18,0b0001000

out portb,r18

rcall fff

ldi r18, 0b00010000

out portb,r18

rcall fff

ldi r18, 0b00000100

out portb,r18

rcall fff

ldi r18, 0b00100000

out portb,r18

rcall fff

ldi r18, 0b00000010

out portb,r18

rcall fff

ldi r18, 0b01000000

out portb,r18

rcall fff

ldi r18, 0b00000001

out portb,r18

rcall fff

ldi r18, 0b10000000

out portb,r18

rcall fff

rjmp loop

Програма перевірки та перевірки, яка перевіряє стан кнопки 1 та 2, після якої можна обновити чи перейти на інший режим без закінчення циклу включення діодів

fff:

in r17,pind

sbrc r17,0

rjmp kn1

in r17,pind

sbrc r17,1

rjmp kn2

ldi r20, 50

in r17,pind

sbrc r17,0

rjmp kn1

in r17,pind

sbrc r17,1

rjmp kn2

ldi r21, 50

in r17,pind

sbrc r17,0

rjmp kn1

in r17,pind

sbrc r17,1

rjmp kn2

Делись добром ;)