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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Аватара пользователя
Shuspano
Грызет канифоль
Сообщения: 270
Зарегистрирован: Вс окт 20, 2019 13:03:56

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

Сообщение Shuspano »

Пытаюсь написать подпрограмму десятичной считалки, и застрял. 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-ки. Вот тут я застрял.
Реклама
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

А почему сравнение с 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
.
.
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

А нужны именно тетрады? (десятичная коррекция результата)
Может проще считать в двоичном формате, а уже результат таблично декодировать.
8)
Аватара пользователя
Shuspano
Грызет канифоль
Сообщения: 270
Зарегистрирован: Вс окт 20, 2019 13:03:56

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

Сообщение Shuspano »

[uquote="akl",url="/forum/viewtopic.php?p=4077237#p4077237"]А почему сравнение с 9, а не с 10. Типа[/uquote]

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

можно еще конечно делать типа:

Код: Выделить всё

back: add A, #1
         da A
         cjne A, #99, back
         ...
        
и все получается. Но, надо будет разбирать результат на тетрады (громоздко), и не представляю как осуществлять обратный счет, т.к DA A с вычитанием не работает.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

А прямая табличная перекодировка?
можно и через DPTR
movc a,@a+dptr
и через текущий РС
movc a,@a+pc
Счет ведем в бинарном формате, декодировка из бинарника в неупакованный двоично-десятичный (0x0N) в зависимости от того, что удобнее. Далее из тетрады в сегментный код по табличке.
8)
Реклама
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

Shuspano писал(а):Потому что после 9-ки в регистре появляется 0x0A, с которым непонятно что делать
именно когда в регистре появится 10, нужно обнулять регистр и делать перенос (инкремент) следующего разряда (регистра).
а то по твоему коду счет идет только до 9, а не до 10 - считает до 8, а потом сразу появляется 10. число 09 у тебя отсутствует.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Аватара пользователя
Shuspano
Грызет канифоль
Сообщения: 270
Зарегистрирован: Вс окт 20, 2019 13:03:56

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

Сообщение Shuspano »

[uquote="Starichok51",url="/forum/viewtopic.php?p=4079037#p4079037"]именно когда в регистре появится 10, нужно обнулять регистр и делать перенос (инкремент) следующего разряда (регистра).[/uquote]
Кроме собственно, счета, надо забирать результат из счетного регистра. Если его забираю до сброса в ноль - у меня там десятка (x0A) оказывается, если после сброса в ноль - соответственно, там всегда ноль. Я уже уже прошагал это в симуляторе, это тоже не работает
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

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
.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Это уже вопрос организации цикла:
действие до инкремента/декремента
или
действие после инкремента/декремента
и
в каком месте анализ на завершение цикла проводится.
Поэтому для анализа и/или подсказки нужно видеть полную программу, а не только сам контрольный цикл.
8)
И второе...
собственно анализ только отдельно взятого цикла вывода на индикацию без источника приращения не бывает.
А там вероятно какой-то генератор на прерывании устроен. Либо есть возможность пресечения анализируемой прожки "сторонними подпрограммами"...
В результате как вариант еще и хранение критичных регистров в стеке на время прерывания добавится.
:roll:
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

Shuspano писал(а):Я уже уже прошагал это в симуляторе, это тоже не работает
не той дорогой ты шагал. у всех работает, а у тебя не работает.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Shuspano
Грызет канифоль
Сообщения: 270
Зарегистрирован: Вс окт 20, 2019 13:03:56

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

Сообщение Shuspano »

Я меж тем главного не заметил, что считалка у меня не завершается никогда пока не досчитает до 9999. А она должна быть однопроходной, то есть может быть вызвана однократно.Оформил как подпрограмму, завел 4 ячейки памяти, которые вгружаю в счетные регистры в начале, и выгружаю из регистров при выходе. Как жаль, что CJNE не работает с адресами памяти, так бы удалось сэкономить 16 байт.
Насчет какой-то программы в общем... пока не знаю. Я пару лет назад удачно написал динамическую индикацию без внешних микрух, и пытаюсь придумать ей какую-то полезную загрузку.
Так все заработало, спасибо всем большое
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Код 0xB5
CJNE a,ad,rel
Сравнение аккумулятора с содержимым ячейки РПД.
Mcs51tbl.pdf
(1.55 МБ) 117 скачиваний
8)
Аватара пользователя
Shuspano
Грызет канифоль
Сообщения: 270
Зарегистрирован: Вс окт 20, 2019 13:03:56

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

Сообщение Shuspano »

Да я знаю набор инструкций 8051. Просто в CJNE нельзя указать как источник прямой адрес памяти, типа, CJNE 0x33, #direct, rel - вот что печалит.
либо ACC, либо РОНы, либо @Ri - указатель на память
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

а что, у тебя большой дефицит с памятью программы, что так важно сэкономить 16 байт?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Shuspano
Грызет канифоль
Сообщения: 270
Зарегистрирован: Вс окт 20, 2019 13:03:56

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

Сообщение Shuspano »

[uquote="Starichok51",url="/forum/viewtopic.php?p=4080008#p4080008"]а что, у тебя большой дефицит с памятью программы, что так важно сэкономить 16 байт?[/uquote]
Учили, что там где можно сократить, там надо сокращать.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

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

Вернуться в «Разные вопросы по МК»