Страница 1 из 3

Динамическая индикация + термометр DS18B20

Добавлено: Пн июл 03, 2006 17:53:01
Pavel V.
Доброго времени суток!
У меня вот какой вопрос. В моем устройстве используется датчик температуры DS18B20 (тот, что 1-wire) совместно с динамической индикацией.

Динамическая индикация работает по прерыванию переполнения таймера.

Для считывания температуры с датчика, необходимо от 200 до 800 мс (в зависимости от разрешения). Прерывания от Д.И. случаются чаще, соответственно результат измерения температуры не всегда корректен.

На данный момент проблему решил выключением Д.И. на время процедуры измерения температуры (меряю ее в прерывании где-то раз в 10 сек). Но неприятно, что индикаторы гаснут.

Интересно, кто-нибудь сталкивался с подобным? Может быть есть какие-то варианты?


И еще вопрос - существуют ли некие аппаратные контроллеры 7-сегм. индикаторов, чтобы обойтись без динамической?

Добавлено: Вт июл 04, 2006 04:02:17
МИК
Специализированные контроллеры наверное есть, но в похожих случаях не забиваю голову поиском экзотики, да еще со всякими не всегда устраевающими меня ограничениями. Беру второй, подходящий мк, зашиваю что надо, стыкую с основным мк, и все что надо он отрабатывает.

Добавлено: Ср июл 05, 2006 05:50:35
Mamonth
Подскажи как работал с DS18B20 у меня чего-то не получилось. )) Если не секрет конечно.

Добавлено: Ср июл 05, 2006 10:17:15
moLCHec
И я б не отказался посмотреть как 1-wire юзают. А если у тебя MEGA16 или выше то там мона асинхронно запустить T2. у меня на 1 Гц работает и не жалуется пока. Ставишь кварц и устанавливаешь нужный делитель. А вообще можно заюзать есчё один счётчик с приоритетом пониже и его под данную задержку настроить. Какой контроллер то .

Добавлено: Ср июл 05, 2006 17:25:02
yaroslav
Вот я делал терморегулятор для холодильника. Как раз на DS18B20, плюс МК PIC16F84A (AVRы, к сожалению, не юзаю). 1-wire работает на ура, а вот динамическая индикация слегка "подмигивает", хотя и не все замечают. Считывание температуры - раз в секунду. Обновление показаний индикатора - постоянно, как только возможно. Короче, во время преобразования температуры датчиком я вывожу на индикатор старое значение. Как только получено новое значение - вывожу его на индикатор. С прерываниями ваааще не связан (даже отключаю их нафиг).
Индикатор светодиодный, семисегментный, 4-разрядный. Для вывода значений использую сдвиговый регистр К555ИР8. Всего на индикации задействовано 6 выводов МК - 2 на регистр и 4 на катоды разрядов.
Пока всё работает, уже второй год.

Добавлено: Ср июл 05, 2006 19:08:53
Pavel V.
Для работы с датчиком (DS18b20) использую встроенные в CodeVision AVR библиотеки, работают на ура.

Короче, во время преобразования температуры датчиком я вывожу на индикатор старое значение.

А каким образом? Ведь погаснуть должна индикация (кроме одного текущего знакоместа)?

Контроллер - mega8.

Добавлено: Чт июл 06, 2006 13:35:25
yaroslav
Pavel V. писал(а):
Короче, во время преобразования температуры датчиком я вывожу на индикатор старое значение.

А каким образом? Ведь погаснуть должна индикация (кроме одного текущего знакоместа)?


Я соображал так:
1) запускаю преобразование температуры на датчике (а это как-никак 750 мс идёт при 12-битном разрешении);
2) вызываю процедуру вывода значений на индикатор (она делает один проход по всем знакоместам индикатора);
3) проверяю - не готово ли новое значение температуры (датчик должен то ли поднять, то ли опустить уровень на шине 1-wire, уже не помню);
4) если датчик ещё не готов выдать новое значение температуры (ещё идёт преобразование), то перехожу ко второму пункту;
5) иначе (датчик закончил преобразование) обрабатываю и вывожу на индикатор новое значение температуры - вот, собственно, и всё.
Итого, за время преобразования (750 мс) я успеваю раз 50 вывести старые значения на индикатор, поэтому и мигание особенно не заметно.
Такое может не прокатить если датчик имеет паразитное питание, т.е. питание от шины данных. В таком случае во время преобразования температуры нужно удерживать на шине данных высокий уровень, что исключает возможность опроса состояния датчика во время преобразования. Тут уж нужно точно отсчитывать время и только после этого считывать данные с датчика.

Добавлено: Чт июл 06, 2006 15:26:03
Pavel V.
Спасибо, Ярослав! Буду думать теперь как все лучше сделать:)

Добавлено: Сб июл 08, 2006 08:38:15
moLCHec
Исходником работы с 1-Wire не поделишся.??

Добавлено: Сб июл 08, 2006 13:18:07
yaroslav
moLCHec писал(а):Исходником работы с 1-Wire не поделишся.??


Если это ко мне вопрос, то могу поискать :). Но вот только прога на асме для PICов. И ROM-команды там не реализованы - только SkipROM (пропуск команды) работает, т.к. датчик у меня был один и мучаться каждый раз с инициализацией его единственного и неповторимого :)) было влом. Но для одного датчика этого хватает, то если датчиков несколько - тогда нужно соображать всякие MatchROM, ReadROM и т.д. и т.п.
А вообще, была в инете прога для работы с этими датчиками - TempKeeper называется. Полная версия платная, демо версия, соответственно, халявная, но и функций там поменьше (типа работа только с одним или двумя датчиками, отсутствие логов всяких, уже не помню). Для начала сойдёт, а там мож чё своё сварганить можно будет :)

Добавлено: Сб июл 08, 2006 14:02:41
moLCHec
да нет я к автору темы обращался. Вообще я не понимаю что у него не получается у m8 3 таймера(Т0,Т1,Т2). У T1 есчё вроде А и В cчётные регистры. установил на каждый своё прерывание и всё. Одним прерыванием читаешь температуру заносишь в глобальную переменную и запускаешь следущее преобразование, Другим отображаешь содержимое глобальной переменной.

Добавлено: Вс июл 23, 2006 10:15:33
Pavel V.
В CodeVision, насколько я понял, встроенные функции для работы с 1-Wire, так что делиться нечем..

Добавлено: Вт сен 18, 2007 16:44:48
alex2103
Только что делал термостат на Меге8+DS18b20+3 семисегментника.
Тоже столкнулся с проблемой, когда ведется измерение температуры, то приходится выключать индикацию.
В итоге все поборол подправлением встроеных библиотек CV.
Если еще актуально, то могу поделиться.

Добавлено: Ср сен 19, 2007 09:38:02
chief
сейчас делаю терморегулятор для электро-котла. Mega8+DS1820+динамическая индикация. Ничего не отключаю.
Просто в каждом прерывании разрешаю прерывание которое отвечает за индикацию. Само прерывание выполняется очень быстро и не создает проблем для снятия показаний с датчика (раз в 1 сек)

Добавлено: Ср сен 19, 2007 11:45:33
alex2103
chief а с DS1820 работаете как? Если использовать стандартные библиотеки CV, то полюбому ошибки будут...
Просто в каждом прерывании разрешаю прерывание которое отвечает за индикацию. Само прерывание выполняется очень быстро и не создает проблем для снятия показаний с датчика (раз в 1 сек)

непонятно...каждый раз разрешаете...а где запрещаете? :)

Добавлено: Чт сен 20, 2007 08:40:27
chief
alex2103 писал(а):chief а с DS1820 работаете как? Если использовать стандартные библиотеки CV, то полюбому ошибки будут...
Просто в каждом прерывании разрешаю прерывание которое отвечает за индикацию. Само прерывание выполняется очень быстро и не создает проблем для снятия показаний с датчика (раз в 1 сек)

непонятно...каждый раз разрешаете...а где запрещаете? :)

Дело в том что пишу на асме. А как известно при вызове прерывания автоматически выполняется команда "cli" - запрещение всех прерываний. И только после выхода из прерывания командой ''reti'' прерывания опять разрешаются (если до этого они были разрешены). Таким образом насильно разрешая прерывания в процедуре обработчика таймера 1 (опрос термодатчика), я разрешаю прерывания от таймера 2 (ну и от всех остальных конечно тоже), где отрабатывается динамическая индикация и опрос клавиатуры. Таким образом даже когда происходит опрос термодатчика у меня происходят прерывания то таймера 2 и свободно происходит отображение значения. Как я уже говорил выше, прерывание выполняется 7.25 мкс и не дает сбоев при опросе термодатчика. DS1820 использую так как есть под рукой. Отличия от DS18B20 в точности 0.5 С. Т.е. для перевода в целочисельный формат результат первого байта нужно сдвинуть один раз вправо. Ау DS18B20 4 раза (2байта)

Добавлено: Чт сен 20, 2007 12:23:05
alex2103
раз асм тогда вопросов нет :)
мне пишлось в библиотеке все процедуры чтения/записи 1-wire заключать в cli{}sei

Добавлено: Чт сен 20, 2007 21:26:09
chief
alex2103 писал(а):раз асм тогда вопросов нет :)
мне пишлось в библиотеке все процедуры чтения/записи 1-wire заключать в cli{}sei

а так что не работает?

Добавлено: Пт сен 21, 2007 08:19:29
alex2103
а так что не работает?

неа...чтоб получить достоверную температуру приходилось останавливать индикацию :(

Добавлено: Пт сен 21, 2007 10:13:23
chief
alex2103 писал(а):
а так что не работает?

неа...чтоб получить достоверную температуру приходилось останавливать индикацию :(

Странно. Тайминги там не такие уж и критичные. Единственно возможно в твоей функции постоянно идет опрос готовности, а я тупо жду 750 мс. В данном случае асм рулит. Попробуй ассемблерную вставку. Функции могу скинуть.