Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Re: Всё по DS18(B/S)20.

Ср дек 13, 2017 20:58:00

Все четко заработало)Благодарю всех за содействие :beer: :hunger:

Re: Всё по DS18(B/S)20.

Чт дек 14, 2017 05:43:25

Операцию деления можно исключить, умножив код на 160 (0,1ºC), 1600(0,01ºC) и т.д. Младший байт отбрасывается (при усечении) или его 7-бит прибавляется к результату, расположенному в старших байтах, а затем оный отбрасывается.

Re: Всё по DS18(B/S)20.

Чт дек 14, 2017 14:00:57

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

Re: Всё по DS18(B/S)20.

Чт дек 14, 2017 15:25:40

Приветствую!Настало время CRC.теорию вроде как понял, осталось реализовать. 1. Первое, что не понятно это СRC8==100110001, как вообще это вычислено? принимаем это как константу так понял. 2. считываю 56 бит с датчика, куда и как столько данных поместить?в какую-то одну переменную или разбить на байты по 8 бит,то тогда вообще не понятно как мне применить ИЛИ-НЕ с 8 битным байтом и 9 битным СRC8...

Re: Всё по DS18(B/S)20.

Чт дек 14, 2017 15:44:32

ROMan2947 писал(а):Настало время CRC
по-моему, настало время изучить документацию как следует. там все написано - и что считывать, и куда, и как CRC считать. и на сайте полно статей, и даже моя есть среди них. И даже с примерами...

Re: Всё по DS18(B/S)20.

Чт дек 14, 2017 15:52:00

по-моему, настало время изучить документацию как следует
:roll:

Re: Всё по DS18(B/S)20.

Чт дек 14, 2017 16:50:24

Starichok51 писал(а):нет ни умножения, ни деления
Starichok51 писал(а): умножаю на 10 сдвигами и сложением

Это как ? 2 предложения и оба друг другу противоречат :)
Когда считанное значение делится на 16, получается всё абсолютно тоже самое - выделение целого и дробной частей. А как уже деление делать, сдвигами или операцией деления - дело тридесятое.
Так что, Вы делаете всё тоже самое, только через ...

Re: Всё по DS18(B/S)20.

Чт дек 14, 2017 20:41:03

ну, не корректно выразился.
нет "явного" умножения, с использованием команды mul.
а умножение косвенное - через сдвиги и сложение.
считанные 2 байта я 4 раза сдвигаю влево (умножение на 16 сдвигами). в одном регистре получается целая часть, в другом регистре остается дробная часть.
сначала вывожу целую часть, потом дробную "умножаю" на 10 и вывожу получившуюся цифру десятых.

в общем-то, дело вкуса каждого человека, как ему делать...

Re: Всё по DS18(B/S)20.

Пт дек 15, 2017 07:01:11

как же я тупанул со своим желанием избавиться от применения команды mul...
это же не 2 байта умножить на 2 байта...
тут надо-то всего 2 строчки - загрузить в регистр число 10 и перемножить 2 регистра.
а я взялся двигать, складывать...

Re: Всё по DS18(B/S)20.

Пн янв 01, 2018 22:20:23

С Новым годом всех!!!
Сил нет уже втыкать к код, ошибки не вижу но она есть. Считываю ROM побитно в DATA_REGISTR, первый считанный бит 1 ,хоть и должен быть 0. остальные биты считываются исправно. Откуда берется первая 1?


Код:
int read_bit(void)
{
   int bit=0x00;
   
   BUS_LOW;
   _delay_us(3);
   BUS_HIGT;
   _delay_us(20);
   
   if(ds18b20_PIN&(1<<DQ))
   {
      bit=0x01;
   }
   else
   {
      bit=0x00;
   }
   
   _delay_us(60);

   return bit;
}

void registr(void)
{
   int DATA_REGISTR = 0x00;
   int j = 0x00;
   
   while (j<=(SIZE))
   {
      
      if (DATA_REGISTR&0x80) // 0x80==1<<7
      {
         DATA_REGISTR = DATA_REGISTR << 1;
         DATA_REGISTR |= read_bit();               // enter_bit(&i);
         //DATA_REGISTR ^= 0x131;
      }
      else
      {
         DATA_REGISTR = DATA_REGISTR << 1;
         DATA_REGISTR |= read_bit();           //enter_bit(&i);
      }
      
      j++;
   }

}

void read_ID (void)
{
   ds18b20_init();
   write_ds18b20(READ1_ROM);
   registr();

}

Re: Всё по DS18(B/S)20.

Пн янв 01, 2018 22:34:11

Не вижу разницы между if и else в функции со странным именем registr.

Непонятно, что такое SIZE, и есть чувство, что цикл лишний раз выполняется.

20мкс пауза при чтении бита - как по мне, многовато.

Re: Всё по DS18(B/S)20.

Пн янв 01, 2018 22:52:24

Не вижу разницы между if и else в функции со странным именем registr.

это функция для чтения ,бита и вычисления СRC . там в if коммент.вот и стало без разницы, но это после.
#define SIZE 8 // количество считываемых бит


Добавлено after 6 minutes 49 seconds:
20мкс пауза при чтении бита - как по мне, многовато.


считывание ROM все ОК,да с осциллографом щупал там все допустимо и 15мкс выставлял. Но вот откуда первый бит 1 берется ХЗ

Re: Всё по DS18(B/S)20.

Вт янв 02, 2018 11:31:05

Понимаю ни у кого нет никаких предположении... :cry:

Re: Всё по DS18(B/S)20.

Ср фев 07, 2018 15:47:40

У меня есть вычислитель crc8 1wire: https://github.com/d-el/PS3604L_Regulat ... /src/crc.c
А вот как использовать: https://github.com/d-el/PS3604L_Regulat ... /ds18TSK.c
Лучше прими весь пакет а затем посчитай контрольную сумму.

Re: Всё по DS18(B/S)20.

Пн май 21, 2018 11:22:44

Starichok51 писал(а):потом дробную часть умножаю на 10 сдвигами и сложением, и сразу получаю цифру десятых.
А как с округлением? Лично я десятые от этой 18х20 делал по таблице в 16 байт. Четыре младших бита кода температуры - вход в таблицу, на выходе - десятичная цифра, которую следует светить после точки. Можно прямо в ASCII, если надо.

Таблица такая:
Код:
"0112334456678899"

Re: Всё по DS18(B/S)20.

Пн май 21, 2018 11:37:49

Если нужно округление то как обычно:
temperature = (scratchpad * 10 + (16/2)) / 16; //Деление с округлением
К числителю прибавить половину знаменателя.

Re: Всё по DS18(B/S)20.

Пн май 21, 2018 13:48:42

afz писал(а):А как с округлением? Лично я десятые от этой 18х20 делал по таблице в 16 байт.
после умножения на 10 получаем целое число (от 0 до 9), потом смотрим старший бит остатка в дробной части. если есть старший бит, то делаем инкремент получившейся цифры десятых.
а можно и по таблице. с таблицей, пожалуй, будет быстрее, чем умножать и потом анализировать округление.

Re: Всё по DS18(B/S)20.

Пн май 21, 2018 22:18:16

[quote="afz"]с таблицей, пожалуй, будет быстрее, чем умножать и потом анализировать округление.

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

Re: Всё по DS18(B/S)20.

Пт май 25, 2018 06:38:00

Вот именно, зависит. На STM32, да даже на больших АВР-ках, программируя на Си, естественно, этой ерундой никто не будет заниматься. А вот на мелких ATtiny, на которых нет даже команды умножения и под которые пишут на Асме - самое то. И этой 18х20 даже полноценное преобразование 2->10 не нужно: считаем, сколько раз можно вычесть 100 (без цикла, поскольку вычесть получится не больше одного раза) - получили старшую цифру, в цикле считаем, сколько раз можно вычесть из остатка 10 - вот вторая цифра, остаток - третья, десятые - по таблице. Ну, еще не забыть, что число может быть и отрицательным, тогда надо запомнить где-то знак минуса и сделать всему числу NEG. Максимум, два десятка машинных команд плюс 16-байтовая таблица, и все.

И вся эта возня, естественно, не ради скорости, а ради компактности кода - подобная задачка легко влезет и в тиньку с 1К флеши (512 машинных команд максимум).

Добавлено after 20 minutes 9 seconds:
Starichok51 писал(а):после умножения на 10 получаем целое число (от 0 до 9), потом смотрим старший бит остатка в дробной части. если есть старший бит, то делаем инкремент получившейся цифры десятых.
а можно и по таблице. с таблицей, пожалуй, будет быстрее, чем умножать и потом анализировать округление.
Программируя на Си, лучше всего умножить код числа на 100, прибавить к нему 5 и преобразовать в строку, после чего отбросить последнюю цифру, предпоследняя будет десятыми, остальные - целой частью. Да, перед этим надо учесть минус.

Re: Всё по DS18(B/S)20.

Пт май 25, 2018 08:52:53

И получите в результате фигню. https://radiokot.ru/forum/viewtopic.php ... 8#p3259348
Ответить