
- •Программирование цифровой техники и микроконтроллеров управления
- •Алматы 2012
- •1 Микроконтроллеры в современном мире
- •1.1 Краткая история развития микроконтроллеров
- •1.2 Задачи и роль микроконтроллеров
- •2 Выполнение арифметических операций в мп
- •2.1 Системы счислений
- •2.2 Двоичная арифметика
- •2.3 Дополнительный код
- •2.4 Знаковый разряд
- •3 Регистры общего и специального назначения
- •3.1 Регистры portc и trisc
- •3.2 Регистр Status
- •3.3 Фиксированная (абсолютная) адресация
- •4 Косвенная адресация. Логика
- •4.1 Косвенная адресация
- •4.2 Логические функции
- •5 Маскирование. Стек
- •5.1 Маскирование
- •5.2 Счетчик команд
- •5.3 Стек
- •6 Конвейер и подпрограмма задержки
- •6.1 Конвейер
- •6.2 Программа задержки
- •6.3 Расчет времени задержки
- •7 Выполнение умножения и деления
- •7.1 Умножение и деление при помощи сдвига
- •7.2 Инструкции условных переходов
- •7.3 Целочисленное умножение
- •7.4 Целочисленное деление
- •7.5 Умножение на дробное число
- •8 Программирование клавиатуры. Дешифратор
- •8.1 Клавиатура
- •8.2 Фрагменты программы
- •8.3 Дешифратор
- •8.4 Компаратор
- •9 Основные элементы цифровой техники
- •9.1 Сумматор
- •9.2 Арифметико-логическое устройство
- •9.3 Бистабильные схемы
- •9.4 Триггеры и регистры
- •10 Структура микроконтроллера. Индикатор
- •10.1 Применение операций сдвига
- •10.2 Цифровой индикатор
- •10.2 Структурная схема мк
- •11 Прерывания и сторожевой таймер
- •11.1 Прерывания
- •11.2 Подсчет посетителей с помощью прерываний
- •11.3 Сторожевой таймер
- •12 Фактор времени и аналоговый мир
- •12.1 Модуль таймера tmr1
- •12.2 Применение таймера tmr1
- •12.3 Аналоговый мир
- •Приложение а Список некоторых сокращений
- •Список литературы
- •Содержание
- •050013, Алматы, Байтурсынова, 126
6 Конвейер и подпрограмма задержки
Цель лекции: объяснить совместный механизм работы счетчика команд, стека, конвейера, основной программы и подпрограмм.
Краткое содержание лекции. Конвейер и его назначение, совместный механизм работы счетчика команд, стека, конвейера, основной программы и подпрограмм. Время выполнения команд. Программа задержки и её расчет.
6.1 Конвейер
Конвейер реализован в виде двух 14-битных регистров. В первом регистре находится команда, только что считанная из памяти программ по адресу, определяемому значением счетчика команд. Второй регистр подключен к дешифратору и соответственно содержит исполняемую в данный момент команду. Такое исполнение позволяет осуществлять выборку команды одновременно с исполнением команды, выбранной в предыдущем цикле. Что ускоряет работу микроконтроллера. Естественно, при этом предполагается, что последовательность выполнения команд имеет линейный характер. В случае команды, выполняющих переход к другому месту памяти программ, команда, находящаяся на вершине конвейера, должна быть заменена другой командой. Это называется сбросом конвейера, сброс увеличивает время исполнения команды на машинный цикл. Как видно из рисунка 6.1, обычно команда выполняется за один машинный цикл.
Рисунок 6.1 - Конвейер
Из рисунка также видно, почему первые три команды в программах пустые (инструкция NOP). В это время в память данных записывается «мусор».
6.2 Программа задержки
Напишем подпрограмму Timer для формирования задержки. Её блок-схема представлена на рисунке 6.2.
Рисунок 6.2 – Блок – схемы подпрограмм задержки
Программное формирование задержки заключается в простом «ничего не делании» в течение требуемого времени. Обычно это реализуется с помощью цикла, в котором заданная константа декрементируется до нуля, как показано на рисунке 6.2 слева.
Выбирая соответствующее значение константы N, можно сформировать задержку определенной длительности. Понятно, что эта задержка будет зависеть от частоты тактового сигнала микроконтроллера. У нас тактовая частота равна 12 МГц, следовательно, длительность машинного цикла, содержащего 4 такта ТМ=4/F=4/(12106) =0,333 мкс.
Фрагмент текста программы:
MOVLW D'N'; аргумент для подпрограммы (для константы Sch_in).
CALL Timer
Timer; подпрограмма Timer. Применен один цикл.
MOVWF Sch_in; устанавливаем значение счетчика равное N.
M_in; метка счетчика.
DECF Sch_in, F; уменьшаем значение счетчика Sch_in на 1.
BTFSS STATUS, Z; если оно равно нулю (Z=1), пропускаем GOTO.
GOTO M_in; срабатывает только при Z=0.
RETURN; конец подпрограммы Timer.
6.3 Расчет времени задержки
Чтобы определить величину задержки Tz, нужно учесть, сколько времени выполняется та или иная команда подпрограммы, и вычислять общее число машинных циклов, которое тратится на выполнение подпрограммы.
Команда CALL Timer, используемая для перехода к подпрограмме, выполняется за два машинных цикла из-за сброса конвейера.
Команда MOVWF Sch_in выполняется за один машинный цикл.
Команды DECF Sch_in, F, декрементирующие содержимое счетчика, затрачивают и в общей сложности N проходов цикла.
Команда BTFSS STATUS, Z, проверяющая состояние флага Z (не стал ли W равен нулю после предыдущего декрементирования?), также выполняется N раз. Однако при последнем проходе происходит выход из цикла за счет пропуска команды перехода, что добавляет один цикл из-за сброса конвейера. Таким образом, общая задержка, вносимая этой командой, составляет N + 1 циклов.
Команда GOTO. Выполняется только N-1 раз, поскольку выход из цикла происходит за счет пропуска команды Goto. Каждое ее выполнение занимает 2 цикла из-за сброса конвейера. Она, таким образом, выполняется 2(N- 1) раз.
Команда RETURN выполняется за 2 цикла.
Подсчет количества циклов приведен в таблице 6.1. Напишем выражение для расчета времени задержки: TZ=ТМ(4+4N)=0,333(4+4N).
Таблица 6.1 - Число циклов выполнения команд
Команда |
Call |
Movwf |
Decf |
Btfss |
Goto |
Return |
Сумма |
Количество циклов |
2 |
1 |
N |
N+1 |
2(N-1) |
2 |
4+4N |
Максимальное значение N может быть только D’255’. При этом получится задержка: TZ=0,333(4+4225)=341 мкс. В действительности максимальная задержка будет при N=0. Рассчитайте её самостоятельно. Поэтому для задержек больше чем 341 мкс, придется создавать дополнительно еще один или два внешних цикла как показано на рисунке 6.2 справа.
Будем приближенно считать, ошибка составит всего 4 ТМ, что внешний цикл кратно увеличивает время задержки. Рассчитаем значение счетчика Sch_out необходимо для получения задержки в 0,05с методом пропорций:
Sch_out=1- - 341 мкс, Sch_out=? - - 50000. Получим Sch_out=147.
Задержку можно увеличить, добавляя в тело цикла команды Nор (нет операции). Каждая команда Nор добавляет один машинный цикл, не влияя при этом на флаги регистра STATUS.
Наша процедура задержки является примером подпрограммы, которая имеет входной параметр W, определяющий время задержки, но она ничего не возвращает в главную программу. Эта подпрограмма просто выполняет свою задачу, заключающуюся в формировании задержки, а также изменяет регистры данных, рабочий регистр и некоторые флаги регистра Status.