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

184 Часть 11. Программирование микроконтроллеров АVR на ассемблере всего. Ко второй группе обычно принадлежат всяческие регистры установки режи­ мов энергосбережения, таймеров, портов UART и т. д. Чтобы не тратить времени на разборки, вы можете для всех портов, в которых сомневаетесь, использовать пере­ нос через IN/ouт - они выполняются за один такт, потому намного это программу не задержит. Все здесь сказанное по поводу разного доступа к разным областям регистрового файла РВВ сводится к коротким примечаниям к таблице Register Summary, которые имеются в описании каждого контроллера. ПОДРОБНОСТИ Так и видится , как два студента из Тронхейма, Альф Боген и Вегард Волен , разраба­ тывая структуру AVR, искренне собирались облегчить жизнь пользователям, придумав весьма стройную структуру, в которой было 32 регистра общего назначения, и 64 ре­ гистра ввода/вывода . Как им казалось, с большим запасом , потому что в первом AT90S 1 200 было всего 1 8 РВВ. И 64-х адресов действительно хватало в течение целого десятилетия, пока не уперлись в то, что регистры для все новых функций , без которых жить уже становилось неприлично, размещать некуда. Модернизировать ядро, слава богу, не стали : без беспрецедентно быстрого и простого ядра , которое является неубиваемым козырем архитектуры AVR, она скоро скатилась бы на периферию от­ расли . Потому пришлось городить надстройки в памяти данных, захватывая регистра­ ми все новые области . Уже в ATmega8/1 6 64-байтовое адресное пространство РВВ оказалось забито почти полностью, а в модернизированных ATmega88/1 68/328 оно захватывает область в 224 байта - от $ 2 0 до $ FF (пользовательская SRAM, соответственно, начинается с адреса $ 100) . Регистрам , попавшим в область выше абсолютного адреса $ 5F, номера не присваивают, они характеризуются только адресами в памяти . Соответственно, на эти Exteпded 1 /0 Registers не действуют уже и инструкции in/out - доступ к ним про­ изводится , как к ячейкам памяти на общих основаниях, т. е. командами lct/lcts и st/sts . Причем для Exteпded 1 /0 Registers их названия в этих командах нужно указы­ вать напрямую, без всяких +$ 2 0 . В ATmega88 и его родственниках общее количество регистров еще относительно не­ велико, всего 86, потому они разместились r:io всей этой памяти достаточно вольготно. В старших моделях вроде ATmega2560 регистров ввода/вывода еще больше - 1 83 штуки , и там они отхватывают еще больший кусок памяти (до адреса $ 1 FF) . Пото­ му при использовании этих моделей всегда проверяйте адрес начала пользователь­ ской SRAM, а еще лучше используйте константу sRAМ_sтARт. Мы к таким моделям контроллеров здесь не обращаемся , но если вам придется их программировать на ассемблере, сразу глядите в iпс-файл - там Exteпded 1/0 Registers к о мпактно помещены в начале перечня по убыванию адресов и помечены примечанием MEMORY MAPPED. Теперь, наконец, вернемся к обмену с памятью SRAM. Режимы с преддекрементом и постинкрементом используются, когда нужно прочесть/записать целый фрагмент из памяти (эти команды недействительны для ряда младших моделей МК семейства Tiny, но для упоминаемой в этой книге модели ATtiny23 1 3 они работают). Схема действий аналогичная приведенной ранее, только команды выглядят так: st - Z , temp / * с преддекрементом, запись в ячейку с адресом Z - 1 , после вьmолнения команды регистр Z = Z- 1 * / st Z+ , temp / * с постинкрементом, запись в ячейку с адресом Z , после вьmолнения команды регистр Z = Z+l * /

RkJQdWJsaXNoZXIy MTExODQxMg==