Страница 1 из 2

Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Чт дек 25, 2014 10:34:43
Severrr
Я недавно начал изучать программирование на ассемблере для PIC.
Даже спаял для этого дела простой JDM, потом экстра пик.
Дрыгать ногами научился, с прерываниями разобрался, циклами задержек и т.п.
Но не догоняю, как инкрементировать счетчик в двоичном виде до числа более 255. Знаний не хватает из-за нехватки времени на изучение без помощи.
Понимаю, что для этого нужно от 2-х байт и более. Пусть будет 2 байта к примеру мне нужен счетчик до 10 000.

Затем содержимое этих регистров нужно преобразовать в десятичный вид для отображения на 4-х разрядном семисегментном индикаторе.
Как я думаю, двоичное число нужно раскидать по регистрам десятки тысяч, тысячи, сотни, десятки и единицы. Но как это сделать не могу найти.
Найти код asm разжованый, чтобы можно было понять суть процесса записи большого числа в двоичном виде и преобразования его в десятичный.

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

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

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Чт дек 25, 2014 10:53:20
E71

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Чт дек 25, 2014 11:52:19
Severrr
Спасибо за ссылку, кое-что начало проясняться.

Но там не особо разжевано.
Вопрос такой:
Мне нужно записать число, к примеру 557, в регистры bin1 и bin2.
Как объединить эти 2 регистра в 16 бит?

допустим я указал в шапке эти регистры

bin1 equ 0dh;
bin2 equ 0ch;

Дальше мне нужно записать в них 557.
Какой код будет?

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Чт дек 25, 2014 12:19:21
uldemir
Если пишешь на ассемблере, то никак - просто резервируй две ячейки памяти.
Severrr писал(а):Дальше мне нужно записать в них 557.

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

movlw  low 557
movwf  bin2
movlw  high 557
movwf  bin1    ; просто обычно принято младший байт расмещать в младшем адресе, но не принципиально
; теперь инкремент
incf      bin2, f  ; увеличиваем младший байт
btfsc    status, c  ; если не произошло переполнение, то следующую операцию пропускаем
incf      bin1, f   ; если младший переполнился, то и старший
disclaimer: в приведённом коде могут быть ошибки, так как не проверялось, но идея, надеюсь понятна.

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Чт дек 25, 2014 12:40:59
Severrr
uldemir писал(а): не проверялось, но идея, надеюсь понятна.
а low и high - это что такое?

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Чт дек 25, 2014 12:48:36
Severrr
Псмотрел инкремментирование на калькуляторе в бинарном виде, опираясь на предоставленный код и вкурил сразу. Идея на самом деле стала ясной и понятной. Огромное спасибо uldemir!

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Чт дек 25, 2014 13:00:11
dosikus
uldemir писал(а):

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

movlw  low 557
movwf  bin2
movlw  high 557
movwf  bin1    ; просто обычно принято младший байт расмещать в младшем адресе, но не принципиально
disclaimer: в приведённом коде могут быть ошибки, так как не проверялось, но идея, надеюсь понятна.
Это не просто ошибки это вопиющий бред .
Максимальное значения для 8ми бит ?

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Чт дек 25, 2014 13:09:14
uldemir
low и high директивы выделяющие из числа младший и старший байт. Можно самому написать

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

movlw 2
movwf bin1
movlw 45
movwf bin2
Но это не наглядно. Не понятно откуда взялись эти числа.

Можно писать по-иному:

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

movlw 557 >> 8 ; число сдвигаем вправо на 8 позиций (или делим на 256)
...
movlw 557 & 0xff ; маской выбираем только младшие 8 бит
...
Но все эти вычисления выполняются только на этапе компиляции и код генерят абсолютно одинаковый.
dosikus писал(а):Это не просто ошибки это вопиющий бред .
Пруф? Возможно, я не правильно назвал эти функции - недавно сменил MPLAB c 8-го на Х и не умею быстро сделать пустой проект для проверки. Возможно надо писать low(557) и high(557), но суть от этого не меняется.

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Чт дек 25, 2014 13:14:17
dosikus
uldemir , не прибавляй минусов к своей карме ламера.
Это не функции а команды ассемблера - это раз , максимально в ячейку памяти влезет число 255( 0xFF) -это два...

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Чт дек 25, 2014 13:27:30
uldemir
Можешь мне добавить к карме ламера своих минусов. Возможно, я немного ошибаюсь в терминологии, что считать директивами, что функциями итп. Но суть не меняется - речь как раз и идёт о том как работать с числами больше 255, т.е. как их раскидать по двум байтам.

И в чем ошибка? Неужели число high(557) больше чем 255?
Вот листинг из первого попавшегося проекта:

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

0157   3040           00606         MOVLW   LOW(CHAR3IMG)
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
0158   008D           00607         MOVWF   EEADRL
0159   300F           00608         MOVLW   HIGH(CHAR3IMG)
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
015A   008F           00609         MOVWF   EEADRH
......

0F40                  01702 CHAR3IMG:
....
Errors   :     0
Warnings :     0 reported,     0 suppressed
Messages :   172 reported,     0 suppressed

Как видите, сообщений об ошибке нет.

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Чт дек 25, 2014 13:28:05
ploop
Это не функции а команды ассемблера
Всю жизнь были директивами препроцессора.
максимально в ячейку памяти влезет число 255( 0xFF) -это два
У пиков всего одна ячейка памяти? :shock:

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Чт дек 25, 2014 13:31:05
Severrr
Ну главное я понял, а о назначении старшего и младшего байтов можно разобраться и самому. Про low и High я догадался, не смотря на неверное написание кода. Кстати нашел и то как переводить двоичный код в двоично-десятичный. Так, что ответ uldemir оказался полезным в любом случае.

Поправлюсь. Написание кода скорее всего наоборот верное. Проверить нет пока возможности.

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Чт дек 25, 2014 14:21:29
BOB51
На данную тему существует целая куча юзерс гвиде от микрошипа, огромное количество приложений по двоичной/двоично - десятичной математике и море вариантов преобразоваий. Притом, что все варианты будут верными...
Просто нужно выбрать наиболее оптимальный для конкретного случая (обусловленно системой команд, временем исполнения и наличным ресурсом ОЗУ)
8)
С ассемблером могу помочь - но только под конкретную схему и/или задачку с конкретной схемкой - остальное есть "перемалывание в ступе" предположений... :beer:

Ну и dosiKUS как всегда "КУСЬ!" 8)

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Пт дек 26, 2014 06:25:16
Severrr
BOB51 писал(а): Притом, что все варианты будут верными...
Просто нужно выбрать наиболее оптимальный для конкретного случая (обусловленно системой команд, временем исполнения и наличным ресурсом ОЗУ)
Есть варианты с циклами вычитаний из исходного бинарного числа для вычисления тысяч, сотен и тд. Но в этом случае длительность выполнения команд зависит от самого исходного числа. Есть ли код, длительность выполнения которого не зависит от этого числа?

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Пт дек 26, 2014 08:03:10
uldemir
Есть (там дальше и сама ссылка) в 526-й аппноте от микрочипа. Там, кстати, есть и многие другие примеры операций с 8-ми и 16-ти битными числами. Принцип прост: в БКД логике производится умножение на 2 по маске аргумента.

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Пт дек 26, 2014 10:08:48
Severrr
uldemir писал(а): умножение на 2 по маске аргумента.
Как раз этот код Eddy71 в первом же ответе скинул. Только я пока въехать в этот принцип до конца не могу. Разбираюсь потихоньку.
Спасибо всем огромное. Вы сократили мне время на поиски истины в разы. Еще один кирпичик почти освоен.

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Пт дек 26, 2014 10:54:09
uldemir
Тот код все приводят и иногда даётся ссылка на источник. Но нигде не написан принцип работы. В своё время удалось найти по ключевому слову "метод левого сдвига". Ну это если хочется разобраться. А если использовать, то лучше использовать готовую подпрограмму - там уже все такты вылизаны и что-нибудь оптимальнее придумать сложно.

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Пт дек 26, 2014 13:43:56
E71
Присоединюсь к совету использовать вылизаные библиотеки. Вот тут просто клад из них. Из разных областей полезности.

http://www.piclist.com/techref/microchip/routines.htm

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Сб дек 27, 2014 08:13:25
Severrr
Eddy71 писал(а):Вот тут просто клад из них
Офигенная ссылка! Коды с пояснениями и искать нужный код очень просто - красота!
Одно из самых дорогих вещей в жизни - это время. Спасибо всем на форуме, что Вы его находите чтобы помочь другим! :))

Re: Запись чисел больше 255 и преобразование их в 10й вид.

Добавлено: Сб дек 27, 2014 08:34:05
Albert_V
Извиняюсь, если эти библиотеки - "повтор".