|
|
  |
Вывести на 7ми сегментный индикатор температуру с ds18b20 с десятыми |
|
|
|
Mar 22 2016, 15:59
|
Участник

Группа: Участник
Сообщений: 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); }
|
|
|
|
|
Mar 23 2016, 20:49
|

Профессионал
    
Группа: Свой
Сообщений: 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 Кстати , именно поэтому у Вас и не получается посчитать дробную часть т.к. вы забыли про точность
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Mar 24 2016, 11:22
|

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

|
QUOTE (ILYAUL @ Mar 23 2016, 22:49)  дробная часть DS18 прекрасно ложится на таблицу От обеих "решений" я плакалъ  . Арифметика начальной школы  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
|
|
|
|
|
Mar 24 2016, 22:05
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

|
Учитывая то, что у этих недотермометров разброс в полтора-два градуса — привычное дело, никакого смысла десятичные выводить нет! А вообще, если уж очень хочется, то все элементарно!
|
|
|
|
|
Mar 24 2016, 22:46
|

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

|
QUOTE (ILYAUL @ Mar 24 2016, 21:06)  Мне очень жаль , но ничем помочь не могу  О чем и речь, что не можете, но взялись  QUOTE (Эдди @ Mar 25 2016, 00:05)  А вообще, если уж очень хочется, то все элементарно! Количесво "решений" через анус не ограничено ничем, что Вы и подтвердили очередной раз. Зачем? Вопрос, впрочем, риторический  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|