Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перевод WORD в строчный WORD или INT
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК
Aldec
Подскажите библиотеки или функции что то в плане BCDTODEC для перевода WORD или INT в строчный WORD т.е. 1250 в 1,2,5.0
novikovfb
в чем именно должен заключаться перевод? Что значит - WORD? (обычно, это - двухбайтовое беззнаковое целое число, как и зачем его преобразовывать в массив INT - не понятно, достаточно приведения типов).
krux
покажите sizeof(word) и sizeof(int) на вашей платформе и вашем компиляторе.
Aldec
Под переводом в INT имеется ввиду конвертация в сумму круглых значений, или выделении десятых, сотых
scifi
sprintf()
А вообще задачка уровня средней школы, конечно cranky.gif
hsoft
Цитата(Aldec @ Mar 6 2017, 09:33) *
Под переводом в INT имеется ввиду конвертация в сумму круглых значений, или выделении десятых, сотых

написано что то совершенно непонятное.
ViKo
Керниган и Ричи в своей книжке дали пример.
Сергей Борщ
Вы не поняли - это все для слабых! Еще и книжки читать... Нужны библиотеки.
scifi
Цитата(Сергей Борщ @ Mar 6 2017, 14:31) *
Вы не поняли - это все для слабых! Еще и книжки читать... Нужны библиотеки.

Когда-то библиотеками называли такие здания, в которых хранились книги. О, ирония! laughing.gif
Эдди
Я не понял, что ТСу надо? Вот это что ли (аналог printf для целых чисел на МК)?
Такое впечатление, что полный нуль в двух языках сразу: и в С, и в русском!
Aldec
Нужно конвертировать четырехзначное число в массив, типа строчного что то в плане MODF, т.е. какая функция возвращает значение указанное в аргументе, как указатель на определенное число в WORDе
Эдди
Что такое MODF? Что такое WORD? Почему нельзя сразу нормально писать?
novikovfb
Цитата(Эдди @ Mar 6 2017, 19:57) *
Что такое MODF? Что такое WORD? Почему нельзя сразу нормально писать?

если нормально написать - ТС самому понятно станет
Grizzzly
Цитата(Эдди @ Mar 6 2017, 18:57) *
Что такое MODF?

http://en.cppreference.com/w/cpp/numeric/math/modf
Эдди
Очень круто: начал ТС с каких-то int, а в итоге float/double всплыл…
Aldec
Вроде раздел средства разработки и вопрос в общем в каком компиляторе есть функции или готовые процедуры конвертирования DWORD в int array[ ]

Сергей Борщ
QUOTE (Aldec @ Mar 7 2017, 09:18) *
в каком компиляторе есть функции или готовые процедуры конвертирования DWORD в int array[ ]
Ни в каком нет. Читать учебник вам все-же придется.
Obam
Цитата(Aldec @ Mar 7 2017, 11:18) *
Вроде раздел средства разработки и вопрос в общем в каком компиляторе есть функции или готовые процедуры конвертирования DWORD в int array[ ]

http://cppstudio.com/post/389

Вторая страница пошла (я понимаю, форуму хорошо - реклама-шрэклама…), куда катится этот мир (;
http://publ.lib.ru/ARCHIVES/Z/ZLOBIN_Vladi...cessorah.(1991).[djv-fax].zip

Ну и совсем по-пионэрски:
CODE

void BIN_TO_BCD (uint32_t* bcd)
//==============================================================================
// Подпрограмма преобразования 64-х разрядного двоичного (BIN) числа в
// упакованный двоично-десятичный (BCD) формат.
//==============================================================================
#define _tetrad_mask (0x0000000Fu)
#define _tetrad_lmt (0x00000004u)
#define _tetrad_crrctn (0x00000003u)
{
uint32_t shift_rg[5] = {bcd[0], bcd[1], 0, 0, 0},
i = 0x00000040,// счетчик цикла по входному регистру
t, t_l, t_c;
int32_t j;// счетчик цикла по тетрадам BCD-регистра
do {
j = 0x0000001C;
do {
t = (_tetrad_mask << j);
t_l = (_tetrad_lmt << j);
t_c = (_tetrad_crrctn << j);
if ((shift_rg[2] & t) > t_l) {
shift_rg[2] = shift_rg[2] + t_c;
};
if ((shift_rg[3] & t) > t_l) {
shift_rg[3] = shift_rg[3] + t_c;
};
if ((shift_rg[4] & t) > t_l) {
shift_rg[4] = shift_rg[4] + t_c;
};
j =j - 4;
} while (j >= 0);

shift_rg[4] = shift_rg[4] << 1;
if (shift_rg[3] & 0x80000000) {
shift_rg[4] = (shift_rg[4] | 0x00000001);
};
shift_rg[3] = shift_rg[3] << 1;
if (shift_rg[2] & 0x80000000) {
shift_rg[3] = (shift_rg[3] | 0x00000001);
};
shift_rg[2] = shift_rg[2] << 1;
if (shift_rg[1] & 0x80000000) {
shift_rg[2] = (shift_rg[2] | 0x00000001);
};
shift_rg[1] = shift_rg[1] << 1;
if (shift_rg[0] & 0x80000000) {
shift_rg[1] = (shift_rg[1] | 0x00000001);
};
shift_rg[0] = shift_rg[0] << 1;

i = i - 1;
} while (i != 0);

bcd[2] = shift_rg[2];
bcd[3] = shift_rg[3];
bcd[4] = shift_rg[4];
}


//Определили, к примеру:
uint32_t BnrCdDcmls[5];

//Задали:
BnrCdDcmls[0] = младшие_32_разряда;
BnrCdDcmls[1] = старшие_32_разряда;
//Вызвали:
BIN_TO_BCD ((uint32_t*)&BnrCdDcmls);
//Получили: с BnrCdDcmls[2] по BnrCdDcmls[4] тетрадами (это по 4 бита - если слово незнакомое) двоично-десятичное представление;
//ну и уж дальше рассортируете.

Чесслово, за время треда уже и книжку бы прочитали и первый вариант кода проверить успели бы…
Сергей Борщ
QUOTE (Obam @ Mar 7 2017, 10:04) *
//Определили, к примеру:
uint32_t BnrCdDcmls[5];
Вот сразу уже и не подходит. Требовалось WORD.
QUOTE (Obam @ Mar 7 2017, 10:04) *
тетрадами
Снова мимо - надо было int.

biggrin.gif
Obam
Цитата(Сергей Борщ @ Mar 7 2017, 12:45) *
Вот сразу уже и не подходит. Требовалось WORD.

Лично я остановился на WORD'97…
Если закопаться в своих архивах (но я этого делать не стану sm.gif ), то найду подобное и для mcs51, а там word (машинное слово, так ведь?) вообще 8 бит…

Цитата
Снова мимо - надо было int.

biggrin.gif

Ни фига: именно int надо "декомпозировать" wink.gif, Причём TC, упоминая MODF, похоже считает, что int так же сложно устроен, что и float.

Примем дополнение до 2-х, как формат (старший разряд знаковым) - будет int, не примем - не будет. sm.gif

Ну пусть человек, хоть посмотрит-подумает, голова, она ведь не только чтоб в неё есть… а по поводу "за время треда уже и книжку бы прочитали…", я так понимаю, возражений нет (;
Aldec
Упоминание MODF и других функций только для намека на тип функций, то что она из раздела конвертирования. BCDTODEC или BINTOBCD
Тема больше про оптимальные варианты конвертации или более компактные.
scifi
Цитата(Aldec @ Mar 7 2017, 13:21) *
Упоминание MODF и других функций только для намека на тип функций, то что она из раздела конвертирования. BCDTODEC или BINTOBCD
Тема больше про оптимальные варианты конвертации или более компактные.

Для начала укажите тип процессора и язык программирования.
x86?
Васик, питон, жабаскрипт?
Aldec
Вы имеете ввиду что в каком то x86 МК есть аппаратный конвертер

Цитата(Obam @ Mar 7 2017, 08:04) *
//Получили: с BnrCdDcmls[2] по BnrCdDcmls[4] тетрадами (это по 4 бита - если слово незнакомое) двоично-десятичное представление;

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

1111 на выходе 0001 и 0101 т.е 15 ковертируется INT [1,5]
Obam
"Понесли кроссовки Митю...".
Не знаю в каком году вы впервые увидели как унутре себя работает процессор, но книжицу по ссылке всё же почитайте; просветлению, определённо, способствует...

Ну естественно, 15 в шестнадцатиричном представлении - 0FH, в двоичном - 1111B, в двоично-десятичном будет 15H, а в виде ASCIZ 31H, 35H, 00H
А что не так? После:
BnrCdDcmls[0] = 0x0000000F;
BnrCdDcmls[1] = 0x00000000;
BIN_TO_BCD ((uint32_t*)&BnrCdDcmls);
вы не получили 0x00000015 в BnrCdDcmls[2]?

Ваши исходные 1250:
BnrCdDcmls[0] = 1250;
BnrCdDcmls[1] = 0;
BIN_TO_BCD ((uint32_t*)&BnrCdDcmls);
не дали 0x00001250 в BnrCdDcmls[2]?

64 двоичных разряда (два слова в ARM-архитектуре, откуда и дан пример) составляют число из 24-х десятичных разряднов.

И ещё, INT[1,5] это по-каковски?
Aldec
Вам покажется странным но в Си, инициализация массива выглядит как int A[ 10 ], поэтому не должно вызывать затруднений,
Надо также заметить что он т.е. Си принят что то вроде стандартом или по умолчанию и поэтому в вопросе подразумевается Си
Также в Си есть деление по модулю с возвратом остатка т.е. один из различных вариантов для конвертации в массив это A[ ] = B%10.
Obam
Цитата(Aldec @ Mar 8 2017, 16:50) *
Вам покажется странным но в Си, инициализация массива выглядит как int A[ 10 ]

Нет не покажется sm.gif, но "объявление массива", давайте будем терминологически точными; инициализация несколько иное явление - нулями по умолчанию, но можем явно указать чем, а можем (не забывайте - форум про микроконтроллеры) поместить в неинициализируемую область.
Цитата
Надо также заметить что он т.е. Си принят что то вроде стандартом или по умолчанию и поэтому в вопросе подразумевается Си
Также в Си есть деление по модулю с возвратом остатка т.е. один из различных вариантов для конвертации в массив это A[ ] = B%10.

Ну ща вам прилетит: B - это что? А в скобочках что?
Сергей Борщ
QUOTE (Aldec @ Mar 8 2017, 14:50) *
т.е. один из различных вариантов для конвертации в массив это A[ ] = B%10.
Ну так и используйте его. Зачем тему было заводить? lol.gif
Aldec
Да раздел про МК а также "How-to, тонкости работы со средствами разработки" это подразумевает тонкости, фишки...

разделить DWORD на 10 это не на 2, поэтому вопрос про тонкости и фишки.
SSerge
Цитата(Aldec @ Mar 9 2017, 02:38) *
...
вопрос про тонкости и фишки.

http://homepage.cs.uiowa.edu/~jones/bcd/decimal.html
http://we.easyelectronics.ru/Soft/preobraz...lye-chisla.html
Aldec
Там не совсем ясно какой конвертер круче, на делении на 10 или сдвиге 3,30

http://www.microchip.su/showthread.php?t=2162
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.