|
Вопрос по датчику, DS18B20 |
|
|
|
Jul 19 2007, 08:07
|

Частый гость
 
Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374

|
Цитата(Anjey_N @ Jul 17 2007, 10:48)  Ещё вопрос. Для того чтобы записать конфигурационный байт нужно подать последовательно такие команды: - reset; - skip rom 0xCC; - write scratchpad 0x4E; - записать TH; - записать TL; - конфигурация.
Так ли это? А с завода датчики выпускаются с 12-резолюцией? Ещё один вопрос в догонку, скорее по написанию программы. В файле драйвера DS18B20 (пусть это будет DS18B20.c) я ввожу новую переменную. Например, flag_znak=0 если температура положительная и flag_znak=1 если температура отрицательная. А опрашивать эту переменную буду в другом файле (допустим main.c). Вопрос: как определить переменную (char? int? extern?) и в каком файле?
|
|
|
|
|
Jul 19 2007, 08:16
|

Местный
  
Группа: Свой
Сообщений: 243
Регистрация: 22-09-04
Из: Burbach, Germany
Пользователь №: 704

|
Цитата(Anjey_N @ Jul 19 2007, 11:07)  Ещё один вопрос в догонку, скорее по написанию программы. В файле драйвера DS18B20 (пусть это будет DS18B20.c) я ввожу новую переменную. Например, flag_znak=0 если температура положительная и flag_znak=1 если температура отрицательная. А опрашивать эту переменную буду в другом файле (допустим main.c). Вопрос: как определить переменную (char? int? extern?) и в каком файле? 1) В файле DS18B20.c определяете переменную: Код unsigned char flag_znak; 2) В файле DS18B20.h наряду с прототипами функций работы с термометром должна присутствовать строчка: Код extern unsigned char flag_znak; 3) В файле main.c должна присутствовать строчка: Код #include "DS18B20.h"
|
|
|
|
|
Jul 19 2007, 10:52
|

Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 7-10-05
Из: UA
Пользователь №: 9 342

|
Цитата(ALexx @ Jul 19 2007, 11:16)  3) В файле main.c должна присутствовать строчка: Код #include "DS18B20.h" Маленькое дополнение: очень желательно, чтобы строчка Код #include "DS18B20.h" присутствовала также и в самом "DS18B20.с", для того чтобы компилятор имел возможность во время компиляции проверить соответствие типов объявленной и реализованной переменных. Иначе, если вы, например, внутри "DS18B20.с" поменяете тип этой переменной с unsigned на signed, но не отразите это в "DS18B20.h", то основная программа (в "main.c") будет по прежнему считать ее unsigned, что чревато крайне трудноуловимыми глюками.
--------------------
Gray©at
|
|
|
|
|
Jul 19 2007, 18:19
|

Частый гость
 
Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374

|
Цитата(GrayCat @ Jul 19 2007, 13:52)  Маленькое дополнение: очень желательно, чтобы строчка Код #include "DS18B20.h" присутствовала также и в самом "DS18B20.с", для того чтобы компилятор имел возможность во время компиляции проверить соответствие типов объявленной и реализованной переменных. Иначе, если вы, например, внутри "DS18B20.с" поменяете тип этой переменной с unsigned на signed, но не отразите это в "DS18B20.h", то основная программа (в "main.c") будет по прежнему считать ее unsigned, что чревато крайне трудноуловимыми глюками. У меня всё заработало!!!!  Большое спасибо!!!!!!!
|
|
|
|
|
Jul 20 2007, 07:25
|

Частый гость
 
Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374

|
Цитата(M@T_F@Q @ Jul 19 2007, 22:18)  А можно сюда выложить программку, а то я 3 ночь с датчиком разбираюся. Можно, но попозже, когда со всеми глюками разберусь. краткие характеристики: Контроллер ATmega16, кварц на 16 МГц, динамическая индикация, 4-разрядный АЛС с ОА, 1 датчик DS18B20. Дай ссылку на почтовый ящик, закончу - вышлю.
|
|
|
|
|
Jul 20 2007, 07:33
|

Местный
  
Группа: Свой
Сообщений: 243
Регистрация: 22-09-04
Из: Burbach, Germany
Пользователь №: 704

|
Цитата(GrayCat @ Jul 19 2007, 13:52)  Маленькое дополнение: очень желательно, чтобы строчка Код #include "DS18B20.h" присутствовала также и в самом "DS18B20.с", для того чтобы компилятор имел возможность во время компиляции проверить соответствие типов объявленной и реализованной переменных. Иначе, если вы, например, внутри "DS18B20.с" поменяете тип этой переменной с unsigned на signed, но не отразите это в "DS18B20.h", то основная программа (в "main.c") будет по прежнему считать ее unsigned, что чревато крайне трудноуловимыми глюками. Это само собой. Любой с-файл, сопровождаемый h-файлом должен содержать в себе его объявление. Но за уточнение спасибо.
|
|
|
|
|
Jul 20 2007, 21:03
|

Участник

Группа: Участник
Сообщений: 65
Регистрация: 25-01-07
Из: Узбекистан
Пользователь №: 24 765

|
Цитата(Anjey_N @ Jul 20 2007, 12:25)  Можно, но попозже, когда со всеми глюками разберусь. краткие характеристики: Контроллер ATmega16, кварц на 16 МГц, динамическая индикация, 4-разрядный АЛС с ОА, 1 датчик DS18B20. Дай ссылку на почтовый ящик, закончу - вышлю. ООооо это было бы вобще классно. Мой емайл roman_1986@xnet.uz. Заранее спасибо!!!
|
|
|
|
|
Jul 21 2007, 06:30
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Cпасибо,CV тоже проверяет при линковке и выдает -ошибка линкера несоответсвие типов. Тогда здесь речь об чем? Цитата(GrayCat @ Jul 19 2007, 14:52)  Маленькое дополнение: очень желательно, чтобы строчка Код #include "DS18B20.h" присутствовала также и в самом "DS18B20.с", для того чтобы компилятор имел возможность во время компиляции проверить соответствие типов объявленной и реализованной переменных. Иначе, если вы, например, внутри "DS18B20.с" поменяете тип этой переменной с unsigned на signed, но не отразите это в "DS18B20.h", то основная программа (в "main.c") будет по прежнему считать ее unsigned, что чревато крайне трудноуловимыми глюками.
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Jul 25 2007, 15:37
|

Частый гость
 
Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374

|
Цитата(M@T_F@Q @ Jul 21 2007, 00:03)  ООооо это было бы вобще классно. Мой емайл roman_1986@xnet.uz. Заранее спасибо!!! посмотри почту
|
|
|
|
|
Jul 30 2007, 07:05
|

Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 7-10-05
Из: UA
Пользователь №: 9 342

|
Цитата(WHALE @ Jul 21 2007, 09:30)  Тогда здесь речь об чем? Линкер способен словить несоответствия размеров переменных. А каким образом они объявлены -- signed, unsigned или вообще структура -- о том ведомо только компилятору.
--------------------
Gray©at
|
|
|
|
|
Aug 1 2007, 06:49
|

Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 7-10-05
Из: UA
Пользователь №: 9 342

|
Цитата(WHALE @ Jul 30 2007, 10:50)  а вот и нет-signed и unsigned отлавливаются также и именно линкером,по крайней мере в CV. Ну, значит счастливых пользователей CV можно поздравить с тем, что в объектник пишется полная информация о типах  Но не стоит расслабляться: так дела обстоят не у всех. Не вечно же вы будете пользоваться только CV!  Так что не стоит забывать хорошую манеру прописывать объявление переменных в .h-файле и включать его в .c-файл с определением этой же переменной.
--------------------
Gray©at
|
|
|
|
|
Aug 1 2007, 17:01
|

Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 7-10-05
Из: UA
Пользователь №: 9 342

|
Цитата(GDI @ Aug 1 2007, 11:16)  iar ругается на такое, типа двойное объявление или что то типа того... А вот не надо делать двойное объявление  . А надо различать объявление и выделение памяти. Файл functions.h: Код // ... extern unsigned char Variable; // ... Файл functions.c: Код #include "functions.h" // ... unsigned char Variable; // ... Файл main.c: Код #include "functions.h" // ... Variable = 1; // ... Так вот в functions.h содержится именно объявление. Просмотрев строку extern unsigned char Variable; компилятор просто "держит в уме", что где-то эта переменная будет, и знает, каким образом с ней обращаться. Включение "functions.h" в main.c не генерирует никакого кода и не выделяет никакой памяти. На это указывает ключевое слово extern.А вот в functions.c происходит реальное выделение памяти под unsigned char Variable; . Поскольку в данном случае тип переменной согласуется с тем, что было объявлено в "functions.h", то все в порядке.
--------------------
Gray©at
|
|
|
|
|
Aug 2 2007, 06:29
|
Частый гость
 
Группа: Свой
Сообщений: 77
Регистрация: 4-08-06
Пользователь №: 19 324

|
Цитата(GrayCat @ Aug 1 2007, 10:49)  Так что не стоит забывать хорошую манеру прописывать объявление переменных в .h-файле и включать его в .c-файл с определением этой же переменной. доброе время суток. Если я Вас правильно понял, то так можно обьявлять только extern переменые, а не глобальные для одного *.с файла.
|
|
|
|
|
Aug 27 2007, 08:30
|
Частый гость
 
Группа: Validating
Сообщений: 149
Регистрация: 11-02-05
Из: Рязань
Пользователь №: 2 574

|
Цитата(namelos @ Aug 24 2007, 14:07)  Питание на 3 провода. Эх, осциллографа нет. Поэтому и тыкаюсь в темноте. На близком все тип-топ. Может кто-нибудь знает, хотя бы примерно, в каком диапазоне timeslotы использовать. В вашем случае вполне верояно может звенеть сама линия интерфейса фронты у вас крутые поэтому после информационного импульса за ним возникает отклик который может быть значительной амплитуды, осцилографом их видно. Такие вещи особенно проявляются когда на длинной линии много датчиков висит. Боротся с этим вполне реально обычно делают драйвер линии который валит фронты до приемлемых значений. У DS по этому вопросу были рекомендации, эжели ссылку найду то скину. А из практики делал 30 датчиков на 150 м с драйвером линии все работало. А вот программно подбирать интервалы не советую тут раз на раз не приходится, как попадеш к тому же на разных температурах чуствительность датчика к звону разная на плюсе может и работать а на минусе загнется.
|
|
|
|
|
Aug 27 2007, 12:39
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930

|
Цитата(namelos @ Aug 24 2007, 17:51)  Поставил pullup на 1к, заработало со стандартными таймслотами. Pullup на 1К ставить нельзя. Ключ в этом датчике терпит 4ма. При повышенной температуре (не знаю точно,какой) Dallas рекомендует не более 3ма. Так что расчетное сопротивление на pullup должно быть не меньше 1,66К.
|
|
|
|
|
Aug 28 2007, 07:55
|
Частый гость
 
Группа: Свой
Сообщений: 77
Регистрация: 4-08-06
Пользователь №: 19 324

|
Доброе время суток, господа эмбеддеры. Спасибо всем за ответы. Свой вопрос я задал уважаемому участнегу нашего форума Dima_Ag, на который получил очень исчерпывающий ответ. С его разрешения, я привожу его ниже. Цитата Сейчас я тоже пытаюсь посадить датчик DS18B20 на 50м провод. Для считывания данных использую подтягивающий резистор 1.5к, хотя рекомендуемый 4.7к(больше 1.5к данные считываются с ожибкой). Чем это может грозить? При большом номинале подтягивающего сопротивления возрастает время переходного процесса, ввиду чего короткие импульсы, которыми передаются "единицы", могут быть слишком "удлинены". Отсюда и ошибки в передаче данных. Цитата И еще, извините за глупый вопрос, а какая связь между pullup сопротивлением и напряжением на входе контроллера при нулевом сигнале? Если можно поподробнее. Связь тут следующая: в конце даташита можно найти тьакую табличку: DC ELECTRICAL CHARACTERISTICS где указано, что Sink Current = 4 мА. Это означает, что такой ток будет протекать через подтягивающий резистор в то время, когда термометр "выдаёт" ноль. Чем больше номинал резистора, тем ближе напряжение "нуля" к 0 Вольтам. Если же номинал подтягивающего резистора взять очень маленьким, то протекающий ток в 4 мА может не создать достаточно "сильного" падения напряжения на этом самом резисторе, следовательно, уровень нуля может быть слишком высок. Пример: если взять подтягивающий резистор в 500 Ом, питание 5 Вольт, то ток, протекающий от DS18b20 создаст падение напряжения = 500*0.004 = 2 В, таким образом, уровень "нуля" на входе микроконтроллера будет 5В - 2В =3 В! , что, естественно, за "ноль" не воспримется. ........ И еще неплохая ссылка на форум по этой теме.
|
|
|
|
|
Aug 28 2007, 08:36
|
Местный
  
Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101

|
Цитата(namelos @ Aug 28 2007, 11:55)  в конце даташита можно найти тьакую табличку: DC ELECTRICAL CHARACTERISTICS где указано, что Sink Current = 4 мА.
Пример: если взять подтягивающий резистор в 500 Ом, питание 5 Вольт, то ток, протекающий от DS18b20 создаст падение напряжения = 500*0.004 = 2 В Там что, в термометре, источник тока на 4 mA или всё-таки ключ? Если ключ (ИМХО так), то 4 mA - это его максимальный ток, при большем токе он сгорит/нагреет термометр, но напряжение нуля будет равно его напряжению насыщения. Если источник тока, то объясните мне зачем такой изврат.
|
|
|
|
|
Aug 28 2007, 11:33
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Maik-vs @ Aug 28 2007, 11:36)  Если ключ (ИМХО так), то 4 mA - это его максимальный ток, при большем токе он сгорит/нагреет термометр, но напряжение нуля будет равно его напряжению насыщения. Скорее всего в качестве ключа там стоит полевой транзистор (что видно по картинке 10 в даташите). А полевой транзистор не имеет такого параметра как напряжение насыщения, вместо этого он имеет сопротивление канала в открытом состоянии (Rds-on). На той же картинке оно указано - 100 Ом. Ну а поскольку оно сопротивление, то вместе с сопротивлением подтяжки образуется делитель, и чем меньше сопротивление подтяжки, тем выше напряжение с выхода делителя. И при определенном сопротивлении подтяжки напряжение оказывается выше напряжения нуля. То же и на стороне контроллера. И естественно, мощность, выделяющаяся на сопротивлении открытого канала, приводит к разогреву термометра - это вы правильно заметили.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|