Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Mega128 и обращение к памяти.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
add
Вопросик по обращению к памяти:
при обращении к памяти контроллеров до 64к делал так (asm):

ldi zl,low(mas*2)
ldi zh,high(mas*2)
lpm
;и т.д.

.
.
.
mas:
.db 0xff,0xaa
.
.
В меге128 есть еще регистр RAMPZ (определяет к какой из 64к обращатся).
Возможно ли по метке (в этом случае "mas:") загрузить байт в озу из flash?
Компилятор ведь может определить в любое место flash массив "mas"...
Как в этом случае можно обращатся по ссылке к памяти?
Зарание сапсибо за ответы!
aesok
Цитата(add @ Aug 24 2006, 12:59) *
Компилятор ведь может определить в любое место flash массив "mas"...
Как в этом случае можно обращатся по ссылке к памяти?
Зарание сапсибо за ответы!


В разных компиляторах по разному. Какой компилятор вы используете?

Анатолий.


Цитата(add @ Aug 24 2006, 12:59) *
Компилятор ведь может определить в любое место flash массив "mas"...
Как в этом случае можно обращатся по ссылке к памяти?
Зарание сапсибо за ответы!


В разных компиляторах по разному. Какой компилятор вы используете?

Анатолий.
add
Цитата
В разных компиляторах по разному. Какой компилятор вы используете?

?! в avr studio (avrasm v2)... несовсем понятен вопрос?
есть альтернатива задать адрес так к примеру :
.org 0x01000а
но несовсем удобно так работать....
DS
Цитата(add @ Aug 24 2006, 13:25) *
Цитата
В разных компиляторах по разному. Какой компилятор вы используете?

?! в avr studio (avrasm v2)... несовсем понятен вопрос?
есть альтернатива задать адрес так к примеру :
.org 0x01000а
но несовсем удобно так работать....


Похоже, только руками контролировать RAMPZ. Ассемблер генерит на lpm только эту команду, по определению, не меняя никаких регистров. Мало того, lpm Z+ при переходе границы не меняет RAMPZ.
add
Цитата
Мало того, lpm Z+ при переходе границы не меняет RAMPZ

Есть замечательная команда ELPM Rd,Z+ c учетом RAMPZ :-)
Но вопрос остается открытым....
DS
Цитата(add @ Aug 24 2006, 16:14) *
Цитата
Мало того, lpm Z+ при переходе границы не меняет RAMPZ

Есть замечательная команда ELPM Rd,Z+ c учетом RAMPZ :-)
Но вопрос остается открытым....


Я имел в виду, что ассемблер не разбирается с состоянием RAMPZ, что в команде есть, то и будет выполняться. Надо при загрузке Z в таких случаях грузить и RAMPZ. Т.е. добавляете еще две команды
к ldi zl, ldi zh каждый раз. А вместо lpm , соответственно - elpm. Тогда можно будет не думать каждый раз об адресе.
add
Цитата
Тогда можно будет не думать каждый раз об адресе.

я вопрошал о том как загрузить адрес метки (к примеру "mas:") (см.выше) в регистры zl:zh:RAMPZ ?!
т.е. как определить значение метки , чтобы загрузить в регистры?
DS
Логическими операциями и сдвигами над меткой - это же число. В ассемблере же можно логические выражения и сдвиги использовать, чтобы сформировать из метки, которая есть число, значение, загружаемое в RAMPZ.

.include "m128def.inc"

.org 0
ldi r16, a>>15
out rampz, r16
ldi zl, low(a*2)
ldi zh, high(a*2)
elpm r1, Z


.org 0x8010
a: .dw 100

Ну вот типа так.
add
Цитата
Логическими операциями и сдвигами над меткой - это же число.

как это число располовинитьдля регистров zl:zh и RAMPZ?
и собственно как его получить, условным асемблированием?
DS
Цитата(add @ Aug 24 2006, 17:53) *
Цитата
Логическими операциями и сдвигами над меткой - это же число.

как это число располовинитьдля регистров zl:zh и RAMPZ?
и собственно как его получить, условным асемблированием?

Выше привел. Пока проверял, Вы этот пост уже написали.
add
DS_ Пасиба! открыли глаза...проверил, дествительно все так работает..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.