AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
31.03.2015, 19:22
|
|
Прохожий
Регистрация: 23.11.2006
Сообщений: 3
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Преобразовать FLOAT/HEX
Не могу перешагнуть через это преобразование:
есть переменная temp (float) -измеренная температура датчиком DS18B20.
Для озвучивания температуры нужно преобразовать так , чтобы в буфер
записать переменнные в hex виде .
Знак числа. Каждая цифра числа отдельно. Децимальная точка. Десятая доля . Например +100.5 градуса (0x2B),(0x31),(0x30),(0x30), (0x2E),(0x35).
Помогите конкретным примером
AVR- CV
|
|
|
|
31.03.2015, 19:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: Преобразовать FLOAT/HEX
В даташите написано, как преобразовывать температуру. float тут 100 лет в обед не сплющились, целочисленной математики за глаза хватит!
Т.е. считанное значение приводим к виду температура*10, потом выводим, рисуя десятичную точку перед последним знаком. Чтобы преобразовать целое в строку, заморачиваться не надо: это элементарнейшая функция.
Кстати, а какое отношение HEX имеет ко всему этому?
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
01.04.2015, 19:40
|
|
Прохожий
Регистрация: 23.11.2006
Сообщений: 3
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Преобразовать FLOAT/HEX
Спасибо конечно за наставления на путь истинный. Но я уже разменял 6 десятков.
Поэтому, поздно пить "БОРЖОМИ", когда печень уже отпала.
Если всё так просто , то помогите "кодом".
Михаил
|
|
|
|
01.04.2015, 20:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: Преобразовать FLOAT/HEX
Вот — мой велосипед для вывода целых чисел в терминал.
А это — то же самое, только с выводом в шестнадцатеричной записи.
Чтобы вывести число как дробь, достаточно в нужном месте еще десятичную точку нарисовать (скажем, если я захочу напряжение вывести не в виде xxxx в сотых долях Вольта, а в виде xx.xx — в целых Вольтах, то посчитаю, в какой позиции нужно точку вывести и выведу в нужном месте).
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
02.04.2015, 00:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.11.2004
Адрес: Москва
Сообщений: 8,540
Сказал спасибо: 698
Сказали Спасибо 4,315 раз(а) в 1,979 сообщении(ях)
|
Re: Преобразовать FLOAT/HEX
Сочувствую ТС.
Эдди на существо не размениваясь, щедро и от души вываливает по полкило строк.
Этак разбираясь и 7й десяток разменять можно.
__________________
Я не помогаю. Я провоцирую думать.
Не дай вам Бог плохих контактов.
|
|
|
|
02.04.2015, 01:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: Преобразовать FLOAT/HEX
Сообщение от Kabron
|
Эдди на существо не размениваясь, щедро и от души вываливает по полкило строк
|
Если бы вопрос четко был сформулирован, то не выкидывал бы такую толпу строк.
Все-таки, правильно заданный вопрос уже содержит в себе приличную долю ответа!
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
02.04.2015, 10:24
|
|
Прописка
Регистрация: 27.04.2005
Сообщений: 125
Сказал спасибо: 10
Сказали Спасибо 26 раз(а) в 17 сообщении(ях)
|
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.
|
|
|
|
02.04.2015, 14:19
|
|
Временная регистрация
Регистрация: 05.08.2010
Сообщений: 93
Сказал спасибо: 68
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
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);
} |
|
|
|
|
02.04.2015, 14:27
|
|
Временная регистрация
Регистрация: 05.08.2010
Сообщений: 93
Сказал спасибо: 68
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
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]; |
|
|
|
|
02.04.2015, 14:28
|
|
Частый гость
Регистрация: 17.11.2008
Адрес: Россия г.Краснодар
Сообщений: 30
Сказал спасибо: 14
Сказали Спасибо 33 раз(а) в 5 сообщении(ях)
|
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.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:32.
|
|