Задержки в программе и их расчётЗадержка – это сегмент программы, который ничего не делает, но обеспечивающий временной простой в ходе выполнения программы на определенное время. Разберем классический пример, обеспечивающий задержку на 10 машинных циклов (10 мкс):
Reg_1 equ H0010
;...
movlw .3
movwf Reg_1
wr decfsz Reg_1, 1
goto wr
1я строчка – определяем в "шапке" адрес регистра под число.
2я – записываем число 3 в аккумулятор W.
3я – копируем из аккумулятора в Reg_1.
Это были подготовительные моменты. Далее собственно сама задержка.
4я строчка – уменьшить Reg_1 на единицу и результат сохранить Reg_1.
5я строчка – переход по метке wr на четвертую строчку.
Очевидно, что 4я и 5я строчка в цикле выполнятся 2 раза. Тогда где обещанные 10 машинных циклов? Дело в том, что команды, связанные с переходами на другие команды, выполняются за 2 машинных цикла. Теперь всё сходится.
А если нам надо обеспечить задержку не в 10 мкс, а 11 мкс? Тогда достаточно в самом конце кода дописать строчку с командой NOP (пустышка), которая как и большинство команд выполняется за 1 мкс.
А как быть если нам нужна задержка для мигалки на 0,5 сек или на 1 сек? Тогда нам надо написать код, который будет занимать 500000 и, соответственно, 1000000 машинных циклов. И это очень просто. Скачиваем программу Pause_2, которая выдаёт код по заданному количеству машинных циклов.
|