реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Ds18b20 и прерывания, Работает только при отключеных прерываниях
Andrew_k5
сообщение Nov 2 2009, 18:05
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 15-02-07
Из: Днепропетровск
Пользователь №: 25 387



Читаю температуру средствами кодевизион. Результат только при отключении прерывания на время чтения. В чем причина?
Go to the top of the page
 
+Quote Post
chief_olimp
сообщение Nov 2 2009, 18:44
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344



что означает средствами кодевизион? Какого прерывания? Может быть что выполняемое во время чтения прерывание портит процедуру чтения. Нужно как то выкручиваться.

Сообщение отредактировал chief_olimp - Nov 2 2009, 18:51
Go to the top of the page
 
+Quote Post
Andrew_k5
сообщение Nov 2 2009, 19:15
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 15-02-07
Из: Днепропетровск
Пользователь №: 25 387



Контроллер мега 16. Термометр на рс.7. Есть прерывания по таймерам, ацп, уарт. Для чтения использую ds18b20.h из кодевизион.
Go to the top of the page
 
+Quote Post
fmdost
сообщение Nov 2 2009, 19:37
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Так и должно быть. 1wire требует точных временнЫх интервалов.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Nov 2 2009, 19:41
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



При работе с DS1820 требуется формирование импульсов определённой длительности. Причём если некоторые определяющие импульсы формируются с разбежкой T+100%, некоторые формируются достаточно точно. Например фронтовые.

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

При таком подходе - никаких проблем не возникает. Если же у вас задержки формируются программно и/или прерывания обслуживаются значительное время (не верно написаны), то в этом случае датчик перестанет работать.
Go to the top of the page
 
+Quote Post
uriy
сообщение Nov 3 2009, 04:50
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Я тоже запрещаю прерывания во время обмена с датчиком.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Nov 3 2009, 06:40
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(uriy @ Nov 3 2009, 08:50) *
Я тоже запрещаю прерывания во время обмена с датчиком.


Во время работы с этим датчиков я тоже запрещаю прерывания но не постоянно, а только на то время когда идёт установка или считывание состояния пинов. На время задержек разрешаю т.к. часто страдает динамическая индикация и прерывания от ТС. Задержки там небольшие конечно и возникновение парочки прерываний их особо не портит (конечно если обработчик прерывания не сильно раздут, у меня в прерываниях от ТС только флаги выставляются).
Go to the top of the page
 
+Quote Post
Krik99
сообщение Nov 3 2009, 06:45
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 11-05-08
Из: Украина
Пользователь №: 37 411



mempfis_ опередил smile.gif

Сообщение отредактировал Krik99 - Nov 3 2009, 06:46


--------------------
Go to the top of the page
 
+Quote Post
Пришелец
сообщение Nov 3 2009, 09:18
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



в этом протоколе можно выделить задержки которые критичны и которые некритичны

прерывания можно запрещать только на время критичных задержек.
Go to the top of the page
 
+Quote Post
fmdost
сообщение Nov 4 2009, 00:49
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Можно ещё использовать COM порт. Смотреть там, "standard.pdf"
Go to the top of the page
 
+Quote Post
Andrew_k5
сообщение Nov 4 2009, 04:52
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 15-02-07
Из: Днепропетровск
Пользователь №: 25 387



Цитата(Пришелец @ Nov 3 2009, 13:18) *
в этом протоколе можно выделить задержки которые критичны и которые некритичны

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

это мне и надо. Как это сделать используя то что есть в кодевизион т.е. Стандартную библиотеку работы с датчиком или надо самому пропитывать, может кто поделится кусочком кода где это реализуется.
Go to the top of the page
 
+Quote Post
Andrew_k5
сообщение Nov 4 2009, 07:41
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 15-02-07
Из: Днепропетровск
Пользователь №: 25 387



Решил проблему изменив в ds18b20.h вместо delау_ms прописал задержку по таймеру и все заработало! Спасибо всем ответившим.smile.gif
Go to the top of the page
 
+Quote Post
Krik99
сообщение Nov 4 2009, 07:59
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 11-05-08
Из: Украина
Пользователь №: 37 411



Я делал по другому, в стандартной либе перед обращением к либе с функциями 1Wire запрещал прерывание, а потом опять разрешал. smile.gif


--------------------
Go to the top of the page
 
+Quote Post
-SANYCH-
сообщение Nov 4 2009, 09:53
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 289
Регистрация: 6-12-05
Пользователь №: 11 864



Когда работал в кодевизион (уже не помню версию) с таким же датчиком то столкнулся с проблемой неправильного вывода отрицательной температуры. Может конечно я чего то не дочитал. Просто интересно кто нить еще с этим сталкивался.
Go to the top of the page
 
+Quote Post
Krik99
сообщение Nov 4 2009, 10:55
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 11-05-08
Из: Украина
Пользователь №: 37 411



Я делал так для отрицательной температуры:
Код
if (temp>1000){ //если считали температуру больше 1000
temp=4096-temp; // отнимаем от температуры 4096
temp=-temp; // ставим знак минус
}


Сообщение отредактировал Krik99 - Nov 4 2009, 10:56


--------------------
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 14th July 2025 - 23:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.0149 секунд с 7
ELECTRONIX ©2004-2016