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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Помогите разобраться с преобразованиями
Neytrino
сообщение Oct 12 2009, 09:38
Сообщение #1


Участник
*

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



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


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Neytrino @ Oct 12 2009, 12:38) *
в IAR нет функций преобразования bin2dec и обратно.
Вам это нужно для вывода значения на индикатор? Тогда что-то такое:
Код
unsigned int Bin;
unsigned char D[5];
for(i=0; i<5; ++i)
{
  D[i]= Bin % 10;
  Bin /= 10;
}

Десятичные цифры в массиве будут лежать "наоборот": D[0]-самая младшая (единицы), D[1]-десятки, и тд.
Если нужно делать это быстро, то вычитанием десятков тысяч, единиц тысяч, сотен, и тд (воспользуйтесь поиском - это уже не раз обсуждалось).
Go to the top of the page
 
+Quote Post
Rst7
сообщение Oct 12 2009, 12:16
Сообщение #3


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Если нужно делать это быстро, то вычитанием десятков тысяч, единиц тысяч, сотен, и тд


Есть способы и быстрее. Правда, требуют аппаратного умножителя.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Neytrino
сообщение Oct 12 2009, 12:41
Сообщение #4


Участник
*

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



Да, я опрашиваю DS1307 и вывожу значения на LCD на основе ks0108. Беда оказалась в том, что после того как секунды отсчитали 9 следующее значение было уже 16, после 24 сразу же 32 и т.д. Где-то наткнулся, что неправильно преобразованы числа, но готовой функции в IAR не нашел, как в CV вот и решил обратиться, т.к. кодов не нашел
Go to the top of the page
 
+Quote Post
Rst7
сообщение Oct 12 2009, 12:47
Сообщение #5


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Да, я опрашиваю DS1307 и вывожу значения на LCD на основе ks0108.


Дык это совсем другое дело, там же BCD. Каждый байт в символьный десятичный вид преобразуется банально:
Код
char *out; //Указатель на буфер строки
char v; //Значение байта
....
*out++=((v&0xF0)>>4)+'0';
*out++=(v&0x0F)+'0';


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Neytrino
сообщение Oct 12 2009, 13:38
Сообщение #6


Участник
*

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



а что такое bcd? я что-то не совсем понял гугл
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 12 2009, 14:22
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Neytrino @ Oct 12 2009, 16:38) *
а что такое bcd?

Двоично-десятичный код
Go to the top of the page
 
+Quote Post
Neytrino
сообщение Oct 13 2009, 15:56
Сообщение #8


Участник
*

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



CODE
int bin2bcd(int v)
{

int out;
int i1;
i1=(v>>4)*10;
out = i1;
return out;
}


вот так я получил десятки, но что-то не могу получить единицы, помогите, я совсем запутался
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 13 2009, 17:02
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Neytrino @ Oct 13 2009, 21:56) *
вот так я получил десятки, но что-то не могу получить единицы, помогите, я совсем запутался
Раз уж вы использовали умножение, то видимо и деление не будет извратом. laughing.gif Используйте операцию % - получение остатка от целочисленного деления.
Код
i2=v%10; // получение остатка при делении на десять
Go to the top of the page
 
+Quote Post
Neytrino
сообщение Oct 13 2009, 17:22
Сообщение #10


Участник
*

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



Люди, Вы наверное будите смеяться, но у меня снова получился полный бред, вот код:
CODE
int bin2bcd(int v)
{

int out;
int i1,i2;
i1=(v>>4)*10;
i2=v%10;
out = i1+i2;
return out;
}
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 13 2009, 21:26
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Конечно бред. Вот код. Может не эстетично, зато дешево надежно и практично wink.gif И без умножений-делений, которые требуют соответствующих библиотек, увеличивающих конечный код. Актуально для МК с небольшим количеством набортной Flash.
Код
uint16_t bcd(uint16_t val)
{ uint16_t out=0, inp=val;
  while (inp>=1000)
  { inp-=1000;
    out+=1<<12;
  }
  while (inp>=100)
  { inp-=100;
    out+=1<<8;
  }
  while (inp>=10)
  { inp-=10;
    out+=1<<4;
  }
  out+=inp;
  return (out);
}

Естественно аргумент функции не должен превышать значения 9999.
Go to the top of the page
 
+Quote Post
Neytrino
сообщение Oct 17 2009, 17:38
Сообщение #12


Участник
*

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



странно конечно, но правильно не работает... может проблема в переменных, которые я поставил, вместо uintl6_t и предположит, что это unsigned int
Go to the top of the page
 
+Quote Post
Rst7
сообщение Oct 17 2009, 17:50
Сообщение #13


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Вы бы задачу конкретизировали. А то совсем не ясно, какой результат Вам надо получить.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 17 2009, 18:56
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Neytrino @ Oct 17 2009, 23:38) *
странно конечно, но правильно не работает...
Что именно не работает? На входе бинарное число, на выходе бинарно-десятичное. Т.е. каждый полубайт (4 бита) содержит число, не превышающее основания 10 (от 0 до 9). Допустим на входе число 1234=0x04D2, на выходе получаем 0x1234. После этого достаточно выделить каждый из полубайтов, прибавить к нему ASCII-код символа '0'=0x30 и можно выводить на экран число в привычном десятичном виде.
Цитата(Neytrino @ Oct 17 2009, 23:38) *
может проблема в переменных, которые я поставил, вместо uintl6_t и предположит, что это unsigned int
В стандарте Си нет конкретной размерности у типов переменных. Размерность типов переменных задается в стандартном хедере limits.h и может отличаться на разных кристаллах и компиляторах. А стандарт лишь гарантирует их отношение charshort intintlong int. Чтобы избежать неоднозначности я использовал конкретный тип uint16_t, который соответствует 16-и битному unsigned int.
Go to the top of the page
 
+Quote Post
Neytrino
сообщение Oct 17 2009, 19:26
Сообщение #15


Участник
*

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



Простите за глупый вопрос, но как выделить полубайт?

Цитата(Rst7 @ Oct 17 2009, 21:50) *
Вы бы задачу конкретизировали. А то совсем не ясно, какой результат Вам надо получить.

Ну мне надо вывести значения в десятичной системе, которые выдает мне DS1307
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 07:36
Рейтинг@Mail.ru


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