Хранение данных в ОЗУ
В проектируемом измерителе для всех операций переменных‑регистров не хватит, и часть данных придется хранить в ОЗУ (SRAM). Познакомимся с общими принципами обращения к ячейкам этой памяти.
Для чтения и записи SRAM предназначены регистры х, y и z – т. е. пары r27:r26, r29:r28 и r31:r30 , которые по отдельности еще именуют XH: XL, YH: YL, ZH: ZL – в том же порядке (т. е. старшим в каждой паре служит регистр с большим номером). Если обмен данными производится между памятью и другим регистром общего назначения, то достаточно задействовать только одну из этих пар (любую), если же между областями памяти – целесообразно задействовать две. Независимо от того, какую из пар мы используем, чтение и запись происходят по идентичным схемам, меняются только имена регистров.
Покажем основной порядок действий при чтении из памяти в случае использования регистра z (r31:r30 ). Чтение одной ячейки с заданным адресом Address , коррекция ее значения и обратная запись производятся так:
Режимы с преддекрементом и постинкрементом используются, когда нужно прочесть/записать целый фрагмент из памяти. Схема действий аналогичная, только команды выглядят так:
Абсолютно аналогично выглядят команды чтения:
А вот как можно в цикле записать одно и то же значение из temp в 16 идущих подряд ячеек памяти, начиная с нулевого адреса старших 256 байтов памяти:
Напомним, что область пользовательского ОЗУ начинается с адреса $60 (9610). При попытке записать что‑то по меньшему адресу вы обязательно попадаете в какой‑то регистр, и результат окажется непредсказуем. Также не следует забывать о том, что последние адреса ОЗУ заняты под стек, который обязательно задействуется, если в программе применяются прерывания. Так, в ATmega8535 имеется 512 байтов SRAM, потому последний адрес (RAMEND ) будет равен 96 + 512 – 1 = 607 ($25F), но не стоит занимать адреса ОЗУ выше примерно 592 ($250).
Дата добавления: 2016-05-11; просмотров: 959;