Кожному перериванню призначений свій вектор у початковій області пам'яті програм. Різні переривання мають пріоритет відповідно до розташування їх векторів. По молодших адресах розташовані вектори з більшим пріоритетом.
Усі команди, що оперують регістрами прямо адресуються до кожного з регістрів за один машинний цикл. Єдине виключення - п'ять команд, що оперують із константами SBCІ, SUBІ, CPІ, ANDІ, ORІ й команда LDІ, що завантажує регістр константою. Ці команди працюють тільки із другою половиною реєстрового файлу - R16..R31. Команди SBC, SUB, CP, AND і OR, також як і всі інші, можуть бути застосовні до всього реєстрового файлу.
Кожному регістру присвоєна адреса в просторі даних, вони відображаються на перші 32 комірки ОЗУ. Хоча регістровий файл фізично розміщений поза ОЗУ, подібна організація пам'яті дає гнучкий доступ до регістрів. Регістри X, Y і Z можуть використовуватися для індексації будь-якого регістру.
Крім звичайних функцій, регістри R26..R31 мають додаткові функції, ці регістри можна використовувати як адресні покажчики в області пам'яті даних. Ці регістри позначаються як X,Y,Z.
При різних режимах адресації ці регістри можуть використовуватися як фіксована адреса, для адресації з автоінкрементом або з авто декрементом.
АЛП процесора безпосередньо підключений до 32 регістрів загального призначення. За один машинний цикл АЛП робить операції між регістрами реєстрового файлу. Команди АЛП розділені на три основні категорії - арифметичні, логічні й бітові. Деякі мікроконтролери сімейства AVR мають апаратний умножувач в арифметичній частині АЛП.
AT90S2313 містить 2кб, завантажуваної флеш пам'яті для зберігання програм. Оскільки всі команди займають одне 16- розрядне слово, флеш пам'ять організована як 1K 16- розрядних слів. Флеш пам'ять витримує не менш 1000 циклів перезапису.
Програмний лічильник має ширину 10 біт і в такий спосіб адресується до 1024 слів програмної флеш-памяти.
Таблиці констант можуть
розташовуватися в діапазоні адрес 0-2K. AT90S2313 містить 128 байт
енергонезалежної пам'яті, що електрично стирається (EEPROM). EEPROM
організована як окрема область даних, кожний байт якої може бути прочитаний і
перезаписаний. EEPROM витримує не менш 100000 циклів запису/стирання. Нижче
розглянуте й програмування пам'яті даних через SPІ інтерфейс
Таблиця 1.1 - Характеристики мікроконтролера AT90S2313
-55оС … +125 оС
Температура зберігання
-65оС … +150 оС
Напруга на будь-якому виході окрім RESET
-1.0V … Vcc+0.5 В
Напруга на будь-якому виході RESET
-1.0V … 13 В
Максимальна рабоча напруга
6.6 В
Таблиця 1.2 - Характеристики мікроконтролера AT90S2313 по постійному струму
Продовження таблиці 1.2
Примітки по мікроконтролеру AT90S2313:
1. В рабочому стані струм через виводи повинен обмежуватися наступними умовами:
- Максимальний струм через вивод - 20 мА (5V), 10 мА (3V);
. Мінімальна напруга для режима
пониженного споживання - 2V.
Таблиця 1.3 - Список регістрів мікроконтролера AT90S2313
Продовження таблиці 1.3
2. Розробка схем структурної,
принципової та алгоритму роботи програми
Для забезпечення алгоритму роботи мікропроцесорного пристрою сигналізації семисегментного індикатора була розроблена структурна схема (рисунок 2.1).
На рис 2.1 VD1-VD8 - лінійка
світлодіонів для виведення режимів світлосигнальної індикації, SB1, SB2 -
кнопки, як засоби керування вказаними режимами, МК - мікроконтролер, в якому
задіяні два порти введення/виведення для взаємодії з засобами керування.
Рисунок 2.1 - Структурна схема
мікропроцесорного пристрою керування лінійкою світлодіодів
Згідно структурної схеми було
розроблена принципова схема мікропроцесорного керування лінійкою світлодіодів.
(рисунок 2.2).
Рисунок 2.2 - Схема електрична
принципова мікропроцесорного керування лінійкою світлодіодів
Умовні позначення на рисунку 2.2: SB1 - кнока 1; SB2 - кнока 2; R1-R8 - активні опори; VD0- VD7 - світлодіоди.
При подачі живлення всі діоди засвічуються і гаснуть з затримкою в 2 секунди. При натисканні кнопки 1 встановлюеться 2 режим роботи і діоди засвічуються в послідовності VD 0, VD 7, VD 1, VD 6, VD 2, VD 5, VD 3, VD 4. При натисканні кнопки 2 встановлюеться 3 режим роботи і діоди засвічуються в зворотній послідовності.
Алгоритм роботи пристрою виведення
сигналізації на лінійку світлодіодів представлений на рис. 2.3.
Рисунок 2.3 Алгоритм роботи пристрою виведення сигналізації на лінійку світлодіод
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,0b11111111portb,r16fffr16,0b00000000portb,r16
Фрагмент програми, який відповідає за перевірку стану кнопки наведений нижче. Считуєм і перевіряєм нульовий розряд, якщо кнопка не натиснута, то програма буде зациклена в даному фрагменті і очікувати зміни положення кнопки. Після нажмання кнопки в PIND буде "0", після чого відбувається перехід на програму індикації.
kn1:
ldi r16,0b00000000portb,r16r17,pindr17,0
Програма індикації "режим 2 " в послідовності вимкнення світлодіодів VD0, VD7, VD1, VD6, VD2, VD5, VD3, VD4.
ind1:
ldi r18,0b10000000portb,r18fffr18,0b00000001portb,r18fffr18,0b01000000portb,r18fffr18,0b00000010portb,r18fffr18,0b00100000portb,r18fffr18,0b00000100portb,r18fffr18,0b00010000portb,r18fffr18,0b0001000portb,r18fffloop
ldi r18,0b0001000portb,r18fffr18, 0b00010000portb,r18fffr18, 0b00000100portb,r18fffr18, 0b00100000portb,r18fffr18, 0b00000010portb,r18fffr18, 0b01000000portb,r18fffr18, 0b00000001portb,r18fffr18, 0b10000000portb,r18fffloop
Програма перевірки та перевірки, яка перевіряє стан кнопки 1 та 2, після якої можна обновити чи перейти на інший режим без закінчення циклу включення діодів
fff:r17,pindr17,0kn1r17,pindr17,1kn2r20, 50r17,pindr17,0kn1r17,pindr17,1kn2r21, 50r17,pindr17,0kn1r17,pindr17,1kn2
4. Розробка програми на мові
програмування C
Для розробки програми на С використаємо IDE CodeVisionAVR.- інтегроване середовище розробки програмного забезпечення для мікроконтролерів сімейства Atmel AVR [18].включає в себе наступні компоненти:
· компілятор С - подібного мови для 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);=0b11111111;_ms(100);=0b00000000;
Цикл, який перевіряє чи нажата кнопка 1 і чи нажата кнопка 2, якщо так, то відбувається одна із програм в циклі, режим 2 чи режим 3
if (PIND.0==1)(PIND.1==1)
Цикл, який перевіряє чи не нажата кнопка 1. Якщо кнопка нажата, то тіло циклу не виконується.
while(PIND.0==0)
Цикл, який перевіряє чи не нажата кнопка 1. Якщо кнопка нажата, то тіло циклу не виконується.
while(PIND.1==0)
Режим 2, який виводиться на світлові діоди.
PORTB=0b01111111;(zatr_perev_kn() == 1)goto label1;if (zatr_perev_kn() == 2)goto label2;=0b00111111(zatr_perev_kn() == 1)goto label1;if (zatr_perev_kn() == 2) goto label2;=0b00011111;(zatr_perev_kn() == 1)goto label1;if (zatr_perev_kn() == 2)goto label2;=0b00001111;(zatr_perev_kn() == 1)goto label1;if (zatr_perev_kn() == 2)goto label2;=0b00000111;(zatr_perev_kn() == 1)goto label1;if (zatr_perev_kn() == 2)goto label2;=0b00000011;(zatr_perev_kn() == 1)goto label1;if (zatr_perev_kn() == 2)goto label2;=0b00000001;(zatr_perev_kn() == 1)goto label1;if (zatr_perev_kn() == 2)goto label2;=0b00000000;(zatr_perev_kn() == 1)goto label1;if (zatr_perev_kn() == 2)goto label2;
Режим 3, який виводиться на світлові діоди.
PORTB=0b01111110;(zatr_perev_kn() == 1)goto label1;if (zatr_perev_kn() == 2)goto label2;=0b00111100;(zatr_perev_kn() == 1)goto label1;if (zatr_perev_kn() == 2)goto label2;=0b00011000;(zatr_perev_kn() == 1)goto label1;if (zatr_perev_kn() == 2)goto label2;=0b00000000;(zatr_perev_kn() == 1)goto label1;if (zatr_perev_kn() == 2)goto label2;=0b00011000;(zatr_perev_kn() == 1)goto label1;if (zatr_perev_kn() == 2)goto label2;=0b00111100;(zatr_perev_kn() == 1)goto label1;if (zatr_perev_kn() == 2)goto label2;=0b01111110;(zatr_perev_kn() == 1)goto label1;if (zatr_perev_kn() == 2)goto label2;=0b11111111;(zatr_perev_kn() == 1)goto label1;if (zatr_perev_kn() == 2)goto label2;
Первірка кнопок і затримка реалізовуеться за допомогою
if (zatr_perev_kn() == 1)goto label1;
else if (zatr_perev_kn() == 2)goto label2;zatr_perev_kn()
{ count;(count=0; count<100; count++)
{_ms(10);(PIND.0 == 1) return 1;if(PIND.1 == 1) return 2;return 0;
}
5. Моделювання в PROTEUS VSM
Для перевірки правильності роботи програми необхідно змоделювати принципову схему, і програма-емулятор Proteus VSM v.7.6 дуже добре підходить. В середовищі Proteus можна моделювати різні принципові схеми, навіть багато каскадні.
Пакет являє собою систему схемотехнічного моделювання, що базується на основі моделей електронних компонентів прийнятих в PSpice. Відмінною рисою пакета PROTEUS VSM є можливість моделювання роботи програмованих пристроїв: мікроконтролерів, мікропроцесорів, DSP і інш.
Бібліотека компонентів містить довідкові дані. Додатково в пакет PROTEUS VSM входить система проектування друкованих плат. Пакет Proteus складається з двох частин, двох підпрограм: ISIS - програма синтезу та моделювання безпосередньо електронних схем і ARES - програма розробки друкованих плат. Разом з програмою встановлюється набір демонстраційних проектів для ознайомлення.
Пакет є комерційним. Безкоштовна ознайомча версія характеризується повною функціональністю, але не має можливості збереження файлів.
Примітною особливістю є те, що в ARES можна побачити 3D -модель друкованої плати, що дозволяє розробнику оцінити свій пристрій ще на стадії розробки.
Перед моделюванням зберемо спрощену
принципову схему роботи мікроконтролера. Для цього запустимо Proteus та
виберемо необхідні для схеми елементи(рис. 5.1): зліва під "картою"
схеми на панелі натискаємо на кнопку "Р" та в з’явившемуся вікні в
області введення набираємо назви елементів на англійській мові й в області
"Results" вибираємо необхідний елемент двічі клацаючи на ньому.
Рисунок 5.1 - Вибір елементів в
Proteus
Вибравши всі потрібні елементи закриваємо вікно "Pick Devices" та складаємо нашу схему. Готова схема представлена на рис. 5.2.
Тепер для того, щоб схема працювала необхідно задати мікроконтролеру hex-файл написаної програми: викликаємо контекстне меню мікроконтролера та вибираємо "Edit Properties" або клацаємо на мікроконтролер та натискаємо комбінацію клавіш "Ctrl+E"; в з’явившемуся вікні вибираємо робочу частоту мікроконтролера(1МГц) та шлях до hex-файлу програми та натискаємо "Ok". Тепер запустимо модуляцію зібраної та запрограмованої схеми, для цього натиснемо на кнопку "Play"