Выбрать главу

Итак, в окне Memory перейдем к ячейке с адресом $FFFD (rdBuf1). В этом случае удобнее воспользоваться скроллером, переместив его в самый низ, так как интересующие нас ячейки с адресами $FFFD, $FFFE, $FFFF (rdBuf1, rdBuf2 и rdBuf3 соответственно) являются тремя последними ячейками, которые могут отображаться в окне Memory.

Щелкнем на третьей от конца ячейке — ее адрес в виде 0xFFFD отобразится в окошке адреса (справа в первой строке окна Memory). Вместо содержимого этой ячейки (скорее всего 00) введем АА, курсор автоматически перейдет на следующую ячейку с адресом 0xFFFE, введем в нее значение 55, в ячейку OxFFFF — значение 71.

Второй вариант (здесь не реализован, проверьте его отладку самостоятельно): после команд записи типа

STS wrBuf1,tmp

добавлять команды

STS rdBuf1.tmp

то же для буферов 2 и 3. Что при этом произойдет?

В реальной схеме:

• при выполнении первой из команд запись произойдет как в буфер, так и в микросхему памяти (подробности смотрите в описании схемы);

• вторая команда еще раз запишет те же данные в ту же ячейку микросхемы памяти.

При отладке: одинаковые данные запишутся в два адреса: один — имитирующий ячейку микросхемы памяти, второй — имитирующий буфер.

При этом программа несколько удлиняется. Однако после отладки дополнительные команды можно удалить.

Продолжим отладку. Следя за ячейками памяти wrBuf1 wrBuf1 и wrBu3, а также за переменной tmp, выполним 9 команд (9 нажатий F11).

Теперь указатель выполнения команд находится на первой команде ЗАГРУЗКИ В ПАМЯТЬ ПЕРВОГО МАССИВА.

Интерес в записи первого массива в память представляет первый цикл.

В окне Memoiy перейдем к ячейке с адресом 0хЕ060 (aArBgn1). Переведем курсор на команду NCtmp и нажмем Ctrl+F10. В ячейке с адресом 0хЕ060 появился байт данных FF, соответствующий значению переменной tmp.

Нажмем F11 — выполнение команды INC привело к тому, что переменная tmp стала равна нулю, в результате чего установился бит Z (окно Processor). Поэтому если бы команда INC стояла перед командой BRNE, выполнился бы лишь один цикл записи элементов массива в память.

Замечание: SFF+1 = $100, результат — двухбайтная величина, но поскольку регистр может хранить только один байт, в нем остается младшая часть, то есть, ноль. Аналогичным образом $00-1 = $FF, при этом вычитание происходит как бы из двухбайтного числа $100.

Жмем F11 — выполнение команды DEC уменьшило до 9 значение переменной cnt, то есть, результат не нулевой, поэтому флаг Z сбросился (окно Processor).

Отладка аналогичного цикла уже комментировалась, поэтому можно установить курсор на команде с меткой ARR2: и нажать Ctrl+F10. Заметьте, в регистр Z (окно Processor) записался адрес OxFFFD, соответствующий константе aArBgn2+1.

В окне Memoiy перейдем к ячейке 0xFFFD, жмем F11: запись содержимого регистра tmp произошла в ячейку с адресом OxFFFC (aArBgn2), как и было необходимо.

Отладка цикла не требует комментариев.

Установим курсор на последней команде программы и нажмем Ctrl+F10. Проконтролируйте содержимое ячеек памяти, в которые записался массив 2.

Что будет, если убрать последнюю команду? Вообще-то для проверки удобнее заменить ее командой NOP. Ассемблируем программу, нажмем FI 1, установим курсор на последней команде NOP. В окне Processor | Cycle counter заметим число циклов процессора (153). Нажмем F11: выполнение программы опять началось с первой команды, но посмотрите на число циклов процессора: их стало 4206! После того, как все команды нашей программы были извлечены из памяти программ и выполнены, продолжался поиск команд в свободной части памяти программ, при переходе к новой свободной ячейке счетчик циклов процессора увеличивал свое состояние, а вместе с ним и счетчик команд (Processor | Program counter). Максимальное значение, которое может храниться в этом счетчике для микроконтроллера AT90S8515, равно 4095, следующее значение — снова ноль, поэтому и произошел переход в начало программы, а к содержимому счетчика циклов процессора добавились циклы загрузки отсутствующих команд.

Обычно микроконтроллеры работают в бесконечном цикле. Если программа завершила свое выполнение и ожидает прерывания, установите в конце команду зацикливания на себя:

Stop: ijmpStop

Автор: Баранов Вадим Николаевич (E-maiclass="underline" bvnl23@bk.ru).

Подключение внешней памяти 512 Кбайт к микроконтроллеру AT90S8535

На момент написания книги лишь два микроконтроллера серии АТ90 были снабжены интерфейсом подключения внешней памяти: AT90S4414 и AT90S8515. К тому же первый из них уже снят с производства.