Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Опыты с 8051. Как так вышло?

Пн янв 31, 2022 21:55:12

Дело было вечером, делать было нечего. Сижу, и занимаюсь сами знаете чем. Озадаченный вопросом "а что будет если", в MCU8051IDE дизассемлировал маленький бессмысленный кусочек какого-то бинарного мусора, и пытаюсь отладить то что вышло. Удалил все вызовы и переходы в никуда, все MOVX, все что влияет на указатель стека, удалил или поменял все, на что ругается IDE. Осталось немного. При выполнении что-то там происходит, ставлю переход из конца в начало, и делаю вечный кайф:
Спойлер
Код:
   ORG   0h
lab0:   mov   A, @R0
   setb   C
   rlc   A
   mov   @R1, A
   mov   @R0, A
   mov   @R1, A
   mov   C, 0E7h
   rlc   A
   anl   3h, A
   rlc   A
   mov   @R1, A
   anl   C, 0F2h
   rr   A
   mov   @R1, #32h
   mov   R3, 77h
   rlc   A
   xchd   A, @R1
   rlc   A
   mov   R7, A
   xchd   A, @R1
   mov   R2, A
   xchd   A, @R1
   rlc   A
   mov   @R1, A
   ljmp   lab0
   END

Прошагиваю то что получилось, и через 2-3 цикла выполнения этого бреда, получаю ошибку:
Изображение
Комментирую указанную строку. После чего получаю такую-же ошибку в строке с другим номером. Делал дальше по всякому, получалось все одно и тоже Начинаю подозревать что чудит IDE, тем более что там такое иногда бывает, и решаю проверять в железе.Дописываю две подпрограммы - вывода аккумулятора в P1 со светодиодами, и задержку 400 мс, чтоб видно было:
Спойлер
Код:
ledport   equ   P1
temp   equ   0x20

   ORG   0h
lab0:   mov   A, @R0
   setb   C
   rlc   A
   mov   @R1, A
   mov   @R0, A
   mov   @R1, A
   mov   C, 0E7h
   rlc   A
   anl   3h, A
   rlc   A
   mov   @R1, A
   anl   C, 0F2h
   rr   A
   mov   @R1, #32h
   mov   R3, 77h
   rlc   A
   xchd   A, @R1
   rlc   A
   mov   R7, A
   xchd   A, @R1
   mov   R2, A
   xchd   A, @R1
   rlc   A
   mov   @R1, A
        mov   temp, A
   call   output
   call   delay
   ljmp   lab0

delay:   mov   30h, #002h
   mov   31h, #0c6h
   mov   32h, #0e7h
next:   djnz   32h, $
   djnz   31h, next
   djnz   30h, next
   ret

output:   push   ACC
   push   PSW
   mov   A, temp
   cpl   A
   mov   ledport, A
   pop   PSW
   pop   ACC
   ret
   END

Заливаю в МК, запускаю, через пару циклов программа встает... Да причем так встает, что МК виснет намертво, reset перестает работать. Понимаю, что я такого пока не видел.
Пытаюсь понять как это происходит, и не знаю что думать. IDE говорит что invalid opcode. Но как могут быть опкоды инвалидами, если их выдает транслятор, если они записывается во флэш, где не могут изменится в процессе работы. Инструкции в этой программе хоть и от балды натыканы, но они ведь правильные. Я что-то не знаю, не понимаю, или как это?

Re: Опыты с 8051. Как так вышло?

Вт фев 01, 2022 10:04:33

Может там собачка по-умолчанию включена?

Re: Опыты с 8051. Как так вышло?

Ср фев 02, 2022 10:26:57

КОТЯТКИ!
Не издевайтесь над подопытными мелкосхемами!
:music:
Первое, что резво в глаза бросается:
Нельзя абсолютно произвольно впихивать код в МК, не считаясь со структурой и организацией того МК.
1. Смотрим карту регистров РПД и положение указателя стека "по умолчанию" - без оного ни одна подпрограмма/прерывание никогда верно работать не будут!
(https://img.radiokot.ru/files/20529/2qo1qt1kgh.GIF)
И говорим спасибо авторам MCS51 за то, что хоть в область РСФ нет необходимости без надобности лазить за отключением неиспользуемых аппаратных модулей (как у некоторых АВРок и ПИКушек).
2. Практически всегда есть шанс "заглючить" МК до состояния полного отключения питания на 1-2 минуты для повторного перезапуска, ежли не учитывать что при подаче питания содержимое РПД неопределено, а сигнал RESET имеющееся до него содержимое РПД НЕ ИЗМЕНЯЕТ.
8)

Ежли уж под то мку иде, то скорее вот так будет компилироваться (полный проект с начальными настройками под МК):
mcu_tst.zip
(14.95 KiB) Скачиваний: 73

и то...
все операции с @R0/@R1 нужно проверять на диапазон корректности (в тесте этого нету), чтоб запись не могла производиться выше адреса 0х40 - дабы содержимое стека не укошмарить.
8)

Re: Опыты с 8051. Как так вышло?

Пт фев 04, 2022 20:27:29

Хм... Гм... В общем, это плохая идея была у меня - декомпилировать что попало.

BOB51 писал(а):equ 0x20 в среде MCU 8051 IDE префикс 0х.... не допускается!

Еще как допускается, работает без проблем.
Насчет очистки РПД... Как -то я купил на алёэкспрессе сверхдешевые STC11F02. Выводы коцанные, сами царапанные, шились через один. Выглядели так, как будто их достали из мусорки. Так вот, если после включения прочитать любую прямоадресуемую ячейку RAM, то там будет случайное число. У других такого не припомню.

Re: Опыты с 8051. Как так вышло?

Сб фев 05, 2022 10:26:02

Ежли б 0х... Работало без проблем, то любой их моих проектов под c51asm можно было бы без труда туда подключить.
8)
Собственно их за тех "нюансов" я и не стал использовать данную IDE...
:(
Относительно ОЗУ резидентной памяти данных - у всех семейств при аппаратном сбросе в процессе работы содержимое этой области не меняется.
Начальное содержимое также неопределённо.
С одной стороны - выход из "глубокой гибернации" по стандарту mcs51(через сигнал reset), в более поздних - сохранение данных при сбросе от собаки/ схем контроля питания да тот же выход из "глубокого сна".
8)

Re: Опыты с 8051. Как так вышло?

Вс фев 06, 2022 15:39:55

Кстати мое отношение к удобству MCU IDE (Синтаксис ассемблера) достаточно субьективно.
Просто когда подобрал ключ к практически однотипному написанию исходников на ассемблере для трех компиляторов -
MCS51 (c51asm), AVR (AVRASM2 AVRstudio4.19) и mpasm (mplab studio8.92) дополнить "на скору руку" значительно отличающееся сложнее.
А там таки отличия имеются...
Разве что уж совсем "обстоятельства прижмут" - сама IDE весьма привлекательна и работоспособна от ХР до7ки/10ки.
Но то уж лучше сразу под SDCC грызть будет.
:beer:
Ответить