реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как имитировать в keil внешнюю память?, Которая с 8-битным адресом.
paskal
сообщение Dec 12 2015, 19:03
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 348
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Нужно отлаживать 51-й в составе сложной схемы. Обмен идет через аппаратные обращения к внешней памяти через movx a,@r0. То есть имитация 256 внешних байт. Если не записывать в эти адреса нужные значения, то отладка превращается в геморрой.
Имитацию 64к адресов, которая через dptr адресуется, я нашел. А как эту память редактировать?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 12 2015, 21:02
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 398
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



1. Menu -> View -> Memory windows -> Memory X
2. В окне Memory задать начальный адрес отображения содержимого. Например, для внешней памяти отображение с нулевого адреса: x:0
x - внешняя память
d - внутренняя RAM
с - память программ
3. В контекстном меню (правая кнопка мыши на окне) выбрать тип представления содержимого памяти
4. Двойной клик на содержимом окна Memory - редактирование
Go to the top of the page
 
+Quote Post
paskal
сообщение Dec 12 2015, 21:29
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 348
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Цитата(Палыч @ Dec 13 2015, 00:02) *
1. Menu -> View -> Memory windows -> Memory X
2. В окне Memory задать начальный адрес отображения содержимого. Например, для внешней памяти отображение с нулевого адреса: x:0

Это я уже делал. Если при адресации использовать @dptr то это работает. Но у меня @r0, и с ним этот вариант не дает эффекта sad.gif Видимо для этого случая используется другая модель памяти.
Go to the top of the page
 
+Quote Post
редактор
сообщение Dec 14 2015, 09:24
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 345
Регистрация: 9-06-07
Пользователь №: 28 315



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


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 14 2015, 13:13
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 398
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(paskal @ Dec 13 2015, 01:29) *
Это я уже делал. Если при адресации использовать @dptr то это работает. Но у меня @r0, и с ним этот вариант не дает эффекта sad.gif Видимо для этого случая используется другая модель памяти.

При симуляции внешней памяти Keil "зашел" немного дальше, чем это, возможно, было нужно biggrin.gif
Поскольку при командах типа MOVX А,@R0 выводы P2 (старший байт адреса памяти) находятся в Hi-Z, то чтение осуществяется из участка внешней памяти с диапазоном адресов от 0xFF00 по 0xFFFF.
Go to the top of the page
 
+Quote Post
DPL
сообщение Jan 21 2016, 14:04
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 88
Регистрация: 15-10-04
Из: Новочеркасск
Пользователь №: 886



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

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 (точнее - изменяют лишь на время своего выполнения, а затем восстанавливают).
Если в Вашем устройстве старшие разряды адреса не используются, то при симуляции их всё равно придётся учитывать (по крайней мере я не знаю, как объяснить Кейлу, что они не нужны).
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th November 2017 - 11:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01224 секунд с 7
ELECTRONIX ©2004-2016