Запись чисел больше 255 и преобразование их в 10й вид.
Запись чисел больше 255 и преобразование их в 10й вид.
Я недавно начал изучать программирование на ассемблере для PIC.
Даже спаял для этого дела простой JDM, потом экстра пик.
Дрыгать ногами научился, с прерываниями разобрался, циклами задержек и т.п.
Но не догоняю, как инкрементировать счетчик в двоичном виде до числа более 255. Знаний не хватает из-за нехватки времени на изучение без помощи.
Понимаю, что для этого нужно от 2-х байт и более. Пусть будет 2 байта к примеру мне нужен счетчик до 10 000.
Затем содержимое этих регистров нужно преобразовать в десятичный вид для отображения на 4-х разрядном семисегментном индикаторе.
Как я думаю, двоичное число нужно раскидать по регистрам десятки тысяч, тысячи, сотни, десятки и единицы. Но как это сделать не могу найти.
Найти код asm разжованый, чтобы можно было понять суть процесса записи большого числа в двоичном виде и преобразования его в десятичный.
Для знающих людей это очень простой вопрос. Наверняка у кого-то это есть в качестве блока программы (макроса), который просто втыкается во время написанию очередной прошивки для очередного девайса.
В общем, товарищи, если есть такой код разжеваный, в котором можно разобраться новичку, если не жалко, скиньте пожалуйста.
Даже спаял для этого дела простой JDM, потом экстра пик.
Дрыгать ногами научился, с прерываниями разобрался, циклами задержек и т.п.
Но не догоняю, как инкрементировать счетчик в двоичном виде до числа более 255. Знаний не хватает из-за нехватки времени на изучение без помощи.
Понимаю, что для этого нужно от 2-х байт и более. Пусть будет 2 байта к примеру мне нужен счетчик до 10 000.
Затем содержимое этих регистров нужно преобразовать в десятичный вид для отображения на 4-х разрядном семисегментном индикаторе.
Как я думаю, двоичное число нужно раскидать по регистрам десятки тысяч, тысячи, сотни, десятки и единицы. Но как это сделать не могу найти.
Найти код asm разжованый, чтобы можно было понять суть процесса записи большого числа в двоичном виде и преобразования его в десятичный.
Для знающих людей это очень простой вопрос. Наверняка у кого-то это есть в качестве блока программы (макроса), который просто втыкается во время написанию очередной прошивки для очередного девайса.
В общем, товарищи, если есть такой код разжеваный, в котором можно разобраться новичку, если не жалко, скиньте пожалуйста.
Если у вас что-то не получается, надо притвориться, что вы умеете это делать. Если дурить себе голову достаточно долго, то когда-нибудь у вас начнет получаться, и тогда можно забыть, что вы притворялись. /Юрий Мороз
- Реклама
Re: Запись чисел больше 255 и преобразование их в 10й вид.
Спасибо за ссылку, кое-что начало проясняться.
Но там не особо разжевано.
Вопрос такой:
Мне нужно записать число, к примеру 557, в регистры bin1 и bin2.
Как объединить эти 2 регистра в 16 бит?
допустим я указал в шапке эти регистры
bin1 equ 0dh;
bin2 equ 0ch;
Дальше мне нужно записать в них 557.
Какой код будет?
Но там не особо разжевано.
Вопрос такой:
Мне нужно записать число, к примеру 557, в регистры bin1 и bin2.
Как объединить эти 2 регистра в 16 бит?
допустим я указал в шапке эти регистры
bin1 equ 0dh;
bin2 equ 0ch;
Дальше мне нужно записать в них 557.
Какой код будет?
Если у вас что-то не получается, надо притвориться, что вы умеете это делать. Если дурить себе голову достаточно долго, то когда-нибудь у вас начнет получаться, и тогда можно забыть, что вы притворялись. /Юрий Мороз
Re: Запись чисел больше 255 и преобразование их в 10й вид.
Если пишешь на ассемблере, то никак - просто резервируй две ячейки памяти.
disclaimer: в приведённом коде могут быть ошибки, так как не проверялось, но идея, надеюсь понятна.
Severrr писал(а):Дальше мне нужно записать в них 557.
Код: Выделить всё
movlw low 557
movwf bin2
movlw high 557
movwf bin1 ; просто обычно принято младший байт расмещать в младшем адресе, но не принципиально
; теперь инкремент
incf bin2, f ; увеличиваем младший байт
btfsc status, c ; если не произошло переполнение, то следующую операцию пропускаем
incf bin1, f ; если младший переполнился, то и старшийRe: Запись чисел больше 255 и преобразование их в 10й вид.
а low и high - это что такое?uldemir писал(а): не проверялось, но идея, надеюсь понятна.
Если у вас что-то не получается, надо притвориться, что вы умеете это делать. Если дурить себе голову достаточно долго, то когда-нибудь у вас начнет получаться, и тогда можно забыть, что вы притворялись. /Юрий Мороз
- Реклама
Re: Запись чисел больше 255 и преобразование их в 10й вид.
Псмотрел инкремментирование на калькуляторе в бинарном виде, опираясь на предоставленный код и вкурил сразу. Идея на самом деле стала ясной и понятной. Огромное спасибо uldemir!
Последний раз редактировалось AlekseyEnergo Сб дек 27, 2014 20:53:35, всего редактировалось 1 раз.
Причина: Нарушение пункта 2.2 правил форума. Предупрежден!
Причина: Нарушение пункта 2.2 правил форума. Предупрежден!
Если у вас что-то не получается, надо притвориться, что вы умеете это делать. Если дурить себе голову достаточно долго, то когда-нибудь у вас начнет получаться, и тогда можно забыть, что вы притворялись. /Юрий Мороз
Re: Запись чисел больше 255 и преобразование их в 10й вид.
Это не просто ошибки это вопиющий бред .uldemir писал(а):disclaimer: в приведённом коде могут быть ошибки, так как не проверялось, но идея, надеюсь понятна.Код: Выделить всё
movlw low 557 movwf bin2 movlw high 557 movwf bin1 ; просто обычно принято младший байт расмещать в младшем адресе, но не принципиально
Максимальное значения для 8ми бит ?
Re: Запись чисел больше 255 и преобразование их в 10й вид.
low и high директивы выделяющие из числа младший и старший байт. Можно самому написать
Но это не наглядно. Не понятно откуда взялись эти числа.
Можно писать по-иному:Но все эти вычисления выполняются только на этапе компиляции и код генерят абсолютно одинаковый.
Код: Выделить всё
movlw 2
movwf bin1
movlw 45
movwf bin2Можно писать по-иному:
Код: Выделить всё
movlw 557 >> 8 ; число сдвигаем вправо на 8 позиций (или делим на 256)
...
movlw 557 & 0xff ; маской выбираем только младшие 8 бит
...Пруф? Возможно, я не правильно назвал эти функции - недавно сменил MPLAB c 8-го на Х и не умею быстро сделать пустой проект для проверки. Возможно надо писать low(557) и high(557), но суть от этого не меняется.dosikus писал(а):Это не просто ошибки это вопиющий бред .
Re: Запись чисел больше 255 и преобразование их в 10й вид.
uldemir , не прибавляй минусов к своей карме ламера.
Это не функции а команды ассемблера - это раз , максимально в ячейку памяти влезет число 255( 0xFF) -это два...
Это не функции а команды ассемблера - это раз , максимально в ячейку памяти влезет число 255( 0xFF) -это два...
Re: Запись чисел больше 255 и преобразование их в 10й вид.
Можешь мне добавить к карме ламера своих минусов. Возможно, я немного ошибаюсь в терминологии, что считать директивами, что функциями итп. Но суть не меняется - речь как раз и идёт о том как работать с числами больше 255, т.е. как их раскидать по двум байтам.
И в чем ошибка? Неужели число high(557) больше чем 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й вид.
Всю жизнь были директивами препроцессора.Это не функции а команды ассемблера
У пиков всего одна ячейка памяти?максимально в ячейку памяти влезет число 255( 0xFF) -это два
Re: Запись чисел больше 255 и преобразование их в 10й вид.
Ну главное я понял, а о назначении старшего и младшего байтов можно разобраться и самому. Про low и High я догадался, не смотря на неверное написание кода. Кстати нашел и то как переводить двоичный код в двоично-десятичный. Так, что ответ uldemir оказался полезным в любом случае.
Поправлюсь. Написание кода скорее всего наоборот верное. Проверить нет пока возможности.
Поправлюсь. Написание кода скорее всего наоборот верное. Проверить нет пока возможности.
Последний раз редактировалось AlekseyEnergo Пн дек 29, 2014 16:29:45, всего редактировалось 1 раз.
Причина: Нарушение пункта 2.2 правил форума. Подредактировал.
Причина: Нарушение пункта 2.2 правил форума. Подредактировал.
Если у вас что-то не получается, надо притвориться, что вы умеете это делать. Если дурить себе голову достаточно долго, то когда-нибудь у вас начнет получаться, и тогда можно забыть, что вы притворялись. /Юрий Мороз
Re: Запись чисел больше 255 и преобразование их в 10й вид.
На данную тему существует целая куча юзерс гвиде от микрошипа, огромное количество приложений по двоичной/двоично - десятичной математике и море вариантов преобразоваий. Притом, что все варианты будут верными...
Просто нужно выбрать наиболее оптимальный для конкретного случая (обусловленно системой команд, временем исполнения и наличным ресурсом ОЗУ)
С ассемблером могу помочь - но только под конкретную схему и/или задачку с конкретной схемкой - остальное есть "перемалывание в ступе" предположений...
Ну и dosiKUS как всегда "КУСЬ!"
Просто нужно выбрать наиболее оптимальный для конкретного случая (обусловленно системой команд, временем исполнения и наличным ресурсом ОЗУ)
С ассемблером могу помочь - но только под конкретную схему и/или задачку с конкретной схемкой - остальное есть "перемалывание в ступе" предположений...
Ну и dosiKUS как всегда "КУСЬ!"
Re: Запись чисел больше 255 и преобразование их в 10й вид.
Есть варианты с циклами вычитаний из исходного бинарного числа для вычисления тысяч, сотен и тд. Но в этом случае длительность выполнения команд зависит от самого исходного числа. Есть ли код, длительность выполнения которого не зависит от этого числа?BOB51 писал(а): Притом, что все варианты будут верными...
Просто нужно выбрать наиболее оптимальный для конкретного случая (обусловленно системой команд, временем исполнения и наличным ресурсом ОЗУ)
Если у вас что-то не получается, надо притвориться, что вы умеете это делать. Если дурить себе голову достаточно долго, то когда-нибудь у вас начнет получаться, и тогда можно забыть, что вы притворялись. /Юрий Мороз
Re: Запись чисел больше 255 и преобразование их в 10й вид.
Есть (там дальше и сама ссылка) в 526-й аппноте от микрочипа. Там, кстати, есть и многие другие примеры операций с 8-ми и 16-ти битными числами. Принцип прост: в БКД логике производится умножение на 2 по маске аргумента.
Re: Запись чисел больше 255 и преобразование их в 10й вид.
Как раз этот код Eddy71 в первом же ответе скинул. Только я пока въехать в этот принцип до конца не могу. Разбираюсь потихоньку.uldemir писал(а): умножение на 2 по маске аргумента.
Спасибо всем огромное. Вы сократили мне время на поиски истины в разы. Еще один кирпичик почти освоен.
Если у вас что-то не получается, надо притвориться, что вы умеете это делать. Если дурить себе голову достаточно долго, то когда-нибудь у вас начнет получаться, и тогда можно забыть, что вы притворялись. /Юрий Мороз
Re: Запись чисел больше 255 и преобразование их в 10й вид.
Тот код все приводят и иногда даётся ссылка на источник. Но нигде не написан принцип работы. В своё время удалось найти по ключевому слову "метод левого сдвига". Ну это если хочется разобраться. А если использовать, то лучше использовать готовую подпрограмму - там уже все такты вылизаны и что-нибудь оптимальнее придумать сложно.
-
E71
Re: Запись чисел больше 255 и преобразование их в 10й вид.
Присоединюсь к совету использовать вылизаные библиотеки. Вот тут просто клад из них. Из разных областей полезности.
http://www.piclist.com/techref/microchip/routines.htm
http://www.piclist.com/techref/microchip/routines.htm
Re: Запись чисел больше 255 и преобразование их в 10й вид.
Офигенная ссылка! Коды с пояснениями и искать нужный код очень просто - красота!Eddy71 писал(а):Вот тут просто клад из них
Одно из самых дорогих вещей в жизни - это время. Спасибо всем на форуме, что Вы его находите чтобы помочь другим!
Если у вас что-то не получается, надо притвориться, что вы умеете это делать. Если дурить себе голову достаточно долго, то когда-нибудь у вас начнет получаться, и тогда можно забыть, что вы притворялись. /Юрий Мороз
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Запись чисел больше 255 и преобразование их в 10й вид.
Извиняюсь, если эти библиотеки - "повтор".
- Вложения
-
- Match.rar
- (86.7 КБ) 172 скачивания
С Уважением, Альберт (Albert_V).


