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
   253   254   255   256   257   258   259   260   261   262   263