Вопросы по работе с термометрами DS18B20

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

sheva_s писал(а):а потом вычитал в книге по ПИКам описание работы датчика температуры где написано что когда приходит отрицательная температура с датчика её нужно проинвертировать и прибавить 1 получим число для вывода. Вот тогда и разобрался с вашим кодом. :))
господи, ну вы ведь на Си пишите - зачем все это?! я же написал, как делать - никаких инверсий, никаких суммирований...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение 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;
Реклама
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

ARV извените я несмог разобраться в том что вы написали я только изучаю язык Си , после того как определили что у нас отрицательная температура и установили знак , у меня невыходило вывести цифры на экран без того что бы их проинвертировать как в вашем случае мне сделать ? Код программы я вылаживал выше подскажите пожалуста :)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
anco
Открыл глаза
Сообщения: 57
Зарегистрирован: Вс фев 15, 2009 21:12:36

Требования к питанию

Сообщение anco »

Здравствуйте!
Повесил схему с двумя ds18b20 (3-х проводная, 2 датчика параллельно) на 5 вольт от USB компьютера и заметил что один показывает более стабильно, а второй может завышать до 1 град относительно первого. Если комп выключен, то второй начинает занижать относительно первого до 2-х градусов. Повесил паралельно питанию 470 мкФ, температура на втором выросла на 3 градуса!!! Подключив к аккумуляторам разница между двумя термометрами 0,1 град., очень редко 0,2. Вот такой экземпляр попался...

ЗЫ Все это проделовалось расположив два датчика рядом и замотав их в пенопласт. Опрос обоих датчиков раз в 3 сек одной и той же процедурой: 1-я сек запустить преобразования для всех, 2-я сек прочитать первый, 3-я - второй.

ЗЫЫ Может кто сталкивался с таким? Какой шанс купить другой датчик и нарваться на такой же глючный?
Реклама
VadimPa
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт окт 02, 2009 18:02:01

Сообщение VadimPa »

Питание от компьютера лучше не использовать, а насчет точности
в даташите ясно написано точность ±0.5°C –10°C to 85°C
а в диапазоне –55°C to +125°C еще хуже.
Так думаю, что на экран выводить можно и 0,0625 °, а верить
только целым градусам.
Реклама
svamoscow
Родился
Сообщения: 17
Зарегистрирован: Чт июл 31, 2008 14:30:05
Откуда: Москва

Сообщение svamoscow »

Использую паразитное питание, при этом во время преобразования температуры я просто включаю "1" на ноге Atmega8L там где подключен датчик (может лучше внешний кмоп?), проблема в следующем: датчик периодически выдаёт 85 градусов, когда температура меньше минус 8 - минус 14 градусов просто постоянно горит 85, при этом проверяется CRC, она сходится, то бишь он шлёт это "осознанно". Что значат эти загадочные 85 градусов? пробовал немного изменять задержки (сам всё писал на asm и все они строго в пределах заданных в datasheet), добился того что датчик стал пореже выдавать 85 (хотябы перестал в положительной температуре). Опробовал несколько датчиков все выдают периодически 85 градусов какие то чаще, какие то реже, без паразитного питания всё окей, только иногда CRC не сходится (длина провода 1 метр), кстати на сколько часто у Вас не сходится CRC? Даже при моделировании в proteus иногда не сходится CRC.
svamoscow
Родился
Сообщения: 17
Зарегистрирован: Чт июл 31, 2008 14:30:05
Откуда: Москва

Сообщение 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

Код: Выделить всё

   sbi W1_DDR,W1_BN
   cbi W1_PORT,W1_BN

Поэтому подтягиваю линию на ноль таким образом:

Код: Выделить всё

   sbi W1_DDR,W1_BN

А отпускаю таким:

Код: Выделить всё

   cbi W1_DDR,W1_BN


PS админам проблемы со вставкой значков больше меньше, пришлось их на слова заменять, съелся кусок текста.
svamoscow
Родился
Сообщения: 17
Зарегистрирован: Чт июл 31, 2008 14:30:05
Откуда: Москва

Сообщение 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, а затем уже делать его выходом!
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение 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.....
эт именно то чего я так и не понял, подозревал что тут пипец и будет....и оказалось таки что есть.....не работает с минусовыми температурами этот фокус....

П.С, А мой монстровитый и дурацкий запутанный работает :) учел все :)
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение 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 :)
Последний раз редактировалось clawham Вт ноя 03, 2009 10:26:57, всего редактировалось 1 раз.
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Re: Требования к питанию

Сообщение clawham »

anco писал(а):ЗЫЫ Может кто сталкивался с таким? Какой шанс купить другой датчик и нарваться на такой же глючный?


а шанс велик.....мне техасовец сказал что у нас процент продажи отбракованных изделий выше 75 процентов(украина)да я и сам в этом убедился! То что приходило семплами и то что я покупал на радиорынке....такое ощущение что это разные приборы разных фирм и с разной внутренней глюкофобией :)
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Сообщение sachok »

Значит не у меня одного такие датчики, что хочет то делает назависимо от частоты чтения температуры, завышает и всё, хоть тресни :) ставил разную разрядность ничего не даёт
Я не Сашок!!!
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Сообщение sachok »

Сегодня весь день промучался с завышением показаний датчика. Pull up резистор поставил 50кОм :shock: и тоже ничего не дало (хотя показания считываются). Такое впечетление что датчик нагревается от того, что на него подано напряжение питания (утром как только встал пришел и включил термометр и удивился он показал правильную температуру но не долго это было, через несколько секунд показания поплыли вверх :cry:) пробовал подавать питание на датчик с порта МК только на время чтения температуры, а после чтения сразу снимать питание ......... и это не помогло :cry: что ёщё может быть, покупать новый датчик нету желания...
Я не Сашок!!!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Сообщение sachok »

Я сейчас так и делаю, подал питание, считал температуру, снял питание, и 5 секунд спокойствия. Может попробую снизить напряжения питания но так само буду подавать его только на время чтения температуры.
Я не Сашок!!!
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

А датчик подключён по 3-х проводной схеме я так понимаю?
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Сообщение sachok »

Да, 1-минус, 2-подтянут на +5 резистором 50кОм (и подключен к МК), на 3 вывод сейчас подаю питание через 4 диода 1n4148 с порта МК только на время измерения температуры. Сейчас уже белее менее работает, но всёравно не так как бы хотелось но лучше чем было.
Я не Сашок!!!
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

А по паразитному питанию пробовали? Уменя такой проблемы никогда небыло, но я всегда использую паразитное питание, без подачи в линию жёсткого плюса на время приобразования, просто пуллап на 750 Ом.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

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

Вернуться в «Микроконтроллеры и ПЛИС»