Перейти к содержанию
    

Преобразовать данные с DS18B20 в строку printf

приведите результаты к одному 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот только подскажите пожалуйста перевод из двоичного в двоично-десятичный код (из 0001 1010 получить 0010 0110).

Блин! Вы, что? В школе не учились?

Обозначим Ваше число 0001 1010 как Х:

АААА= Х /10

а остаток от деления - вторая тетрада

ВВВВ= Х % 10

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блин! Вы, что? В школе не учились?

Обозначим Ваше число 0001 1010 как Х:

АААА= Х /10

а остаток от деления - вторая тетрада

ВВВВ= Х % 10

Уважаемый Палыч.

В школе учился.

К сожалению я не очень силён в си :( о чём очень сожалею и извиняюсь что спрашиваю ерунду.

Теперь знаю!

Что целую часть от деления пишем АААА = Х /10;

Остаток ВВВВ= Х % 10;

Вам огромное Спасибо! :rolleyes:

Изменено пользователем Pilot134

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К сожалению я не очень силён в си

К языку Си ваши вопросы не имеют отношения.

Ещё в начальных классах школы дают понятие "позиционная система счисления". Коль подзабыли - погуглили бы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

// 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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

// 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

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

float temperature(void){

   int* ptr = (void*)scratchpad;

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

}

Я ни в коем случае ни кого не игнорирую.

Я очень Вам признателен за то что помогаете таким "спецам" как я.

Я уже эту часть сделал. Работает. Круто!!!

Спасибо ВАМ и этому замечательному форуму :rolleyes:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...