Страница 13 из 16
Добавлено: Чт сен 10, 2009 10:34:46
ARV
sheva_s писал(а):а потом вычитал в книге по ПИКам описание работы датчика температуры где написано что когда приходит отрицательная температура с датчика её нужно проинвертировать и прибавить 1 получим число для вывода. Вот тогда и разобрался с вашим кодом.

господи, ну вы ведь на Си пишите - зачем все это?! я же написал, как делать - никаких инверсий, никаких суммирований...
Добавлено: Чт сен 10, 2009 11:07:33
urry
угу, согласен, дал глупый совет, недосмотрел, лишние телодвижения.
Заявленное int temp по умолчанию для компиляторов Си считается как signed int temp, а беззнаковое нужно объявлять дополнительно
(unsigned int).
В данном случае после чтения
temp=ds18b20_temperature(&ds18b20_rom_codes[0][0]);
//#asm("sei")
minus=0;
if (temp<0) minus=1;
Добавлено: Чт сен 10, 2009 11:21:27
sheva_s
ARV извените я несмог разобраться в том что вы написали я только изучаю язык Си , после того как определили что у нас отрицательная температура и установили знак , у меня невыходило вывести цифры на экран без того что бы их проинвертировать как в вашем случае мне сделать ? Код программы я вылаживал выше подскажите пожалуста

Добавлено: Чт сен 10, 2009 11:45:41
ARV
повторять одно и то же мне недосуг - смотрите или по форуму, или на моем сайте в разделе для начинающих - я рассказывал о выводе чисел и кое-чем другом.
Требования к питанию
Добавлено: Сб сен 26, 2009 14:39:53
anco
Здравствуйте!
Повесил схему с двумя ds18b20 (3-х проводная, 2 датчика параллельно) на 5 вольт от USB компьютера и заметил что один показывает более стабильно, а второй может завышать до 1 град относительно первого. Если комп выключен, то второй начинает занижать относительно первого до 2-х градусов. Повесил паралельно питанию 470 мкФ, температура на втором выросла на 3 градуса!!! Подключив к аккумуляторам разница между двумя термометрами 0,1 град., очень редко 0,2. Вот такой экземпляр попался...
ЗЫ Все это проделовалось расположив два датчика рядом и замотав их в пенопласт. Опрос обоих датчиков раз в 3 сек одной и той же процедурой: 1-я сек запустить преобразования для всех, 2-я сек прочитать первый, 3-я - второй.
ЗЫЫ Может кто сталкивался с таким? Какой шанс купить другой датчик и нарваться на такой же глючный?
Добавлено: Пт окт 02, 2009 19:57:44
VadimPa
Питание от компьютера лучше не использовать, а насчет точности
в даташите ясно написано точность ±0.5°C –10°C to 85°C
а в диапазоне –55°C to +125°C еще хуже.
Так думаю, что на экран выводить можно и 0,0625 °, а верить
только целым градусам.
Добавлено: Вт окт 20, 2009 23:52:04
svamoscow
Использую паразитное питание, при этом во время преобразования температуры я просто включаю "1" на ноге Atmega8L там где подключен датчик (может лучше внешний кмоп?), проблема в следующем: датчик периодически выдаёт 85 градусов, когда температура меньше минус 8 - минус 14 градусов просто постоянно горит 85, при этом проверяется CRC, она сходится, то бишь он шлёт это "осознанно". Что значат эти загадочные 85 градусов? пробовал немного изменять задержки (сам всё писал на asm и все они строго в пределах заданных в datasheet), добился того что датчик стал пореже выдавать 85 (хотябы перестал в положительной температуре). Опробовал несколько датчиков все выдают периодически 85 градусов какие то чаще, какие то реже, без паразитного питания всё окей, только иногда CRC не сходится (длина провода 1 метр), кстати на сколько часто у Вас не сходится CRC? Даже при моделировании в proteus иногда не сходится CRC.
Добавлено: Ср окт 21, 2009 11:58:50
svamoscow
Опытным путём выяснил, что проблема у меня с передачей команды в устройство скорее всего, и чем длиннее линия тем меньше вероятность успешной передачи. Взял линию 10 метров (телефонный шнур) - постоянно принимаю 85, то есть чтение проходит нормально, CRC без ошибок, похоже команда передаётся в датчик неправильно. Вот кусок кода передачи, подскажите где здесь косяк?
Код: Выделить всё
;Запись в шину
;*****************************************************************
W1_write:
ldi W1_delay,7 ;ждём 3.5 мкс (больше 1)
rcall W1_1delay
ldi W1_count,8
W1_write_loop:
cli
sbi W1_DDR,W1_BN
ldi W1_delay,2 ;ждём 1.63 мкс (больше 1 меньше 15)
rcall W1_1delay
sbrc W1_temp,0 ;если "1" сразу отпускаем шину
cbi W1_DDR,W1_BN
ldi W1_delay,165 ;ждём ещё 62.75 мкс (в сумме больше 60 меньше 120)
rcall W1_1delay
cbi W1_DDR,W1_BN ;в случае записи "0" отпускаем
ror W1_temp ;первыми идут младшие биты
ldi W1_delay,7 ;ждём 3.5 мкс перед передачей следующего бита (больше 1)
rcall W1_1delay
sei
dec W1_count
brne W1_write_loop
ror W1_temp ;вернём регистр в исходное состояние
ret
Предварительно всегда запускается процедура инициализации где посылается RESET
Поэтому подтягиваю линию на ноль таким образом:
А отпускаю таким:
PS админам проблемы со вставкой значков больше меньше, пришлось их на слова заменять, съелся кусок текста.
Добавлено: Ср окт 21, 2009 16:45:49
svamoscow
Вот куда вкралась проблема!!! Столько мучений было)
Код: Выделить всё
ldi W1_temp,0xcc ;Skip ROM
rcall W1_write
ldi W1_temp,0x44 ;Convert T
rcall W1_write
sbi W1_DDR,W1_BN ;паразитное питание
sbi W1_PORT,W1_BN
clr temp0 ; 100 мсекунд
rcall wait1024
Как выяснилось нужно обязательно делать вот так:
Код: Выделить всё
ldi W1_temp,0xcc ;Skip ROM
rcall W1_write
ldi W1_temp,0x44 ;Convert T
rcall W1_write
sbi W1_PORT,W1_BN ;паразитное питание
sbi W1_DDR,W1_BN
clr temp0 ; 100 мсекунд
rcall wait1024
То есть сначала включать на порту 1, а затем уже делать его выходом!
Добавлено: Вт ноя 03, 2009 10:13:49
clawham
ARV писал(а):господи, ну что вы такое понаписали-то? смотрите: DS выдает байты температуры в привычном формате младший-старший... то есть если обратиться к двум байтам, как к переменной
int - мы сразу получим температуру в 0,0625 долях градуса... чтобы перевести это во
float, всего-навсего надо целую температуру поделить на 16... вот так:
Код: Выделить всё
unsigned char buf[8];// массив, возвращенный DS18B20
int T = *(int*)buf;
float Tf = T / 16.0;
И снова ЗДРАВСТВУЙТЕ!
Хочу выразить некоторую претензию!
Не корректно работает сий код!!! Он верен только для положительных температур!!!
Ведь когда температура меньше нуля то Дска биты-то инвертирует!!!
и получается у нас в результате вместо -1 -- +4095!!!!!
Оно меня сегодня ночью в 3 часа разбудило тревогой мол накрылся контроллер(компьютерная программа пищщала системным динамиком!!!)
пока вылечил условием что если результат деления получился больше 256 то отнять от него 4096.....
эт именно то чего я так и не понял, подозревал что тут пипец и будет....и оказалось таки что есть.....не работает с минусовыми температурами этот фокус....
П.С, А мой монстровитый и дурацкий запутанный работает

учел все

Добавлено: Вт ноя 03, 2009 10:17:46
clawham
svamoscow писал(а):Использую паразитное питание, при этом во время преобразования температуры я просто включаю "1" на ноге Atmega8L там где подключен датчик (может лучше внешний кмоп?), проблема в следующем: датчик периодически выдаёт 85 градусов, когда температура меньше минус 8 - минус 14 градусов просто постоянно горит 85, при этом проверяется CRC, она сходится, то бишь он шлёт это "осознанно". Что значат эти загадочные 85 градусов? пробовал немного изменять задержки (сам всё писал на asm и все они строго в пределах заданных в datasheet), добился того что датчик стал пореже выдавать 85 (хотябы перестал в положительной температуре). Опробовал несколько датчиков все выдают периодически 85 градусов какие то чаще, какие то реже, без паразитного питания всё окей, только иногда CRC не сходится (длина провода 1 метр), кстати на сколько часто у Вас не сходится CRC? Даже при моделировании в proteus иногда не сходится CRC.
85 это ошибка передачи команды!!! Кстати аналогичный глюк будет если вы его нагреете дл +100 даже рядом с мк
уменьшите до 512 Ом подтягивающий резюк! и будет вам счастье - у меня линия 120 метров 4 датчика в - 27 работают исправно раз в пол секунды
Кстати по поводу
Код: Выделить всё
ldi W1_temp,0xcc ;Skip ROM
rcall W1_write
ldi W1_temp,0x44 ;Convert T
rcall W1_write
sbi W1_PORT,W1_BN ;паразитное питание
sbi W1_DDR,W1_BN
clr temp0 ; 100 мсекунд
rcall wait1024
если вы сначала переведете вход на выход а в регистре PORT будет ноль то вы тем самым сгенерируете Reset pulse

Re: Требования к питанию
Добавлено: Вт ноя 03, 2009 10:24:17
clawham
anco писал(а):
ЗЫЫ Может кто сталкивался с таким? Какой шанс купить другой датчик и нарваться на такой же глючный?
а шанс велик.....мне техасовец сказал что у нас процент продажи отбракованных изделий выше 75 процентов(украина)да я и сам в этом убедился! То что приходило семплами и то что я покупал на радиорынке....такое ощущение что это разные приборы разных фирм и с разной внутренней глюкофобией

Добавлено: Ср ноя 04, 2009 23:00:48
sachok
Значит не у меня одного такие датчики, что хочет то делает назависимо от частоты чтения температуры, завышает и всё, хоть тресни

ставил разную разрядность ничего не даёт
Добавлено: Чт ноя 05, 2009 18:59:31
sachok
Сегодня весь день промучался с завышением показаний датчика. Pull up резистор поставил 50кОм

и тоже ничего не дало (хотя показания считываются). Такое впечетление что датчик нагревается от того, что на него подано напряжение питания (утром как только встал пришел и включил термометр и удивился он показал правильную температуру но не долго это было, через несколько секунд показания поплыли вверх

) пробовал подавать питание на датчик с порта МК только на время чтения температуры, а после чтения сразу снимать питание ......... и это не помогло

что ёщё может быть, покупать новый датчик нету желания...
Добавлено: Чт ноя 05, 2009 19:14:17
ARV
sachok писал(а):Такое впечетление что датчик нагревается от того, что на него подано напряжение питания
это не впечатление, а суровая реальность. саморазогрев - явление известное и давно описанное в документации на этот датчик. чтобы уменьшить погрешность от саморазогрева, можно попытаться снизить напряжение питания до минимального, при котором еще обеспечивается надежная работа, но правильнее будет подавать питание только на время очередного замера, т.е. подал питание, измерил, отключил питание. в этом случае погрешности не будет вообще.
Добавлено: Чт ноя 05, 2009 19:28:05
sachok
Я сейчас так и делаю, подал питание, считал температуру, снял питание, и 5 секунд спокойствия. Может попробую снизить напряжения питания но так само буду подавать его только на время чтения температуры.
Добавлено: Чт ноя 05, 2009 20:39:21
Pooher
А датчик подключён по 3-х проводной схеме я так понимаю?
Добавлено: Чт ноя 05, 2009 20:54:57
sachok
Да, 1-минус, 2-подтянут на +5 резистором 50кОм (и подключен к МК), на 3 вывод сейчас подаю питание через 4 диода 1n4148 с порта МК только на время измерения температуры. Сейчас уже белее менее работает, но всёравно не так как бы хотелось но лучше чем было.
Добавлено: Чт ноя 05, 2009 20:58:55
Pooher
А по паразитному питанию пробовали? Уменя такой проблемы никогда небыло, но я всегда использую паразитное питание, без подачи в линию жёсткого плюса на время приобразования, просто пуллап на 750 Ом.
Добавлено: Вт ноя 24, 2009 12:58:12
sheva_s
Подскажите датчик ds18b20 с завода настроен на какое разрешение ? Если я его перенастрою на другое разрешение сохраняються ли эти настройки в датчике после отключения питания, или стают на заводские. (может глупый вопрос просто хочу как можно больше упростить программу избавиться от настройки датчика)