Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вывести на 7ми сегментный индикатор температуру с ds18b20 с десятыми
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
DmitriyT
Здравствуйте уважаемые разработчики.

Все не могу вывести темперетуру с десятичными на 7ми сегментный индикатор с драйвером max7219.

Целые числа получилось вывести, а десятичные не получается.

Код
void show_temper()
{

unsigned int temps, drob_tmp;
unsigned char celie,drob,j;
for(j=0;j<devices;)
{
temps = (signed int) ds18b20_temperature(&ds18b20_rom_codes[j][0]);
//Присвоим переменной temp значение переменной temperature с явным указанием типа данных
if (temps >= 0){temps = ~temps+1;buf5=10;}
else{buf5=0xF;} // если число отрицательное перевести его в норм.вид // целая часть числа
                // целая часть числа
    drob_tmp  = temps & 0x000F;          // дробная часть числа с точностью 1/16 градуса

    drob=(unsigned char)((drob_tmp * 10) / 16);  // преобразование дробной части в формате "1/16 градуса" в десятичный формат с точностью 0,1 градуса
/*Переменные разрядов индикатора*/
buf0=15;      
buf1=drob;
buf2=temps%10;
buf3=temps/10;
buf4=0xF;
j++;          
}
delay_ms(750);
}
ILYAUL
А зачем ее считать , дробная часть DS18 прекрасно ложится на таблицу , куда заносятся числа соответствующие выбранной точности DS. Так например : 1 для точности 0.5 будет равна -0.5 , для 0,25 = 0,2 для 0,125 = 0.1 , для 0,0625 = 0 . Если после запятой 0 то он и в Африке 0
Кстати , именно поэтому у Вас и не получается посчитать дробную часть т.к. вы забыли про точность
zltigo
QUOTE (ILYAUL @ Mar 23 2016, 22:49) *
дробная часть DS18 прекрасно ложится на таблицу

От обеих "решений" я плакалъ sad.gif. Арифметика начальной школы sad.gif
CODE
#define DS18X20_FRACCONV        625    // Constant to convert the fraction bits to cel*(10^-4)

    dcel = *((signed short *)&spad[0]);        // LSB and MSB to short

    if( dcel < 0 )            // Subzero
        dcel = ((dcel*DS18X20_FRACCONV)-500)/1000;
    else
        dcel = ((dcel*DS18X20_FRACCONV)+500)/1000;


А тут КРЕПКО думать, а что-же оказалось в этом signed int. "Подсказка" выше дана.
QUOTE
temps = (signed int) ds18b20_temperature(&ds18b20_rom_codes[j][0]);
ILYAUL
Цитата
От обеих "решений" я плакалъ
Мне очень жаль , но ничем помочь не могу laughing.gif
Эдди
Учитывая то, что у этих недотермометров разброс в полтора-два градуса — привычное дело, никакого смысла десятичные выводить нет!
А вообще, если уж очень хочется, то все элементарно!
zltigo
QUOTE (ILYAUL @ Mar 24 2016, 21:06) *
Мне очень жаль , но ничем помочь не могу laughing.gif

О чем и речь, что не можете, но взялись sad.gif



QUOTE (Эдди @ Mar 25 2016, 00:05) *
А вообще, если уж очень хочется, то все элементарно!

Количесво "решений" через анус не ограничено ничем, что Вы и подтвердили очередной раз. Зачем? Вопрос, впрочем, риторический sad.gif.

ILYAUL
Цитата
О чем и речь, что не можете, но взялись
Я вроде ясно написал , что ВАМ помочь не могу т.к. это бесполезно
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.