Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств

Шаг 5. Переходим непосредственно к разработке устройств и программ 211 выполнения пустого цикла. Сначала в регистр loop записывается некое начальное значение (строка 33). В нашем случае оно равно 200. Затем начинается цикл, который постепенно уменьшает значение регистра loop до нуля (строки 34 и 35). Происходит это следующим образом. В строке 34 содержимое регистра уменьшается на единицу, а в строке 35 происходит проверка содержимого на ноль. Если ноль не достигнут, то управление передается по метке wtl, и цикл повторяется. Когда же содержимое loop кажется равным нулю, очередного перехода не произойдет, и цикл задержки закончится. Очевидно, что в нашем случае цикл задержки выполнится 200 раз. Если обратиться к приложению, то можно узнать, что команда dec выполняется за один такт системного генератора. Команда brne выпол ­ няется: за один такт, если не вызывает перехода; за два такта, если вызы ­ вает переход. Поэтому один цикл задержки будет выполняться за 3 такта. Двести циклов за 3x200=600 тактов. Тактовая частота кварцевого резонатора у нас равна 4 МГц. Длительность одного колебания тактовой частоты равна 1/4 = 0,25 мкс. Поэтому время, за которое будут выполнены все 200 циклов задержки, равно 600x0,25=150 мкс. Добавьте сюда время выпол ­ нения остальных команд подпрограммы, включая команду вызова под ­ программы и команду возврата из подпрограммы, и вы получите общее время задержки (162 мкс). Максимальная задержка, которую можно сформировать при помощи данной подпрограммы, равна (255x3x0, 25)+12=203, 25 мкс. Учтите, что в нашем случае не применяется предварительное деление частоты такто ­ вого генератора. Если это было бы не так, то длительность выполнения каждой команды нужно было бы умножать на коэффициент деления предварительного делителя. Теперь вернемся к двум командам работы со стеком, которые мы не стали рассматривать вначале. Они предназначены для сохранения в стеке и последующего восстановления содержимого регистра loop. В начале подпрограммы (строке 32) значение loop сохраняется, а перед выходом их подпрограммы (строка 36) — восстанавливается. Подобный прием придает программе одно полезное свойство. После окончания работы подпрограммы значения всех регистров микроконтрол ­ лера остается без изменений. В данном конкретном случае такое свойство ничего не дает, кроме, разве что, дополнительной задержки. Однако в сложных программах, имеющих не одну, а несколько подпрограмм, одни и те же регистры удобно использовать в разных подпрограммах. Те же самые регистры может использовать и основная программа. В этом случае описанное выше полезное свойство просто необходимо для правильной работы всей программы. Зная эту особенность, програм ­

RkJQdWJsaXNoZXIy MTExODQxMg==