Читайте также:
|
|
Временные интервалы в пределах нескольких тактов организуются с помощью команд NOP. По этой команде не выполняется никакой операции, но время выполнения этой команды составляет 1 такт (период частоты) тактового генератора микроконтроллера.
Для формирования больших временных интервалов используются программные циклы. Временная задержка с использованием программных циклов осуществляется загрузкой соответствующего значения в регистр и цикл, в котором производится вычитание 1 из содержимого регистра и переход на эту же команду, если содержимое регистра не равно нулю. При использовании регистра R16, процедура имеет вид:
LDI R16, X; Х – число, определяющ. длит.задержки
LOOP: DEC R16; R16 -1 и может установиться флаг нуля; (Z)
BRNE LOOP; если Z=0 (регистр не пуст), то переход.
;иначе будет выполн. следующая команда
Время выполнения команд:
LDI – 1 такт,
DEC – 1 такт,
BRNE LOOP – 2 такта при переходе и 1 такт в последнем цикле.
Длительность каждого цикла, кроме последнего, составляет 3 такта (один такт команды DEC и два такта команды BRNE). Длительность последнего цикла составляет два такта, так как в нем команда BRNE выполняется за один такт (из памяти уже считана последующая команда).
Получим формулу длительности задержки в тактах:
N = 1+3*(X-1)+1+1, или N = 3X, тактов (2)
Если задержка выполнена в виде подпрограммы, то, учитывая время выполнения команды вызова подпрограммы RCALL (3 такта) и возврата из подпрограммы RET(4 такта), получим формулу для временного интервала в тактах:
N = 3*X+7, тактов. (3)
Из этой формулы может быть определено значение X.
Так как максимальное значение в регистре равно 255, то максимальная задержка составляет 3*255 + 7 = 772 такта.
Пример1 Рассчитать значение константы задержки Х для формирования временного интервала в тактах N = 402.
Подставляем в формулу: N = 3*X+7. 402=3*Х+7 или 395=3*Х.
Так как 395 не делится в целое число раз на 3, то выбираем ближайшее целое, чтобы получилось деление без остатка.
393 = 3*Х. Отсюда: Х=131.
Так как было произведено уменьшение, то очевидно что время задержки уменьшится на 2 такта. Для получения заданного значения временного интервала необходимо добавить две команды NOP. Подпрограмма задержки (имя которой DELAY) будет иметь вид:
DELAY: LDI R16, 131; 131– число, определяющ. длит.задержки
LOOP: DEC R16; R16 -1 и может устанавиться флаг нуля Z
BRNE LOOP; если Z=0 (регистр не пуст), то переход,
;иначе выполн. следующ. команда
NOP
NOP
RET;Выход из подпрогр. задержки
Для задержек больше 772 тактов используется процедура вложенных циклов. При использовании регистров R16 и R17 подпрограмма имеет вид:
DELAY: LDI R16, Y;Y –число внешних циклов
EXT_L: LDI R17, X;Х – число внутренних циклов
INT_L: DEC R17;
BRNE INT_L; внутренний цикл.
DEC R16;
BRNE EXT_L; внешний цикл.
RET
Сначала выполняется внутренний цикл циклическим уменьшением содержимого регистра R17. При обнулении регистра R17, происходит уменьшение содержимого регистра внешнего цикл R16 на 1. Если его содержимое не равно 0 (команда BRNE, EXT_L), то выполняется переход по метке EXT_L и снова выполняется внутренний цикл.
Если процедура является подпрограммой, то длительность задержки в тактах рассчитывается по формуле:
N = (3*X+3)*Y+7, тактов. (4)
(Число 3 – время выполнения команд BRNE EXT_L и LDI R17, X ).
Из этой формулы могут быть определены значения X и Y.
Максимальная задержка составляет (3*255 + 3)*255+7 = 195847 тактов.
Для получения задержек больших по величине используют циклы двойной, тройной и т.д. вложенности. При использовании циклов двойной вложенности длительность задержки в тактах вычисляется по формуле:
N = [ (3*X+3)*Y+3]*Z + 7. (5)
Пример 2 Рассчитать значение констант X и Y для получения временной задержки равной 103 мкс, если тактовая частота микроконтроллера равна 16мГц.
Время задержки в тактах:
N = tsek*Fтакт = 103*10-6*16*106 = 1648 тактов.
Для получения такой задержки требуется процедура с вложенными циклами.
Подставляем в формулу значения:
N = (3*X+3)*Y+7; 1648=(3*Х+3)*Y+7, или 1641=(3*Х+3)*Y.
Уменьшаем N на единицу 1640=(3*Х+3)*Y, тогда можно взять Y=10.
Далее: 1640=(3*Х+3)*10. → 164=3*Х+3 → 161=3*Х.
Выбираем ближайшее целое (на два меньшее) 159=3*Х → Х=53.
При таких заменах время задержки не будет равно заданному. Поэтому во внешний цикл необходимо вставить команду NOP, а за пределами циклов вставить две команды NOP, т.е. получится фактически формула
N = (3*X+3+2)*Y+7+1.
Подставив в нее значения Х и Y получим N равное 1648.
Текст подпрограммы для примера:
DELAY: LDI R16, 10;Загрузка в R16 константы внешнего цикла
EXT_L: LDI R17, 53;Загрузка в R17 константы внутреннего цикла
INT_L: DEC R17; Уменьшение на 1 значения в R17
BRNE INT_L; Если R17 ≠ 0, то переход на команду по метке
;иначе будет выполняться следующ. команда
NOP
DEC R16; Уменьшение на 1 значения в R16
BRNE EXT_L; Если R16 ≠ 0, то переход на команду по метке
;иначе будет выполняться следующ. команда
NOP
NOP
RET
При необходимости уменьшения значения на значительную величину Nд (использование значительного числа команд NOP) рекомендуется вместо команд NOP добавить в подпрограмму задержки одиночный цикл со значением, рассчитанным по формуле: Nд=3X.
Недостатком формирования временных интервалов программным способом является не выполнение требований к основным функциям микроконтроллера: измерение параметров, обработка данных и формирование сигналов управления. В приведенных примерах микроконтроллер выполняет функцию двоичного счетчика.
Дата добавления: 2015-07-20; просмотров: 446 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Оператор цикла for | | | Программный способ формирования временных интервалов на языке СИ |