ідпрограми обслуговування
; переривання INT, якщо біт A.3 дорівнює 1
JMP M1; перехід, якщо біт A.3 НЕ дорівнює 1
...;
INT: STOP TCNT; останов таймера
JMP 07; перехід до осередку 7 (вектор переривання
; від лічильника подій)
Приклад 4.3 . Програмне формування тимчасової затримки. Припустимо, що в керуючій програмі необхідно реалізувати тимчасову затримку 100 мкс. Підпрограма формування тимчасової затримки буде мати вигляд:
DELAY: MOV R2, # X; (R2) в†ђ X
COUNT: DJNZ R2, COUNT; декремент R2 і цикл, якщо не нуль
RET; повернення
Для отримання необхідної тимчасової затримки необхідно визначити число X, завантажуване в робочий регістр. Визначення числа X виконується на основі розрахунку часу виконання команд, утворюють дану підпрограму. При цьому необхідно враховувати, що команди MOV і RET виконуються одноразово, а число повторень команди DJNZ дорівнює числу X. Крім того, звернення до підпрограмі тимчасової затримки здійснюється по команді CALL DELAY, час виконання якій також необхідно враховувати при підрахунку тимчасової затримки. В описі команд мікроконтролера вказується, за скільки машинних циклів (МЦ) виповнюється кожна команда. На підставі цих даних визначається сумарний число машинних циклів у підпрограмі: CALL - 2 МЦ, MOV - 2 МЦ, DJNZ - 2 МЦ, RET - 2 МЦ.
При тактовою частоті 6 МГц кожен машинних цикл виконується за 2,5 мкс. Таким чином, підпрограма виконується за час 5 +5 +5 X +5 = 15 +5 X мкс. Для реалізації тимчасової затримки 100 мкс число X = (100-15)/5 = 17.
Приклад 4.4 . Тимчасова затримка великої тривалості. В якості прикладу розглянемо підпрограму, що реалізовує тимчасову затримку 100 мс:
DELAY: MOV R1, # 84; завантаження X
LOOPEX: MOV R2, # 236; завантаження Y
LOOPIN: DJNZ R2, LOOPIN; декремент R2 і внутрішній цикл,
; якщо R2 не дорівнює нулю
DJNZ R1, LOOPEX; декремент R1 і зовнішній цикл,
; якщо R1 не дорівнює нулю
MOV R3, # 4; точна підстроювання тимчасової затримки
LOOPAD: DJNZ R3, LOOPAD;
RET;
Числа X і Y вибираються з співвідношення T = 5 +5 + X (5 +5 Y +5) +5, де T - реалізований тимчасової інтервал у мікросекундах. Максимальний часовий інтервал, реалізований таким чином, при X = Y = 255 становить 327,69 мс, тобто приблизно 0,3 с.
У прикладі два вкладених циклу реалізують тимчасову затримку тривалістю 15 +84 (10 +5 * 236) = 99975 мкс, а додатковий цикл LOOPAD реалізує затримку 25 мкс і тим самим забезпечує точне підстроювання тимчасового інтервалу.
Тимчасова затримка тривалістю 1 с. Секунда є дуже великим інтервалом часу в порівнянні з частотою тактирования мікроконтролера. Такі затримки складно реалізувати методом вкладених циклів, тому їх зазвичай набирають з точно підстроєних затримок меншою тривалості. Наприклад, затримку в 1 с можна реалізувати десятикратним викликом підпрограми, що реалізує затримку 100 мс:
ONESEC: MOV R3, # 10; завантаження в R3 числа викликів
; підпрограми DELAY
LOOP: CALL DELAY; затримка 100 мс
DJNZ R3, LOOP; декремент R3 і цикл, якщо R3 не дорівнює 0
Похибка програми становить 55 мкс.
Приклад 4.5 . Формування тимчасової затримки на основі таймерів. Недоліком програмної реалізації тимчасової затримки є нераціональне використання ресурсів мікроконтролера: під час формування затримки мікроконтролер практично простоює, оскільки не може вирішувати завдання управління об'єктом. У той же час апаратурні засоби мікроконтролера дозволяють реалізувати тимчасові затримки на тлі основної програми роботи.
При використанні таймера в МК48 можна отримати тимчасові затримки тривалістю від 80 мкс до 20 мс. p> Наприклад, для реалізації тимчасової затримки 240 мкс необхідно виконати наступні дії:
MOV A, # NOT (240/80-1); завантаження таймера
MOV T, A;
STRT T; запуск таймера
EN TCNTI; дозвіл переривання
Поява сигналу переривання від таймера відповідає закінченню тимчасового інтервалу 240 мкс. Похибка становитиме 7,5 мкс (час виконання команди передачі управління по вектору переривання і команди STOP TCNT).
Висновок: вивчив структурну схему однокристального мікроконтролера ВЕ48, його центральний процесор, організацію пам'яті програм і даних, засоби розширення пам'яті програм і даних; розглянув систему команд з пересилання та обробці даних; ознайомився з наведеними нижче прикладами програм мовою асемблера; справив введення, налагодження і трансляцію в об'єктний код цих програм; виконав програми по кроках з переглядом результатів виконання в регістрах і оперативної пам'яті.