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

 
 
> Вывести на 7ми сегментный индикатор температуру с ds18b20 с десятыми
DmitriyT
сообщение Mar 22 2016, 15:59
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 31-10-15
Пользователь №: 89 110



Здравствуйте уважаемые разработчики.

Все не могу вывести темперетуру с десятичными на 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);
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ILYAUL
сообщение Mar 23 2016, 20:49
Сообщение #2


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



А зачем ее считать , дробная часть DS18 прекрасно ложится на таблицу , куда заносятся числа соответствующие выбранной точности DS. Так например : 1 для точности 0.5 будет равна -0.5 , для 0,25 = 0,2 для 0,125 = 0.1 , для 0,0625 = 0 . Если после запятой 0 то он и в Африке 0
Кстати , именно поэтому у Вас и не получается посчитать дробную часть т.к. вы забыли про точность


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 24 2016, 11:22
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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]);


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 08:59
Рейтинг@Mail.ru


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