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

Мк51 (at89x51) Ошибка Relative Jump Too Large


necr0filius

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

Компилятор на команду

jnb e0h, error

выдает сообщение relative jump too large, соответсвенно тогда когда метка (error) находится на некотором большем удалениии от команды jnb чем следовало бы.

В документации на кросс-ассемблер в разделе ошибок, причина возникновения этой объясняется следующим:

===

Ошибка RELATIVE JUMP TOO LARGE (Слишком далекий относительный переход) Значение Результирующий адрес перехода находится на другой

странице.

ВОПРОС: какую директиву нужно указать, для успешной компиляции программы и есть ли она?

Если нету, что в этом случае можете посоветовать сделать?

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

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

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

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

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

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

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

относительный переход по такой команде +127..-128 байт, естественно будет ошибка если метка отстоит далее.

надо так:

jb e0h,noerror ; если бит взведен то продолжить выполнение программы,

ljmp error ; иначе прыгнуть к error.

noerror: ............ ;выполняем далее программу

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

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

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

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

2 Duhas - "не относительным перходом а прямым..." что ты имел ввиду?

2 Speccy - относительный переход по такой команде +127..-128 байт, естественно будет ошибка если метка отстоит далее.

надо так: jb e0h,noerror ; если бит взведен то продолжить выполнение программы,

ljmp error ; иначе прыгнуть к error.

noerror: ............ ;выполняем далее программу

так не получается, алгоритм построен подругому, это громоздко. Юзается блок выборки битов аккумулятора следующим образом.

Block:

JNB E0h,Label1

JNB E1h,Label2

JNB E2h,Label3

JNB E3h,Label4

Ret

Хочется так что бы не дописывать лишнего кода. Тут именно интересует, есть ли директива, хотя я теперь подозреваю что в состав кросс-ассемблера такая функция не входит. Так как команды jnb (jb,jz,jnz...) в своем составе имеют только один байт для адреса перехода в отличие от команды LCALL которая имеет для адреса два зарезервированных бита.

Выходит команды аналогичные jnb вычисляют адрес перехода путем "прибавления" смещения к PC, в отличие от LCALL которая имеет два байта и хранит сразу адрес перехода.

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

Подозреваю что нету такой директивы, потому что это ассемблер а не компилятор.

Вам не хочется дописывать лишнего кода?

Вы наверное шутите? Или у Вас комар бита не подточит в этой программе, и места нету совершенно? Ни за что не поверю.

Этож машинные коды - тут либо так, либо эдак.

Говорю же вот выход:

Block:
	  jb 0E0h,NO_LABEL_1
	ljmp LABEL_1
NO_LABEL_1:
	  jb 0E1h,NO_LABEL_2
	ljmp LABEL_2
NO_LABEL_2:
	  jb 0E2h,NO_LABEL_3
	ljmp LABEL_3
NO_LABEL_3:
	  jb 0E3h,NO_LABEL_4
	ljmp LABEL_4
NO_LABEL_4:
	 ret

Код увеличился на 12 байт. Это что критично для Вас?

Есть еще с десяток способов как проверить биты аккумулятора, но все они связаны с относительным переходом, а он Вам не подходит по дальности перехода.

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

ну вот я об этом и говорил .. JNB выполняет относительный переход - тоесть смещение на n относительно данного адреса... если дальнобойности относительного перехода нехватает то вариант Speccy тут мен кажется чуть ли не идальным..

«Как сердцу выразить себя? … Мысль изреченная есть ложь!»

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

Вам не хочется дописывать лишнего кода?

Вы наверное шутите? Или у Вас комар бита не подточит в этой программе, и места нету совершенно? Ни за что не поверю.

Я и не говорил что это совсем критично, пришлось добавлять, а что делать, сроки жмут...

Просто пока было времени немножко подумать, и поискать такого рода выход, думал и искал, как времени не стало, так и реализовал похожим образом, иначе и правда никак.

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

Должно зависеть от того чем текст превращается в машинный код.

Если это компилировать Keil-ом, то там наверняка есть оптимизация. Например удалить лишние прямые переходы. Или расположить куски кода таким образом, чтобы уменьшить кол-во переходов. На то он и компилятор.

А если ассемблировать "в лоб", то будет то, что написано в тексте как ни крути.

Добавлю еще, что если вышеприведенный пример действительно имеет место быть, то все переходы должны осуществляться в пределах от метки Block до команды ret. Не обязаны, но должны. Так как по оформлению это очень похоже на какую-то подпрограмму.

Иначе получается, что при входе в эту подпрограмму, и осуществлении перехода по условию, когда-нибудь придется делать ret. А команда ret в подпрограмме должна быть только одна. Не обязана, но должна. А в примере получается не совсем логичное построение.

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

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

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

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

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

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

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

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

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

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

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

    • Нет. Но вот резистор в базу очень не помешает...  
    • Разобрался почему нет ШИМ. Оказывается нога от драйвера, которая идёт на задний ход не подключена к выводу, зде есть ШИМ... Значить буду переделывать) просто перережу ногу которая идет к выводу дуни и кину провод к выводу где есть ШИМ...
    • То есть вместо R1 впаять переменник на 3К и при выставленном максимальном значении R2  добиться показания в мои 25  вольт. Вот это похоже на истину. Значить работаем с R1. Спасибо.
    • А что тогда стабилизируется? Если нужен "реостат" в смысле "регулируемое сопротивление" то  нужна электронная нагрузка с режимом "постоянное сопротивление" или CR. Элемент нагрузки в любом случае это ИТУН (даже в вашей схеме), надо просто ввести обратную связь с коллектора, т.к. I=U/R, I - ток, задаваемый нагрузочному элементу, U - напряжение на нагрузке, а R - желаемое сопротивление, коэффициент, который можно задать делителем напряжения например. Что-то типа такого, обычный ИТУН на полевике с возможностью включить обратную связь со входа нагрузки для режима CR.   Транзистору с отсутствием напряжения на коллекторе ничего не будет, база просто останется диодом, через который течет ток, определяемый положением движка и управляющим напряжением. Отсутствие напряжения на базе при наличии напряжения на коллекторе не критично до тех пор, пока база притянута к земле через сопротивление (в отечественных даташитах это параметр максимального напряжения коллектор-эмиттер при заданном сопротивлении база-эмиттер). Это сильно критично для старых транзисторов с большим током утечки коллектора, если его не пустить с базы в эмиттер через сопротивление меньшее или равное примерно 0,25/Ik0, транзистор начнёт приоткрываться. Для современных транзисторов сопротивление может быть относительно большим из-за малых утечек. Да, странный вопрос. Если нужно сопротивление, то зачем схема источника тока
    • На лицо полное непонимание принципа работы биполярного транзистора.
    • ..совсем точно, - выключаешь БП, выпаиваешь R1 и на его место впаиваешь резистор сопротивлением 3 кОм.. включаешь БП и вертишь R2 - проверяешь (измеряешь вольтметром или мультиметром) диапазон изменения напряжения на выходе БП..  если не устраивает опять меняешь R1..   более подробно будет сложнее..
×
×
  • Создать...