Easyelectronics.ru

Электроника для всех
Текущее время: 24 сен 2020, 19:11

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



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
 Заголовок сообщения: алгоритм HEX to BCD
СообщениеДобавлено: 28 ноя 2016, 21:08 
Заглядывает иногда

Зарегистрирован: 04 апр 2012, 01:14
Сообщения: 66
Здравствуйте!
объясните пошагово как преобразовать шестнадцатеричную систему в формат BCD

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

спасибо!

_________________
...и на пятый день господь создал STM32F407...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: алгоритм HEX to BCD
СообщениеДобавлено: 28 ноя 2016, 21:26 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
yazimma, вам надо именно понять алгоритм?
Более-менее адекватное изложение в https://en.wikipedia.org/wiki/Double_dabble
Идея алгоритма:
По сути, в нём две части, выход одной - вход другой
1. Берём все биты Xi исходного числа от старшего к младшему (например, сдвигая число налево через перенос)
2. 8 раз подряд делаем для результата Y = Y*2 + Xi, причём соблюдаем при этом правила BCD-переноса (т.е. если у нас в каком-то ниббле должно получиться число от 10 до 19 - делаем из него число от 10h до 19h (т.е. прибавляем 6).
При этом мы знаем, что получится число от 10 до 19 ещё до удвоения (если до удвоения в соответствующм ниббле было число от 5 до 9) - соответственно, можем вместо этого заранее прибавить 3.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: алгоритм HEX to BCD
СообщениеДобавлено: 28 ноя 2016, 21:35 
Заглядывает иногда

Зарегистрирован: 04 апр 2012, 01:14
Сообщения: 66
о нет. если можно число 0х3B5 в двоичной 0011 1011 0101
как и куда сдвигаем и где биты проверяем. так более наглядно
и количество сдвигов как определить?

_________________
...и на пятый день господь создал STM32F407...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: алгоритм HEX to BCD
СообщениеДобавлено: 28 ноя 2016, 21:42 
Заглядывает иногда

Зарегистрирован: 04 апр 2012, 01:14
Сообщения: 66
сдвигаю на 4 разряда влево 0011, 1011 0101 продолжаю потому что 3 получилось
еще сдвиг 0011 1,011 0101 теперь у нас число 7( тоже меньше 10)
еще сдвиг 0011 10,11 0101 теперь в левой части 11 это уже больше 10. что дальше делать?

_________________
...и на пятый день господь создал STM32F407...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: алгоритм HEX to BCD
СообщениеДобавлено: 28 ноя 2016, 21:45 
Заглядывает иногда

Зарегистрирован: 04 апр 2012, 01:14
Сообщения: 66
aamonster писал(а):
https://en.wikipedia.org/wiki/Double_dabble
Идея алгоритма:
.

спасибо за ссылку но на английском(
осталось понять куда 3 прибавить? к тому что в новом регистре получили ( в который сдвигаем)

_________________
...и на пятый день господь создал STM32F407...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: алгоритм HEX to BCD
СообщениеДобавлено: 28 ноя 2016, 22:31 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
На 5 надо проверять _каждый_ ниббл. Т.е. если в лоб реализовать - вам понадобятся отдельные переменные для единиц, десятков, сотен и так далее.
Т.е. к примеру у вас число 1100 (я для примера взял число покороче)
Начало: десятки = 0, единицы = 0.
3. Берём старший бит X3=1
е=е*2+1=1, переноса нет
д=д*2+0=0, переноса нет (в примере и не будет)
2. Следующий бит X2=1
е=е*2+1=2+1=3, переноса нет
д=0
1. Следующий бит X1=0
е=е*2=6
д=0
0. Следующий бит X0=0
е=е*2+1 = 12, больше 9 - переносим (2 пишем, 1 в уме)
д=д*2+перенос = 1

Итого получили д=1 е=2

А теперь то же самое, но с проверкой на 5 _до_ удвоения (пишу только единицы)
3. е=0 e<5 - прибавлять не надо (e*2+X3<10 - независимо от X3); e=e*2+X3 = 1
2. e=1 e<5 - прибавлять не надо; e=e*2+X2 = 3
1. e=3 e<5 - прибавлять не надо; e=e*2+X1 = 6
0. e=6 e>=5 - прибавляем 3: e=9; e=e*2+X0 = 18 - но e - одна 16-ричная цифра, значит, перенос: e=2, перенос поднят
д=д*2+перенос = 1
Итого то же самое: д=1 е=2


Последний раз редактировалось aamonster 28 ноя 2016, 23:11, всего редактировалось 1 раз.

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

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 2063
Может для начала взять простой алгоритм (если я правильно суть беседы уловил)
Код:
uint32_t dst = 0; // для 8 разрядов максимум
i = 0;
while (n != 0)
{
  dst |= ((n % 10) << i);
  i += 4;
  if (i == 32)
    break;
  n /= 10;
}


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

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 832
yazimma писал(а):
объясните пошагово как преобразовать шестнадцатеричную систему в формат BCD

Вот нафига вообще иметь такие знания? если проще написать на Си всего одну строчку.
static inline uint8_t nex_bcd (uint8_t nex){return ((nex%10)|((nex/10)<<4));}; это для времени

ну или так - чтоб печатать
Код:
char txt_buf[11];
static char * t32_char (uint32_t value, char *buffer);
char * t32_char (uint32_t value, char *buffer)
{
   buffer += 11;
   *--buffer = 0;
   do
   {
      *--buffer = value % 10 + '0';
      value /= 10;
   }
   while (value != 0);
   return buffer;
}

_________________
Потоковая OS


Последний раз редактировалось AVI-crak 28 ноя 2016, 22:52, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: алгоритм HEX to BCD
СообщениеДобавлено: 28 ноя 2016, 22:51 
Заглядывает иногда

Зарегистрирован: 04 апр 2012, 01:14
Сообщения: 66
aamonster писал(а):
Итого получили д=1 е=2


ВСЁ дошло!!! спасибо за объяснение!!!вкурил)

x893- Спасибо за алгоритм!! пойду распакую , хотя кратко и талантливо!

AVI-crak писал(а):
Вот нафига вообще

я просто во всем разбираюсь всегда до косточки
ну если stm32f4 это проглотит то впихну, а если нет )) то буду знать как это сделать

спасибо еще раз всем .тему можно закрывать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: алгоритм HEX to BCD
СообщениеДобавлено: 28 ноя 2016, 23:17 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
yazimma, я там отредактировал - чтобы вариацию с >=5 и +=3 пояснить.

А вообще лучше было разбираться в этом алгоритме на примере реализации для проца с BCD-коррекцией сложения (команда DAA на Intel). Эта команда после сложения двух двоично-десятичных чисел корректирует результат, чтобы он был корректным двоично-десятичным числом.
Соответственно, преобразование становится очень красивым: пихаем очередной бит в перенос, потом ADC аккумулятора с самим собой, потом DAA - и так 8 раз. Всё.


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

Зарегистрирован: 18 июл 2016, 21:17
Сообщения: 746
Все что предназначено на вывод человеку, не требует высокой скорости. Так что даже на авр можно использовать флоат и принтф.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: алгоритм HEX to BCD
СообщениеДобавлено: 29 ноя 2016, 15:45 
Старожил
Аватара пользователя

Зарегистрирован: 16 окт 2011, 11:19
Сообщения: 853
Откуда: Харьков
yazimma писал(а):
Здравствуйте!
объясните пошагово как преобразовать шестнадцатеричную систему в формат BCD


Тут есть апнота AVR204 с примерами


Вложения:
AVR204.jpg
AVR204.jpg [ 157.53 Кб | Просмотров: 3048 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: алгоритм HEX to BCD
СообщениеДобавлено: 29 ноя 2016, 16:01 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1643
Откуда: Курск
Вот ещё, с картинками, verilog


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: алгоритм HEX to BCD
СообщениеДобавлено: 29 ноя 2016, 18:01 
Старожил

Зарегистрирован: 02 дек 2010, 13:52
Сообщения: 5158
Откуда: п. Борок, Ярославская область
На avr я делал банальным вычитанием.

Пример такой: пусть есть число 16 бит.
Код:
счетчик десятков тысяч = 0;
до тех пор, пока число > 10000, число -= 10000; счетчик десятков тысяч++;
BCD = счетчик десятков тысяч <<16;

счетчик тысяч = 0;
до тех пор, пока число > 1000, число -= 1000; счетчик тысяч++;
BCD += счетчик тысяч <<12;

счетчик сотен = 0;
до тех пор, пока число > 100, число -= 100; счетчик сотен++;
BCD += счетчик сотен <<8;

счетчик десятков = 0;
до тех пор, пока число > 10, число -= 10; счетчик десятков++;
BCD += (счетчик десятков <<4)+число;

К примеру avr операции сдвига, суммы и вычитания отнимают одно и то же количество времени. Так что такой алгоритм при должных условиях получается несколько оптимальнее, и проще - чем со сдвигами.

_________________
Ёж птица гордая, пока не пнешь - не полетит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: алгоритм HEX to BCD
СообщениеДобавлено: 30 ноя 2016, 21:00 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: алгоритм HEX to BCD
СообщениеДобавлено: 01 дек 2016, 08:56 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 618
Откуда: Челябинск
demiurg1978 писал(а):
Код:
           *ptr++ = (cnt_2 | 0x30);

Хм... Что это за магическое число 0x30?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: алгоритм HEX to BCD
СообщениеДобавлено: 01 дек 2016, 09:18 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 758
Откуда: GMT+6
Bill
'0'


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: алгоритм HEX to BCD
СообщениеДобавлено: 01 дек 2016, 09:21 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3685
Откуда: Новосибирск
Bill писал(а):
Хм... Что это за магическое число 0x30?

0x30, 0x31, 0x32, 0x33, 0x34,
0x35, 0x36, 0x37, 0x38, 0x39.
Пока писал, успели ответить.
'0', '1', '2', '3', '4',
'5', '6', '7', '8', '9'.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: алгоритм HEX to BCD
СообщениеДобавлено: 01 дек 2016, 14:15 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 710
Откуда: Германия
Лучше так и писать, чтобы код легче читать было:

Код:
           *ptr++ = (cnt_2 | '0');


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


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


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

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


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

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

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