Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как имитировать в keil внешнюю память?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
paskal
Нужно отлаживать 51-й в составе сложной схемы. Обмен идет через аппаратные обращения к внешней памяти через movx a,@r0. То есть имитация 256 внешних байт. Если не записывать в эти адреса нужные значения, то отладка превращается в геморрой.
Имитацию 64к адресов, которая через dptr адресуется, я нашел. А как эту память редактировать?
Палыч
1. Menu -> View -> Memory windows -> Memory X
2. В окне Memory задать начальный адрес отображения содержимого. Например, для внешней памяти отображение с нулевого адреса: x:0
x - внешняя память
d - внутренняя RAM
с - память программ
3. В контекстном меню (правая кнопка мыши на окне) выбрать тип представления содержимого памяти
4. Двойной клик на содержимом окна Memory - редактирование
paskal
Цитата(Палыч @ Dec 13 2015, 00:02) *
1. Menu -> View -> Memory windows -> Memory X
2. В окне Memory задать начальный адрес отображения содержимого. Например, для внешней памяти отображение с нулевого адреса: x:0

Это я уже делал. Если при адресации использовать @dptr то это работает. Но у меня @r0, и с ним этот вариант не дает эффекта sad.gif Видимо для этого случая используется другая модель памяти.
редактор
первые 256 байт внешней памяти могут адресоваться как через DPTR, так и через регистрs R0, R1 (через команду MOVX).
В классике было так. Если не работает то
1 - ошибка в коде
2 - глюк в Кейле
Палыч
Цитата(paskal @ Dec 13 2015, 01:29) *
Это я уже делал. Если при адресации использовать @dptr то это работает. Но у меня @r0, и с ним этот вариант не дает эффекта sad.gif Видимо для этого случая используется другая модель памяти.

При симуляции внешней памяти Keil "зашел" немного дальше, чем это, возможно, было нужно biggrin.gif
Поскольку при командах типа MOVX А,@R0 выводы P2 (старший байт адреса памяти) находятся в Hi-Z, то чтение осуществяется из участка внешней памяти с диапазоном адресов от 0xFF00 по 0xFFFF.
DPL
Отвечаю поздновато, но, возможно, ответ поможет.

Keil вполне корректно моделирует внешнюю память (по крайней мере uVision3, с которым я работал долго), причём как при обращении по 16-разрядным адресам, так и по 8-разрядным. При отладке следует иметь в виду, что если внешняя память подключена к 16-разрядной шине адреса (а Keil считает именно так для классического 8051), то физический адрес будет в любом случае 16-разрядным. Если использовать команды типа movx a,@DPTR, то этот адрес полностью находится в DPTR. Если же используются команды типа movx a,@R0, то младший байт адреса берётся из R0, а старший - из P2 (т.е. текущее содержимое P2).

Следовательно, при выполнении команд
Код
mov P2,#20h
mov r0,#33h
movx a,@r0

байт считается из ячейки с адресом 2033h, а если потом сделать так:
Код
mov P2,#40h
movx a,@r0

то чтение произойдёт уже из ячейки 4033h.
Аналогично работает и запись в XRAM.
Таким образом, при просмотре ячеек в окне Memory Window нужно указывать адрес с учетом старшего байта, соответствующего текущему содержимому P2.
Следует отметить что команды типа movx a,@DPTR не изменяют содержимое P2 (точнее - изменяют лишь на время своего выполнения, а затем восстанавливают).
Если в Вашем устройстве старшие разряды адреса не используются, то при симуляции их всё равно придётся учитывать (по крайней мере я не знаю, как объяснить Кейлу, что они не нужны).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.