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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Преобразовать FLOAT/HEX

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

Кстати, а какое отношение HEX имеет ко всему этому?
__________________
Союз Советских Социалистических Округов Северной Америки
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.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Преобразовать FLOAT/HEX

Вот — мой велосипед для вывода целых чисел в терминал.
А это — то же самое, только с выводом в шестнадцатеричной записи.
Чтобы вывести число как дробь, достаточно в нужном месте еще десятичную точку нарисовать (скажем, если я захочу напряжение вывести не в виде xxxx в сотых долях Вольта, а в виде xx.xx — в целых Вольтах, то посчитаю, в какой позиции нужно точку вывести и выведу в нужном месте).
__________________
Союз Советских Социалистических Округов Северной Америки
eddy вне форума  
Непрочитано 02.04.2015, 00:44  
Kabron
Почётный гражданин KAZUS.RU
 
Аватар для Kabron
 
Регистрация: 12.11.2004
Адрес: Москва
Сообщений: 8,540
Сказал спасибо: 698
Сказали Спасибо 4,315 раз(а) в 1,979 сообщении(ях)
Kabron на пути к лучшему
По умолчанию Re: Преобразовать FLOAT/HEX

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

Сообщение от Kabron Посмотреть сообщение
Эдди на существо не размениваясь, щедро и от души вываливает по полкило строк
Если бы вопрос четко был сформулирован, то не выкидывал бы такую толпу строк.
Все-таки, правильно заданный вопрос уже содержит в себе приличную долю ответа!
__________________
Союз Советских Социалистических Округов Северной Америки
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
Сообщений: 93
Сказал спасибо: 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
Сообщений: 93
Сказал спасибо: 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, время: 13:32.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot