Page 258 - 4503
P. 258
Рисунок 8.6 — Формування затримки з допомогою циклу
Для визначення кількості циклів, а значить величини N,
потрібно оцінити кількість часу котрий припадає на ту чи
іншу команду даної програми:
1. Команада call DELAY_1MS використовується для
переходу до підпрограми і триває два машинних цикла, а
-6
значить — 2 мікросекунди (2 мкс = 2·10 с).
2. Команда movlw N, що передує входу у цикл
виконується за один машинний цикл, а значить триває 1 мкс.
3. Команда addlw–1, що декрементує вміст робочого
регістру в цілому триває N проходів по циклу, тобто N мкс.
4. Команда btfss STATUS,Z, котра перевіряє стан
ознаки Z (чи не став нульовим вміст робочого регістра після
попереднього декрементування) також виконується N разів.
Однак при останньому проході відбувається вихід з циклу
через пропуску команди переходу, що додає 1 до часу
виконання через скидання конвеєра. Отже, загальна затримка,
що вноситься цією командою складає N + 1 циклів.
5. Оскільки вихід із циклу відбувається через пропуск
команди goto D_LOOP, тому вона виконується N – 1 разів
кожний з яких займає 2 мкс, а значить загальний вклад цієї
команди на тривалість затримки складає 2(N - 1).
Отже, заключна команда return триває 2 мкс.
Отже загальна кількість машинних циклів цієї
підпрограми обчислятимемо за такою схемою:
2(call) + 1(movlw) + N (addlw) + (N+1) (btfss) +
2(N-1) (goto) + 2(return)
Нагадаємо, що програма, за задумом має тривати 1000
мкс (1мс). Тож прирівняємо суму отриманих коефіцієнтів до
1000:
2+1+ N + (N+1) + 2(N-1) + 2 = 1000
4 + 4 N = 1000
258