|
|
  |
Преобразовать float в двоично-десятичное (WinAVR C), Как это сделать собственно |
|
|
|
Apr 3 2007, 14:58
|

Частый гость
 
Группа: Участник
Сообщений: 142
Регистрация: 3-04-07
Пользователь №: 26 732

|
Подскажите, как программно перевести переменную с плавающей точкой FLOAT в BCD или что нибудь похожее для вывода на семисегментный светодиодный индикатор. Я делаю калибровку измерительного прибора, по формуле: TEMP = (((float)ADC-OFFSET)*T1) / ((ADCT1-OFFSET)); TEMP - искомое значение флоат формата ADC - текущее значение АЦП 16-бит OFFSET - показания АЦП при 0 на входе T1 - эталонная температура,значением которой и производится калибровка ADCT1 - значение АЦП при температуре Т1 Измерения нужно проводить точно, поэтому решил использовать арифметику с плавающей точкой, а вот как перевести в BCD, чтоб наблюдать воочию на семисегментнике...сижу думаю...и думаю... и  .
|
|
|
|
|
Apr 3 2007, 15:09
|
Группа: Участник
Сообщений: 11
Регистрация: 14-07-06
Из: Кишинёв
Пользователь №: 18 825

|
самое простое что приходит в голову это sprintf(str,"%f",TEMP). а затем уже строку преобразовать в BCD если надо
но флоат много памяти жрёт, поэтому я например по возможности использую числа с "фиксированной запятой" типа long, учитывая нужную точность
|
|
|
|
|
Apr 6 2007, 15:00
|

Частый гость
 
Группа: Участник
Сообщений: 142
Регистрация: 3-04-07
Пользователь №: 26 732

|
 А-а-а...сибо.. Можно ведь пребразовать в строковую... Но как это сделать? Я добавил Вашу строку в прогу, определил переменную char - str[15], откомпилировал и загнал в симулятор... Так в памяти ОЗУ данный массив str[15] имеет какое-то значение только в элементе str[0]! Остальные равны 0. Хотя переменная TEMP равна 0,936214..... А можно в WinAVR еще как-то float в строчное преобразовать? (а потом по ASCII коду определить цифру и вывести ее на LED индикатор)
|
|
|
|
|
Oct 31 2007, 10:05
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Batman @ Apr 3 2007, 18:58)  ...плавающей точкой, а вот как перевести в BCD, чтоб наблюдать воочию на семисегментнике...сижу думаю...и думаю... и  . Почитайте описание функций 'dtostrf' и 'dtostre'. И если будете использовать float подключите 'libm.lib' библиотеку, добавте ключик -lm. Анатолий.
|
|
|
|
|
Nov 2 2007, 12:02
|
Группа: Новичок
Сообщений: 5
Регистрация: 25-09-07
Пользователь №: 30 828

|
На www.atmel.ru была статья "Преобразование двоичных чисел в двоично-десятичные" там есть ответ на этот вопрос.
|
|
|
|
|
Nov 2 2007, 14:21
|
Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 22-03-07
Из: Novosibirsk
Пользователь №: 26 415

|
Цитата(Batman @ Apr 6 2007, 22:00)  Так в памяти ОЗУ данный массив str[15] имеет какое-то значение только в элементе str[0]! Остальные равны 0. Хотя переменная TEMP равна 0,936214..... Вы, наверное, использовали стандартный printf. Он не поддерживает плавающую точку. Нужно добавить -Wl,-u,vfscanf -lscanf_flt Цитата А можно в WinAVR еще как-то float в строчное преобразовать? (а потом по ASCII коду определить цифру и вывести ее на LED индикатор) Поскольку вам на LED под точку отдельное знакоместо не нужно (а printf вставит точку-символ), если число знаков после запятой фиксированное, используйте itoa/ltoa/utoa. Например, itoa(TEMP * 1000 + 0.5, str, 10), а точку потом на нужном сегменте засветите. Учтите, что число будет выровнено влево, старшие нули пропадут. Для вашего случая получится "936". Придется самому выравнивать. Если лень, только для положительных формата XX.XX - sprintf_P(str, PSTR("%2d%02d"), (int)TEMP, (int)(TEMP * 100 + 0.5) % 100);
|
|
|
|
|
Nov 3 2007, 07:18
|
Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 22-03-07
Из: Novosibirsk
Пользователь №: 26 415

|
Цитата(SergeiCh @ Nov 2 2007, 21:21)  sprintf_P(str, PSTR("%2d%02d"), (int)TEMP, (int)(TEMP * 100 + 0.5) % 100) Написал не подумав.  Округляться будет неправильно. При TEMP = 0.9999 вместо " 100" получится " 000" Проще так: Код sprintf(str, "%04d", (int)(TEMP * 100 + 0.5)); if (*str == '0') *str = ' '; Последнюю строчку по вкусу
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|