Белов, А.В. Микроконтроллеры 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) — восстанавливается. Подобный прием придает программе одно полезное свойство. После окончания работы подпрограммы значения всех регистров микроконтрол лера остается без изменений. В данном конкретном случае такое свойство ничего не дает, кроме, разве что, дополнительной задержки. Однако в сложных программах, имеющих не одну, а несколько подпрограмм, одни и те же регистры удобно использовать в разных подпрограммах. Те же самые регистры может использовать и основная программа. В этом случае описанное выше полезное свойство просто необходимо для правильной работы всей программы. Зная эту особенность, програм
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==