Перейти к содержанию

    

Как имитировать в keil внешнюю память?

Нужно отлаживать 51-й в составе сложной схемы. Обмен идет через аппаратные обращения к внешней памяти через movx a,@r0. То есть имитация 256 внешних байт. Если не записывать в эти адреса нужные значения, то отладка превращается в геморрой.

Имитацию 64к адресов, которая через dptr адресуется, я нашел. А как эту память редактировать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Menu -> View -> Memory windows -> Memory X

2. В окне Memory задать начальный адрес отображения содержимого. Например, для внешней памяти отображение с нулевого адреса: x:0

x - внешняя память

d - внутренняя RAM

с - память программ

3. В контекстном меню (правая кнопка мыши на окне) выбрать тип представления содержимого памяти

4. Двойной клик на содержимом окна Memory - редактирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1. Menu -> View -> Memory windows -> Memory X

2. В окне Memory задать начальный адрес отображения содержимого. Например, для внешней памяти отображение с нулевого адреса: x:0

Это я уже делал. Если при адресации использовать @dptr то это работает. Но у меня @r0, и с ним этот вариант не дает эффекта :( Видимо для этого случая используется другая модель памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

первые 256 байт внешней памяти могут адресоваться как через DPTR, так и через регистрs R0, R1 (через команду MOVX).

В классике было так. Если не работает то

1 - ошибка в коде

2 - глюк в Кейле

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Это я уже делал. Если при адресации использовать @dptr то это работает. Но у меня @r0, и с ним этот вариант не дает эффекта :( Видимо для этого случая используется другая модель памяти.

При симуляции внешней памяти Keil "зашел" немного дальше, чем это, возможно, было нужно :biggrin:

Поскольку при командах типа MOVX А,@R0 выводы P2 (старший байт адреса памяти) находятся в Hi-Z, то чтение осуществяется из участка внешней памяти с диапазоном адресов от 0xFF00 по 0xFFFF.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отвечаю поздновато, но, возможно, ответ поможет.

 

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 (точнее - изменяют лишь на время своего выполнения, а затем восстанавливают).

Если в Вашем устройстве старшие разряды адреса не используются, то при симуляции их всё равно придётся учитывать (по крайней мере я не знаю, как объяснить Кейлу, что они не нужны).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация