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

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


-=FISHER=-

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

17 минут назад, technik-1017 сказал:

а PINTEMP это случайно не PINx?

#define PORTTEMP PORTC
#define DDRTEMP DDRC
#define PINTEMP PINC
#define BITTEMP 2

Изменил код на

		DDRTEMP |= 1<<BITTEMP;
		PORTTEMP |= (1<<BITTEMP); //выставляем 1 на шине, шина к этому моменту уже отпущена
		_delay_ms(100); //в 9 битном режиме преобразования - 750 милисекунд
		PORTTEMP &= ~(1<<BITTEMP); //выставляем 0 на шине
		DDRTEMP &= ~(1<<BITTEMP); //отпускаем шину

Результат тот же...

14 минуты назад, ARV сказал:

Иначе говоря, датчик не получил команду, но отвечает корректно.

Интересно как же это так?..

Изменено пользователем -=FISHER=-

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

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

2 минуты назад, technik-1017 сказал:

надо заменить в последнем коде PINTEMP на PORTTEMP

Заменил..

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

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

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

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

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

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

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

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

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

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

Только что, Геннадий сказал:

время конвертации температуры составляет чуть меньше 100mS.

Ну, а я поставил с запасом 100 мс.

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

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

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

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

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

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

39 минут назад, -=FISHER=- сказал:

Изменил код на

не в вашем коде, а в моём, так

DDRTEMP &= ~ (1<<BITTEMP); // настраиваем порт на ввод. Подтяжка к "1" за счёт внешнего резистора
PORTTEMP |= (1<<BITTEMP);   // включаем подтяжку к "1" внутри контроллера
DDRTEMP |= 1<<BITTEMP; 	   // настраиваем порт на вывод, появляется честная "1"
_delay_ms(750); //в 12 битном режиме преобразования - 750 милисекунд
DDRTEMP &= ~(1<<BITTEMP);  // настраиваем порт на ввод. Осталась подтяжка к "1" внутри контроллера
PORTTEMP &= ~(1<<BITTEMP);  // отключаем подтяжку к "1" внутри контроллера. Осталась только подтяжка за счёт внешнего резистора

а вы точно уверены, что в датчике установлен 9-битный режим? Может пока оставить 750 млсек

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

8 минут назад, technik-1017 сказал:

не в вашем коде, а в моём, так

Гениально! Ваш код заработал, а смысл то был только лишь в перестановке мест слагаемых! Правда только в 12 битном режиме:(

 

9 минут назад, technik-1017 сказал:

а вы точно уверены, что в датчике установлен 9-битный режим? Может пока оставить 750 млсек

.А что вы имеете ввиду под "в датчике установлен 9 битный режим"? Я так понимаю битность меняется просто изменением времени на измерение, то есть уменьшая время последние значения регистров не успевают заполниться.

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

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

2 минуты назад, -=FISHER=- сказал:

Я так понимаю

Тут понимать следует только то, что написано в даташите, собственные домыслы надо отключить.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

3 минуты назад, ARV сказал:

собственные домыслы надо отключить.

Ну это не домыслы,  эту информацию я подчерпнул из одного видео-урока...Значит надо проверять информацию.

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

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

5 минут назад, technik-1017 сказал:

нет

Значит, я просто не включил 9 битный режим и хочу чтобы он работал?)))

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

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

существует возможность подключения датчика к ПК через COM-порт. Можно настроить датчик один раз с помощью ПК и не встраивать код конфигурации в разрабатываемый блок.

Например, с помощью этой программы

https://musbench.com/e_digital/ds18b20.html

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

18 минут назад, Геннадий сказал:

Значит мне нужно отправить сначала байт команды записи в память:

dt_sendbyte(0x4E); //отправляем команду записи в память

А затем как -то отправить данные в 4-ый байт EEPROM, так что бы в битах R1 и R0 стали ноли, но как именно это сделать? Никак не соображу... Для этого наверное лучше нужно написать отдельную функцию?

Изменено пользователем -=FISHER=-

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

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

Итак сначала нужно послать команду записи в EEPROM (0x4E), затем нужно передать 3 байта (TH, TL и байт конфигурации), после чего выполнить команду копирования блокнота (0x48), причём на время выполнения этой команды необходимо подать на шину "честную 1".

ee.JPG.db1561d946a6626e90d7bd1f1be24dc5.JPG

То есть если я не хочу ничего записывать в регистры TH и TL и мне необходимо выставить разрешение на 9 бит. Я должен послать подряд три "нулевых" байта 0x00 ?

void Set_Resolution (void)
{  
	dt_sendbyte(0xCC); //пропустить идентификацию, тк у нас только одно устройство на шине
	dt_sendbyte(0x4E); //отправляем команду записи в память
	dt_sendbyte(0x00); //записываем нули в TH регистр
	dt_sendbyte(0x00); //записываем нули в TL регистр
	dt_sendbyte(0x00); //записываем нули в регистр конфигурации
	DDRTEMP &= ~ (1<<BITTEMP); // настраиваем порт на ввод. Подтяжка к "1" за счёт внешнего резистора
	PORTTEMP |= (1<<BITTEMP);   // включаем подтяжку к "1" внутри контроллера
	DDRTEMP |= 1<<BITTEMP; 	   // настраиваем порт на вывод, появляется честная "1"
	dt_sendbyte(0x48); //отправляем команду копирования ОЗУ в EEPROM
	DDRTEMP &= ~(1<<BITTEMP);  // настраиваем порт на ввод. Осталась подтяжка к "1" внутри контроллера
	PORTTEMP &= ~(1<<BITTEMP);  // отключаем подтяжку к "1" внутри контроллера. Осталась только подтяжка за счёт внешнего резистора  
}

Будьте добры пролейте свет, я правильно размышляю?

Изменено пользователем -=FISHER=-

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

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

у меня так

      MicroLAN_Reset();                           // сброс на линии 1-wire
      MicroLAN_Write(SKIP_ROM);                   // адресация к одному датчику
      MicroLAN_Write(WRITE_SCRATCHPAD);           // запись 3-х байт в SCRATCHPAD
      MicroLAN_Write(0);                          // запись TH/USER BYTE 1
      MicroLAN_Write(0);                          // запись TL/USER BYTE 2
      MicroLAN_Write(0x7F);                       // запись CONFIG (R0=1,R1=1 - разрядность 12 бит)
      MicroLAN_Reset();                           // сброс на линии 1-wire
      MicroLAN_Write(SKIP_ROM);                   // адресация к одному датчику
      MicroLAN_Write(COPY_SCRATCHPAD);            // запись байтов в E2 RAM
      DELAY_MS(10);                               // задержка 10 млсек (необходима после выполнения команды COPY_SCRATCHPAD)

 

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

29 минут назад, technik-1017 сказал:

у меня так

Ну вот, значит с учетом паразитного питания ещё добавятся строчки для установки 1 на шине для записи в EEPROM.

А вот такой интересный вопрос, EEPROM у DS18B20 по даташиту выдерживает 50k циклов записи. А как сделать, чтобы лишний раз не дёргать память и записывать 9 битное разрешение, только если есть в соответствующих битах конфигурации стоят единички? Неужели придётся читать байт конфигурации и сравнить его значение с интересующим меня значением 0x1F (0b00011111)?

А функция сброса на линии MicroLAN_Reset(); притягивает шину к нулю?

DDRTEMP |= 1<<BITTEMP; //притягиваем шину

Итого в моем случае так? Проверьте пожалуйста последовательность действий при записи в  EEPROM

void Set_Resolution (void)
{  
//********************ЗАПИСЬ В ОЗУ**************************
  
	DDRTEMP &= ~(1<<BITTEMP);  // настраиваем порт на ввод
	dt_sendbyte(0xCC); //пропустить идентификацию, тк у нас только одно устройство на шине
	dt_sendbyte(0x4E); //отправляем команду записи в память
	dt_sendbyte(0); //записываем нули в TH регистр
	dt_sendbyte(0); //записываем нули в TL регистр
	dt_sendbyte(0x1F); //записываем нули в регистр конфигурации R0=0, R1=0, разрешение 9 бит
  
//********************ЗАПИСЬ В ПЗУ (EEPROM)**************************
  
	DDRTEMP &= ~ (1<<BITTEMP); // настраиваем порт на ввод. Подтяжка к "1" за счёт внешнего резистора
	dt_sendbyte(0x48); //отправляем команду копирования ОЗУ в EEPROM
	PORTTEMP |= (1<<BITTEMP);   // включаем подтяжку к "1" внутри контроллера
	DDRTEMP |= 1<<BITTEMP; 	   // настраиваем порт на вывод, появляется честная "1"
	DELAY_MS(10);  // задержка 10 млсек (необходима после выполнения команды COPY_SCRATCHPAD)
	DDRTEMP &= ~(1<<BITTEMP);  // настраиваем порт на ввод. Осталась подтяжка к "1" внутри контроллера
	PORTTEMP &= ~(1<<BITTEMP);  // отключаем подтяжку к "1" внутри контроллера. Осталась только подтяжка за счёт внешнего резистора  
}

 

Изменено пользователем -=FISHER=-

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

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

6 минут назад, Геннадий сказал:

Нет необходимости

В последней строчке кода получается нет необходимости? А последовательность команд верная?

Изменено пользователем -=FISHER=-

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

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

По-моему 9 или 12 битный режим выбирается один раз при инициализации. Потом датчик работает как есть, ведь значение уже хранится в еепром

Настоящему коту и в декабре март!

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

7 минут назад, Геннадий сказал:

Нет необходимости отключать внутреннюю подтяжку.

надо обязательно отключать внутреннюю подтяжку, т.к. формирование "0" происходит сменой режима работы пина (ввод/вывод)

1 минуту назад, KomSoft сказал:

По-моему 9 или 12 битный режим выбирается один раз при инициализации. Потом датчик работает как есть, ведь значение уже хранится в еепром

я предлагал установить режим с помощью внешней программы, но видимо необходимо это реализовать в устройстве

40 минут назад, -=FISHER=- сказал:

А функция сброса на линии MicroLAN_Reset(); притягивает шину к нулю?

у вас это проверка датчика на линии

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

В режиме "вывод" это уже не подтяжка, а логическое состояние выхода, которое включается при формировании сигнала, а до этого момента обеспечивает "честную 1" на линии.

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

4 минуты назад, Геннадий сказал:

В режиме "вывод" это уже не подтяжка, а логическое состояние выхода, которое включается при формировании сигнала, а до этого момента обеспечивает "честную 1" на линии.

а никто и не говорил о подтяжке в режиме вывода

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

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

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

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

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

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

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

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

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

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

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

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

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

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