Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

Преобразовать FLOAT/HEX

Непрочитано 31.03.2015, 19:22  
jmp
Прохожий
 
Регистрация: 23.11.2006
Сообщений: 3
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
jmp на пути к лучшему
По умолчанию Преобразовать FLOAT/HEX

Не могу перешагнуть через это преобразование:
есть переменная temp (float) -измеренная температура датчиком DS18B20.
Для озвучивания температуры нужно преобразовать так , чтобы в буфер
записать переменнные в hex виде .
Знак числа. Каждая цифра числа отдельно. Децимальная точка. Десятая доля . Например +100.5 градуса (0x2B),(0x31),(0x30),(0x30), (0x2E),(0x35).
Помогите конкретным примером
AVR- CV
Реклама:
jmp вне форума  
Непрочитано 31.03.2015, 19:29  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Преобразовать FLOAT/HEX

В даташите написано, как преобразовывать температуру. float тут 100 лет в обед не сплющились, целочисленной математики за глаза хватит!
Т.е. считанное значение приводим к виду температура*10, потом выводим, рисуя десятичную точку перед последним знаком. Чтобы преобразовать целое в строку, заморачиваться не надо: это элементарнейшая функция.

Кстати, а какое отношение HEX имеет ко всему этому?
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 01.04.2015, 19:40  
jmp
Прохожий
 
Регистрация: 23.11.2006
Сообщений: 3
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
jmp на пути к лучшему
По умолчанию Re: Преобразовать FLOAT/HEX

Спасибо конечно за наставления на путь истинный. Но я уже разменял 6 десятков.
Поэтому, поздно пить "БОРЖОМИ", когда печень уже отпала.
Если всё так просто , то помогите "кодом".
Михаил
jmp вне форума  
Непрочитано 01.04.2015, 20:40  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Преобразовать FLOAT/HEX

Вот — мой велосипед для вывода целых чисел в терминал.
А это — то же самое, только с выводом в шестнадцатеричной записи.
Чтобы вывести число как дробь, достаточно в нужном месте еще десятичную точку нарисовать (скажем, если я захочу напряжение вывести не в виде xxxx в сотых долях Вольта, а в виде xx.xx — в целых Вольтах, то посчитаю, в какой позиции нужно точку вывести и выведу в нужном месте).
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 02.04.2015, 00:44  
Kabron
Почётный гражданин KAZUS.RUN
 
Аватар для Kabron
 
Регистрация: 12.11.2004
Адрес: Москва
Сообщений: 8,834
Сказал спасибо: 721
Сказали Спасибо 4,535 раз(а) в 2,070 сообщении(ях)
Kabron на пути к лучшему
По умолчанию Re: Преобразовать FLOAT/HEX

Сочувствую ТС.
Эдди на существо не размениваясь, щедро и от души вываливает по полкило строк.
Этак разбираясь и 7й десяток разменять можно.
__________________
33Й ДАН БАНА
Я не помогаю. Я провоцирую думать.
Не дай вам Бог плохих контактов.
Kabron вне форума  
Непрочитано 02.04.2015, 01:17  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Преобразовать FLOAT/HEX

Сообщение от Kabron Посмотреть сообщение
Эдди на существо не размениваясь, щедро и от души вываливает по полкило строк
Если бы вопрос четко был сформулирован, то не выкидывал бы такую толпу строк.
Все-таки, правильно заданный вопрос уже содержит в себе приличную долю ответа!
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 02.04.2015, 10:24  
Himik_2
Прописка
 
Аватар для Himik_2
 
Регистрация: 27.04.2005
Сообщений: 125
Сказал спасибо: 10
Сказали Спасибо 26 раз(а) в 17 сообщении(ях)
Himik_2 на пути к лучшему
По умолчанию Re: Преобразовать FLOAT/HEX

Для ds18b20 делаю так:

void ConvHex_buf(char Port)
{ short temp;

if(Port==1)
temp=temp1;

if(Port==2)
temp=temp2;

if(temp==0xffff){ BufDisp[0]=BufDisp[1]=BufDisp[2]=0x11; return;} датчик отсутствует

if((temp & 0x8000) != 0) { znak=1; temp=(~temp)+1;} знак температуры
else znak=0;

BufDisp[2]=(unsigned char)(temp ››4) /10;
BufDisp[1]=(unsigned char)(temp ›› 4) % 10;
BufDisp[0]=((unsigned char)(temp & 0x000f)*625)/1000;
}

правда это только три разряда т.е. диапазон -50,0...+99,0

Последний раз редактировалось Himik_2; 02.04.2015 в 10:28.
Himik_2 вне форума  
Непрочитано 02.04.2015, 14:19  
Dmitri_256
Временная регистрация
 
Регистрация: 05.08.2010
Сообщений: 92
Сказал спасибо: 68
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
Dmitri_256 на пути к лучшему
По умолчанию Re: Преобразовать FLOAT/HEX

Моя реализация float-hex и обратно

Код:
float Hex2Float(char buffer[], uint8_t start)
{
  union
  {
    float f;
    uint8_t c[4];
  } union_convert;

  union_convert.c[0] = HexToChar(&buffer[start], 0);
  union_convert.c[1] = HexToChar(&buffer[start], 1*2);
  union_convert.c[2] = HexToChar(&buffer[start], 2*2);
  union_convert.c[3] = HexToChar(&buffer[start], 3*2);
  
  return union_convert.f;
}

void Float2HexPrint(float f_val)
{
  union
  {
    float f;
    uint8_t c[4];
  } union_convert;
  
  union_convert.f = f_val;
  PrintUint8Hex(union_convert.c[0]);
  PrintUint8Hex(union_convert.c[1]);
  PrintUint8Hex(union_convert.c[2]);
  PrintUint8Hex(union_convert.c[3]);
}

/*************************************************/
uint8_t HexToChar(char *InData, uint8_t Start)
{
  uint8_t Rez=0;
  InData+=Start;
  
  if(*InData›0x2F && *InData‹0x3A)
    Rez|=(*InData-0x30);
  else
    Rez|=(*InData-0x37);
  Rez‹‹=4;
  InData++;
  
  if(*InData›0x2F && *InData‹0x3A)
    Rez|=(*InData-0x30);
  else
    Rez|=(*InData-0x37);
  return Rez;
}


void PrintUint8Hex(unsigned char Data)
{
  unsigned char tmp;
  tmp=Data & 0xF0;
  tmp››=4;
  if(tmp‹10)
    PUT_CHAR(tmp+0x30);
  else
    PUT_CHAR(tmp+0x37);
  
  tmp=Data & 0x0F;
  if(tmp‹10)
    PUT_CHAR(tmp+0x30);
  else
    PUT_CHAR(tmp+0x37);
}
Dmitri_256 вне форума  
Непрочитано 02.04.2015, 14:27  
Dmitri_256
Временная регистрация
 
Регистрация: 05.08.2010
Сообщений: 92
Сказал спасибо: 68
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
Dmitri_256 на пути к лучшему
По умолчанию Re: Преобразовать FLOAT/HEX

Моя реализация для ds18b20. Выдрано из конечного автомата, так что в функцию запихайте сами

Код:
static __flash unsigned char table_fract_val[16] = 
{0, 1, 1, 2, 3, 3, 4, 
4, 5, 6, 6, 7, 8, 8, 9, 9};

static unsigned int data;
uint8_t minus; //флаг отрицательной температуры
uint8_t int_val; //целое значение температуры
uint8_t fract_val;  //значение температуры после запятой

//buff[0] и buff[1] прочитанные данные из термометра

data = buff[1]‹‹8 | buff[0];
if(buff[1]&0xF0)
{
  minus = 1;
  data = (0xFFFF - data) +  1;
}
else 
  minus = 0;

int_val = data››4; 
fract_val = table_fract_val[data & 0x0F];
Dmitri_256 вне форума  
Непрочитано 02.04.2015, 14:28  
__Yuri
Частый гость
 
Регистрация: 17.11.2008
Адрес: Россия г.Краснодар
Сообщений: 30
Сказал спасибо: 14
Сказали Спасибо 33 раз(а) в 5 сообщении(ях)
__Yuri на пути к лучшему
По умолчанию Re: Преобразовать FLOAT/HEX

Сообщение от jmp Посмотреть сообщение
Например +100.5 градуса (0x2B),(0x31),(0x30),(0x30), (0x2E),(0x35)
Если Вам необходимо преобразовать значение в строку ascii символов, то удобнее всего использовать функцию sprintf. Например так:

Код:
float fval; // тут находится значение которое необходимо преобразовать
char cbuf[32]; // тут будет находится преобразованное значение в ascii кодировке
sprintf(cbuf,”%f”,fval); // операция преобразования
Для правильной работы этой функции с типом float в CV необходимо в свойствах проекта указать «float, width, precision» во вкладке «C Compiler» «Code Generation».
У этой функции много возможностей, можно сформировать строку, где будут несколько значений вперемешку с поясняющим текстом например: «Temp: +32.5 Time: 12:00». За более подробной информацией смотрите Help по CV.
__Yuri вне форума  
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразовать 128 ТТЛ в 8 evg111 TTL и CMOS логика 71 09.03.2013 08:40
завести на плату 220вольт и преобразовать в TTL ezbun Микроконтроллеры, АЦП, память и т.д 4 15.11.2010 23:10
Как преобразовать X-Y-Z в Видео или VGA? efimius Видеотехника 9 28.07.2010 10:16
Как преобразовать прямогульные импульсы с синусоиду? ArtUrl1986 Электроника - это просто 2 12.05.2009 03:46
помогите преобразовать сигнал 0...10В в 2...10В :-( kdy1 Электроника средств транспорта 2 25.02.2009 11:16


Часовой пояс GMT +4, время: 02:03.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.