Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ds18b20 и прерывания
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Andrew_k5
Читаю температуру средствами кодевизион. Результат только при отключении прерывания на время чтения. В чем причина?
chief_olimp
что означает средствами кодевизион? Какого прерывания? Может быть что выполняемое во время чтения прерывание портит процедуру чтения. Нужно как то выкручиваться.
Andrew_k5
Контроллер мега 16. Термометр на рс.7. Есть прерывания по таймерам, ацп, уарт. Для чтения использую ds18b20.h из кодевизион.
fmdost
Так и должно быть. 1wire требует точных временнЫх интервалов.
SasaVitebsk
При работе с DS1820 требуется формирование импульсов определённой длительности. Причём если некоторые определяющие импульсы формируются с разбежкой T+100%, некоторые формируются достаточно точно. Например фронтовые.

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

При таком подходе - никаких проблем не возникает. Если же у вас задержки формируются программно и/или прерывания обслуживаются значительное время (не верно написаны), то в этом случае датчик перестанет работать.
uriy
Я тоже запрещаю прерывания во время обмена с датчиком.
mempfis_
Цитата(uriy @ Nov 3 2009, 08:50) *
Я тоже запрещаю прерывания во время обмена с датчиком.


Во время работы с этим датчиков я тоже запрещаю прерывания но не постоянно, а только на то время когда идёт установка или считывание состояния пинов. На время задержек разрешаю т.к. часто страдает динамическая индикация и прерывания от ТС. Задержки там небольшие конечно и возникновение парочки прерываний их особо не портит (конечно если обработчик прерывания не сильно раздут, у меня в прерываниях от ТС только флаги выставляются).
Krik99
mempfis_ опередил smile.gif
Пришелец
в этом протоколе можно выделить задержки которые критичны и которые некритичны

прерывания можно запрещать только на время критичных задержек.
fmdost
Можно ещё использовать COM порт. Смотреть там, "standard.pdf"
Andrew_k5
Цитата(Пришелец @ Nov 3 2009, 13:18) *
в этом протоколе можно выделить задержки которые критичны и которые некритичны

прерывания можно запрещать только на время критичных задержек.

это мне и надо. Как это сделать используя то что есть в кодевизион т.е. Стандартную библиотеку работы с датчиком или надо самому пропитывать, может кто поделится кусочком кода где это реализуется.
Andrew_k5
Решил проблему изменив в ds18b20.h вместо delау_ms прописал задержку по таймеру и все заработало! Спасибо всем ответившим.smile.gif
Krik99
Я делал по другому, в стандартной либе перед обращением к либе с функциями 1Wire запрещал прерывание, а потом опять разрешал. smile.gif
-SANYCH-
Когда работал в кодевизион (уже не помню версию) с таким же датчиком то столкнулся с проблемой неправильного вывода отрицательной температуры. Может конечно я чего то не дочитал. Просто интересно кто нить еще с этим сталкивался.
Krik99
Я делал так для отрицательной температуры:
Код
if (temp>1000){ //если считали температуру больше 1000
temp=4096-temp; // отнимаем от температуры 4096
temp=-temp; // ставим знак минус
}
ae_
-SANYCH- возможно вы не до конца разобрались с представлением чисел в дополнительном коде
Andrew_k5
Чего хотел-добился но есть вопрос к знатокам. В прерывании таймера много вычислений, при обработке прерывания сразу разрешаются другие прерывания, так вот для работы термометра пришлось на время опроса термометра отключать обработку данных. На сколько я понимаю если прерывания разрешены то дело только в размере стека.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.