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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Все четко заработало)Благодарю всех за содействие :beer: :hunger:
Реклама
akl
Друг Кота
Сообщения: 4448
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Операцию деления можно исключить, умножив код на 160 (0,1ºC), 1600(0,01ºC) и т.д. Младший байт отбрасывается (при усечении) или его 7-бит прибавляется к результату, расположенному в старших байтах, а затем оный отбрасывается.
Реклама
Модератор
Аватара пользователя
Сообщения: 19055
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

у меня в термометре нет ни умножения, ни деления. есть только сдвиги.
сначала я вывожу целую часть, потом дробную часть умножаю на 10 сдвигами и сложением, и сразу получаю цифру десятых.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Приветствую!Настало время CRC.теорию вроде как понял, осталось реализовать. 1. Первое, что не понятно это СRC8==100110001, как вообще это вычислено? принимаем это как константу так понял. 2. считываю 56 бит с датчика, куда и как столько данных поместить?в какую-то одну переменную или разбить на байты по 8 бит,то тогда вообще не понятно как мне применить ИЛИ-НЕ с 8 битным байтом и 9 битным СRC8...
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18677
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

по-моему, настало время изучить документацию как следует
:roll:
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Starichok51 писал(а):нет ни умножения, ни деления
Starichok51 писал(а): умножаю на 10 сдвигами и сложением
Это как ? 2 предложения и оба друг другу противоречат :)
Когда считанное значение делится на 16, получается всё абсолютно тоже самое - выделение целого и дробной частей. А как уже деление делать, сдвигами или операцией деления - дело тридесятое.
Так что, Вы делаете всё тоже самое, только через ...
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 19055
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

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

в общем-то, дело вкуса каждого человека, как ему делать...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Модератор
Аватара пользователя
Сообщения: 19055
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

как же я тупанул со своим желанием избавиться от применения команды mul...
это же не 2 байта умножить на 2 байта...
тут надо-то всего 2 строчки - загрузить в регистр число 10 и перемножить 2 регистра.
а я взялся двигать, складывать...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

С Новым годом всех!!!
Сил нет уже втыкать к код, ошибки не вижу но она есть. Считываю 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();

}
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

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

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

20мкс пауза при чтении бита - как по мне, многовато.
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3273416#p3273416"]Не вижу разницы между if и else в функции со странным именем registr.[/uquote]
это функция для чтения ,бита и вычисления СRC . там в if коммент.вот и стало без разницы, но это после.
#define SIZE 8 // количество считываемых бит
Добавлено after 6 minutes 49 seconds:
20мкс пауза при чтении бита - как по мне, многовато.
считывание ROM все ОК,да с осциллографом щупал там все допустимо и 15мкс выставлял. Но вот откуда первый бит 1 берется ХЗ
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Понимаю ни у кого нет никаких предположении... :cry:
Грызет канифоль
Аватара пользователя
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Сообщение drakon »

У меня есть вычислитель crc8 1wire: https://github.com/d-el/PS3604L_Regulat ... /src/crc.c
А вот как использовать: https://github.com/d-el/PS3604L_Regulat ... /ds18TSK.c
Лучше прими весь пакет а затем посчитай контрольную сумму.
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

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

Таблица такая:

Код: Выделить всё

"0112334456678899"
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Грызет канифоль
Аватара пользователя
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Сообщение drakon »

Если нужно округление то как обычно:
temperature = (scratchpad * 10 + (16/2)) / 16; //Деление с округлением
К числителю прибавить половину знаменателя.
Модератор
Аватара пользователя
Сообщения: 19055
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

afz писал(а):А как с округлением? Лично я десятые от этой 18х20 делал по таблице в 16 байт.
после умножения на 10 получаем целое число (от 0 до 9), потом смотрим старший бит остатка в дробной части. если есть старший бит, то делаем инкремент получившейся цифры десятых.
а можно и по таблице. с таблицей, пожалуй, будет быстрее, чем умножать и потом анализировать округление.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Грызет канифоль
Аватара пользователя
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Сообщение drakon »

[uquote="Starichok51",url="/forum/viewtopic.php?p=3382015#p3382015"][quote="afz"]с таблицей, пожалуй, будет быстрее, чем умножать и потом анализировать округление.[/uquote]
Зависит от архитектуры, нужно уточнять.
Табличная математика для такого простого выражения это вообще каменный век.
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

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

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

Добавлено after 20 minutes 9 seconds:
Starichok51 писал(а):после умножения на 10 получаем целое число (от 0 до 9), потом смотрим старший бит остатка в дробной части. если есть старший бит, то делаем инкремент получившейся цифры десятых.
а можно и по таблице. с таблицей, пожалуй, будет быстрее, чем умножать и потом анализировать округление.
Программируя на Си, лучше всего умножить код числа на 100, прибавить к нему 5 и преобразовать в строку, после чего отбросить последнюю цифру, предпоследняя будет десятыми, остальные - целой частью. Да, перед этим надо учесть минус.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
akl
Друг Кота
Сообщения: 4448
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

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

Вернуться в «Периферия»