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

X51 И Банки Регистров


Zer

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

В очередной раз столкнулся с проблемой быстрого переключения банков регистров. По истечении некоторого времени быстрого переключения RS0 и RS1 программу вышибает за пределы кода. Такое ощущение, что сбивается PC.

Раньше этот глюк был замечен на AT89C51 и AT89S8252. Сейчас применяю новую микру с 51-м ядром 71M6534. Глюк тот-же.

Кому что известно по этому поводу? Почему так?

Пока в груди моей бьётся мотор, надежда есть на чистый бензин...

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

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

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

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

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

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

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

Да не важно. Ну, пусть будет вот так:

XXX:
  cpl	 p1.1
  setb   rs0
  setb   rs1
  mov   r0,#0
  clr	  rs0
  clr	  rs1
  jmp	XXX

Код не имеет значения. Имеет значение переключение банков. Это точно.

А вы хорошо знакомы с их архитектурой?

Пока в груди моей бьётся мотор, надежда есть на чистый бензин...

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

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

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

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

Внутреннее ОЗУ данных предназначено для временного хранения информации, используемой в процессе выполнения программы, и занимает 128 младших байт, с адресами от 000h до 07Fh для микроконтроллеров 8051, 8031, КР1816ВЕ31, КР1816ВЕ51, КР1816ВЕ751 КР1830ВЕ31, КР1830ВЕ51, КР1830ВЕ751 или 256 восьмиразрядных ячеек, с адресами от 000h до 0FFh для всех остальных микроконтроллеров семейства.

Регистры специальных функций занимают адреса внутренней памяти данных с 080h по 0FFh. Так как адреса регистров специальных функций совпадают со старшими адресами внутреннего ОЗУ данных, то имеются особенности при использовании этих адресов внутренней памяти данных.

Система команд микроконтроллера позволяет обращаться к ячейкам внутренней памяти данных при помощи прямой и косвенно-регистровой адресации. При обращении к ячейкам памяти с адресами 0-127 использование любого из этих видов адресации будет производить выборку одной и той же ячейки памяти. При обращении к ячейкам ОЗУ с адресами 128-256 следует воспользоваться косвенно-регистровой адресацией. Учитывая, что работа со стеком ведётся при помощи косвенной адресации, то имеет смысл размещать в этой области памяти стек. Если же требуется обратиться к регистрам специальных функций, то нужно использовать прямую адресацию.

Стекпойнт находиться в одном адресном пространстве ОЗУ, и если не уследить с переключением банков, с переназначением стека или с прямыми манипуляциями с РС и SP то:

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

Все вышеперечисленное делаеться в состоянии крайней необходимости, а так просто работаем со стеком и лишь следим, чтобы он не переполнился

Изменено пользователем o_l_e_g

Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

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

Хм... Регистровые банки располагаются в по адресам 0x00-0x1F. Не понятно, причем тут область 0x80-0xFF..?

Или адресация SP тоже сместиться? То есть банки не успевают переключиться, а когда

   setb   RS0
  clr	 RS0
  ret

вылетаем не пойми куда..?

Пока в груди моей бьётся мотор, надежда есть на чистый бензин...

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

XXX:
  cpl	 p1.1
  setb   rs0
  setb   rs1
  mov   r0,#0
  clr	  rs0
  clr	  rs1
  jmp	XXX

В данном примере осуществляется переключение с 0-ого на 3-й банк регистров. Если произойдёт прерывание после setb rs0 , то обработчик будет работать уже с другим банком. Попробуй запрещать прерывания перед переключением.

Пока ты жив, надежда есть.

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

Не важно с каким банком будет работать обработчик прерывания. Просто побьётся часть данных. На сбой PC это не повлияет.

Пока в груди моей бьётся мотор, надежда есть на чистый бензин...

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

Не важно с каким банком будет работать обработчик прерывания. Просто побьётся часть данных. На сбой PC это не повлияет.

Да, пожалуй.

Закинь мне исходник, или хотябы HEX, хочу поймать ошибку.

Пока ты жив, надежда есть.

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

Не важно с каким банком будет работать обработчик прерывания. Просто побьётся часть данных. На сбой PC это не повлияет.

Думаю, повлиять может, на время прерывания значение РС грузиться в стек И если оно модифицируеться или восстанавливаеться из другого места, программа, после восстановления "кривого" значения РС выйдет из прерывания в другом месте.

В любом случае нужно анализировать код.

Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

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

Закинь мне исходник, или хотябы HEX, хочу поймать ошибку.

Выкладывать не буду, т.к. заточен под контроллер 71M6534. Для него эмулятора нет(я нигде не видел), а на другом не пойдёт. Просто переключайте банки и вызывайте подпрограммы.

Например:

repit:
  setb rs0
  setb rs1
  call One
  clr rs0
  clr rs1
  call Two
  cpl p1.1
  jmp repit
One:
  clr rs0
  clr rs1
  cpl p1.3
 setb rs0
  setb rs1
  ret
Two:
 setb rs0
  setb rs1
  cpl p1.2
  clr rs0
  clr rs1
  ret

И не факт, что в дебагере поймаете. Я на железе ловил.

Думаю, повлиять может, на время прерывания значение РС грузиться в стек И если оно модифицируеться или восстанавливаеться из другого места, программа, после восстановления "кривого" значения РС выйдет из прерывания в другом месте.

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

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

Пока в груди моей бьётся мотор, надежда есть на чистый бензин...

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

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

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

Пока, это только предположение...

Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

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

  • 1 год спустя...
Закинь мне исходник, или хотябы HEX, хочу поймать ошибку.

Выкладывать не буду, т.к. заточен под контроллер 71M6534. Для него эмулятора нет(я нигде не видел), а на другом не пойдёт. Просто переключайте банки и вызывайте подпрограммы.

Например:

repit:
  setb rs0
  setb rs1
  call One
  clr rs0
  clr rs1
  call Two
  cpl p1.1
  jmp repit
One:
  clr rs0
  clr rs1
  cpl p1.3
 setb rs0
  setb rs1
  ret
Two:
 setb rs0
  setb rs1
  cpl p1.2
  clr rs0
  clr rs1
  ret

И не факт, что в дебагере поймаете. Я на железе ловил.

Думаю, повлиять может, на время прерывания значение РС грузиться в стек И если оно модифицируеться или восстанавливаеться из другого места, программа, после восстановления "кривого" значения РС выйдет из прерывания в другом месте.

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

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

Попробуй для начала биты коммутации банков менять одновременно путем наложения масок на искомые биты (через операцию OR и/или AND с нужной константой), кроме этого проследи куда устанавливается указатель стека, после сброса он по умолчанию устанавливается в значение 7h. Если указатель стека не трогать, то его глубина составит 24 бита и банки регистров 1,2 и 3 отдаются под стек, в таком случае надо ограничивать число вызовов подпрограмм и сохранений в стеке, если этого не сделать стек зацепит и память флажков (адреса 20h...2Fh внутреннего ОЗУ). Для избежания таких накладок я к примеру указатель стека переставляю на значение 30h и более, все адреса ячеек ОЗУ до него я применяю для хранения данных и переменных, после него оставшихся ячейки ОЗУ я отвожу для нужд стека. При таком раскладе в моем распоряжении находятся все банки регистров и память с битовой адресацией под флажки и не особо опасаюсь про переполнение стека, хотя определенный риск есть.

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

Да проблема была, похоже, в контроллерах. Сейчас почему-то не сталкиваюсь.

P.S. Стек лучше выставлять на адрес 80h, т.к. есть верхние 128 байт внутреннего ОЗУ с косвенной адресацией. Вот её и использовать для стека.

Пока в груди моей бьётся мотор, надежда есть на чистый бензин...

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

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

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

Гость
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
×
×
  • Создать...