Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЦП та МП лр6 Бег огни (таймер с прерыванием).doc
Скачиваний:
19
Добавлен:
29.08.2019
Размер:
1.93 Mб
Скачать

Створення програми. Використання переривань по таймеру. Постановка завдання

У попередньому прикладі ми використовували таймер для формування затримки, але не використали його головної переваги: ​​здатність викликати переривання. На практиці майже ніколи не роблять подібним чином. Найчастіше в подібних випадках застосовують переривання по таймеру. Це дозволяє більш точно формувати інтервали часу, але головне - дозволяє розвантажити центральний процесор.

Поки таймер формує затримку, програма може виконувати будь-які інші дії. У результаті програму біжучих вогнів можна легко поєднати, наприклад, з програмою генерації звуків. Але не будемо ускладнювати нашу задачу і сформулюємо її наступним чином:

«Створити нову програму «біжучих вогнів» з використанням переривань по таймеру».

Схема

Схему залишимо без змін (див. рис. 6.1).

Алгоритм

Поставлене вище завдання вимагає повної переробки всієї нашої програми. Адже зміниться режим роботи таймера. У даному конкретному випадку найзручніше використовувати режим співпадіння. Точніше, його підрежим «скидання при співпадінні». У цьому режимі таймер сам періодично виробляє запити на переривання з наперед заданим періодом.

Всі функції управління «рухом вогнів» виконує процедура обробки переривання. При кожному виклику переривання процедура виконує здвиг «вогнів» на один крок у потрібному напрямку.

Для того, щоб забезпечити таку ж швидкість руху «вогнів», як у попередньому прикладі, ми повинні використовувати ті ж самі коефіцієнти ділення. Для початку необхідно включити попередній дільник і вибрати для нього коефіцієнт ділення 1/1024.

Другий коефіцієнт розподілу (780) ми поміщаємо в спеціальний системний регістр - регістр співпадіння. Порівняння вмісту лічильного регістру з вмістом регістра співпадіння буде відбуватися на апаратному рівні. У режимі «скидання при співпадінні» таймер працює наступним чином. Відразу після запуску значення лічильного регістра почне збільшуватися. Коли це значення виявиться рівним значенню регістра співпадіння, таймер автоматично скинеться і продовжить роботу з нуля. У момент скидання таймера формується запит на переривання.

Для імітації біжучих вогнів, як і в попередніх прикладах, ми будемо використовувати операції здвигу. При цьому нам також знадобиться спеціальний робочий регістр. Тобто один з регістрів загального призначення, в якому буде зберігатися поточний стан наших «вогнів». На початку програми в робочий регістр необхідно записати початкове значення. Тобто число, один з розрядів якого дорівнює одиниці, а решта - нулю. У результаті операцій здвигу ця одиниця буде переміщатися вправо або вліво, створюючи ефект біжучого вогню. Перевірка стану кнопки і здвиг на один крок буде проводитися при кожному виклику процедури обробки переривання.

Виходячи з вищесказаного, алгоритм роботи програми складається з двох незалежних алгоритмів. По-перше, це алгоритм основної програми, а по-друге, алгоритм процедури обробки переривання. Розглянемо їх по порядку.

Алгоритм основної програми:

1. Налаштувати стек і порти вводу-виводу мікроконтролера;

2. Налаштувати таймер і систему переривань;

3. Записати у робочий регістр початкове значення;

4. Дозволити роботу таймера;

5. Дозволити переривання;

6. Перейти до виконання основного циклу.

Так як всі операції, пов'язані з рухом вогнів, виконує процедура обробки переривань, в основному циклі програми нам нічого робити не потрібно. Для простоти залишимо основний цикл порожнім.

Алгоритм процедури обробки переривання:

1. Перевірити стан перемикача режимів;

2. Якщо контакти перемикача розімкнуті, зробити здвиг всіх розрядів робочого регістра на один розряд вправо. Якщо в результаті цього здвигу одиничний біт вийде за межі байта, створити новий одиничний біт в крайній лівій позиції;

3. Якщо контакти перемикача замкнуті, зробити здвиг всіх розрядів робочого регістра на один розряд вліво. Якщо в результаті цього здвигу одиничний біт вийде за межі байта, створити новий одиничний біт в крайній правій позиції;

4. Вивести вміст робочого регістра в порт РВ, попередньо проінвертувавши його;

5. Закінчити процедуру обробки переривання.