Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по датчику
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Anjey_N
Ещё вопрос.
Для того чтобы записать конфигурационный байт нужно подать последовательно такие команды:
- reset;
- skip rom 0xCC;
- write scratchpad 0x4E;
- записать TH;
- записать TL;
- конфигурация.

Так ли это?
А с завода датчики выпускаются с 12-резолюцией?
=GM=
Цитата(Anjey_N @ Jul 17 2007, 06:48) *
Для того чтобы записать конфигурационный байт нужно подать последовательно такие команды:
- reset;
- skip rom 0xCC;
- write scratchpad 0x4E;
- записать TH;
- записать TL;
- конфигурация.
А с завода датчики выпускаются с 12-резолюцией?

Да, всё так, если у вас одно устройство на шине. При подаче питания на датчик устанавливается 12-битное разрешение.
Anjey_N
Цитата(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?) и в каком файле?
ALexx
Цитата(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"
GrayCat
Цитата(ALexx @ Jul 19 2007, 11:16) *
3) В файле main.c должна присутствовать строчка:
Код
#include "DS18B20.h"

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


У меня всё заработало!!!! yeah.gif Большое спасибо!!!!!!!
M@T_F@Q
А можно сюда выложить программку, а то я 3 ночь с датчиком разбираюся.
Tcom
Вот здесь пример смотри разбирайся
http://electronix.ru/forum/index.php?showt...10934&st=15
Anjey_N
Цитата(M@T_F@Q @ Jul 19 2007, 22:18) *
А можно сюда выложить программку, а то я 3 ночь с датчиком разбираюся.


Можно, но попозже, когда со всеми глюками разберусь.
краткие характеристики:
Контроллер ATmega16, кварц на 16 МГц, динамическая индикация, 4-разрядный АЛС с ОА, 1 датчик DS18B20.
Дай ссылку на почтовый ящик, закончу - вышлю.
ALexx
Цитата(GrayCat @ Jul 19 2007, 13:52) *
Маленькое дополнение: очень желательно, чтобы строчка
Код
#include "DS18B20.h"
присутствовала также и в самом "DS18B20.с", для того чтобы компилятор имел возможность во время компиляции проверить соответствие типов объявленной и реализованной переменных. Иначе, если вы, например, внутри "DS18B20.с" поменяете тип этой переменной с unsigned на signed, но не отразите это в "DS18B20.h", то основная программа (в "main.c") будет по прежнему считать ее unsigned, что чревато крайне трудноуловимыми глюками.


Это само собой. Любой с-файл, сопровождаемый h-файлом должен содержать в себе его объявление.
Но за уточнение спасибо.
WHALE
а при линковке соответствие типов не проверяется?
Igor26
Цитата(WHALE @ Jul 20 2007, 12:36) *
а при линковке соответствие типов не проверяется?

Это делает компилятор. Линкер занимается другим.
WHALE
Хорошо.Компилятор должен проверять соответствие типов при обьявлении extern типа из другого файла?
M@T_F@Q
Цитата(Anjey_N @ Jul 20 2007, 12:25) *
Можно, но попозже, когда со всеми глюками разберусь.
краткие характеристики:
Контроллер ATmega16, кварц на 16 МГц, динамическая индикация, 4-разрядный АЛС с ОА, 1 датчик DS18B20.
Дай ссылку на почтовый ящик, закончу - вышлю.

ООооо это было бы вобще классно. Мой емайл roman_1986@xnet.uz.
Заранее спасибо!!!
Сергей Борщ
Цитата(WHALE @ Jul 20 2007, 11:36) *
а при линковке соответствие типов не проверяется?
ИАР проверяет. Думаю, что и другие должны. Например, если в одном файле определить unsigned char A; а в другом объявить extern signed long A; то линкер выругается. Компилятор не имеет возможности отлавливать такие ошибки, ибо при компиляции второго файла не имеет информации о содержимом (и даже о существовании) первого.
WHALE
Cпасибо,CV тоже проверяет при линковке и выдает -ошибка линкера несоответсвие типов.
Тогда здесь речь об чем?
Цитата(GrayCat @ Jul 19 2007, 14:52) *
Маленькое дополнение: очень желательно, чтобы строчка
Код
#include "DS18B20.h"
присутствовала также и в самом "DS18B20.с", для того чтобы компилятор имел возможность во время компиляции проверить соответствие типов объявленной и реализованной переменных. Иначе, если вы, например, внутри "DS18B20.с" поменяете тип этой переменной с unsigned на signed, но не отразите это в "DS18B20.h", то основная программа (в "main.c") будет по прежнему считать ее unsigned, что чревато крайне трудноуловимыми глюками.
Сергей Борщ
Цитата(WHALE @ Jul 21 2007, 09:30) *
Тогда здесь речь об чем?
Видимо не все линкеры ловят. И даже если ловят, то выдают варнинг, который можно не разобравшись задавить. Вот тогда чудеса и начнутся.
Anjey_N
Цитата(M@T_F@Q @ Jul 21 2007, 00:03) *
ООооо это было бы вобще классно. Мой емайл roman_1986@xnet.uz.
Заранее спасибо!!!




посмотри почту
GrayCat
Цитата(WHALE @ Jul 21 2007, 09:30) *
Тогда здесь речь об чем?

Линкер способен словить несоответствия размеров переменных. А каким образом они объявлены -- signed, unsigned или вообще структура -- о том ведомо только компилятору.
WHALE
а вот и нет-signed и unsigned отлавливаются также и именно линкером,по крайней мере в CV.
GrayCat
Цитата(WHALE @ Jul 30 2007, 10:50) *
а вот и нет-signed и unsigned отлавливаются также и именно линкером,по крайней мере в CV.
Ну, значит счастливых пользователей CV можно поздравить с тем, что в объектник пишется полная информация о типах a14.gif Но не стоит расслабляться: так дела обстоят не у всех. Не вечно же вы будете пользоваться только CV! wink.gif Так что не стоит забывать хорошую манеру прописывать объявление переменных в .h-файле и включать его в .c-файл с определением этой же переменной.
GDI
Цитата
прописывать объявление переменных в .h-файле и включать его в .c-файл с определением этой же переменной.

iar ругается на такое, типа двойное объявление или что то типа того...
WHALE
СV аналогично.А в чем смысл двойного обьявляния и в хидере и в с-файле?
Igor26
Цитата(WHALE @ Aug 1 2007, 12:30) *
СV аналогично.А в чем смысл двойного обьявляния и в хидере и в с-файле?

В хидере объявляют переменную, если хотят, чтоб её можно было видеть из других файлов. При этом, перед объявлением переменной в хидере, пишут ключевое слово extern. При объявлении этой же переменной в .С-файле это ключевое слово не указывается.
GrayCat
Цитата(GDI @ Aug 1 2007, 11:16) *
iar ругается на такое, типа двойное объявление или что то типа того...

А вот не надо делать двойное объявление wink.gif . А надо различать объявление и выделение памяти.

Файл 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", то все в порядке.
namelos
Цитата(GrayCat @ Aug 1 2007, 10:49) *
Так что не стоит забывать хорошую манеру прописывать объявление переменных в .h-файле и включать его в .c-файл с определением этой же переменной.

доброе время суток. Если я Вас правильно понял, то так можно обьявлять только extern переменые, а не глобальные для одного *.с файла.
Igor26
Цитата(namelos @ Aug 2 2007, 10:29) *
доброе время суток. Если я Вас правильно понял, то так можно обьявлять только extern переменые, а не глобальные для одного *.с файла.

Да.
namelos
Доброе время суток всем. Посадил датчик на 50м кабель и подтягивающий резистор 4,7к, но получаю постоянно ошибкуCRC8. Может кто-нибудь подскажет временные задержки delays для нормальной работы. Заранее спасибо.
GDI
Что значит для нормальной работы? Ставьте такие задержки которые будут у вас работать. Можно еще подтяжку уменьшить, я уменьшал до 1к, но расстояние у меня было 10м
namelos
2 GDI. Поменял pullup соппротивление на 2.2к, но считанные данные проверку на CRC8 не проходят, к сожалению, получаю нули. Буду пробовать подходящие timeslotы. Кстати, большое спасибо за идею параллельного опроса датчиков. a14.gif
GDI
А на близком расстянии работает? Питание у датчиков какое паразитное или 3й провод идет? Осциллом не пробовали смотреть что там на датчике происходит?
namelos
Питание на 3 провода. Эх, осциллографа нет. Поэтому и тыкаюсь в темноте. На близком все тип-топ.
Может кто-нибудь знает, хотя бы примерно, в каком диапазоне timeslotы использовать.
GDI
На 10м с подтяжкой 1к у меня работали самые быстрые тайм-слоты 15 и 70 мкс.
Для начала стоит попробовать увеличить в 2-3- раза, хотя я не помню, есть ли там ограничение на время тайм-слотов.
namelos
Поставил pullup на 1к, заработало со стандартными таймслотами.
namelos
Доброе время суток. Извините за глупый вопрос, а какая связь между pullup-сопротивлением и напряжением на входе контроллера? Если можно поподробнее. Почему с уменьшением сопротивления растет напряжение на входе при 0. Заранее спасибо.
Miron
Цитата(namelos @ Aug 24 2007, 14:07) *
Питание на 3 провода. Эх, осциллографа нет. Поэтому и тыкаюсь в темноте. На близком все тип-топ.
Может кто-нибудь знает, хотя бы примерно, в каком диапазоне timeslotы использовать.

В вашем случае вполне верояно может звенеть сама линия интерфейса
фронты у вас крутые поэтому после информационного импульса за ним
возникает отклик который может быть значительной амплитуды,
осцилографом их видно. Такие вещи особенно проявляются когда
на длинной линии много датчиков висит. Боротся с этим вполне реально
обычно делают драйвер линии который валит фронты до приемлемых
значений. У DS по этому вопросу были рекомендации, эжели ссылку
найду то скину. А из практики делал 30 датчиков на 150 м с драйвером линии
все работало. А вот программно подбирать интервалы не советую
тут раз на раз не приходится, как попадеш к тому же на разных температурах
чуствительность датчика к звону разная на плюсе может и работать а
на минусе загнется.
AndreyKeil
Цитата(namelos @ Aug 24 2007, 17:51) *
Поставил pullup на 1к, заработало со стандартными таймслотами.

Pullup на 1К ставить нельзя. Ключ в этом датчике терпит 4ма. При повышенной температуре (не знаю точно,какой) Dallas рекомендует не более 3ма. Так что расчетное сопротивление на pullup должно быть не меньше 1,66К.
namelos
Доброе время суток, господа эмбеддеры. Спасибо всем за ответы. Свой вопрос
я задал уважаемому участнегу нашего форума 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 В! , что, естественно, за "ноль" не воспримется.
........
a14.gif
И еще неплохая ссылка на форум по этой теме.
Maik-vs
Цитата(namelos @ Aug 28 2007, 11:55) *
в конце даташита можно найти тьакую табличку:
DC ELECTRICAL CHARACTERISTICS
где указано, что Sink Current = 4 мА.

Пример: если взять подтягивающий резистор в 500 Ом, питание 5 Вольт,
то ток, протекающий от DS18b20 создаст падение напряжения = 500*0.004 = 2 В


Там что, в термометре, источник тока на 4 mA или всё-таки ключ? Если ключ (ИМХО так), то 4 mA - это его максимальный ток, при большем токе он сгорит/нагреет термометр, но напряжение нуля будет равно его напряжению насыщения.
Если источник тока, то объясните мне зачем такой изврат.
Сергей Борщ
Цитата(Maik-vs @ Aug 28 2007, 11:36) *
Если ключ (ИМХО так), то 4 mA - это его максимальный ток, при большем токе он сгорит/нагреет термометр, но напряжение нуля будет равно его напряжению насыщения.
Скорее всего в качестве ключа там стоит полевой транзистор (что видно по картинке 10 в даташите). А полевой транзистор не имеет такого параметра как напряжение насыщения, вместо этого он имеет сопротивление канала в открытом состоянии (Rds-on). На той же картинке оно указано - 100 Ом. Ну а поскольку оно сопротивление, то вместе с сопротивлением подтяжки образуется делитель, и чем меньше сопротивление подтяжки, тем выше напряжение с выхода делителя. И при определенном сопротивлении подтяжки напряжение оказывается выше напряжения нуля. То же и на стороне контроллера. И естественно, мощность, выделяющаяся на сопротивлении открытого канала, приводит к разогреву термометра - это вы правильно заметили.
GDI
У меня при работе с подтяжкой 1к наблюдался саморазогрев датчика, но конструктивно сама микросхема датчика помещалась в массивный металлический корпус, а сам датчик в сборе измерял температуру в жидкости, так что небольшой разогрев датчика не влиял на работу устройства в целом, т.к. корпус датчика служил как бы радиатором.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.