ли таймер для формування затримки) але не використали його головної переваги: ​​здатності викликати переривання. На практиці подібним чином майже ніколи не надходять. Частіше всією в подібних випадках застосовують переривання за таймером. Це дозволяє більш точно формувати інтервали часу, але головне - дозволяє розвантажити центральний процесор. p align="justify"> Поки таймер формує затримку, програма може виконувати будь-які інші дії. У результаті програму біжать вогнів можна легко поєднати, наприклад, з програмою генерації звуків. Але не будемо ускладнювати нашу задачу і сформулюємо її наступним чином:
Створити нову програму В«біжать вогнівВ» з використанням переривань за таймером.
5.5 Схема
Схему залишимо без змін.
Алгоритм
Поставлена ​​вище завдання зажадає повної переробки всієї нашої програми.
Адже зміниться режим роботи таймера. У даному конкретному випадку найзручніше використовувати режим збіги. Точніше, його потримаємо В«скидання при збігуВ». У цьому режимі таймер сам періодично виробляє запити на переривання з наперед заданим періодом. p align="justify"> Всі функції управління В«рухом вогнівВ» виконує процедура обробки переривання. При кожному виклику переривання процедура виробляє зрушення В«вогнівВ» на один крок у потрібному напрямку. p align="justify"> Для того, щоб забезпечити таку ж швидкість руху В«вогнівВ», як у попередньому прикладі, ми повинні використовувати ті ж самі коефіцієнти розподілу. Для початку необхідно включити попередній дільник і вибрати для нього коефіцієнт ділення 1/1024. p align="justify"> Другий коефіцієнт ділення (780) ми поміщаємо в спеціальний системний регістр - регістр збіги. Порівняння вмісту рахункового регістра з вмістом регістра збігу відбуватиметься на апаратному рівні. У режимі В«скидання при збігуВ» таймер працює таким чином. Відразу після запуску значення рахункового регістра почне збільшуватися. Коли це значення виявиться рівним значенню регістра збігу, таймер автоматично скинеться і продовжить роботу з нуля. У момент скидання таймера формується запит на переривання. p align="justify"> Для імітації біжать вогнів, як і в попередніх прикладах, ми будемо використовувати операції зсуву. При цьому нам також знадобиться спеціальний робочий регістр. Тобто один з регістрів загального призначення, в якому буде зберігатися поточний стан наших В«вогнівВ». На початку програми в робочий регістр необхідно записати початкове значення. Тобто число, один з розрядів якого дорівнює одиниці, а решта - нулю. У результаті операцій зсуву ця одиниця буде переміщатися вправо або вліво, створюючи ефект біжить вогню. Перевірка стану кнопки і зрушення на один крок буде проводитися при кожному виклику процедури обробки переривання. Виходячи з вищесказаного, алгоритм роботи програми складається з двох незалежних алгоритмів. По-перше, це алгоритм основної програми, а по-друге, алгоритм процедури обробки переривання. Розглянемо їх по порядку. p align="justify"> Алгоритм основної програми:
Налаштувати стек і порти введення-виведення мікроконтролера.
Налаштувати таймер і систему переривань.
Записати в робочий регістр початкове значення.
Дозволити роботу таймера.
Дозволити переривання.
Перейти до виконання основного циклу.
Так як всі операції, пов'язані з рухом вогнів, виконує процедура обробки переривань, в основному циклі програми нам нічого робити не потрібно. Для простоти залишимо основний цикл порожнім. p align="justify"> Алгоритм процедури обробки переривання:
Перевірити стан перемикача режимів.
Якщо контакти перемикача розімкнуті, справити зсув всіх розрядів робочого регістра на один розряд вправо. Якщо в результаті цього зсуву одиничний біт вийде за межі байта, створити новий одиничний біт в крайній лівій позиції.
Якщо контакти перемикача замкнуті, справити зсув всіх розрядів робочого регістра на один розряд вліво. Якщо в результаті цього зсуву одиничний біт вийде за межі байта, створити новий одиничний біт в крайній правій позиції.
Вивести вміст робочого регістра в порт РВ, попередньо проінвертірованний його.
Закінчити процедуру обробки переривання. Перейти до виконання основного алгоритму.
6. Лабораторна № 6
.1 Формування звуку
Постановка завдання
...