Динамическая индикация + термометр DS18B20
- Pavel V.
- Мявтор!
- Сообщения: 384
- Зарегистрирован: Ср май 17, 2006 18:39:01
- Откуда: Москва
- Контактная информация:
Динамическая индикация + термометр DS18B20
Доброго времени суток!
У меня вот какой вопрос. В моем устройстве используется датчик температуры DS18B20 (тот, что 1-wire) совместно с динамической индикацией.
Динамическая индикация работает по прерыванию переполнения таймера.
Для считывания температуры с датчика, необходимо от 200 до 800 мс (в зависимости от разрешения). Прерывания от Д.И. случаются чаще, соответственно результат измерения температуры не всегда корректен.
На данный момент проблему решил выключением Д.И. на время процедуры измерения температуры (меряю ее в прерывании где-то раз в 10 сек). Но неприятно, что индикаторы гаснут.
Интересно, кто-нибудь сталкивался с подобным? Может быть есть какие-то варианты?
И еще вопрос - существуют ли некие аппаратные контроллеры 7-сегм. индикаторов, чтобы обойтись без динамической?
У меня вот какой вопрос. В моем устройстве используется датчик температуры DS18B20 (тот, что 1-wire) совместно с динамической индикацией.
Динамическая индикация работает по прерыванию переполнения таймера.
Для считывания температуры с датчика, необходимо от 200 до 800 мс (в зависимости от разрешения). Прерывания от Д.И. случаются чаще, соответственно результат измерения температуры не всегда корректен.
На данный момент проблему решил выключением Д.И. на время процедуры измерения температуры (меряю ее в прерывании где-то раз в 10 сек). Но неприятно, что индикаторы гаснут.
Интересно, кто-нибудь сталкивался с подобным? Может быть есть какие-то варианты?
И еще вопрос - существуют ли некие аппаратные контроллеры 7-сегм. индикаторов, чтобы обойтись без динамической?
- moLCHec
- Мявтор!
- Сообщения: 825
- Зарегистрирован: Вс дек 18, 2005 20:04:42
- Откуда: Свердловская обл.
- Контактная информация:
И я б не отказался посмотреть как 1-wire юзают. А если у тебя MEGA16 или выше то там мона асинхронно запустить T2. у меня на 1 Гц работает и не жалуется пока. Ставишь кварц и устанавливаешь нужный делитель. А вообще можно заюзать есчё один счётчик с приоритетом пониже и его под данную задержку настроить. Какой контроллер то .
Настоящий кот всегда либо голоден,
либо невыспался ...
либо невыспался ...
Вот я делал терморегулятор для холодильника. Как раз на DS18B20, плюс МК PIC16F84A (AVRы, к сожалению, не юзаю). 1-wire работает на ура, а вот динамическая индикация слегка "подмигивает", хотя и не все замечают. Считывание температуры - раз в секунду. Обновление показаний индикатора - постоянно, как только возможно. Короче, во время преобразования температуры датчиком я вывожу на индикатор старое значение. Как только получено новое значение - вывожу его на индикатор. С прерываниями ваааще не связан (даже отключаю их нафиг).
Индикатор светодиодный, семисегментный, 4-разрядный. Для вывода значений использую сдвиговый регистр К555ИР8. Всего на индикации задействовано 6 выводов МК - 2 на регистр и 4 на катоды разрядов.
Пока всё работает, уже второй год.
Индикатор светодиодный, семисегментный, 4-разрядный. Для вывода значений использую сдвиговый регистр К555ИР8. Всего на индикации задействовано 6 выводов МК - 2 на регистр и 4 на катоды разрядов.
Пока всё работает, уже второй год.
Pavel V. писал(а):Короче, во время преобразования температуры датчиком я вывожу на индикатор старое значение.
А каким образом? Ведь погаснуть должна индикация (кроме одного текущего знакоместа)?
Я соображал так:
1) запускаю преобразование температуры на датчике (а это как-никак 750 мс идёт при 12-битном разрешении);
2) вызываю процедуру вывода значений на индикатор (она делает один проход по всем знакоместам индикатора);
3) проверяю - не готово ли новое значение температуры (датчик должен то ли поднять, то ли опустить уровень на шине 1-wire, уже не помню);
4) если датчик ещё не готов выдать новое значение температуры (ещё идёт преобразование), то перехожу ко второму пункту;
5) иначе (датчик закончил преобразование) обрабатываю и вывожу на индикатор новое значение температуры - вот, собственно, и всё.
Итого, за время преобразования (750 мс) я успеваю раз 50 вывести старые значения на индикатор, поэтому и мигание особенно не заметно.
Такое может не прокатить если датчик имеет паразитное питание, т.е. питание от шины данных. В таком случае во время преобразования температуры нужно удерживать на шине данных высокий уровень, что исключает возможность опроса состояния датчика во время преобразования. Тут уж нужно точно отсчитывать время и только после этого считывать данные с датчика.
moLCHec писал(а):Исходником работы с 1-Wire не поделишся.??
Если это ко мне вопрос, то могу поискать
А вообще, была в инете прога для работы с этими датчиками - TempKeeper называется. Полная версия платная, демо версия, соответственно, халявная, но и функций там поменьше (типа работа только с одним или двумя датчиками, отсутствие логов всяких, уже не помню). Для начала сойдёт, а там мож чё своё сварганить можно будет
- moLCHec
- Мявтор!
- Сообщения: 825
- Зарегистрирован: Вс дек 18, 2005 20:04:42
- Откуда: Свердловская обл.
- Контактная информация:
да нет я к автору темы обращался. Вообще я не понимаю что у него не получается у m8 3 таймера(Т0,Т1,Т2). У T1 есчё вроде А и В cчётные регистры. установил на каждый своё прерывание и всё. Одним прерыванием читаешь температуру заносишь в глобальную переменную и запускаешь следущее преобразование, Другим отображаешь содержимое глобальной переменной.
Настоящий кот всегда либо голоден,
либо невыспался ...
либо невыспался ...
- alex2103
- Прорезались зубы
- Сообщения: 219
- Зарегистрирован: Вт сен 18, 2007 16:41:16
- Откуда: Украина, г. Запорожье
- Контактная информация:
chief а с DS1820 работаете как? Если использовать стандартные библиотеки CV, то полюбому ошибки будут...
непонятно...каждый раз разрешаете...а где запрещаете?
Просто в каждом прерывании разрешаю прерывание которое отвечает за индикацию. Само прерывание выполняется очень быстро и не создает проблем для снятия показаний с датчика (раз в 1 сек)
непонятно...каждый раз разрешаете...а где запрещаете?
alex2103 писал(а):chief а с DS1820 работаете как? Если использовать стандартные библиотеки CV, то полюбому ошибки будут...Просто в каждом прерывании разрешаю прерывание которое отвечает за индикацию. Само прерывание выполняется очень быстро и не создает проблем для снятия показаний с датчика (раз в 1 сек)
непонятно...каждый раз разрешаете...а где запрещаете?
Дело в том что пишу на асме. А как известно при вызове прерывания автоматически выполняется команда "cli" - запрещение всех прерываний. И только после выхода из прерывания командой ''reti'' прерывания опять разрешаются (если до этого они были разрешены). Таким образом насильно разрешая прерывания в процедуре обработчика таймера 1 (опрос термодатчика), я разрешаю прерывания от таймера 2 (ну и от всех остальных конечно тоже), где отрабатывается динамическая индикация и опрос клавиатуры. Таким образом даже когда происходит опрос термодатчика у меня происходят прерывания то таймера 2 и свободно происходит отображение значения. Как я уже говорил выше, прерывание выполняется 7.25 мкс и не дает сбоев при опросе термодатчика. DS1820 использую так как есть под рукой. Отличия от DS18B20 в точности 0.5 С. Т.е. для перевода в целочисельный формат результат первого байта нужно сдвинуть один раз вправо. Ау DS18B20 4 раза (2байта)
alex2103 писал(а):а так что не работает?
неа...чтоб получить достоверную температуру приходилось останавливать индикацию
Странно. Тайминги там не такие уж и критичные. Единственно возможно в твоей функции постоянно идет опрос готовности, а я тупо жду 750 мс. В данном случае асм рулит. Попробуй ассемблерную вставку. Функции могу скинуть.