- •Лабораторна робота №6 Дослідження режиму переривання в мікроконтролерах
- •Теорія по структурі мп та перериванням
- •1.2. Відмінні риси.
- •1.3. Характеристики процесора.
- •1.4. Характеристики підсистеми вводу/виводу.
- •1.5. Периферійні пристрої.
- •1.6. Архітектура ядра.
- •1.7. Розміщення та опис виводів.
- •2. Архітектура мікроконтролерів aTmega8.
- •2.1. Загальні відомості.
- •2.2. Організація пам'яті
- •2.3. Регістри вводу/виводу.
- •3. Переривання.
- •3.1. Загальні відомості.
- •3.2. Таблиця векторів переривань.
- •3.3. Обробка переривань.
- •4. Регістри портів вводу/виводу.
- •Створення програми. Використання переривань по таймеру. Постановка завдання
- •Алгоритм
- •Програма на Асемблері
- •Опис програми (лістинг 6.1)
- •2.4. Порядок виконання роботи
- •1.6. Контрольні тестові питання.
- •Литература
Створення програми. Використання переривань по таймеру. Постановка завдання
У попередньому прикладі ми використовували таймер для формування затримки, але не використали його головної переваги: здатність викликати переривання. На практиці майже ніколи не роблять подібним чином. Найчастіше в подібних випадках застосовують переривання по таймеру. Це дозволяє більш точно формувати інтервали часу, але головне - дозволяє розвантажити центральний процесор.
Поки таймер формує затримку, програма може виконувати будь-які інші дії. У результаті програму біжучих вогнів можна легко поєднати, наприклад, з програмою генерації звуків. Але не будемо ускладнювати нашу задачу і сформулюємо її наступним чином:
«Створити нову програму «біжучих вогнів» з використанням переривань по таймеру».
Схема
Схему залишимо без змін (див. рис. 6.1).
Алгоритм
Поставлене вище завдання вимагає повної переробки всієї нашої програми. Адже зміниться режим роботи таймера. У даному конкретному випадку найзручніше використовувати режим співпадіння. Точніше, його підрежим «скидання при співпадінні». У цьому режимі таймер сам періодично виробляє запити на переривання з наперед заданим періодом.
Всі функції управління «рухом вогнів» виконує процедура обробки переривання. При кожному виклику переривання процедура виконує здвиг «вогнів» на один крок у потрібному напрямку.
Для того, щоб забезпечити таку ж швидкість руху «вогнів», як у попередньому прикладі, ми повинні використовувати ті ж самі коефіцієнти ділення. Для початку необхідно включити попередній дільник і вибрати для нього коефіцієнт ділення 1/1024.
Другий коефіцієнт розподілу (780) ми поміщаємо в спеціальний системний регістр - регістр співпадіння. Порівняння вмісту лічильного регістру з вмістом регістра співпадіння буде відбуватися на апаратному рівні. У режимі «скидання при співпадінні» таймер працює наступним чином. Відразу після запуску значення лічильного регістра почне збільшуватися. Коли це значення виявиться рівним значенню регістра співпадіння, таймер автоматично скинеться і продовжить роботу з нуля. У момент скидання таймера формується запит на переривання.
Для імітації біжучих вогнів, як і в попередніх прикладах, ми будемо використовувати операції здвигу. При цьому нам також знадобиться спеціальний робочий регістр. Тобто один з регістрів загального призначення, в якому буде зберігатися поточний стан наших «вогнів». На початку програми в робочий регістр необхідно записати початкове значення. Тобто число, один з розрядів якого дорівнює одиниці, а решта - нулю. У результаті операцій здвигу ця одиниця буде переміщатися вправо або вліво, створюючи ефект біжучого вогню. Перевірка стану кнопки і здвиг на один крок буде проводитися при кожному виклику процедури обробки переривання.
Виходячи з вищесказаного, алгоритм роботи програми складається з двох незалежних алгоритмів. По-перше, це алгоритм основної програми, а по-друге, алгоритм процедури обробки переривання. Розглянемо їх по порядку.
Алгоритм основної програми:
1. Налаштувати стек і порти вводу-виводу мікроконтролера;
2. Налаштувати таймер і систему переривань;
3. Записати у робочий регістр початкове значення;
4. Дозволити роботу таймера;
5. Дозволити переривання;
6. Перейти до виконання основного циклу.
Так як всі операції, пов'язані з рухом вогнів, виконує процедура обробки переривань, в основному циклі програми нам нічого робити не потрібно. Для простоти залишимо основний цикл порожнім.
Алгоритм процедури обробки переривання:
1. Перевірити стан перемикача режимів;
2. Якщо контакти перемикача розімкнуті, зробити здвиг всіх розрядів робочого регістра на один розряд вправо. Якщо в результаті цього здвигу одиничний біт вийде за межі байта, створити новий одиничний біт в крайній лівій позиції;
3. Якщо контакти перемикача замкнуті, зробити здвиг всіх розрядів робочого регістра на один розряд вліво. Якщо в результаті цього здвигу одиничний біт вийде за межі байта, створити новий одиничний біт в крайній правій позиції;
4. Вивести вміст робочого регістра в порт РВ, попередньо проінвертувавши його;
5. Закінчити процедуру обробки переривання.