Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

Глава 6. Основы программирования МКАVR Delay : dec RazrO brne Delay dec Razrl brne Delay <все равны О - конец задержки> 151 Обратите внимание, что при использовании команды dec никаких дополнительных команд сравнения при достижении нуля не требуется (подробно об этом будет рас­ сказано в следующей главе). Некрасивость приведенного решения заключается в наличии команд перехода, которые выполняются за один такт, если условие (в нашем случае равенство нулю) не выполняется, и за два такта, если оно выпол­ няется. К тому же число циклов в каждой итерации, вообще говоря, разное . Поэто­ му точно подсчитать число циклов становится достаточно сложно. Это хорошо, что в этой нашей задаче необязательно выдерживать точный интервал, а если надо? Значительно более компактной и предсказуемой будет реализация алгоритма на основе команды вычитания с учетом переноса (листинг 6 . 1 4) . Delay : suЬi RazrO , 1 sbci Razrl , O ; sbci Razr2 , 0 - если потребуется 3-й регистр brcc Delay Работает это так: команда sbci вычитает сразу две величины: то, что записано в самой команде, плюс флаг переноса с. Если результат предыдущего вычитания устанавливает флаг переноса (что происходит при переходе через ноль, когда из ноля вычитается единица), то команда sbci вычтет его значение, равное единице, если нет, то не вычтет ничего (точнее, вычтет ноль). В результате в каждой итера­ ции выполняется строго определенное число команд и за строго определенное вре­ мя: по одному такту на каждое вычитание, плюс два такта на переход обратно к началу цикла (для команды ьrсс условие перехода выполняется, если флаг пере­ носа не установлен), - всего при двух регистрах четыре такта. (Для особо въедли­ вых отметим, что самый последний цикл будет на один такт короче) . Итак, для того чтобы получить ровно 1 00 ООО тактов, нам нужно записать в регист­ ры Raz r2 - RazrO число 1 00 00014 = 25 ООО, или $ 61А8 . Это даст интервал в 0, 1 с при тактовой частоте 1 МГц. Можно считать и иначе : одно вычитание происходит за четыре такта, что равносильно снижению тактовой частоты вчетверо, до 250 кГц. 1 секунда будет тогда равносильна 250 тыс . таких суммарных тактов, а О, 1 секун­ ды - 25 тысячам. В общем случае число N, соответствующее нужному интервалу времени Т (с) при тактовой частоте f.raкr (Гц), можно получить по формуле N = Т f.raid(r + 2), где r -

RkJQdWJsaXNoZXIy MTExODQxMg==