Перейти к содержанию

DS18B20 выдает неадекватные показания при паразитном питании


-=FISHER=-

Рекомендуемые сообщения

1 час назад, -=FISHER=- сказал:

может быть и правда проще всего каждый раз при подаче питания загружать 9 битный режим в ОЗУ

Как то давно собирал термометр Гном, с Радиокота. Там была прошивка с 9 бит. Я её и использовал. Через время решил сделать свой термометр, с десятыми. Опрос датчика стандартный 12 бит. Но не тут то было. Датчик был зашит на 9 бит, и десятые показывались 0 или 5. Пришлось перелопачивать даташит, и перепрограммировать датчик. Может вам проще будет собрать тот термометр, он простой. И там перепрограммировать свой датчик. А потом использовать его в своей конструкции?

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, -=FISHER=- сказал:

проще всего каждый раз при подаче питания загружать 9 битный режим в ОЗУ самостоятельно и никакого EEPROM?

именно это я тебе и сказал.

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, andrusha152 сказал:

Может вам проще будет собрать тот термометр, он простой. И там перепрограммировать свой датчик. А потом использовать его в своей конструкции

Мне нравится самому с нуля разбираться, да и мне кажется проще самому сделать, чем повторять и в случае проблем разбираться в чужом. Тем более я уже остановился на записи в ОЗУ датчика и всё отлично работает :)

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

05.04.2020 в 19:01, KomSoft сказал:

(понимаю, что так разговор начинать нельзя, типа сам не делал, но учу. Но...) Непосредственно программированием 18В20 не занимался, а вот сейчас ради интереса залез в даташит. А там написано: Clipboard01.png.4c43d12842765fbee337070cfbd4433c.png

т.е. данные сохраняются в еепром и считываются при включении питания. Или могут быть загружены в любой момент командой Recall E2.

А вот на следующей странице написано вот так: CONFIGURATION REGISTER
Byte 4 of the scratchpad memory contains the configuration register, which is organized as illustrated in
Figure 8. The user can set the conversion resolution of the DS18B20 using the R0 and R1 bits in this
register as shown in Table 2. The power-up default of these bits is R0 = 1 and R1 = 1 (12-bit resolution).

Т.е. состояние при включении питания - 12-битное разрешение. Вот и пойми этих разработчиков!

Я сейчас взял для эксперимента другой датчик DS18B20, и из функции установки разрешения убрал запись в EEPROM, а оставил только запись в ОЗУ и что Вы думаете? Датчик не завёлся!

А в даташите кстати ведь записано только что при включении питания данные считываются из EEPROM в scratchpad, но не сказано что они записываются в SRAM!))) Похоже их нужно каждый раз считывать туда самостоятельно?...

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

В общем я разобрался с записью в EEPROM DS18B20, вдруг кому-то пригодиться?

ds18b20.h

Скрытый текст

#ifndef DS18B20_H_
#define DS18B20_H_

#include "main.h"

#define SkipROM 0xCC //Определение датчика на шине
#define ConvertT  0x44 //Команда измерения температуры
#define ReadScratchpad 0xBE //Команда чтения ОЗУ
#define WriteScratchpad 0x4E //Команда записи в ОЗУ
#define CopyScratchpad 0x48 //Команда копирования ОЗУ в EEPROM
#define Recall 0xB8 //команда копирования EEPROM в Scratchpad
#define Resolution9bit 0x1F //значение конфигурационного регистра для расрешения 9 бит
#define Resolution12bit 0x7F //значение конфигурационного регистра для расрешения 12 бит

#define PORTTEMP PORTB
#define DDRTEMP DDRB
#define PINTEMP PINB
#define BITTEMPIN 6
#define BITTEMPOUT 1

uint8_t sensor_bit; //переменная для выбора датчика температуры


int dt_check(void); //функция преобразования показаний датчика в температуру
char converttemp (unsigned int tt); //преобразование температуры в единицы
void Set_Resolution (void); //функция установки разрешения
char dt_readscratchpad(void); //функция чтения из ОЗУ значение битов разрешения

#endif /* DS18B20_H_ */

 

ds18b20.c

Скрытый текст

#include "DS18B20.h"

char Cminus;

//функция определения датчика на шине
char dt_testdevice(void) //dt - digital termomether | определим, есть ли устройство на шине
{
	char stektemp=SREG;// сохраним значение стека
	cli(); //запрещаем прерывание
	char dt;
	DDRTEMP |= 1<<sensor_bit; //притягиваем шину
	_delay_us(485); //задержка как минимум на 480 микросекунд
	DDRTEMP &= ~(1<<sensor_bit); //отпускаем шину
	_delay_us(65); //задержка как максимум на 60 микросекунд
	if ((PINTEMP & (1<<sensor_bit))==0)//проверяем, ответит ли устройство
	{
		dt=1;//устройство есть
	} 
	else dt=0;//устройства нет
	SREG = stektemp;// вернем значение стека
	_delay_us(420); //задержка как минимум на 480 микросекунд, но хватит и 420, тк это с учетом времени прошедших команд
	return dt; //вернем результат
}


//функция записи бита на устройство
void dt_sendbit(char bt)
{
	char stektemp=SREG;// сохраним значение стека
	cli(); //запрещаем прерывание
	DDRTEMP |= 1<<sensor_bit; //притягиваем шину
	_delay_us(2); //задержка как минимум на 2 микросекунды
	if(bt)
		DDRTEMP &= ~(1<<sensor_bit); //отпускаем шину
	_delay_us(65); //задержка как минимум на 60 микросекунд
	DDRTEMP &= ~(1<<sensor_bit); //отпускаем шину
	SREG = stektemp;// вернем значение стека
}

//функция записи байта на устройство
void dt_sendbyte(unsigned char bt)
{
	char i;		
	for(i=0;i<8;i++)//посылаем отдельно каждый бит на устройство
	{
		if((bt & (1<<i)) == 1<<i)//посылаем 1
			dt_sendbit(1);
		else //посылаем 0
			dt_sendbit(0);
	}	
}

//функция чтения бита с устройства
char dt_readbit(void)
{
	char stektemp=SREG;// сохраним значение стека
	cli(); //запрещаем прерывание
	char bt; //переменная хранения бита
	DDRTEMP |= 1<<sensor_bit; //притягиваем шину
	_delay_us(2); //задержка как минимум на 2 микросекунды
	DDRTEMP &= ~(1<<sensor_bit); //отпускаем шину
	_delay_us(13);
	bt = (PINTEMP & (1<<sensor_bit))>>sensor_bit; //читаем бит
	_delay_us(45);
	SREG = stektemp;// вернем значение стека
	return bt; //вернем результат
}

//функция чтения байта с устройства
unsigned char dt_readbyte(void)
{
	char c=0;
	char i;
	for(i=0;i<8;i++)
		c|=dt_readbit()<<i; //читаем бит
	return c;
}

//функция преобразования показаний датчика в температуру
int dt_check(void)
{
	unsigned char bt;//переменная для считывания байта
	unsigned int tt=0;
	if(dt_testdevice()==1) //если устройство нашлось
	{
		dt_sendbyte(SkipROM); //пропустить идентификацию, тк у нас только одно устройство на шине
		dt_sendbyte(ConvertT); //измеряем температуру
		//DDRTEMP &= ~ (1<<sensor_bit); // настраиваем порт на ввод. Подтяжка к "1" за счёт внешнего резистора
		PORTTEMP |= (1<<sensor_bit);   // включаем подтяжку к "1" внутри контроллера
		DDRTEMP |= (1<<sensor_bit); 	   // настраиваем порт на вывод, появляется честная "1"
		_delay_ms(100); //в 9 битном режиме преобразования - 100 милисекунд
		DDRTEMP &= ~(1<<sensor_bit);  // настраиваем порт на ввод. Осталась подтяжка к "1" внутри контроллера
		PORTTEMP &= ~(1<<sensor_bit);  // отключаем
	}
	if(dt_testdevice()==1) //если устройство нашлось
	{
		dt_sendbyte(SkipROM); //пропустить идентификацию, тк у нас только одно устройство на шине
		dt_sendbyte(ReadScratchpad); //даем команду на чтение данных с устройства
		bt = dt_readbyte(); //читаем младший бит LS
		tt = dt_readbyte(); //читаем старший бит MS, здесь знак -
		tt = (tt<<8)|bt;//сдвигаем старший влево, младший пишем на его место, тем самым получаем общий результат
	}
	return tt;
}

//преобразование температуры в единицы
char converttemp (unsigned int tt)
{
	char t = tt>>4;//сдвиг и отсечение части старшего байта
	if(t&(1<<7))
	{
		t=~t;
		if(t==0x00){Cminus=0;}
		else{Cminus=1;}
	}
 	else
 	{Cminus=0;}
	return t;
}

void Set_Resolution (uint8_t resolution)
{ 
	if(dt_testdevice()==1) //если устройство нашлось
	{ 
//********************ЗАПИСЬ В ОЗУ**************************
		DDRTEMP &= ~(1<<sensor_bit);  // настраиваем порт на ввод
		dt_sendbyte(SkipROM); //пропустить идентификацию, тк у нас только одно устройство на шине
		dt_sendbyte(WriteScratchpad); //отправляем команду записи в память
		dt_sendbyte(0); //записываем нули в TH регистр
		dt_sendbyte(0); //записываем нули в TL регистр
		dt_sendbyte(resolution); //записываем нули в регистр конфигурации R0=0, R1=0, разрешение 9 бит
	}
//********************КОПИРОВАНИЕ ОЗУ В ПЗУ (EEPROM)**************************
	if(dt_testdevice()==1) //если устройство нашлось
	{
 		DDRTEMP &= ~ (1<<sensor_bit); // настраиваем порт на ввод. Подтяжка к "1" за счёт внешнего резистора
 		dt_sendbyte(SkipROM); //пропустить идентификацию, тк у нас только одно устройство на шине
 		dt_sendbyte(CopyScratchpad); //отправляем команду копирования ОЗУ в EEPROM
 		PORTTEMP |= (1<<sensor_bit);   // включаем подтяжку к "1" внутри контроллера
 		DDRTEMP |= (1<<sensor_bit); 	   // настраиваем порт на вывод, появляется честная "1"
 		_delay_ms(10);  // задержка 10 млсек (необходима после выполнения команды COPY_SCRATCHPAD)
 		DDRTEMP &= ~(1<<sensor_bit);  // настраиваем порт на ввод. Осталась подтяжка к "1" внутри контроллера
 		PORTTEMP &= ~(1<<sensor_bit);  // отключаем подтяжку к "1" внутри контроллера. Осталась только подтяжка за счёт внешнего резистора 
	}
}

char dt_readscratchpad(void) // функция, которая вернет значение регистра конфигурации
{
	char c_byte=0; //объявим переменную в которую будет считан байт конфигурации
	if(dt_testdevice()==1) //ШАГ 1. Определим, есть ли устройство на шине
	{
		dt_sendbyte(0xCC); //ШАГ 2. Пропустим идентификацию
		dt_sendbyte(0xBE); //ШАГ 3. Команда чтения
		for(int i=0; i<9; i++) // последовательно прочитаем все 9 байт, а значение 5го занесем в переменную
		// и остановимся на пятом (Configuration Register)
		{
			if(i==4){c_byte=dt_readbyte();}
			else{dt_readbyte();}
		}
	}
	return c_byte;
}

 

Проверка разрешения и установка 9 бит в случае, если в EEPROM стоит 12 бит. Происходит только один раз для нового датчика.

Скрытый текст

int main(void)
{
	if (dt_readscratchpad()==Resolution12bit){Set_Resolution(Resolution9bit);} //если устанолено разрешение 12 бит, то установим 9 бит 
	while(1)
    {
		sensor_bit=BITTEMPIN; tt_in=converttemp(dt_check()); //измерим температуру для первого датчика
		sensor_bit=BITTEMPOUT; tt_out=converttemp(dt_check()); //измерим температуру для второго датчика     
    }
}

 

 

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...