Полная версия этой страницы:
Ds18b20 и прерывания
Andrew_k5
Nov 2 2009, 18:05
Читаю температуру средствами кодевизион. Результат только при отключении прерывания на время чтения. В чем причина?
chief_olimp
Nov 2 2009, 18:44
что означает средствами кодевизион? Какого прерывания? Может быть что выполняемое во время чтения прерывание портит процедуру чтения. Нужно как то выкручиваться.
Andrew_k5
Nov 2 2009, 19:15
Контроллер мега 16. Термометр на рс.7. Есть прерывания по таймерам, ацп, уарт. Для чтения использую ds18b20.h из кодевизион.
Так и должно быть. 1wire требует точных временнЫх интервалов.
SasaVitebsk
Nov 2 2009, 19:41
При работе с DS1820 требуется формирование импульсов определённой длительности. Причём если некоторые определяющие импульсы формируются с разбежкой T+100%, некоторые формируются достаточно точно. Например фронтовые.
Я в своей библиотеке запрещаю прерывания, там где это нужно. Поскольку запрет длится несколько тактов, то это не вызывает побочных эффектов. А основные задержки формируются при помощи таймера.
При таком подходе - никаких проблем не возникает. Если же у вас задержки формируются программно и/или прерывания обслуживаются значительное время (не верно написаны), то в этом случае датчик перестанет работать.
Я тоже запрещаю прерывания во время обмена с датчиком.
mempfis_
Nov 3 2009, 06:40
Цитата(uriy @ Nov 3 2009, 08:50)

Я тоже запрещаю прерывания во время обмена с датчиком.
Во время работы с этим датчиков я тоже запрещаю прерывания но не постоянно, а только на то время когда идёт установка или считывание состояния пинов. На время задержек разрешаю т.к. часто страдает динамическая индикация и прерывания от ТС. Задержки там небольшие конечно и возникновение парочки прерываний их особо не портит (конечно если обработчик прерывания не сильно раздут, у меня в прерываниях от ТС только флаги выставляются).
mempfis_ опередил
Пришелец
Nov 3 2009, 09:18
в этом протоколе можно выделить задержки которые критичны и которые некритичны
прерывания можно запрещать только на время критичных задержек.
Можно ещё использовать COM порт. Смотреть
там, "standard.pdf"
Andrew_k5
Nov 4 2009, 04:52
Цитата(Пришелец @ Nov 3 2009, 13:18)

в этом протоколе можно выделить задержки которые критичны и которые некритичны
прерывания можно запрещать только на время критичных задержек.
это мне и надо. Как это сделать используя то что есть в кодевизион т.е. Стандартную библиотеку работы с датчиком или надо самому пропитывать, может кто поделится кусочком кода где это реализуется.
Andrew_k5
Nov 4 2009, 07:41
Решил проблему изменив в ds18b20.h вместо delау_ms прописал задержку по таймеру и все заработало! Спасибо всем ответившим.
Я делал по другому, в стандартной либе перед обращением к либе с функциями 1Wire запрещал прерывание, а потом опять разрешал.
-SANYCH-
Nov 4 2009, 09:53
Когда работал в кодевизион (уже не помню версию) с таким же датчиком то столкнулся с проблемой неправильного вывода отрицательной температуры. Может конечно я чего то не дочитал. Просто интересно кто нить еще с этим сталкивался.
Я делал так для отрицательной температуры:
Код
if (temp>1000){ //если считали температуру больше 1000
temp=4096-temp; // отнимаем от температуры 4096
temp=-temp; // ставим знак минус
}
-SANYCH- возможно вы не до конца разобрались с представлением чисел в
дополнительном коде
Andrew_k5
Nov 5 2009, 19:08
Чего хотел-добился но есть вопрос к знатокам. В прерывании таймера много вычислений, при обработке прерывания сразу разрешаются другие прерывания, так вот для работы термометра пришлось на время опроса термометра отключать обработку данных. На сколько я понимаю если прерывания разрешены то дело только в размере стека.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.