Easyelectronics.ru

Электроника для всех
Текущее время: 20 июл 2018, 09:52

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: Hex to BCD
СообщениеДобавлено: 22 май 2018, 20:41 
Заглядывает иногда

Зарегистрирован: 03 июл 2012, 19:16
Сообщения: 108
Вот существует широко известный простой способ преобразовать целое двоичное число в двоично десятичное: двигаем число влево в байты результата, если ниббл вдруг становится больше или равен 5, то прибавляем к нему 3:
Изображение
А вот есть ли подобный простой алгоритм для дробных чисел с фиксированной запятой? Допустим, у меня на дробную часть один байт: 2^(-1)...2^(-8), хочу получить BCD с точностью 2 знака.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Hex to BCD
СообщениеДобавлено: 22 май 2018, 21:35 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 560
Допустим дробная часть равна 64, тогда множим ее на 100, добавляем 128, для более точного округления, делим на 256(или берем второй байт), получаем 25, преобразуем ее в BCD так же как и целую часть, а выводим как 0.25. Или берем 10, проделываем то же самое, получаем 4-ку, она меньше 10, значит добавляем нолик и выводим как 0.04.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Hex to BCD
СообщениеДобавлено: 22 май 2018, 22:20 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1953
Просто домножьте на степень 10, запомнив положение точки и преобразуйте как целое число, а точку потом поставите где надо


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Hex to BCD
СообщениеДобавлено: 22 май 2018, 22:55 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1253
Откуда: Курск
Тоже интересно
На словах у вас всё просто, а вот кто сможет расписать преобразование двоичного числа 11.001001 в BCD как в табличке выше ???
ЗЫ Предположим 3 знака после запятой


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Hex to BCD
СообщениеДобавлено: 23 май 2018, 00:48 
Старожил

Зарегистрирован: 18 июл 2016, 21:17
Сообщения: 746
Этот алгоритм является как бы альтернативой делению на степени 10 для вывода чисел на индикацию?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Hex to BCD
СообщениеДобавлено: 23 май 2018, 02:56 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 4581
11.001001 = 11 . 001001
1. вывести целую часть 11
2. поставить точку
3. цикл вывода дробной части:
а. temp = (001001) * 10;
б. вывести число temp>>6;
в. temp = temp & 0x3F;
г. - см. а, так пока не надоестЪ.
Зря поратил время.


Последний раз редактировалось u37 23 май 2018, 15:52, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Hex to BCD
СообщениеДобавлено: 23 май 2018, 04:19 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5063
Int_13h писал(а):
А вот есть ли подобный простой алгоритм для дробных чисел с фиксированной запятой? Допустим, у меня на дробную часть один байт: 2^(-1)...2^(-8), хочу получить BCD с точностью 2 знака.


от задачи зависит то как оптимально преобразовывать если мы говорим о преобразовании с целью отображения
я обычно в цикле раскладываю по модулю 10 от старшей цифры к младшей
деление по модулю дает нам десятичную цифру разряда в диапазоне 0-9
чтобы из нее получить char достаточно прибавить '0'
или если у нас таблица символов (7-ми сегментный индикатор или графический) то полученное число добавляем к индексу в таблице цифры 0

насчет чисел с точкой.... в какой задаче они нужны?
ИМХО лучшее число с фиксированной точкой в проектах с МК - это целое со сдвинутой базой
например температура 36.6 хранится как 366 при точности один знак после запятой, 3660 - при точности два знака


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Hex to BCD
СообщениеДобавлено: 23 май 2018, 10:01 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1253
Откуда: Курск
Так никто и не смог расписать табличку... Только теория
Пример:
Есть замечательный датчик AS5311. Его разрешение 12 бит. 10 из них - дробная часть. Младший разряд равен 1/1024 мм. Данные изначально в двоичном виде. Их никак не получится хранить помноженными на 10... Затронутый ТС способ преобразования в BCD удобен, в частности, при применении в ПЛИС. В МК можно любой изврат делать, переменные вводить, делить умножать и тд. Вы покажите на конкретном примере чтоб так же красиво было с дробными двоичными числами. Лично я не догоняю. Не исключаю что туплю - не идеален )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Hex to BCD
СообщениеДобавлено: 23 май 2018, 11:00 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 751
Что-то я там не вижу про дробную часть. Я вижу 12-битное значение положения:
Цитата:
The Serial interface allows data transmission of the 12-bit absolute linear position information (within one pole pair = 2.0mm). Data bits D11:D0 represent the position information with a resolution of 488nm (2000μm / 4096) per step.

И в выводе ШИМ тоже в ДШ оперируются значениями 0..4095. Да и никто не заставляет хранить данные в полученном виде, их сразу можно приводить к удобному виду. В зависимости от того, что потом планируется с полученными данными делать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Hex to BCD
СообщениеДобавлено: 23 май 2018, 11:35 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1253
Откуда: Курск
Ok
Это всё теории
Ещё раз. Покажите, как в примере, в табличке у ТС, преобразование 12 битного двоичного числа в BCD
Вот вернул мне датчик число 11.0010010001
Мне это число надо вывести на 6-ти разрядный 7-ми сегментный индикатор в понятном человеку виде с точностью до тысячных (три знака до запятой, три знака после запятой)
Распишите мне последовательность действий. Именно операциями сдвига, сравнения, добавления. Без умножений на 10, деления без остатка, остатка от деления на 10 и прочего


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Hex to BCD
СообщениеДобавлено: 23 май 2018, 12:05 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5063
Cthulhu писал(а):
Ok
Это всё теории
Ещё раз. Покажите, как в примере, в табличке у ТС, преобразование 12 битного двоичного числа в BCD
Вот вернул мне датчик число 11.0010010001
Мне это число надо вывести на 6-ти разрядный 7-ми сегментный индикатор в понятном человеку виде с точностью до тысячных (три знака до запятой, три знака после запятой)
Распишите мне последовательность действий. Именно операциями сдвига, сравнения, добавления. Без умножений на 10, деления без остатка, остатка от деления на 10 и прочего


на абстрактный вопрос всегда будет теоретический ответ
в вашем вопросе не определено откуда берется число 11.0010010001, скорее всего это уже результат преобразования и совсем не факт, что оно в таком виде нужно

без деления на 10 в десятичном виде вы никак не представите число. в примере ТС речь идет о числе в 4 бита, по сути описан упрощенный алгоритм дешифрации двоичного числа в десятичное
при этом число 4-х битное в диапазоне 10-15 уже не будет работать
или я что то не понимаю
но логика в том, что 4 битное число это от 1 до 2 BCD цифр, 8-ми битное от 1 до 3 BCD
алгоритм выше не дает ответа на вопрос как получить несколько BCD из одного числа


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Hex to BCD
СообщениеДобавлено: 23 май 2018, 13:12 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1253
Откуда: Курск
Ппц
Да хоть сколько бит, любая разрядность для целых чисел https://en.wikipedia.org/wiki/Double_dabble
Вопрос про дробную часть
Как происхождение числа повлияет на алгоритм???? Датчик выдал такой результат, он по другому не умеет. И это вполне годный результат
Вопрос в том, как из двоичного 0.01 получить три отдельных цифры 0 2 5, годных для вывода на индикатор, а из 0.001 получить 4 (или другое количество, в зависимости от требуемой точности) цифры 0 1 2 5. А из 0.011 получить 0 3 7 5
Вероятнее всего этот алгоритм не подходит для дробной части


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Hex to BCD
СообщениеДобавлено: 23 май 2018, 13:20 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 4581
Cthulhu писал(а):
Именно операциями сдвига, сравнения, добавления. Без умножений на 10

Видимо, вы не в курсе, что такое "умножение". Почитали бы, перед тем, как.
Умножить на 10 - это 1 сложение и 2 сдвига.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Hex to BCD
СообщениеДобавлено: 23 май 2018, 15:29 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 751
https://electronics.stackexchange.com/q ... ts-in-vhdl

И вообще все описания в сети, на эту тему предлагают умножать на 10, ничего страшного в этом нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Hex to BCD
СообщениеДобавлено: 23 май 2018, 16:20 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1253
Откуда: Курск
NStorm писал(а):
.

Спасибо! Это то что нужно!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Hex to BCD
СообщениеДобавлено: 27 май 2018, 07:52 
Заглядывает иногда

Зарегистрирован: 03 июл 2012, 19:16
Сообщения: 108
Отчитываюсь. Вот этот алгоритм прекрасно подошел.
Reflector писал(а):
Допустим дробная часть равна 64, тогда множим ее на 100, добавляем 128, для более точного округления, делим на 256(или берем второй байт), получаем 25, преобразуем ее в BCD так же как и целую часть, а выводим как 0.25. Или берем 10, проделываем то же самое, получаем 4-ку, она меньше 10, значит добавляем нолик и выводим как 0.04.

Сначала дробный байт умножаем на 100d сдвигами, это должно быть эквивалентно переводу из дробной части в целую:
100X = 64X + 32X + 4X = X<<6 + X<<5 + X<<2
Далее добавляем 128d, из двух байтов результата берем старший. Что в нем есть прогоняем через дабл-дабл алгоритм и готово - дробная часть в BCD формате. Не забываем добавить к целой части единичку, если дробная часть 0xFF ~ 0.99604 ~ 1.00.

Зачем это нужно? Во внутреннем представлении не важно, с целыми или дробными работать, главное положение запятой отслеживать при умножении/делении. Но тут потребовалось организовать ввод-вывод на HMI настроечных коэффициентов и результатов в виде дробных чисел, вот тут и потребовался алгоритм. Вот вводит человек 0.5, значит в программе должно появиться 0х0080, получилось в программе 0х02FF - человек видит 3.00. Красиво и точность в принципе достаточна :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB