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

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


-=FISHER=-

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

Способ управления выходом шины 1-wire изменением направления передачи довольно распространённый способ. Лично я использую два пина для подключения датчиков ds18b20 (один вход и один выход) и схему активной подтяжки.

http://forum.cxem.net/index.php?/topic/165405-помогите-с-датчиком-dallas/&tab=comments#comment-2456067

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

6 часов назад, technik-1017 сказал:

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

Да хотелось бы это реализовать именно в устройстве, чтобы при замене термодатчика, он автоматически вставал в 9 битный режим. Дак как же это сделать единожды?

6 часов назад, technik-1017 сказал:

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

Получается вот эта функция?

dt_testdevice(void)

 

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

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Только что, -=FISHER=- сказал:

он автоматически вставал в 9 битный режим

Да не проблема, но зачем?! Чем не устраивает 12-битный режим, установленный с завода?

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

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

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

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

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

Да хотелось бы это реализовать именно в устройстве, чтобы при замене термодатчика, он автоматически вставал в 9 битный режим. Дак как же это сделать единожды?

у вас по схеме есть свободные ввода, повесте на один из входов кнопку (микрик) и инициализируйте датчики при нажатии на кнопку

 

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

Получается вот эта функция?

да

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

Мы не ищем легких путей? Разве после сброса влом прочитать регистр датчика, проверить режим и (по необходимости) выставить требуемый?

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

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

Разве после сброса влом прочитать регистр датчика, проверить режим и (по необходимости) выставить требуемый?

такой вариант уже был, автора пока не устроил:

10 часов назад, -=FISHER=- сказал:

Неужели придётся читать байт конфигурации и сравнить его значение с интересующим меня значением 0x1F (0b00011111)

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

Вы уверены, что автора устроит - "неужели придется допаивать кнопку, инициализировать линию порта, добавлять функцию опроса кнопки и сравнивать ее состояние с вкл/выкл"?:)

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

вообще я предполагал, как вариант, замыкание микрика (или перемычки) перед подачей питания:
нажали кнопку, подали питание, проверили кнопку, инициализировали датчики (возможно ещё что-нибудь инициализировали - "первое включение"))

вообще решать не нам

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

15 часов назад, ARV сказал:

Чем не устраивает 12-битный режим, установленный с завода?

Огромной задержкой в 750 мс

13 часа назад, Геннадий сказал:

Разве после сброса влом прочитать регистр датчика, проверить режим и (по необходимости) выставить требуемый?

 

13 часа назад, technik-1017 сказал:

такой вариант уже был, автора пока не устроил:

Этот вариант я вижу как единственный возможный, но я читал даташит и как я понял чтение из регистра конфигурации - задача не из лёгких. Не могли бы вы пожалуйста привести пример?

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

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

Только что, -=FISHER=- сказал:

Огромной задержкой в 750 мс

У вас же как бы часы многофункциональные? Я угадал? Огромная задержка в 1 секунду для часов вас не смущает? Или вы и время выводите каждые 100 мс?

Только что, -=FISHER=- сказал:

как я понял чтение из регистра конфигурации - задача не из лёгких

Самая сложная задача - это поиск адресов нескольких 1-wire устройств, сидящих на одной шине, все остальное примитивно, как таблица умножения, и в даташите крайне детально расписано.

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

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

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

Я угадал?

В яблочко :)

 

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

Огромная задержка в 1 секунду для часов вас не смущает?

Смотрите, если я буду выводить на дисплей и время и температуру и при этом часы будут иметь кнопки, чтобы сработала кнопка, придётся её удерживать значительное время. Вот в этом заключается неудобство 12 битного режима в частности. А ещё у меня уже появился спортивный интерес программно перевести DS18B20 в 9 битный режим, потому что конкретного примера на Си, мне не удалось найти в Сети.

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

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

Только что, -=FISHER=- сказал:

В яблочко

Готовлюсь у битве экстрасенсов :)

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

В своих проектах я всегда заводил с DS1307 сигнал INT в режиме меандра, по которому определял, что прошла секунда (или меньше - там можно настроить период меандра) - и только в этом случае обновлял показания индикатора, остальное время можно было делать, что угодно.

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

if (прошла_секунда){
  temp = read_temperature();
  start_conversion();
  show_time();
  show_temperature();
}

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

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

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

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

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

все остальное примитивно, как таблица умножения, и в даташите крайне детально расписано.

Боюсь даташитов, сам не знаю почему...

5b6d2576722f2_.JPG.9a8633ef72b2d84234a65a6653d6787e.JPG

В общем прочитал про чтение.

5b6d25add4275_.JPG.b42329fa7c267a3f3240dc724776d6e3.JPG

В голове сложилась вот такая последовательность:

char dt_readcbyte(void) // функция, которая вернет значение регистра конфигурации
{
	char c_byte; //объявим переменную в которую будет считан байт конфигурации
	dt_testdevice(void) //ШАГ 1. Определим, есть ли устройство на шине
	dt_sendbyte(0xCC); //ШАГ 2. Пропустим идентификацию
	dt_sendbyte(0xBE); //ШАГ 3. Команда чтения
	for(int i=0; i<5; i++) // последовательно прочитаем 5 байт в одну и ту же переменную
      						// и остановимся на пятом (Configuration Register)
	{
		c_byte=dt_readbyte();
	}
//дальше чиать память нет необходимости, значит нужно послать импульс сброса, вот так?
	DDRTEMP |= 1<<BITTEMP; //притягиваем шину к 0
	_delay_us(485); //задержка как минимум на 480 микросекунд
	DDRTEMP &= ~(1<<BITTEMP); //отпускаем шину
	return c_byte;
}

Сработает такая последовательность?

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

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

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

Вы допускаете традиционную для многих ошибку - не считываете ВСЕ байты, возвращаемые датчиком. Не смотря на "убедительный" факт, что "и так работает", так делать нельзя. Всегда нужно вычитывать все 9 байтов, выдаваемых датчиком (кроме случаев, когда это на самом деле оговорено в даташите) и обязательно проверять CRC всего массива. Любые дальнейшие манипуляции над данными делать только в том случае, если CRC всех 9 байт равна нулю, иначе игнорировать результат обмена.

В вашем алгоритме есть разного рода ошибки - от странных до грубых.

Только что, -=FISHER=- сказал:

ШАГ 1. Определим, есть ли устройство на шине

Определим - это значит узнаем, есть оно или нет, что подразумевает оператор if над результатом определения. У вас же просто определим и наплюем на результат - хоть есть, хоть нет, будем делать дальше.

Только что, -=FISHER=- сказал:

последовательно прочитаем 5 байт в одну и ту же переменную

Про это уже написал: считаем 9 байт и по мере считывания вычислим CRC, потом проверим CRC на 0, и если ноль на самом деле - пойдем далее.

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

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

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

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

Смотрите, если я буду выводить на дисплей и время и температуру и при этом часы будут иметь кнопки

я вам ранее давал ссылку на один из моих примеров работы с датчиком ds18b20,там есть и работа с ds1307 + меню
http://forum.cxem.net/applications/core/interface/file/attachment.php?id=433564

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

1 час назад, ARV сказал:

У вас же просто определим и наплюем на результат - хоть есть, хоть нет, будем делать дальше.

Поторопился...

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

А вы можете намекнуть, как проверить CRC? (Это контрольная сумма, я правильно понял?)

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

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

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

Только что, -=FISHER=- сказал:

А вы можете намекнуть, как проверить CRC?

А чего тут намекать? Я прямо скажу: в avr-gcc стандартно включен модуль поддержки CRC util/crc16.h, подключив который, вы поимеете в распоряжении функцию _crc_ibutton_update(uint8_t __crc, uint8_t __data), при помощи которой и считается CRC: заводите переменную uint8_t crc, обнуляете её перед считыванием, затем каждый считанный байт data пропускаете через эту функцию: crc = _crc_ibutton_update(crc, data), а потом смотрите, что там в crc посчиталось.

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

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

3 часа назад, ARV сказал:

затем каждый считанный байт data пропускаете через эту функцию: crc = _crc_ibutton_update(crc, data), а потом смотрите, что там в crc посчиталось.

Данные будут достоверны, только если после считывания всех байтов, crc останется равной 0 ? А если не останется, то? И почему настолько важно считать CRC?

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

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

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

А если не останется, то?

То, что данные приняты с ошибкой.

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

И почему настолько важно считать CRC?

Вам без разницы с какими данными работать?

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

16 minutes ago, -=FISHER=- said:

если не останется, то?

Вы прочитали погоду на Марсе. Один или несколько байтов неправильные. Или наводки на линию, илм временные интервалы не соблюдены. Обрабатывая такие данные, можете получить что угодно и долго мучаться вопросом, почему так получилось.

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

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

13 минуты назад, Darth_Vader сказал:

Вам без разницы с какими данными работать?

Ну хотелось бы с правильными)) Я верно описал суть это проверки с помощью 

 

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

модуль поддержки CRC util/crc16.h

?

Только что, KomSoft сказал:

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

А потом на Марсе начинают происходить события по мотивам DOOM3 )))

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

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

Если вы читали описание стандарта 1-wire, вы должны понимать, что надежного обмена он принципиально не гарантирует - оставлять логический уровень в линии на откуп заряда распределенной емкости через подтягивающее сопротивление - это очень малонадежный способ. Кроме того, стандарт допускает, что в линию в любой момент может быть добавлено еще одно устройство, которое начинает с того, что выдает PRESENCE_PULSE, т.е. тупо утягивает линию в 0 на сотню микросекунд, не менее. Что будет с данными, которые вы в это время считывали?

Поэтому единственная гарантия, что вы на самом деле получили информацию от датчика, а не от солнечного ветра или грозовых разрядов, является проверка CRC. А единственная гарантия, что датчик получил от вас какую-то инфу, это повторное вычитывание этой инфы из него (но к термодатчику это относится не особо сильно).

Лучше раз и навсегда сделать правильные функции, чем потом гадать, почему иногда что-то странное происходит...

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

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

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

Лучше раз и навсегда сделать правильные функции, чем потом гадать, почему иногда что-то странное происходит...

В частности вы имеете ввиду добавить функцию проверки контрольной суммы при чтении данных?

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

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

@ARV @technik-1017 @Геннадий Спасибо товарищи!))) У меня успешно получилось прочитать и записать данные в EEPROM датчика DS18B20 ! :)

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

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • Да, именно в этом основной вопрос. Спасибо всем за инфу. (не вижу тут "спасиб/лайков" под постами).
    • это - верно.. просто тогда теряется весь смысл тестирования.. я не хочу спорить, пусть ТС сам определяется.. а это еще не факт качественного звука (все "ламповики" в вас тапки будут кидать), не факт, что - Hi-End.. 
    • Может, и так. Не настаиваю, а токмо рекомендую.
    • @Falconist, думаю в этом случае нет смысла, только входное сопротивление уменьшать. У меня в преде для микрофона стоят 100кОм среднюю точку образующие, шума почти нет. В моëм VAC2.0 так и вообще 200+200кОм стоят по входу (вход на полевиках) и шума нет. @Богдан Назаренко, А вот конденсатор на 250пФ-1нФ параллельно R8 и R3 (ниже плечо делителя напряжения на входе) поставить не помешало бы, в качестве простейшего ФНЧ. Они не дадут усилителю принимать высокочастотные шумы, иначе скорее всего помимо усилителя у вас получится тихий радиоприëмник на рандомную частоту)) 
    • Всё правильно - "усыхают" и чаще в схеме управления, нежели  в силовых. Я иногда, чтобы не выпаивать плохие конденсаторы, припаиваю к старым новые и ИБП продолжает нормально работать. Но, в любом случае, желательно перед перепаиванием, проверить последние пробником.
    • У никель-цинковых очень большое сопротивление, тестером не прозвонить. По этому признаку их легко отличить от марганец-цинковых. Не знаю, какие лучше подойдут именно в затворную цепь. Можно попробовать содрать с БУ транзистора или диода. ferrite bead
    • На слух? Ню-ню... @Богдан Назаренко , я бы номиналы делителей, образующих средние точки для неинвертирующих входов ОУ уменьшил на порядок, а от них ко входам поставил бы по 100 кОм. Всё-таки высокоомные резисторы имеют повышенный дробовый шум по сравнению со среднеомными.
×
×
  • Создать...