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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Преобразовать данные с DS18B20 в строку printf
Pilot134
сообщение Oct 7 2013, 08:11
Сообщение #16





Группа: Участник
Сообщений: 14
Регистрация: 19-01-08
Пользователь №: 34 227



Цитата(megajohn @ Oct 7 2013, 13:43) *
приведите результаты к одному 16битному BCD
типо так
0000 AAAA BBBB CCCC где температора AB,C и

Интересный вариант.
Температуре 26,5 град. соответствует код 0000 0001 1010 1000
Откидываем дробную часть останется 0000 0000 0001 1010
Как из него получить двоично-десятичный код? Т.е. AAAA BBBB?
Как округлить до десятых дробную часть показаний термометра уже мне подсказали выше (будет СССС).
Т.е. впринципе можно действительно сравнить числа в двоично-десяичном формате (0000 АААА ВВВВ СССС).
Вот только подскажите пожалуйста перевод из двоичного в двоично-десятичный код (из 0001 1010 получить 0010 0110).
Спасибо!

Сообщение отредактировал Pilot134 - Oct 7 2013, 08:14
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 7 2013, 08:50
Сообщение #17


Гуру
******

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



Цитата(Pilot134 @ Oct 7 2013, 12:11) *
Вот только подскажите пожалуйста перевод из двоичного в двоично-десятичный код (из 0001 1010 получить 0010 0110).

Блин! Вы, что? В школе не учились?
Обозначим Ваше число 0001 1010 как Х:
АААА= Х /10
а остаток от деления - вторая тетрада
ВВВВ= Х % 10
Go to the top of the page
 
+Quote Post
Pilot134
сообщение Oct 7 2013, 10:49
Сообщение #18





Группа: Участник
Сообщений: 14
Регистрация: 19-01-08
Пользователь №: 34 227



Цитата(Палыч @ Oct 7 2013, 14:50) *
Блин! Вы, что? В школе не учились?
Обозначим Ваше число 0001 1010 как Х:
АААА= Х /10
а остаток от деления - вторая тетрада
ВВВВ= Х % 10

Уважаемый Палыч.
В школе учился.
К сожалению я не очень силён в си sad.gif о чём очень сожалею и извиняюсь что спрашиваю ерунду.
Теперь знаю!
Что целую часть от деления пишем АААА = Х /10;
Остаток ВВВВ= Х % 10;
Вам огромное Спасибо! rolleyes.gif

Сообщение отредактировал Pilot134 - Oct 7 2013, 11:54
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 7 2013, 12:08
Сообщение #19


Гуру
******

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



Цитата(Pilot134 @ Oct 7 2013, 14:49) *
К сожалению я не очень силён в си

К языку Си ваши вопросы не имеют отношения.
Ещё в начальных классах школы дают понятие "позиционная система счисления". Коль подзабыли - погуглили бы...
Go to the top of the page
 
+Quote Post
ukpyr
сообщение Oct 7 2013, 13:53
Сообщение #20


Профессионал
*****

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



Код
// convert 12-bit temperature data of ds18b20 to signed celsius fixed-point (with tenth)
S16 ds1w_12bit2tenth(U16 value) {
    U8 value_sign = (value >> 8) & 0x80; // remember sign of value
    if (value_sign) value = 0 - value;   // convert to absolute value
    value = (value >> 1) + (value >> 3); // convert from 12-bit to fixed point
    if (value_sign) value = 0 - value;   // restore sign of result
    return value;
}
Go to the top of the page
 
+Quote Post
ARV
сообщение Oct 7 2013, 15:58
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(ukpyr @ Oct 7 2013, 17:53) *
Код
// convert 12-bit temperature data of ds18b20 to signed celsius fixed-point (with tenth)
S16 ds1w_12bit2tenth(U16 value) {
    U8 value_sign = (value >> 8) & 0x80; // remember sign of value
    if (value_sign) value = 0 - value;   // convert to absolute value
    value = (value >> 1) + (value >> 3); // convert from 12-bit to fixed point
    if (value_sign) value = 0 - value;   // restore sign of result
    return value;
}

почему-то мои сообщения как-то игнорируют... вот так надо:
Код
static char scratchpad[9]; // в этот массив считываются все регистры датчика

float temperature(void){

   int* ptr = (void*)scratchpad;

   return *ptr / 16.0; // для DS18B20 в 12-битном разрешении, для 9-битного делить на 2.0

}


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
ukpyr
сообщение Oct 7 2013, 16:20
Сообщение #22


Профессионал
*****

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



зачем float для простейшей формулы ?
Go to the top of the page
 
+Quote Post
Pilot134
сообщение Oct 7 2013, 16:47
Сообщение #23





Группа: Участник
Сообщений: 14
Регистрация: 19-01-08
Пользователь №: 34 227



Цитата(ARV @ Oct 7 2013, 21:58) *
почему-то мои сообщения как-то игнорируют... вот так надо:
Код
static char scratchpad[9]; // в этот массив считываются все регистры датчика

float temperature(void){

   int* ptr = (void*)scratchpad;

   return *ptr / 16.0; // для DS18B20 в 12-битном разрешении, для 9-битного делить на 2.0

}

Я ни в коем случае ни кого не игнорирую.
Я очень Вам признателен за то что помогаете таким "спецам" как я.
Я уже эту часть сделал. Работает. Круто!!!
Спасибо ВАМ и этому замечательному форуму rolleyes.gif
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Oct 9 2013, 12:35
Сообщение #24


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Палыч @ Oct 7 2013, 11:57) *
1. Пусть у нас есть три цифры: А - десятки единиц, В - единицы, С - десятые доли
2. Следует получить двоичное число, где запятая стоит перед четвертым разрядом (т.е. умноженное на 16 = 2 в степени 4) - см. документацию на м/с.
3. Из А,В и С получаем число АВС, выраженное в десятых долях (т.е. 10 раз большее чем есть на самом деле):
А*100 + В*10 + С
4. Вспоминаем (см.п2), что нам нужно число, умноженное на 16
(А*100 + В*10 + С) * 16
5. У нас же было число увеличенное в 10 раз (см.п3), поэтому делим на 10:
(А*100 + В*10 + С) * 16 / 10


надо проделать два шага:
1. разделить поля при помощи маскирования четырех младших бит и предварительного сдвига на 4 бита для единиц и на 8 для десятков. Я полагаю у вас все в одном 16 (или 32) битном числе.
2. Получив три числа надо одно умножить на 10 и сложить со вторым. Дробную часть отдельный вопрос. Неизвестно еще как она представлена. Если BCD, то наверное надо перейти к числам с плавающей запятой и поделив третье число на 10 прибавить к сумме.
Так вы получите значеное, которое можно использовать как угодно.
printf("%f", result);

Если вам только напечатать, то вместо второго шага можно сразу:
printf("%d%d,%d", val_x_10, val_x_1, val_x_0_1);

советую вам внимательно проверить как представлена дробная часть.

Сообщение отредактировал Tarbal - Oct 9 2013, 12:46
Go to the top of the page
 
+Quote Post

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

 


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


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