Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 2. Общее устройство, организация памяти, тактирование, сброс 33 занимает первые 96 байт (до адреса $60 ), то адреса SRAM займут адресное про- странство от $0060 до $025F (т. е. от 96-й до 607-й ячейки включительно, что и со- ставит ровно 512 байт). Конец встроенной памяти данных обозначается константой RAMEND , которая для каждой модели контроллера имеет свое значение. Не очень зна- чимое исключение представляет адресация подключаемой внешней памяти упомя- нутых ранее моделей Mega — т. к. ее максимальный адрес ограничен значением $FFFF (65535), то пространство, занимаемое регистрами, вычитается из этой вели- чины. Операции чтения/записи в память одинаково работают с любыми адресами из дос- тупного пространства, и с этим связано несколько нюансов при употреблении ассемблерных команд. При работе с SRAM нужно быть внимательным — вместо записи в память вы легко можете «попасть» в какой-нибудь регистр. Например, команда загрузки значения регистра r16 в регистр r0 ( mov r0,r16 ) равносильна записи в SRAM по нулевому адресу ( sts $0000,r16 ), т. к. адрес в памяти для РОН совпадает с его номером. Для того чтобы записать что-то в первую ячейку именно SRAM, необходимо обратиться по адресу $60 (а в контроллерах с дополнительными регистрами — по адресу $100 ). Чтобы не заниматься вычислениями для каждого контроллера, первый адрес памяти SRAM определяется константой SRAM_START . В то же время для непосредственной записи в РВВ по его адресу в памяти к номеру регистра следует прибавить $20 — так, регистр флагов SREG , который для многих моделей располагается в конце таблицы РВВ по адресу $3F , в памяти имеет адрес $5F . Устанавливать РВВ прямой адресацией памяти необходимо лишь при наличии этих самых дополнительных регистров, а в остальном пользоваться ей неудобно — такая запись всегда отнимает 2 такта вместо одного, характерного для большинства других команд (хотя иногда это позволяет обойти ограничения на манипуляции с некоторыми РОН и РВВ). Именно поэтому мы постараемся здесь не пользоваться контроллерами с расширенным количеством регистров — увлеченному ассемб- лерщику, возможно, все эти нюансы греют душу, а нормального человека они только запутывают. В наших программах мы будем обращаться к РОН и РВВ с помощью специально предназначенных для этого команд, где абсолютные адреса скрыты за мнемониче- скими обозначениями регистров. Однако забывать о наличии всех этих нюансов не следует — так, при переносе готовой программы, работающей с SRAM, на старшие модели контроллеров нужно быть внимательным из-за того, что в них младшие адреса SRAM могут перекрываться дополнительными РВВ. Энергонезависимая память данных (EEPROM) Все модели МК AVR (кроме самых младших представителей Tiny) имеют встроен- ную EEPROM для хранения констант и данных при отключении питания. В разных моделях объем ее варьируется от 64 байт (ATtiny13) до 4 кбайт (старшие модели Mega). Конец EEPROM обозначается константой EEPROMEND , причем, если этой па- мяти нет вовсе, константа будет равна нулю. Число циклов перепрограммирования EEPROM может достигать 100 тысяч.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==