Заголовок сообщения: Запись чисел больше 255 и преобразование их в 10й вид.
Добавлено: Чт дек 25, 2014 10:34:43
Встал на лапы
Карма: 7
Рейтинг сообщений: 4
Зарегистрирован: Ср ноя 26, 2014 08:42:24 Сообщений: 124 Откуда: г. Уфа
Рейтинг сообщения:0
Я недавно начал изучать программирование на ассемблере для PIC. Даже спаял для этого дела простой JDM, потом экстра пик. Дрыгать ногами научился, с прерываниями разобрался, циклами задержек и т.п. Но не догоняю, как инкрементировать счетчик в двоичном виде до числа более 255. Знаний не хватает из-за нехватки времени на изучение без помощи. Понимаю, что для этого нужно от 2-х байт и более. Пусть будет 2 байта к примеру мне нужен счетчик до 10 000.
Затем содержимое этих регистров нужно преобразовать в десятичный вид для отображения на 4-х разрядном семисегментном индикаторе. Как я думаю, двоичное число нужно раскидать по регистрам десятки тысяч, тысячи, сотни, десятки и единицы. Но как это сделать не могу найти. Найти код asm разжованый, чтобы можно было понять суть процесса записи большого числа в двоичном виде и преобразования его в десятичный.
Для знающих людей это очень простой вопрос. Наверняка у кого-то это есть в качестве блока программы (макроса), который просто втыкается во время написанию очередной прошивки для очередного девайса.
В общем, товарищи, если есть такой код разжеваный, в котором можно разобраться новичку, если не жалко, скиньте пожалуйста.
_________________ Если у вас что-то не получается, надо притвориться, что вы умеете это делать. Если дурить себе голову достаточно долго, то когда-нибудь у вас начнет получаться, и тогда можно забыть, что вы притворялись. /Юрий Мороз
Заголовок сообщения: Re: Запись чисел больше 255 и преобразование их в 10й вид.
Добавлено: Чт дек 25, 2014 11:52:19
Встал на лапы
Карма: 7
Рейтинг сообщений: 4
Зарегистрирован: Ср ноя 26, 2014 08:42:24 Сообщений: 124 Откуда: г. Уфа
Рейтинг сообщения:0
Спасибо за ссылку, кое-что начало проясняться.
Но там не особо разжевано. Вопрос такой: Мне нужно записать число, к примеру 557, в регистры bin1 и bin2. Как объединить эти 2 регистра в 16 бит?
допустим я указал в шапке эти регистры
bin1 equ 0dh; bin2 equ 0ch;
Дальше мне нужно записать в них 557. Какой код будет?
_________________ Если у вас что-то не получается, надо притвориться, что вы умеете это делать. Если дурить себе голову достаточно долго, то когда-нибудь у вас начнет получаться, и тогда можно забыть, что вы притворялись. /Юрий Мороз
Если пишешь на ассемблере, то никак - просто резервируй две ячейки памяти.
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
Встал на лапы
Карма: 7
Рейтинг сообщений: 4
Зарегистрирован: Ср ноя 26, 2014 08:42:24 Сообщений: 124 Откуда: г. Уфа
Рейтинг сообщения:0
uldemir писал(а):
не проверялось, но идея, надеюсь понятна.
а low и high - это что такое?
_________________ Если у вас что-то не получается, надо притвориться, что вы умеете это делать. Если дурить себе голову достаточно долго, то когда-нибудь у вас начнет получаться, и тогда можно забыть, что вы притворялись. /Юрий Мороз
Заголовок сообщения: Re: Запись чисел больше 255 и преобразование их в 10й вид.
Добавлено: Чт дек 25, 2014 12:48:36
Встал на лапы
Карма: 7
Рейтинг сообщений: 4
Зарегистрирован: Ср ноя 26, 2014 08:42:24 Сообщений: 124 Откуда: г. Уфа
Рейтинг сообщения:0
Псмотрел инкремментирование на калькуляторе в бинарном виде, опираясь на предоставленный код и вкурил сразу. Идея на самом деле стала ясной и понятной. Огромное спасибо uldemir!
_________________ Если у вас что-то не получается, надо притвориться, что вы умеете это делать. Если дурить себе голову достаточно долго, то когда-нибудь у вас начнет получаться, и тогда можно забыть, что вы притворялись. /Юрий Мороз
Последний раз редактировалось AlekseyEnergo Сб дек 27, 2014 20:53:35, всего редактировалось 1 раз.
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), но суть от этого не меняется.
uldemir , не прибавляй минусов к своей карме ламера. Это не функции а команды ассемблера - это раз , максимально в ячейку памяти влезет число 255( 0xFF) -это два...
Можешь мне добавить к карме ламера своих минусов. Возможно, я немного ошибаюсь в терминологии, что считать директивами, что функциями итп. Но суть не меняется - речь как раз и идёт о том как работать с числами больше 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 ......
Заголовок сообщения: Re: Запись чисел больше 255 и преобразование их в 10й вид.
Добавлено: Чт дек 25, 2014 13:31:05
Встал на лапы
Карма: 7
Рейтинг сообщений: 4
Зарегистрирован: Ср ноя 26, 2014 08:42:24 Сообщений: 124 Откуда: г. Уфа
Рейтинг сообщения:0
Ну главное я понял, а о назначении старшего и младшего байтов можно разобраться и самому. Про low и High я догадался, не смотря на неверное написание кода. Кстати нашел и то как переводить двоичный код в двоично-десятичный. Так, что ответ uldemir оказался полезным в любом случае.
Поправлюсь. Написание кода скорее всего наоборот верное. Проверить нет пока возможности.
_________________ Если у вас что-то не получается, надо притвориться, что вы умеете это делать. Если дурить себе голову достаточно долго, то когда-нибудь у вас начнет получаться, и тогда можно забыть, что вы притворялись. /Юрий Мороз
Последний раз редактировалось AlekseyEnergo Пн дек 29, 2014 16:29:45, всего редактировалось 1 раз.
Нарушение пункта 2.2 правил форума. Подредактировал.
На данную тему существует целая куча юзерс гвиде от микрошипа, огромное количество приложений по двоичной/двоично - десятичной математике и море вариантов преобразоваий. Притом, что все варианты будут верными... Просто нужно выбрать наиболее оптимальный для конкретного случая (обусловленно системой команд, временем исполнения и наличным ресурсом ОЗУ) С ассемблером могу помочь - но только под конкретную схему и/или задачку с конкретной схемкой - остальное есть "перемалывание в ступе" предположений...
Заголовок сообщения: Re: Запись чисел больше 255 и преобразование их в 10й вид.
Добавлено: Пт дек 26, 2014 06:25:16
Встал на лапы
Карма: 7
Рейтинг сообщений: 4
Зарегистрирован: Ср ноя 26, 2014 08:42:24 Сообщений: 124 Откуда: г. Уфа
Рейтинг сообщения:0
BOB51 писал(а):
Притом, что все варианты будут верными... Просто нужно выбрать наиболее оптимальный для конкретного случая (обусловленно системой команд, временем исполнения и наличным ресурсом ОЗУ)
Есть варианты с циклами вычитаний из исходного бинарного числа для вычисления тысяч, сотен и тд. Но в этом случае длительность выполнения команд зависит от самого исходного числа. Есть ли код, длительность выполнения которого не зависит от этого числа?
_________________ Если у вас что-то не получается, надо притвориться, что вы умеете это делать. Если дурить себе голову достаточно долго, то когда-нибудь у вас начнет получаться, и тогда можно забыть, что вы притворялись. /Юрий Мороз
Есть (там дальше и сама ссылка) в 526-й аппноте от микрочипа. Там, кстати, есть и многие другие примеры операций с 8-ми и 16-ти битными числами. Принцип прост: в БКД логике производится умножение на 2 по маске аргумента.
Заголовок сообщения: Re: Запись чисел больше 255 и преобразование их в 10й вид.
Добавлено: Пт дек 26, 2014 10:08:48
Встал на лапы
Карма: 7
Рейтинг сообщений: 4
Зарегистрирован: Ср ноя 26, 2014 08:42:24 Сообщений: 124 Откуда: г. Уфа
Рейтинг сообщения:0
uldemir писал(а):
умножение на 2 по маске аргумента.
Как раз этот код Eddy71 в первом же ответе скинул. Только я пока въехать в этот принцип до конца не могу. Разбираюсь потихоньку. Спасибо всем огромное. Вы сократили мне время на поиски истины в разы. Еще один кирпичик почти освоен.
_________________ Если у вас что-то не получается, надо притвориться, что вы умеете это делать. Если дурить себе голову достаточно долго, то когда-нибудь у вас начнет получаться, и тогда можно забыть, что вы притворялись. /Юрий Мороз
Тот код все приводят и иногда даётся ссылка на источник. Но нигде не написан принцип работы. В своё время удалось найти по ключевому слову "метод левого сдвига". Ну это если хочется разобраться. А если использовать, то лучше использовать готовую подпрограмму - там уже все такты вылизаны и что-нибудь оптимальнее придумать сложно.
Заголовок сообщения: Re: Запись чисел больше 255 и преобразование их в 10й вид.
Добавлено: Сб дек 27, 2014 08:13:25
Встал на лапы
Карма: 7
Рейтинг сообщений: 4
Зарегистрирован: Ср ноя 26, 2014 08:42:24 Сообщений: 124 Откуда: г. Уфа
Рейтинг сообщения:0
Eddy71 писал(а):
Вот тут просто клад из них
Офигенная ссылка! Коды с пояснениями и искать нужный код очень просто - красота! Одно из самых дорогих вещей в жизни - это время. Спасибо всем на форуме, что Вы его находите чтобы помочь другим!
_________________ Если у вас что-то не получается, надо притвориться, что вы умеете это делать. Если дурить себе голову достаточно долго, то когда-нибудь у вас начнет получаться, и тогда можно забыть, что вы притворялись. /Юрий Мороз
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения