Pilot134 0 7 октября, 2013 Опубликовано 7 октября, 2013 (изменено) · Жалоба приведите результаты к одному 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). Спасибо! Изменено 7 октября, 2013 пользователем Pilot134 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 7 октября, 2013 Опубликовано 7 октября, 2013 · Жалоба Вот только подскажите пожалуйста перевод из двоичного в двоично-десятичный код (из 0001 1010 получить 0010 0110). Блин! Вы, что? В школе не учились? Обозначим Ваше число 0001 1010 как Х: АААА= Х /10 а остаток от деления - вторая тетрада ВВВВ= Х % 10 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pilot134 0 7 октября, 2013 Опубликовано 7 октября, 2013 (изменено) · Жалоба Блин! Вы, что? В школе не учились? Обозначим Ваше число 0001 1010 как Х: АААА= Х /10 а остаток от деления - вторая тетрада ВВВВ= Х % 10 Уважаемый Палыч. В школе учился. К сожалению я не очень силён в си :( о чём очень сожалею и извиняюсь что спрашиваю ерунду. Теперь знаю! Что целую часть от деления пишем АААА = Х /10; Остаток ВВВВ= Х % 10; Вам огромное Спасибо! :rolleyes: Изменено 7 октября, 2013 пользователем Pilot134 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 7 октября, 2013 Опубликовано 7 октября, 2013 · Жалоба К сожалению я не очень силён в си К языку Си ваши вопросы не имеют отношения. Ещё в начальных классах школы дают понятие "позиционная система счисления". Коль подзабыли - погуглили бы... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ukpyr 0 7 октября, 2013 Опубликовано 7 октября, 2013 · Жалоба // 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 0 7 октября, 2013 Опубликовано 7 октября, 2013 · Жалоба // 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 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ukpyr 0 7 октября, 2013 Опубликовано 7 октября, 2013 · Жалоба зачем float для простейшей формулы ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pilot134 0 7 октября, 2013 Опубликовано 7 октября, 2013 · Жалоба почему-то мои сообщения как-то игнорируют... вот так надо:static char scratchpad[9]; // в этот массив считываются все регистры датчика float temperature(void){ int* ptr = (void*)scratchpad; return *ptr / 16.0; // для DS18B20 в 12-битном разрешении, для 9-битного делить на 2.0 } Я ни в коем случае ни кого не игнорирую. Я очень Вам признателен за то что помогаете таким "спецам" как я. Я уже эту часть сделал. Работает. Круто!!! Спасибо ВАМ и этому замечательному форуму :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 9 октября, 2013 Опубликовано 9 октября, 2013 (изменено) · Жалоба 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); советую вам внимательно проверить как представлена дробная часть. Изменено 9 октября, 2013 пользователем Tarbal Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться