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

182 Часть 11. Программирование микроконтроллеров АVR на ассемблере употреблять, и рассмотрим здесь три основных режима чтения/записи SRAM: про­ стой, а также с преддекрементом и с постинкрементом. Все три встречаются очень часто, хотя два последних режима работают не во всех типах АVR. Команды для того чтобы записать/считать данные напрямую в память/из памяти носят название : sts и lds. Команда sts $ 0 1 FF , temp запишет в ячейку по адресу $ 0 1 FF содержимое temp, а команда lds temp , $ 0 1 FF считает ее обратно. Именно с по­ мощью этих команд удобно манипулировать содержимым РОН и РВВ, напрямую их записывая, если это зачем-то надо. Не забывайте только, что при доступе с по­ мощью команд ld/ lds и s t / sts указывать надо не номера регистров, а абсолютные адреса в памяти. Соответственно, для обычных регистров к мнемонической кон­ станте, обозначающей имя, нужно добавить $ 2 0 (32) . Например, содержимое 8-разрядного счетчика ТimerO можно перенести в регистр temp так: in temp, TCNТO или так: lds temp , ( ТСNТ0+$2 0 ) или так: lds temp , ( $ 5 2 ) ; $ 52 - абсолютный адрес TCNTO в AТmegaB Об обращении к Extended 1/0 (Memory Mapped) Registers в более современных мо­ делях AVR, которыми мы тут не пользуемся, рассказано во врезке «Подробности» далее. Команды sts / lds занимают два такта (и имеют размер 4 байта), и при большем, чем два раза подряд считывании/записи, выгодней и удобнее пользоваться командами ld и st . При чтении и записи SRAM с помощью этих команд потребуются регистры х, У или z - т. е. пары r2 7 : r2 6, r2 9 : r2 8 и rЗl : rЗО соответственно, которые по от­ дельности еще именуют х н : х L , YH : YL, zн : zL - в том же порядке (т. е. старшим в каждой паре служит регистр с большим номером). Если обмен данными произво­ дится между памятью и другим регистром общего назначения, то достаточно одной из этих пар (любой), если же между областями памяти - целесообразно задейство­ вать две. Независимо от того, какую из пар мы используем, чтение и запись проис­ ходят по идентичным схемам, меняются только имена регистров. Покажем основной порядок действий при чтении из памяти с использованием регистра z ( r з 1 : r зо ) . Чтение одной ячейки с заданным адресом Address , коррекция ее значения и последующая запись выполняются так, как показано в листинге 7 . 8 . ldi ZH, High (Address ) ; старший байт адреса RАМ ldi ZL , Low (Address ) ;младший байт адреса RАМ ld temp, Z ; читаем ячейку в temp inc temp ; например , увеличиваем значение на 1 st Z , temp ; и снова записываем

RkJQdWJsaXNoZXIy MTExODQxMg==