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

Мк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 пользователей онлайн

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

    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
    • А что нить из ассортимента активных щупов производства СССР..))
    • Типа такого: https://aliexpress.ru/item/2044864227.html?sku_id=58855020183
×
×
  • Создать...