sheva_s писал(а):а потом вычитал в книге по ПИКам описание работы датчика температуры где написано что когда приходит отрицательная температура с датчика её нужно проинвертировать и прибавить 1 получим число для вывода. Вот тогда и разобрался с вашим кодом.
господи, ну вы ведь на Си пишите - зачем все это?! я же написал, как делать - никаких инверсий, никаких суммирований...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
угу, согласен, дал глупый совет, недосмотрел, лишние телодвижения.
Заявленное int temp по умолчанию для компиляторов Си считается как signed int temp, а беззнаковое нужно объявлять дополнительно
(unsigned int).
В данном случае после чтения
temp=ds18b20_temperature(&ds18b20_rom_codes[0][0]);
//#asm("sei")
minus=0;
if (temp<0) minus=1;
ARV извените я несмог разобраться в том что вы написали я только изучаю язык Си , после того как определили что у нас отрицательная температура и установили знак , у меня невыходило вывести цифры на экран без того что бы их проинвертировать как в вашем случае мне сделать ? Код программы я вылаживал выше подскажите пожалуста
повторять одно и то же мне недосуг - смотрите или по форуму, или на моем сайте в разделе для начинающих - я рассказывал о выводе чисел и кое-чем другом.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Здравствуйте!
Повесил схему с двумя ds18b20 (3-х проводная, 2 датчика параллельно) на 5 вольт от USB компьютера и заметил что один показывает более стабильно, а второй может завышать до 1 град относительно первого. Если комп выключен, то второй начинает занижать относительно первого до 2-х градусов. Повесил паралельно питанию 470 мкФ, температура на втором выросла на 3 градуса!!! Подключив к аккумуляторам разница между двумя термометрами 0,1 град., очень редко 0,2. Вот такой экземпляр попался...
ЗЫ Все это проделовалось расположив два датчика рядом и замотав их в пенопласт. Опрос обоих датчиков раз в 3 сек одной и той же процедурой: 1-я сек запустить преобразования для всех, 2-я сек прочитать первый, 3-я - второй.
ЗЫЫ Может кто сталкивался с таким? Какой шанс купить другой датчик и нарваться на такой же глючный?
Питание от компьютера лучше не использовать, а насчет точности
в даташите ясно написано точность ±0.5°C –10°C to 85°C
а в диапазоне –55°C to +125°C еще хуже.
Так думаю, что на экран выводить можно и 0,0625 °, а верить
только целым градусам.
Использую паразитное питание, при этом во время преобразования температуры я просто включаю "1" на ноге Atmega8L там где подключен датчик (может лучше внешний кмоп?), проблема в следующем: датчик периодически выдаёт 85 градусов, когда температура меньше минус 8 - минус 14 градусов просто постоянно горит 85, при этом проверяется CRC, она сходится, то бишь он шлёт это "осознанно". Что значат эти загадочные 85 градусов? пробовал немного изменять задержки (сам всё писал на asm и все они строго в пределах заданных в datasheet), добился того что датчик стал пореже выдавать 85 (хотябы перестал в положительной температуре). Опробовал несколько датчиков все выдают периодически 85 градусов какие то чаще, какие то реже, без паразитного питания всё окей, только иногда CRC не сходится (длина провода 1 метр), кстати на сколько часто у Вас не сходится CRC? Даже при моделировании в proteus иногда не сходится CRC.
Опытным путём выяснил, что проблема у меня с передачей команды в устройство скорее всего, и чем длиннее линия тем меньше вероятность успешной передачи. Взял линию 10 метров (телефонный шнур) - постоянно принимаю 85, то есть чтение проходит нормально, CRC без ошибок, похоже команда передаётся в датчик неправильно. Вот кусок кода передачи, подскажите где здесь косяк?
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.....
эт именно то чего я так и не понял, подозревал что тут пипец и будет....и оказалось таки что есть.....не работает с минусовыми температурами этот фокус....
П.С, А мой монстровитый и дурацкий запутанный работает учел все
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
svamoscow писал(а):Использую паразитное питание, при этом во время преобразования температуры я просто включаю "1" на ноге Atmega8L там где подключен датчик (может лучше внешний кмоп?), проблема в следующем: датчик периодически выдаёт 85 градусов, когда температура меньше минус 8 - минус 14 градусов просто постоянно горит 85, при этом проверяется CRC, она сходится, то бишь он шлёт это "осознанно". Что значат эти загадочные 85 градусов? пробовал немного изменять задержки (сам всё писал на asm и все они строго в пределах заданных в datasheet), добился того что датчик стал пореже выдавать 85 (хотябы перестал в положительной температуре). Опробовал несколько датчиков все выдают периодически 85 градусов какие то чаще, какие то реже, без паразитного питания всё окей, только иногда CRC не сходится (длина провода 1 метр), кстати на сколько часто у Вас не сходится CRC? Даже при моделировании в proteus иногда не сходится CRC.
85 это ошибка передачи команды!!! Кстати аналогичный глюк будет если вы его нагреете дл +100 даже рядом с мк
уменьшите до 512 Ом подтягивающий резюк! и будет вам счастье - у меня линия 120 метров 4 датчика в - 27 работают исправно раз в пол секунды
anco писал(а):
ЗЫЫ Может кто сталкивался с таким? Какой шанс купить другой датчик и нарваться на такой же глючный?
а шанс велик.....мне техасовец сказал что у нас процент продажи отбракованных изделий выше 75 процентов(украина)да я и сам в этом убедился! То что приходило семплами и то что я покупал на радиорынке....такое ощущение что это разные приборы разных фирм и с разной внутренней глюкофобией
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Значит не у меня одного такие датчики, что хочет то делает назависимо от частоты чтения температуры, завышает и всё, хоть тресни ставил разную разрядность ничего не даёт
Сегодня весь день промучался с завышением показаний датчика. Pull up резистор поставил 50кОм и тоже ничего не дало (хотя показания считываются). Такое впечетление что датчик нагревается от того, что на него подано напряжение питания (утром как только встал пришел и включил термометр и удивился он показал правильную температуру но не долго это было, через несколько секунд показания поплыли вверх ) пробовал подавать питание на датчик с порта МК только на время чтения температуры, а после чтения сразу снимать питание ......... и это не помогло что ёщё может быть, покупать новый датчик нету желания...
sachok писал(а):Такое впечетление что датчик нагревается от того, что на него подано напряжение питания
это не впечатление, а суровая реальность. саморазогрев - явление известное и давно описанное в документации на этот датчик. чтобы уменьшить погрешность от саморазогрева, можно попытаться снизить напряжение питания до минимального, при котором еще обеспечивается надежная работа, но правильнее будет подавать питание только на время очередного замера, т.е. подал питание, измерил, отключил питание. в этом случае погрешности не будет вообще.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Я сейчас так и делаю, подал питание, считал температуру, снял питание, и 5 секунд спокойствия. Может попробую снизить напряжения питания но так само буду подавать его только на время чтения температуры.
А датчик подключён по 3-х проводной схеме я так понимаю?
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Да, 1-минус, 2-подтянут на +5 резистором 50кОм (и подключен к МК), на 3 вывод сейчас подаю питание через 4 диода 1n4148 с порта МК только на время измерения температуры. Сейчас уже белее менее работает, но всёравно не так как бы хотелось но лучше чем было.
А по паразитному питанию пробовали? Уменя такой проблемы никогда небыло, но я всегда использую паразитное питание, без подачи в линию жёсткого плюса на время приобразования, просто пуллап на 750 Ом.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Подскажите датчик ds18b20 с завода настроен на какое разрешение ? Если я его перенастрою на другое разрешение сохраняються ли эти настройки в датчике после отключения питания, или стают на заводские. (может глупый вопрос просто хочу как можно больше упростить программу избавиться от настройки датчика)