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

8051 ассемблер. Счет 0-9999.

Вт авг 17, 2021 05:25:02

Пытаюсь написать подпрограмму десятичной считалки, и застрял. 0-99 считает, дальше не могу продолжить:

Код:
back:   inc   R1
   cjne   R1, #9, back
   mov   R1, #0
   inc   R2
   cjne   R2, #9, back
   cjne   R1, #9, back
   mov   R2, #0


При переходе к третьему разряду надо проверить на 9-ку R1, R2, и переходить к R3 но в R1 всегда ноль. Но не обнулять нельзя, тогда он просто считает дальше 9-ки. Вот тут я застрял.

Re: 8051 ассемблер. Счет 0-9999.

Вт авг 17, 2021 07:07:29

А почему сравнение с 9, а не с 10. Типа

Код:
back:   inc   R1
   cjne   R1, #10, back
   mov   R1, #0
   inc   R2
   cjne   R2, #10, back
   mov   R2, #0
   inc   R3
   cjne   R3, #10, back
   mov   R3, #0
   inc   R4
   cjne   R4, #10, back
   mov   R4, #0
.
.

Re: 8051 ассемблер. Счет 0-9999.

Вт авг 17, 2021 09:21:34

А нужны именно тетрады? (десятичная коррекция результата)
Может проще считать в двоичном формате, а уже результат таблично декодировать.
8)

Re: 8051 ассемблер. Счет 0-9999.

Чт авг 19, 2021 07:57:26

А почему сравнение с 9, а не с 10. Типа


Потому что после 9-ки в регистре появляется 0x0A, с которым непонятно что делать, если выводить результат из счетного регистра, и отправлять его на индикацию.
А хотелось бы что только 0-9.

можно еще конечно делать типа:
Код:
back: add A, #1
         da A
         cjne A, #99, back
         ...
       

и все получается. Но, надо будет разбирать результат на тетрады (громоздко), и не представляю как осуществлять обратный счет, т.к DA A с вычитанием не работает.

Re: 8051 ассемблер. Счет 0-9999.

Чт авг 19, 2021 10:04:01

А прямая табличная перекодировка?
можно и через DPTR
movc a,@a+dptr
и через текущий РС
movc a,@a+pc
Счет ведем в бинарном формате, декодировка из бинарника в неупакованный двоично-десятичный (0x0N) в зависимости от того, что удобнее. Далее из тетрады в сегментный код по табличке.
8)

Re: 8051 ассемблер. Счет 0-9999.

Пт авг 20, 2021 11:48:10

Shuspano писал(а):Потому что после 9-ки в регистре появляется 0x0A, с которым непонятно что делать
именно когда в регистре появится 10, нужно обнулять регистр и делать перенос (инкремент) следующего разряда (регистра).
а то по твоему коду счет идет только до 9, а не до 10 - считает до 8, а потом сразу появляется 10. число 09 у тебя отсутствует.

Re: 8051 ассемблер. Счет 0-9999.

Пт авг 20, 2021 22:50:02

именно когда в регистре появится 10, нужно обнулять регистр и делать перенос (инкремент) следующего разряда (регистра).

Кроме собственно, счета, надо забирать результат из счетного регистра. Если его забираю до сброса в ноль - у меня там десятка (x0A) оказывается, если после сброса в ноль - соответственно, там всегда ноль. Я уже уже прошагал это в симуляторе, это тоже не работает

Re: 8051 ассемблер. Счет 0-9999.

Сб авг 21, 2021 04:58:58

Shuspano писал(а):надо забирать результат из счетного регистра...

Код:
back:
   inc   R1
   cjne   R1, #10, back
   mov   R1, #0
   inc   R2
   cjne   R2, #10, back
   mov   R2, #0
   inc   R3
   cjne   R3, #10, back
   mov   R3, #0
   inc   R4
   cjne   R4, #10, back
   mov   R4, #0
;здесь нужно забирать состояние регистров счетчика 0...9999
.

Re: 8051 ассемблер. Счет 0-9999.

Сб авг 21, 2021 08:30:29

Это уже вопрос организации цикла:
действие до инкремента/декремента
или
действие после инкремента/декремента
и
в каком месте анализ на завершение цикла проводится.
Поэтому для анализа и/или подсказки нужно видеть полную программу, а не только сам контрольный цикл.
8)
И второе...
собственно анализ только отдельно взятого цикла вывода на индикацию без источника приращения не бывает.
А там вероятно какой-то генератор на прерывании устроен. Либо есть возможность пресечения анализируемой прожки "сторонними подпрограммами"...
В результате как вариант еще и хранение критичных регистров в стеке на время прерывания добавится.
:roll:

Re: 8051 ассемблер. Счет 0-9999.

Сб авг 21, 2021 11:56:35

Shuspano писал(а):Я уже уже прошагал это в симуляторе, это тоже не работает
не той дорогой ты шагал. у всех работает, а у тебя не работает.

Re: 8051 ассемблер. Счет 0-9999.

Сб авг 21, 2021 20:04:25

Я меж тем главного не заметил, что считалка у меня не завершается никогда пока не досчитает до 9999. А она должна быть однопроходной, то есть может быть вызвана однократно.Оформил как подпрограмму, завел 4 ячейки памяти, которые вгружаю в счетные регистры в начале, и выгружаю из регистров при выходе. Как жаль, что CJNE не работает с адресами памяти, так бы удалось сэкономить 16 байт.
Насчет какой-то программы в общем... пока не знаю. Я пару лет назад удачно написал динамическую индикацию без внешних микрух, и пытаюсь придумать ей какую-то полезную загрузку.
Так все заработало, спасибо всем большое

Re: 8051 ассемблер. Счет 0-9999.

Сб авг 21, 2021 20:40:46

Код 0xB5
CJNE a,ad,rel
Сравнение аккумулятора с содержимым ячейки РПД.
Mcs51tbl.pdf
(1.55 MiB) Скачиваний: 94

8)

Re: 8051 ассемблер. Счет 0-9999.

Вс авг 22, 2021 11:02:37

Да я знаю набор инструкций 8051. Просто в CJNE нельзя указать как источник прямой адрес памяти, типа, CJNE 0x33, #direct, rel - вот что печалит.
либо ACC, либо РОНы, либо @Ri - указатель на память

Re: 8051 ассемблер. Счет 0-9999.

Вс авг 22, 2021 17:07:09

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

Re: 8051 ассемблер. Счет 0-9999.

Вс авг 22, 2021 17:33:35

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

Учили, что там где можно сократить, там надо сокращать.

Re: 8051 ассемблер. Счет 0-9999.

Вс авг 22, 2021 18:23:44

Это разве что для АТ89С2051 имеет некоторое значение.
А для экономии в большинстве случаев удобнее подпрограммы использовать
Второе...
Не забываем, что как сравнение могут выступать и другие команды (а не только "неразрушающая" данные CJNE).
К примеру та же XRL с последующим анализом на нуль в аккумуляторе.
Да и много других приемов, не обязательно на основе математики - иногда логика удобнее или специфические особенности кодов используемых в программе данных.
Правда в таком случае порой приходится полностью переделывать и схемотехнику и программу заново писать.
8)
Да и собственно по CJNE a,adr,rel
одним операндом является содержимое аккумулятора а вторым содержимое ячейки ОЗУ, адрес которой указан в команде.
Собственно от того, какой из операндов будет первым результат не меняется (в любом случае оценивается равенство или неравенство) как и данные что в АCC, что в ячейке adr после операции сравнения.
В отличии от того же к примеру:
XRL a,adr
когда в аккумуляторе останется результат операции, т.е. "данные в АСС будут разрушены"
8)
Ответить