paskal 1 12 декабря, 2015 Опубликовано 12 декабря, 2015 · Жалоба Нужно отлаживать 51-й в составе сложной схемы. Обмен идет через аппаратные обращения к внешней памяти через movx a,@r0. То есть имитация 256 внешних байт. Если не записывать в эти адреса нужные значения, то отладка превращается в геморрой. Имитацию 64к адресов, которая через dptr адресуется, я нашел. А как эту память редактировать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 12 декабря, 2015 Опубликовано 12 декабря, 2015 · Жалоба 1. Menu -> View -> Memory windows -> Memory X 2. В окне Memory задать начальный адрес отображения содержимого. Например, для внешней памяти отображение с нулевого адреса: x:0 x - внешняя память d - внутренняя RAM с - память программ 3. В контекстном меню (правая кнопка мыши на окне) выбрать тип представления содержимого памяти 4. Двойной клик на содержимом окна Memory - редактирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
paskal 1 12 декабря, 2015 Опубликовано 12 декабря, 2015 · Жалоба 1. Menu -> View -> Memory windows -> Memory X 2. В окне Memory задать начальный адрес отображения содержимого. Например, для внешней памяти отображение с нулевого адреса: x:0 Это я уже делал. Если при адресации использовать @dptr то это работает. Но у меня @r0, и с ним этот вариант не дает эффекта :( Видимо для этого случая используется другая модель памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 14 декабря, 2015 Опубликовано 14 декабря, 2015 · Жалоба первые 256 байт внешней памяти могут адресоваться как через DPTR, так и через регистрs R0, R1 (через команду MOVX). В классике было так. Если не работает то 1 - ошибка в коде 2 - глюк в Кейле Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 14 декабря, 2015 Опубликовано 14 декабря, 2015 · Жалоба Это я уже делал. Если при адресации использовать @dptr то это работает. Но у меня @r0, и с ним этот вариант не дает эффекта :( Видимо для этого случая используется другая модель памяти. При симуляции внешней памяти Keil "зашел" немного дальше, чем это, возможно, было нужно Поскольку при командах типа MOVX А,@R0 выводы P2 (старший байт адреса памяти) находятся в Hi-Z, то чтение осуществяется из участка внешней памяти с диапазоном адресов от 0xFF00 по 0xFFFF. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DPL 0 21 января, 2016 Опубликовано 21 января, 2016 · Жалоба Отвечаю поздновато, но, возможно, ответ поможет. 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 (точнее - изменяют лишь на время своего выполнения, а затем восстанавливают). Если в Вашем устройстве старшие разряды адреса не используются, то при симуляции их всё равно придётся учитывать (по крайней мере я не знаю, как объяснить Кейлу, что они не нужны). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться