Страница 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 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) -это два
У пиков всего одна ячейка памяти?

Re: Запись чисел больше 255 и преобразование их в 10й вид.
Добавлено: Чт дек 25, 2014 13:31:05
Severrr
Ну главное я понял, а о назначении старшего и младшего байтов можно разобраться и самому. Про low и High я догадался, не смотря на неверное написание кода. Кстати нашел и то как переводить двоичный код в двоично-десятичный. Так, что ответ uldemir оказался полезным в любом случае.
Поправлюсь. Написание кода скорее всего наоборот верное. Проверить нет пока возможности.
Re: Запись чисел больше 255 и преобразование их в 10й вид.
Добавлено: Чт дек 25, 2014 14:21:29
BOB51
На данную тему существует целая куча юзерс гвиде от микрошипа, огромное количество приложений по двоичной/двоично - десятичной математике и море вариантов преобразоваий. Притом, что все варианты будут верными...
Просто нужно выбрать наиболее оптимальный для конкретного случая (обусловленно системой команд, временем исполнения и наличным ресурсом ОЗУ)
С ассемблером могу помочь - но только под конкретную схему и/или задачку с конкретной схемкой - остальное есть "перемалывание в ступе" предположений...
Ну и dosiKUS как всегда "КУСЬ!"

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
Извиняюсь, если эти библиотеки - "повтор".