реклама на сайте
подробности

 
 
> Помогите разобраться с преобразованиями
Neytrino
сообщение Oct 12 2009, 09:38
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 26-02-09
Пользователь №: 45 406



Уважаемые гуру помогите мне разобраться? в IAR нет функций преобразования bin2dec и обратно. Помогите уважаемы с кодом для С. Прошу не пинать сильно
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Neytrino
сообщение Oct 18 2009, 19:41
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 26-02-09
Пользователь №: 45 406



CODE

int bcd2dec (int bcd)
{
int x,y;
x = (bcd & 0xf);
y = ((bcd & 0xf0)>>4)*10;
return x+y;
}

Вот что получилось! Отлично работает!
А вот с обратным преобразованием как-то не получилось, вот код
CODE
int dec2bcd (int dec)
{
int w,x,y;
while ( dec >= 10)
{
dec -=10;
w++;
}
x = dec;

y = (w<<4);
return y+x;
}


Что я не так сделал? Я хотя бы правильным путем пошел?
Go to the top of the page
 
+Quote Post
xemul
сообщение Oct 18 2009, 20:02
Сообщение #3



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Neytrino @ Oct 18 2009, 23:41) *
...
Что я не так сделал?

Не прочитали статью в википедии, рекомендованную Вам на первой странице треда:
Цитата
...
При сложении двоично-десятичных чисел каждый раз, когда происходит перенос бита в старший полубайт, необходимо к полубайту, от которого произошёл перенос, добавить корректирующее значение 0110.
При сложении двоично-десятичных чисел каждый раз, когда встречается недопустимая для полубайта комбинация, необходимо к каждой недопустимой комбинации добавить корректирующее значение 0110 с разрешением переноса в старшие полубайты.
При вычитании двоично-десятичных чисел, для каждого полубайта, получившего заём из старшего полубайта, необходимо провести коррекцию, отняв значение 0110
Go to the top of the page
 
+Quote Post
Neytrino
сообщение Oct 19 2009, 10:16
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 26-02-09
Пользователь №: 45 406



Цитата(xemul @ Oct 19 2009, 00:02) *
Не прочитали статью в википедии, рекомендованную Вам на первой странице треда:

А можно, если конечно не сложно, разжевать это мне, я что-то не совсем понял данной статьи, если быть точнее как производить коррекцию и как вычислить в функции те самые недопустимые комбинации
Go to the top of the page
 
+Quote Post
xemul
сообщение Oct 19 2009, 13:43
Сообщение #5



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Neytrino @ Oct 19 2009, 14:16) *
А можно, если конечно не сложно, разжевать это мне, я что-то не совсем понял данной статьи, если быть точнее как производить коррекцию и как вычислить в функции те самые недопустимые комбинации

В стандартном BCD (с весами битов 8-4-2-1) каждая десятичная цифра однозначно представляется 4-мя битами (тетрадой):
0 - 0000
1 - 0001
2 - 0010
...
9 - 1001
Остальные 6 комбинаций (1010, ... , 1111) являются недопустимыми. (угадайте, почему коррекция выполняется именно на 6?) smile.gif
Если расписать (на бумажке), н-р, сложение двух BCD-чисел
Код
BCD       BIN
11        0001 0001
+
22        0010 0010
=
33        0011 0011 // без переносов между тетрадами вообще никакой разницы с обычным двоичным сложением

35        0011 0101
+
74        0111 0100
=
          1010 1001 // если в какой-то тетраде цифра>9, то приключился BCD-перенос
          +
          0110 0000 // добавляем коррекцию к каждой тетраде, в которой приключился перенос
          =
109  0001 0000 1001 // и не забываем про перенос в следующий BCD-разряд, вес которого, естесно, уже 100

Вычитание - аналогично.
Да и для любого произвольного основания системы счисления тоже аналогично.
Как уже сказал rezident, развлекаться арифметикой непосредственно в BCD смысла нет - проще BCD перевести в обычный двоичный формат, выполнить необходимые вычисления, и перевести результат обратно в BCD.
В конфе уже не раз обсуждались способы BIN->BCD. Самое неприятное в таких преобразованиях (на контроллерах без аппаратного деления) - деление на 10. Для целочисленной арифметики жизнь можно облегчить, н-р, таким образом:
Код
Деление на 10:
8 bit: Y = (X * 0xCD) >> 11;
16 bit: Y = (X * 0xCCCD) >> 19;
32 bit: Y = (X * 0xCCCCCCCD) >> 35;
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Neytrino   Помогите разобраться с преобразованиями   Oct 12 2009, 09:38
- - Палыч   Цитата(Neytrino @ Oct 12 2009, 12:38) в I...   Oct 12 2009, 11:37
- - Rst7   ЦитатаЕсли нужно делать это быстро, то вычитанием ...   Oct 12 2009, 12:16
- - Neytrino   Да, я опрашиваю DS1307 и вывожу значения на LCD на...   Oct 12 2009, 12:41
- - Rst7   ЦитатаДа, я опрашиваю DS1307 и вывожу значения на ...   Oct 12 2009, 12:47
- - Neytrino   а что такое bcd? я что-то не совсем понял гугл   Oct 12 2009, 13:38
|- - Палыч   Цитата(Neytrino @ Oct 12 2009, 16:38) а ч...   Oct 12 2009, 14:22
- - Neytrino   CODEint bin2bcd(int v) { int out; int i1; i1=(...   Oct 13 2009, 15:56
|- - rezident   Цитата(Neytrino @ Oct 13 2009, 21:56) вот...   Oct 13 2009, 17:02
- - Neytrino   Люди, Вы наверное будите смеяться, но у меня снова...   Oct 13 2009, 17:22
- - rezident   Конечно бред. Вот код. Может не эстетично, зато де...   Oct 13 2009, 21:26
- - Neytrino   странно конечно, но правильно не работает... может...   Oct 17 2009, 17:38
|- - rezident   Цитата(Neytrino @ Oct 17 2009, 23:38) стр...   Oct 17 2009, 18:56
- - Rst7   Вы бы задачу конкретизировали. А то совсем не ясно...   Oct 17 2009, 17:50
- - Neytrino   Простите за глупый вопрос, но как выделить полубай...   Oct 17 2009, 19:26
|- - rezident   Цитата(Neytrino @ Oct 18 2009, 01:26) Про...   Oct 17 2009, 19:33
|- - demiurg_spb   Цитата(Neytrino @ Oct 17 2009, 23:26) Про...   Oct 18 2009, 06:58
- - sigmaN   ЦитатаЧтобы избежать неоднозначности я использовал...   Oct 17 2009, 22:37
|- - rezident   Цитата(sigmaN @ Oct 18 2009, 04:37) Я вот...   Oct 18 2009, 00:57
- - Rst7   ЦитатаНу мне надо вывести значения в десятичной си...   Oct 18 2009, 07:35
- - sigmaN   ЦитатаДык вы не просто читайте, а еще и в смысл пр...   Oct 18 2009, 11:15
- - Neytrino   Цитата(sigmaN @ Oct 18 2009, 15:15) Возьм...   Oct 18 2009, 15:44
- - sigmaN   Отлично. Начнем. Предположим, из порта(или откуда-...   Oct 18 2009, 16:25
- - Neytrino   Кажется до меня дошло!!!!!...   Oct 18 2009, 17:02
|- - rezident   Цитата(Neytrino @ Oct 19 2009, 16:16) А м...   Oct 19 2009, 11:28
- - baralgin   Neytrino В функции dec2bcd в глаза бросается неини...   Oct 18 2009, 20:31
|- - rezident   Цитата(baralgin @ Oct 19 2009, 02:31) rez...   Oct 19 2009, 00:08
- - Neytrino   Так, кажется понял буду пробовать, о результатах ...   Oct 19 2009, 19:45


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st August 2025 - 12:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01438 секунд с 7
ELECTRONIX ©2004-2016