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

Глава б. Основы программирования МКАVR 121 Форма написания ( jmp или rjmp) зависит от выбранного контроллера - если в нем объем памяти программ меньше или равен 8 кбайт, то используется команда rjmp (relative j ump, т. е. относительный безусловный переход) . Она занимает в памяти два байта - как и практически все остальные команды АVR. Код самой команды в этих двух байтах занимает обычно старшую тетраду старшего байта - т. е. четыре бита, остальные 1 2 битов представляют собой адрес, куда переходить - в рассмат­ риваемом случае компилятор подставит адрес команды, следующей сразу за меткой RESET, с которой и начнется собственно выполнение программы. Метка с именем RESET, естественно, всегда должна присутствовать, но может быть расположена уже в любом другом удобном месте программы, за исключением, возможно, еще нескольких первых адресов, о назначении которых далее. Метка, впрочем, может называться и не RESET, а любым другим именем (например, мain, или BEGIN, или setup, или как-то еще), просто у нас так будет принято для удобства чтения : хотите найти в любой программе ее начало - ищите метку RESET. Вернемся к форме записи команды. 1 2 битов адреса могут представлять 4096 раз­ личных адресов. Так как единицей объема памяти программ служит слово из двух байтов, то общий объем адресуемой таким образом памяти и составит 8 кбайт. А вот если памяти больше, то приходится прибегнуть к команде jmp (абсолютный безусловный переход) - она состоит из четырех байтов, в которых адрес займет 22 бита, и потому может адресовать до 4 М слов (до 8 Мбайт) памяти. Те же соображения относятся к другим командам, адресующим память про­ грамм, - к паре rca l l и cal l (а также, с некоторыми нюансами, к lpm и elpm) . В примерах этой книги со старшими моделями семейства Mega мы не работаем, и потому ограничимся командами rjmp, lpm и rca l l, но постараемся о сказанном не забывать . Заметим, что в системе команд АVR семейства Mega есть еще команды ica l l и i jmp (косвенный вызов и косвенный переход), которые по определению могут адресо­ вать 64 К слов (до 1 28 кбайт) памяти, - для этих команд адрес задается 1 6-би­ товым регистром z (о нем будет рассказано далее) . Однако их употребляют не­ часто, а в начале программы (в таблице прерываний, описанной далее) их вообще указывать нельзя чисто технически (нужно заранее задавать значение z, а до начала программы это сделать невозможно). И нструкции и нотация АVR-ассем б лера Для начала отметим, что все последующее изложение рассчитано на использование ассемблера avrasm2, т. к. старый avrasm32 имеет заметно отличающийся набор ди­ ректив компилятора. Правда, различия в основном касаются расширений для avrasm2 (и приближения к нотации языка С), потому много переделывать не при­ дется . Учебное пособие [ 1 1 ] , кстати, единственный более или менее подробный учебник по современной версии AVR assemЫer, который я смог разыскать (если не считать, конечно, справочника с официального сайта [4] ), но опыт показывает, что и краткой русскоязычной справки [3] вкупе с описаниями команд по-русски [6, 7] или по-английски [8] для вполне полноценной работы тоже достаточно.

RkJQdWJsaXNoZXIy MTExODQxMg==