Прошу помощи с функцией

b707
Offline
Зарегистрирован: 26.05.2017

Rumata пишет:

А что с flоat`ом не так?

много места занимает.

Хотя ТС наверняка не совсем правильно считает размер прошивки и, как обычно :), делает из этого неверные выводы.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

b707 пишет:

много места занимает.

Я правильно понял, те пол-страницы говнокода с кучей лишних переменных жрут меньше места? О как!

b707
Offline
Зарегистрирован: 26.05.2017

Rumata пишет:

Я правильно понял, те пол-страницы говнокода с кучей лишних переменных жрут меньше места? О как!

если это единственное использование float в коде - то да

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Если это весь код, то эти потери несущественны, по сравнению с читабельностью. Если это часть большого проекта, то явно это еще где-то будет использоваться и каждый раз делать этот бред... Ну не знаю..  Где то читал, что преждевременная оптимизация один из главных врагов программиста

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Дим-мычъ пишет:

И всё же завершу тему. Пробовал с  float. Не этот код ,немного другой. Выглядит компактней, но больше жрёт ресурса

ардуины. На больших компах конечно же должен работать лучше. А у меня даже на пяти разрядах память устройств возросла до 10%.

При моём коде 7%.

Поэтому привожу окончательный вариант полного преобразования .  Топорно выглядит, но зато работает.

Для первого скетча норм)))

Если кто-то спросит зачем? Спросите у DALLAS, зачем они делают такие датчики.

// полное преобразование 11 разрядного(без знака) значения датчика DS18B20
// в десятичные разряды для вывода на индикатор

  unsigned long chislo_x = 0;
  chislo_x = (unsigned long) chislo; // переводим значения датчика в  unsigned long

  unsigned long chislo_h =  chislo_x * 625ul;// получаем десятичное значение без дроби 
   //с макс.знач. 1 279 375 (7-мь разрядов)
   
   
  a[0] = (byte)( chislo_h / 1000000ul); // значение старшего разряда                                                                           
  unsigned long ff = (unsigned long) (chislo_h % 1000000ul); // остаток от деления

  a[1] = (byte)( ff / 100000ul); // значение второго разряда                                                                           
  unsigned long dd = (unsigned long) ( ff % 100000ul); // остаток от деления
  
  a[2] = (byte)(dd / 10000ul);// значение третьего разряда
  unsigned long cc = (unsigned long) (dd % 10000ul); //остаток
  
  a[3] = (byte)(cc / 1000ul) ;// значение четвёртого разряда
  unsigned long vv = (unsigned long)( cc % 1000ul); // остаток

  a[4] = (byte)(vv / 100ul); // значение пятого разряда
  unsigned long gg = (unsigned long)( vv % 100ul);//остаток

  a[5] = (byte)(gg / 10ul); // значение шестого разряда
  a[6] = (byte)( gg % 10ul);// значение седьмого разряда

 

 

Это ж просто угар! Вам смешно, а мне штаны менять! ;))))

А никто этому чуду не сказал, что два байта от Далласа - просто знаковое целое 16 битное? Со всеми вытекающими... ;))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:

А никто этому чуду не сказал ...

Скажи! Ты это скажешь, другой - другое, так тема мож и до пятницы доживёт :-)

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

wdrakula пишет:

 

 

два байта от Далласа - просто знаковое целое 16 битное? Со всеми вытекающими... ;))

Были два гения по перемещению запятой, типа туда-сюда бит никто и не заметит)))

Пытались насмехаться и оскорблять, но я весёлый человек, не парюсь.

Но если бы, допустим b707 не знал бы сколько будет 2+2, я бы не стал его называть идиотом

Т.к. это как-то не достойно...

А по делу: любому коту понятно , что два байта это знаковое целое 16 бит

Но ведь ещё каждая единица этого числа при этом значит 0.0625

А уже не каждый кот знает, как перевести это в десятичные разряды(я то уже знаю))), да ведь ещё красиво

и без лишних затрат.

P.S.

Впредь сообщения не на человеческом языке буду фильтровать как их и нет

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Дим-мычъ пишет:
я то уже знаю))), да ведь ещё красиво и без лишних затрат.
С чем Вас ещё раз искренне поздравляю.

Гриша
Offline
Зарегистрирован: 27.04.2014

Дим-мычъ пишет:

Но ведь ещё каждая единица этого числа при этом значит 0.0625

и для этого вы умножаете их на 10.000.000 вместо 10.000, не вписываетесь в 2 байте, кидаете  все во float, а когда вас спрашивают на кой вам эти 3 нуля - получаем ответ - "для точности"

ГЕНИАЛЬНО! еще одна медаль

Rumata пишет:

А что с flоat`ом не так? 

с ним все так - но зачем!!!!! как минимум 3 варианта решения были предложены, тема давно имеет оптимальное решение "на все случаи жизни" оно простое и ни разу не секретное. Но ТС вообще даже не пытается это осознать  - у него же работает!!!  т.е. саморазвитие на уровне регрессии.

b707
Offline
Зарегистрирован: 26.05.2017

Гриш, ты не понимаешь - если нет четвертого знака после запятой - "теряется точность" :) Так только халтурщики поступают...

Гриша
Offline
Зарегистрирован: 27.04.2014

b707 пишет:

Гриш, ты не понимаешь - если нет четвертого знака после запятой - "теряется точность" :)

UPD для этого мы берем 5 знаков, и плевать, что четвертый и пятый у нас нули - это ведь все равно точнее чем без них :)))))))))))))))))))

UPD а для точности юзаем всю мантиссу - чего добру пропадать...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Гриша пишет:

UPD а для точности юзаем всю мантиссу - чего добру пропадать...

Ну, тогда и потребителю на экран выводим с шестью знаками. Иначе за что боролись-то? Сохраняли точность сохраняли, а перед "доставкой потребителю" взяли и обрезали :-(

Помнится какой-то деятель выступал на конференции и рассказывал о пакете для расчётов геометрических размеров строительных конструкций. И как на особое достоинство упирал, что гарантирована точность в 9 десятичных знаков. Ему задали опрос: "Вот Вы считаете размеры с точностью до нанометров. Вы собираетесь эти расчёты использовать для строительства офиса Роснано или для чего чего-то ещё?" Ответа я не расслышал, т.к. весь зал в отрытую ржал.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

b707 пишет:

Гриш, ты не понимаешь - если нет четвертого знака после запятой - "теряется точность" :) Так только халтурщики поступают...

Какой там разброс то у ds18b20? Недавно тема была)))

Гриша
Offline
Зарегистрирован: 27.04.2014

Rumata пишет:

b707 пишет:

Гриш, ты не понимаешь - если нет четвертого знака после запятой - "теряется точность" :) Так только халтурщики поступают...

Какой там разброс то у ds18b20? Недавно тема была)))

читайте пост 52 - вырезка, потом продолжим обсуждение

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

 т.к. весь зал в отрытую ржал.

можно конечно и поржать, но если за базу брать данные предыдущей итерации расчетов то погрешность набежит, как мне кажется, не?

Гриша
Offline
Зарегистрирован: 27.04.2014

ua6em пишет:

ЕвгенийП пишет:

 т.к. весь зал в отрытую ржал.

можно конечно и поржать, но если за базу брать данные предыдущей итерации расчетов то погрешность набежит, как мне кажется, не?

в математике есть выражение "необходимо и достаточно" и "необходимость" и "достаточность" в математике считаются вместе - именно считаются, а не прикидываются на пальцах.  В добавок есть готовые модели и "принцип чайника"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Rumata пишет:

Какой там разброс то у ds18b20? 

По даташиту точность ds18b20 - плюс-минус полградуса. Но пренебрегают четвёртым знаком только халтурщики, т.к. вдруг этот четвёртый знак как раз и будет на границе градуса, например! Так что нечего халтурить, правильно ТС Вас тут всех умыл!

:-)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:
данные предыдущей итерации
Во-первых речь шла о конечном результате, а во-вторых существуют разные расчётные модели - одни накапливают погрешность, другие - нет, а есть и такие, которые компенсируют.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Жалко Далласов! Не читали этой ветки, а то бы закрыли  уже свою лавочку)))

Не ну есть повод для улыбки!)))

SLKH
Offline
Зарегистрирован: 17.08.2015

ua6em пишет:

ЕвгенийП пишет:

 т.к. весь зал в отрытую ржал.

можно конечно и поржать, но если за базу брать данные предыдущей итерации расчетов то погрешность набежит, как мне кажется, не?

Подавляющее большинство реальных конструкций/механизмов в реальном мире рассчитывалось на логарифмической линейке - т.е. считались ТРИ ЗНАЧАЩИХ ЦИФРЫ. И у большинства рабочих (не лабораторных) приборов, работающих в цеховых/гаражных условиях, погрешность редко лучше 1%. 

В некоторых случаях действительно нужна ощутимо бОльшая точность. Таких сравнительно немного.

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Дим-мычъ пишет:

Жалко Далласов! Не читали этой ветки, а то 

хоть поржали бы с нами))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Вопщем, я уею, дорогая редакция... 

Наданапицца. 

nibelung
Offline
Зарегистрирован: 21.04.2021

Чей-то Дим-мычъ интерес к вопросу потерял, надо маслеца подлить :)))

// полное преобразование 11 разрядного(без знака) значения датчика DS18B20
// в десятичные разряды для вывода на индикатор

  unsigned long _x = (unsigned long)chislo; // переводим значения датчика в  unsigned long

  _x = _x * 625ul; // получаем десятичное значение без дроби 
                   //с макс.знач. 1 279 375 (7-мь разрядов)
   
  for ( int ii = 6; 0 != (ii--); ) // получаем значение всех разрядов
  {                                // начиная с младшего / седьмого
    a[ii] = (byte)(_x % 10ul);
    _x = _x / 10ul;
  }

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

nibelung пишет:

Чей-то Дим-мычъ интерес к вопросу потерял,

Ему некогда, он разрабов протеуса троллит))

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

nibelung пишет:

Чей-то Дим-мычъ интерес к вопросу потерял, надо маслеца подлить :)))

// полное преобразование 11 разрядного(без знака) значения датчика DS18B20
// в десятичные разряды для вывода на индикатор

  unsigned long _x = (unsigned long)chislo; // переводим значения датчика в  unsigned long

  _x = _x * 625ul; // получаем десятичное значение без дроби 
                   //с макс.знач. 1 279 375 (7-мь разрядов)
   
  for ( int ii = 6; 0 != (ii--); ) // получаем значение всех разрядов
  {                                // начиная с младшего / седьмого
    a[ii] = (byte)(_x % 10ul);
    _x = _x / 10ul;
  }

 

 О наконец-то! Спасибо, проверю позже обязательно. Сейчас занят пока.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Дим-мычъ пишет:
Сейчас занят пока.

Да, мы уж поняли 

Rumata пишет:

Ему некогда, он разрабов протеуса троллит))

:-)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Может, я чего-то упустил, но 0.0625 - это 1/16. Т.е. для получения целых надо сдвинуть на 4 разряда вправо, а для получения десятых - выделить эти 4 разряда (по маске) умножить на 10 и снова сдвинуть на 4 разряда вправо. При этом байтовые сложение и умножение выполняются аппаратно (одного байта достаточно), а ресурсоемкое деление не используется вообще. В коде это десятки байтов - не больше.

nik182
Offline
Зарегистрирован: 04.05.2015

С языка снял. Неистово плюсую и снимаю шляпу за усидчивость. Сам расписывать поленился. Остановился на 1/16 .

Гриша
Offline
Зарегистрирован: 27.04.2014

andriano пишет:

 а ресурсоемкое деление не используется вообще.

Вы сейчас по стенке горохом бросили....

Гриша
Offline
Зарегистрирован: 27.04.2014

andriano пишет:

Может, я чего-то упустил, но 0.0625 - это 1/16. Т.е. для получения целых надо сдвинуть на 4 разряда вправо,

угу.... пост 9

Гриша пишет:

ну и с 24уже написали, еще попробуйте тупо подвинуть значения на 4 бита (уберите лишние) и выведите результат.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

nibelung пишет:

Чей-то Дим-мычъ интерес к вопросу потерял, надо маслеца подлить :)))

// полное преобразование 11 разрядного(без знака) значения датчика DS18B20
// в десятичные разряды для вывода на индикатор

  unsigned long _x = (unsigned long)chislo; // переводим значения датчика в  unsigned long

  _x = _x * 625ul; // получаем десятичное значение без дроби 
                   //с макс.знач. 1 279 375 (7-мь разрядов)
   
  for ( int ii = 6; 0 != (ii--); ) // получаем значение всех разрядов
  {                                // начиная с младшего / седьмого
    a[ii] = (byte)(_x % 10ul);
    _x = _x / 10ul;
  }

 

Отлично nibelung! Всё работает норм. Хорошая идея делить на 10 и брать остаток в байте.

Мне такая идея не заходила совсем.

Один цикл, правда пришлось добавить

С Вашей функцией мой скетч  в целом занимает(2114байт) 6% памяти устройств и 4%дин памяти

С моей (2234)7% и 4% соответственно. По другому не знаю как и что померить

Но в качестве разница очевидна, ещё раз спасибо, ждал этого с первого поста)))

 

А вот данные термометра в Протеусе и выводимые на индикатор :

на термометре 0.1 -- индикатор ---- 0.1250

                         0.2 --------------------- 0.2500

                         0.3 --------------------  0.3125

                         0.4 -------------------- 0.4375

Они говорят, что термометр  в Proteus работает  по полной, но никто этого не видит и не ценит)))

nibelung
Offline
Зарегистрирован: 21.04.2021

Да незашто. Я сюда зашел потренироваться код в форум вставлять)))

Протеус это только модель, реальный Даллас вам и не такое покажет. По даташиту там точность +- 0.5 градуса, все что меньше это шумы.

Если вам температуру померять - делайте как в посте #127.

А если хотите сигналы сотовых на Даллас ловить, тогда отбрасывайте целую часть, берите только дробную с точностью до пятого знака после запятой. Вот только шифрование там лютое, до разговора тяжело будет добраться )))))

rkit
Offline
Зарегистрирован: 23.11.2016

nibelung пишет:

По даташиту там точность +- 0.5 градуса, все что меньше это шумы.

Врешь. Там всё гораздо сложнее, чем "все что меньше это шумы"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rkit пишет:

nibelung пишет:

По даташиту там точность +- 0.5 градуса, все что меньше это шумы.

Врешь. 

Даташит от Maxim Integrated

Даташит от Dallas Semiconductor

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

nibelung пишет:

Чей-то Дим-мычъ интерес к вопросу потерял, надо маслеца подлить :)))

// полное преобразование 11 разрядного(без знака) значения датчика DS18B20
// в десятичные разряды для вывода на индикатор

  unsigned long _x = (unsigned long)chislo; // переводим значения датчика в  unsigned long

  _x = _x * 625ul; // получаем десятичное значение без дроби 
                   //с макс.знач. 1 279 375 (7-мь разрядов)
   
  for ( int ii = 6; 0 != (ii--); ) // получаем значение всех разрядов
  {                                // начиная с младшего / седьмого
    a[ii] = (byte)(_x % 10ul);
    _x = _x / 10ul;
  }

 

Ты отрицательные температуры потерял. Нужно в лонг со знаком переводить, потом обработать знак, оставить модуль и его "разлагать на атомы" ;))).

rkit
Offline
Зарегистрирован: 23.11.2016

Видимо, недостаточно 50000000 повторений о том, что даташит не читают по одной цифре на первой странице. Повторю еще раз.

nibelung
Offline
Зарегистрирован: 21.04.2021

wdrakula пишет:

Ты отрицательные температуры потерял. Нужно в лонг со знаком переводить, потом обработать знак, оставить модуль и его "разлагать на атомы" ;))).

Знаю. Но не все же делать за ТС, это был его, немного поправленный код. Пусть и сам немного потрудится ))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

nibelung пишет:

Пусть и сам немного потрудится ))

А ты наивный! ;)) Это пройдёт с годами.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

rkit пишет:

Видимо, недостаточно 50000000 повторений о том, что даташит не читают по одной цифре на первой странице. Повторю еще раз.

Ты сам еще не понимаешь, почему у тебя на форуме репутация пи..дабола? Вот поэтому.  Я уже писал тебе, что исправить твою репутацию можно исключительно тем, что свои высеры будешь подтверждать.

В ДШ, кроме указания в таблице, есть только график типичного распределения ошибок по 3-м сигма. И какие выводы ты из него делаешь, которые подтвердят высер: "всё гораздо сложнее"?

SLKH
Offline
Зарегистрирован: 17.08.2015

nibelung пишет:

 По даташиту там точность +- 0.5 градуса, все что меньше это шумы.

глубокое заблуждение.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

SLKH пишет:

nibelung пишет:

 По даташиту там точность +- 0.5 градуса, все что меньше это шумы.

глубокое заблуждение.

Вот ёщё один!

ДШ даже стабильность не гарантирует. Она есть, но из практики, а не из ДШ.

Кстати про "шум" ДШ вообще ничего не говорит. ;))

nibelung
Offline
Зарегистрирован: 21.04.2021

SLKH пишет:

nibelung пишет:

 По даташиту там точность +- 0.5 градуса, все что меньше это шумы.

глубокое заблуждение.

Ок, согласен, погорячился. +- 0.5 это возможная разница в показаниях разных датчиков, при измерении одной и той же температуры. Чтобы доверять показаниям датчика с точностью выше чем 0.5 градуса, его нужно калибровать. Без калибровки, все что меньше 0.5 градуса будет не достоверно.

rkit
Offline
Зарегистрирован: 23.11.2016

wdrakula пишет:

В ДШ, кроме указания в таблице, есть только график типичного распределения ошибок по 3-м сигма. И какие выводы ты из него делаешь, которые подтвердят высер: "всё гораздо сложнее"?

Из твоего высера я делаю вывод, что ты посмотрел в книгу и увидел фигу. Ни прочитать сам график и увидеть что там нет "+-0.5, всё что ниже шум", ни понять, что такое стандартное отклонение, ты не осилил, "3-м сигма".

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

rkit пишет:

понять, что такое стандартное отклонение, ты не осилил

И не говори! Пять лет на МехМате - коту под хвост! ;)) Так что там "гораздо сложнее"? Какое место в ДШ говорит о том, что точность (или хотя бы относительная точность) иная, чем 0.5° ? Просто в строчку "ткни"...

ЗЫ: От каждой ведь бочки затычка!!!! Ну просто от каждой. Ткнули носом в глупость - нет бы заткнуться, он снова продолжает.

nik182
Offline
Зарегистрирован: 04.05.2015

Весна однако, зимой был спокойнее и адекватнее.

rkit
Offline
Зарегистрирован: 23.11.2016

На этом разговор с дебилом завершаю.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

rkit пишет:

На этом разговор с дебилом завершаю.

Ну так-то подставлять себя зачем?

Напряги мозг и ответь, какое это вообще имеет отношение к показаниям ОДНОГО И ТОГО ЖЕ датчика? ;))) Клоунишка! Это даже кроме того, что картинко приведено как "типичное" распределение, а не гарантированное.

------------

Еще раз: Ткнули носом в свое дерьмо - скажи: "спасибо за науку", и иди себе с Б..гом.

ВН
Offline
Зарегистрирован: 25.02.2016

 Ты не прав, wdrakula. 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ВН пишет:

 Ты не прав, wdrakula. 

в чем?

Речь идет не о реальности, а о том, что написано в ДШ, а вот там ничего про точность и стабильность не написано.

(кроме пресловутых 0.5)

ВН
Offline
Зарегистрирован: 25.02.2016

wdrakula пишет:

Речь идет не о реальности, а о том, что написано в ДШ, а вот там ничего про точность и стабильность не написано.

(кроме пресловутых 0.5)

да нет, там несколько вещей написано:

- на каждой странице в заголовке -Programmable Resolution;

- The core functionality of the DS18B20 is its direct-todigital temperature sensor. The resolution of the temperature sensor is user-configurable to 9, 10, 11, or 12 bits, corresponding to increments of 0.5°C, 0.25°C, 0.125°C, and 0.0625°C, respectively.

Спрашивается, к чему бы так упираться в это разрешение , если оно и на фиг  не сдалось?

 Но есть непосредственно и о термостабильности

- Drift (Note 11) ±0.2 °C  , а из Note 11 => Drift data is based on a 1000-hour stress test at +125°C with VDD = 5.5V.

т.е. ±0.2 °C вот такая термостабильность в экстремальных долговременных условиях, соответственно в более щадящих можно рассчитывать на лучшие параметры, что практика и подтверждает.