астільки велика, що ми б не побачили руху вогнів. З точки зору спостерігача мерехтіння вогнів виглядало б як слабке світіння всіх світлодіодів.
Зрушити вміст робочого регістра вправо (вліво) на один розряд.
Перевірити, чи не закінчився чи повний цикл зсуву (8 кроків).
Якщо повний цикл зсуву не закінчений, перейти до пункту 2 даного алгоритму. Це призведе до того, що пункти 2, 3, 4, 5 і 6 повторяться 8 разів, і лише потім завершиться повний цикл зсуву.
5. Лабораторна № 5
.1 Використання таймера
Постановка завдання
У попередніх прикладах для формування затримки ми використовували один або кілька вкладених програмних циклів. Однак такий спосіб прийнятний далеко не завжди. Головний недолік подібного методу полягає в тому, що він повністю завантажує центральний процесор. Поки мікроконтролер зайнятий формуванням затримки, він не може виконувати ніяких інших завдань. p align="justify"> Ще один недолік - неможливо з достатньою точністю вибрати час затримки. Набагато кращі результати дає інший спосіб - формування інтервалів часу за допомогою одного з вбудованих таймерів/лічильників мікроконтролера. Будь-який з таймерів/лічильників може працювати як з використанням переривань, так і без переривань. Далі ми розглянемо обидва ці варіанти. І почнемо ми з простішого випадку. p align="justify"> Отже, заново сформулюємо нашу задачу:
Доопрацювати програму В«Ті, що біжать вогніВ», змінивши процедуру формування затримки. Нова процедура повинна використовувати один з внутрішніх таймерів/лічильників і не використовувати переривання. br/>
5.2 Схема
Так як ми розробляємо не самостійне пристрій, а лише вдосконалимо керуючу програму, то схема пристрою не змінюється.
5.3 Алгоритм
Як відомо, в мікроконтролері ATtiny2313 є два вбудованих таймера-лічильника. Тому спочатку нам потрібно вибрати, який з них ми будемо використовувати. Виходити будемо з заданого часу затримки 200 мс. Як відомо, для формування тимчасових інтервалів таймер/лічильник просто підраховує тактові імпульси від системного генератора. p align="justify"> Частота сигналу цього генератора в нашому випадку дорівнює 4 МГц. А період імпульсів 1/4 = 0,25 мкс. Для того, щоб отримати на виході 200 мс, необхідно мати коефіцієнт розподілу, рівний 200 * 103/0, 25 * 106 = 800 * 103 (вісімсот тисяч разів). p align="justify"> Мікросхема ATtiny2313 містить два таймера. Один восьмизарядний і один шестнадцатіразрядний. Восьмизарядний таймер має максимальний коефіцієнт перерахунку 28 = 256, а шестнадцатіразрядний - 216 = 65536. Тобто навіть шестнадцатіразрядного таймера нам не вистачить для формування необхідної затримки. Доведеться скористатися попередніми дільником. Цей дільник виробляє попереднє поділ тактового сигналу перед тим, як той надійде на вхід таймера/лічильника. p align="justify"> Програмним шляхом можна вибрати один з чотирьох фіксованих коефіцієнтів розподілу (див. додаток). Виберемо найбільший можливий коефіцієнт ділення предделітеля (1024). Тоді на його виході ми отримаємо сигнал з частотою 4-106/1024 = 3906 Гц. Період такого сигналу буде дорівнює 1/3906 = 0,256-10 "3 с або 0,256 мс. Саме цей сигнал надходить на вхід нашого таймера, який забезпечує остаточне поділ. Порахуємо коефіцієнт ділення, який наш таймер повинен нам забезпечити: 200/0, 256 ~ 780. Такий коефіцієнт перерахунку нам може забезпечити тільки таймер Т1. p align="justify"> Отже, ми визначилися як з вибором таймера, так і з його налаштуваннями. Тепер можна приступати до створення нової підпрограми затримки. Перш, ніж це зробити, спробуємо описати алгоритм її роботи. Даний алгоритм припускає, що всі необхідні налаштування таймера попереднього дільника зроблені до першого виклику підпрограми, таймер запущений і перебуває в режимі безперервного рахунку. Алгоритм підпрограми затримки представлений нижче. ol>
Записати в рахунковий регістр таймера Т1 нульове значення.
Почати цикл перевірки вмісту рахункового регістра. У тілі циклу програма повинна багаторазово зчитувати вміст рахункового регістра таймера і перевіряти, чи не чи досягло воно свого кінцевого значення (тобто значення 780).
При досягненні рахунковим регістром кінцевого значення, завершити цикл перевірки.
Вийти з підпрограми затримки.
5.4 Використання переривань за таймером
Постановка завдання
У попередньому прикладі ми використовува...