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

Глава 1 б. Некоторые Аrdиiпо-задачи на ассемблере 427 мой нам широтно-импульсной модуляции (ШИМ) с фиксированной на уровне 50 Гц несущей частотой . На этом принципе основана Аrduinо-библиотека Servo . h, общая для разных моделей серводвигателей. Единственная функция этой библио­ теки : servo . write ( <угол поворота> ) - использует ШИМ от Timer l , и устроена так, что с ее помощью можно управлять аж 1 2-ю серводвигателями, подключенными к разным выводам. Мы не будем связываться с ШИМ, а упростим себе задачу: сформируем нужные длительности с помощью задержек. Задержки будем вычислять, исходя из заданно­ го угла. Согласно приведенным ранее правилам, длительность Т с углом поворота d будет связана соотношением Т = 500 + d· 1 000190 = 500 + 1 1 , 1 ·d. Чтобы не терять в точности при вычислениях по этой формуле, мы умножим коэффициент 1 1 , 1 на 1 6 (получив число 1 78) и результат умножения будем делить на 1 6, сдвигая на 4 раз­ ряда вправо. Алгоритм формирования импульса приведен в листинге 1 6 . 1 . ; в temp угол поворота градУсов ldi Razr0 , 1 7 8 ; ( 2500-500 ) / 1 8 0 = 1 7 8 коэффициент пересчета rcall mp8x8u ; умножение temp на RazrO ; результат в Razrl : RazrO делим на 16 - 4 сдвига вправо l s r Razrl ror RazrO l s r Razrl ror RazrO l sr Razrl ror RazrO l sr Razrl ror RazrO ; добавляем 500 subi Razr O , Low ( -5 0 0 ) sbci Razr l , High ( -5 0 0 ) ; в Razrl : RazrO - длительность в микросекундах sbi PortD , 6 ; PD6 в 1 impuls : ; формируем импуль с длит Razrl : RazrO микросекунд suЬi Raz rO , l sbci Razrl , O brcc impuls cbi PortD , 6 ; PD6 в О suЬi Raz rO , l Приведенный алгоритм ссылается на универсальную процедуру перемножения двух байтов (с 1 6-битовым результатом) mp8x8u, которую мы ранее не использова­ ли, а только упоминали в главе 8. Процедура в программе (см. далее) напрямую за­ имствована из «аппнотьш 200, изменены только имена регистров . Конечно, в Mega

RkJQdWJsaXNoZXIy MTExODQxMg==