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

Iar Assembler 78K0S, Как Правильно Задать Переменную В Saddr


EugenOS

Рекомендуемые сообщения

Доброго дня всем.

Имею непонятки с асмом IAR.

;------------------------------------------------------------------------------
load_const_32 macro   freg,c_hi,c_lo
 movw AX, #(c_lo)
 movw freg, AX
 movw AX, #(c_hi)
 movw freg+2, AX
    endm
;-----------------------------------------------------------------------------
    SADDR   EVEN  ; Задаем сегмент данных с короткой адресацией, при этом с привязкой к четным адресам (чтобы адресация слов работала верно)
PUBLIC eax
PUBLIC ebx
PUBLIC ecx
PUBLIC edx
m0:	 DS  4
m1:	 DS  4
eax:    DS  4
ebx:    DS  4
ecx:    DS  4
edx:    DS  4
;-----------------------------------------------------------------------------
	   RSEG CODE ; сегмент кода, релоцируемый
 load_const_32  eax, 4503H,114FH

 movw AX, #(0x114F) ; то же самое что делает макрос
 movw S:eax, AX ;  только я попробовал явно указать короткую адреацию
 movw AX, #(0x4503)
 movw S:eax+2, AX

так вот. ругается (варнингом) на все строки содержащие movw eax,AX ; mov eax, A и т.п. (т.е. где учавствует любая переменная из объявленных выше).

Warning[400]: Number out of range ....

post-42854-0-44432400-1399329147_thumb.jpg

На рисунке то что в list файле, сверху в рамку выделен развернувшийся макрос, снизу первый из двух варнингов после макроса. Как бы отличий не вижу...и не пойму чего ему надо.

Как я предполагаю, он хочет чтоб я ему указал что переменные находятся в saddr, но где ему этого не хватает в объявлении переменных, в написании операндов или может еще где?

Кто с иаром дружит - подскажите.

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

В IAR и 78K0S мало понимаю, но складывается впечатление, что дело всё же в чётности.

В расшифровке варнинга есть подозрительная нечётная цифра 1

mov eax+2,ax - это команда, это понятно

Warning[400]: Number out of range - предупреждение о "выходе за пределы", это тоже понятно

movw \1+2,AX - расшифровка, но непонятно, почему 1+2 ? как будто адрес нечётный и начинается с 1.

---------------^

Если Вы сами не знаете, что это за 1, попробуйте переменную EBX подставить, если эта циферка заменится на 5, значит точно адреса нечётные. Второй способ проверить - подставить однобайтовую переменную перед всеми 32-ух битными и посмотреть, пропадут ли варнинги.

Изменено пользователем tcoder
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Я размещаю перенные типа "WORD"

в сегменте - SADDRP

пример

DSEG SADDRP

TESTDATA: DS 1 ; резервирую память 2байта для переменной "TESTDATA"

Среда программирования "PMplus"

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Я такое пробовал уже. Добавляет еще ошибку " Error[428]: Address operand must be even"

По-идее сегмент релоцируемый и кроме того перед объявлением стоит привязка к четным адресам. Как я понял эти самые \1 ...\2 и т.п. это ссылки на параметры макроса...в реальности он туда пихает 0x10...0x13 для eax 0x14..0x17 для ebx и т.п.

проблема в том что адреса эти адреса как бы отданы уже под MUL, DIV и другие SFR

PM Plus не катит...во-первых под 7 не работает нормально, во-вторых софтового отладчика нет

P.S. я и пытаюсь переложить из под PM+. Кстати именно по этому не один параметр 32-х битной константы, а два двухбайтных. В отличии от IAR, PM+ не подддерживает 32-х битные интегеры в параметрах макроса. пришлось разбивать, когда пытался в ПМ+ работать. А тут еще не исправил на 32-х битные

В иаре, почему-то нет SADDRP

Изменено пользователем EugenOS
Ссылка на комментарий
Поделиться на другие сайты

Короче сделал проще. объявил переменные в главном модуле на С++:

long __saddr eax, ebx, ecx, edx;

а на асме объявил их как внешние.

    extern eax	
    extern ebx	
    extern ecx	
    extern edx	

Костыль конечно, но т.к. все равно главный модуль на сях, то и фиг с ним. Главное - работает.

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

Проверил в IAR Вашу конструкцию - предупреждение тоже "Warning[400]: Number out of range".

Вспомнил, я пару лет назад пытался перевести свои проекты на ассемблере с "PM Plus" в "IAR" и загвоздка как раз была с переменными типа "WORD" c областью "SADDRP", вопрос не решив остался в "PM Plus".

Хотя эта среда программирования "PM Plus" порядком надоела из - за не предсказуемой реакцией на руские строчные буквы " э, ю, я ". C годами уже принаровился

На С++ конечно пойдёт, я программирую только на ASM , интересно было бы посмотреть на решение.

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

Ну я как бы показал уже решение. На СИ:

long __saddr eax, ebx, ecx, edx;
extern "C"{
  void myFunc(void)
}
void main(void)
{
  eax = 12345;
  myFunc()
  // ну  и так далее....
}

На асме:

  SADDR ; на всякий  случай, может и не надо
    extern eax
    extern ebx  
    extern ecx  
    extern edx  

    RSEG  CODE
    PUBLIC myFunc
myFunc:
    movw AX, #eax
    mov HL, AX
    mov A,[HL]
; ну и так далее

все здесь написанное лишь для примера. eax в си присваивается значение для иллюстрации, у меня в проекте это внутренние переменные функции написанной на асме, а самой функции передается указатель на буфер...но это уже совсем другая история

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

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Шота дохрена. Это если мультик может на килогерце. Обычно нет, предел 400 Гц.
    • Да, сначала был написан бутлодер для тини 24. Там нет выделенной памяти под бутлодер и заморочек с областями откуда можно записывать и перезаписывать флеш из программы, там все просто! Также там нет УАРТА, пришлось написать. Ну и самое главное: перезаписывай любые страницы флеш из любого места! В тини 24 под бутлодер ушло 48% памяти. В проекте технологи выделили слишком мало физического места под схему. Потом развел плату, оказалось, что места не так уж и мало. Потом выяснилось, что пинов впритык, и если будет дальнейшее расширение, их может не хватить. И после долгих (ну очень долгих) изысканий (цена, доступность, размеры) остановился на 88 (очень низкая цена, корпус чуть больше чем у 24, датчик температуры, а это важно, но не критически). Да, и сейчас все программируют на С и др. языках высокого уровня, что занимает очень (ну очень) много места, и чипы с небольшой памятью остаются не востребованы, и как следствие низкий спрос, и низкая цена!!! И при тупом переносе программы перезаписи страниц флеш программа не заработала... Ну и пошли изыскания, и я набрел на ВАШ проект, самый полный и законченный на то время. Нужно было выяснить чип который был у меня битый или я что-то упустил при программировании? (в бутлодерах я новичек) Недостаток 88 на сегодня, то что из пользовательской памяти нельзя перепрограммировать флеш, хотя страница стирается.   По поводу ВАШЕЙ программы: выяснилось, что при включенном фьюзе WDT в конфигурации, соединение не устанавливается, а в хелпе это не отражено. В некоторых ситуациях соединение можно восстановить лишь отключив / включив питание, сброс через ножку ресет не помагает. Будем копать дальше,... и глубже....!   Иногда при "установить соединение" выдается сообщение, "соединение не установлено", а на осциллографе виден ответ с чипа?
    • Сейчас по входу стоит керамика 0,1 мкФ + электролит 220 мкФ, иголок вроде нет, ну во всяком случае старичек С1-93 их не показывает.
    • Платы материнки и УВ пока в брак.  - Семён Семёныч... (с) Вы ничего не забыли, сэр? Как вы собрались регулировать УВ по уровню выходного сигнала??? Решение уже есть, пока в процессе. Вот так оно лучше работает.
    • Ну в идеале каптоновым скотчем как вам сказали,но можно обмотать чем угодно лижбе диалектриком было и хотябы немного высокотемпературное,я бы термо усадку взял,поидеи хорошо пойдет  Ещё видел где трансформатор медно алюминиевой жилой был на ампер 10 если не больше на вид аж,и там алюминиевая обмотка сечением пол сантиметра была замотана в бумагу пропитанную в воске,слоем миллиметр примерно эта изоляция была 
    • Всем привет. Собрал мх50, запустился с первого раза, когда делал замеры, соскочил щуп, спалил выходники и пред, заменил, все ок. Питание тор 250 ватт 30х2 выход, после выпрямителя 44В 20000мкф в плечо  увеличил входные емкости на оконечниках, добавил шунтирующую пленку  плата софт старта присутсвует цепь буше взял из ОМ2.7 ТП выставил 100мА добавлена термозащита на каждый канал( но как оказалось, с таким корпусом хрен перегреешь) АС kef q150 dac Aiyima a5 max получилось снять 81 ватт с канала при 8ом нагрузке (на фото самое точное измерение на левом мультиметре) без сигнала если прислонится к ас еле уловимое шипение  при наличии сигнала все ок, играет отлично, мне очень понравилось. в планах ОМ2.7
    • Уже 52 скачивания. Значит актуальна.
×
×
  • Создать...