господи, ну вы ведь на Си пишите - зачем все это?! я же написал, как делать - никаких инверсий, никаких суммирований...sheva_s писал(а):а потом вычитал в книге по ПИКам описание работы датчика температуры где написано что когда приходит отрицательная температура с датчика её нужно проинвертировать и прибавить 1 получим число для вывода. Вот тогда и разобрался с вашим кодом.
Вопросы по работе с термометрами DS18B20
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
угу, согласен, дал глупый совет, недосмотрел, лишние телодвижения.
Заявленное int temp по умолчанию для компиляторов Си считается как signed int temp, а беззнаковое нужно объявлять дополнительно
(unsigned int).
В данном случае после чтения
temp=ds18b20_temperature(&ds18b20_rom_codes[0][0]);
//#asm("sei")
minus=0;
if (temp<0) minus=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;
- sheva_s
- Грызет канифоль
- Сообщения: 256
- Зарегистрирован: Пт апр 27, 2007 14:32:48
- Откуда: Украина Кривой Рог
- Контактная информация:
ARV извените я несмог разобраться в том что вы написали я только изучаю язык Си , после того как определили что у нас отрицательная температура и установили знак , у меня невыходило вывести цифры на экран без того что бы их проинвертировать как в вашем случае мне сделать ? Код программы я вылаживал выше подскажите пожалуста 
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
повторять одно и то же мне недосуг - смотрите или по форуму, или на моем сайте в разделе для начинающих - я рассказывал о выводе чисел и кое-чем другом.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Требования к питанию
Здравствуйте!
Повесил схему с двумя ds18b20 (3-х проводная, 2 датчика параллельно) на 5 вольт от USB компьютера и заметил что один показывает более стабильно, а второй может завышать до 1 град относительно первого. Если комп выключен, то второй начинает занижать относительно первого до 2-х градусов. Повесил паралельно питанию 470 мкФ, температура на втором выросла на 3 градуса!!! Подключив к аккумуляторам разница между двумя термометрами 0,1 град., очень редко 0,2. Вот такой экземпляр попался...
ЗЫ Все это проделовалось расположив два датчика рядом и замотав их в пенопласт. Опрос обоих датчиков раз в 3 сек одной и той же процедурой: 1-я сек запустить преобразования для всех, 2-я сек прочитать первый, 3-я - второй.
ЗЫЫ Может кто сталкивался с таким? Какой шанс купить другой датчик и нарваться на такой же глючный?
Повесил схему с двумя ds18b20 (3-х проводная, 2 датчика параллельно) на 5 вольт от USB компьютера и заметил что один показывает более стабильно, а второй может завышать до 1 град относительно первого. Если комп выключен, то второй начинает занижать относительно первого до 2-х градусов. Повесил паралельно питанию 470 мкФ, температура на втором выросла на 3 градуса!!! Подключив к аккумуляторам разница между двумя термометрами 0,1 град., очень редко 0,2. Вот такой экземпляр попался...
ЗЫ Все это проделовалось расположив два датчика рядом и замотав их в пенопласт. Опрос обоих датчиков раз в 3 сек одной и той же процедурой: 1-я сек запустить преобразования для всех, 2-я сек прочитать первый, 3-я - второй.
ЗЫЫ Может кто сталкивался с таким? Какой шанс купить другой датчик и нарваться на такой же глючный?
- Реклама
Использую паразитное питание, при этом во время преобразования температуры я просто включаю "1" на ноге Atmega8L там где подключен датчик (может лучше внешний кмоп?), проблема в следующем: датчик периодически выдаёт 85 градусов, когда температура меньше минус 8 - минус 14 градусов просто постоянно горит 85, при этом проверяется CRC, она сходится, то бишь он шлёт это "осознанно". Что значат эти загадочные 85 градусов? пробовал немного изменять задержки (сам всё писал на asm и все они строго в пределах заданных в datasheet), добился того что датчик стал пореже выдавать 85 (хотябы перестал в положительной температуре). Опробовал несколько датчиков все выдают периодически 85 градусов какие то чаще, какие то реже, без паразитного питания всё окей, только иногда CRC не сходится (длина провода 1 метр), кстати на сколько часто у Вас не сходится CRC? Даже при моделировании в proteus иногда не сходится CRC.
Опытным путём выяснил, что проблема у меня с передачей команды в устройство скорее всего, и чем длиннее линия тем меньше вероятность успешной передачи. Взял линию 10 метров (телефонный шнур) - постоянно принимаю 85, то есть чтение проходит нормально, CRC без ошибок, похоже команда передаётся в датчик неправильно. Вот кусок кода передачи, подскажите где здесь косяк?
Предварительно всегда запускается процедура инициализации где посылается RESET
Поэтому подтягиваю линию на ноль таким образом:
А отпускаю таким:
PS админам проблемы со вставкой значков больше меньше, пришлось их на слова заменять, съелся кусок текста.
Код: Выделить всё
;Запись в шину
;*****************************************************************
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_BNPS админам проблемы со вставкой значков больше меньше, пришлось их на слова заменять, съелся кусок текста.
Вот куда вкралась проблема!!! Столько мучений было)
Как выяснилось нужно обязательно делать вот так:
То есть сначала включать на порту 1, а затем уже делать его выходом!
Код: Выделить всё
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
- Откуда: Одесса
- Контактная информация:
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
- Откуда: Одесса
- Контактная информация:
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: Требования к питанию
anco писал(а):ЗЫЫ Может кто сталкивался с таким? Какой шанс купить другой датчик и нарваться на такой же глючный?
а шанс велик.....мне техасовец сказал что у нас процент продажи отбракованных изделий выше 75 процентов(украина)да я и сам в этом убедился! То что приходило семплами и то что я покупал на радиорынке....такое ощущение что это разные приборы разных фирм и с разной внутренней глюкофобией
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
- sachok
- Опытный кот
- Сообщения: 849
- Зарегистрирован: Сб янв 05, 2008 11:05:15
- Откуда: Україна м.Луцьк
- Контактная информация:
Сегодня весь день промучался с завышением показаний датчика. Pull up резистор поставил 50кОм
и тоже ничего не дало (хотя показания считываются). Такое впечетление что датчик нагревается от того, что на него подано напряжение питания (утром как только встал пришел и включил термометр и удивился он показал правильную температуру но не долго это было, через несколько секунд показания поплыли вверх
) пробовал подавать питание на датчик с порта МК только на время чтения температуры, а после чтения сразу снимать питание ......... и это не помогло
что ёщё может быть, покупать новый датчик нету желания...
Я не Сашок!!!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
это не впечатление, а суровая реальность. саморазогрев - явление известное и давно описанное в документации на этот датчик. чтобы уменьшить погрешность от саморазогрева, можно попытаться снизить напряжение питания до минимального, при котором еще обеспечивается надежная работа, но правильнее будет подавать питание только на время очередного замера, т.е. подал питание, измерил, отключил питание. в этом случае погрешности не будет вообще.sachok писал(а):Такое впечетление что датчик нагревается от того, что на него подано напряжение питания
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
А по паразитному питанию пробовали? Уменя такой проблемы никогда небыло, но я всегда использую паразитное питание, без подачи в линию жёсткого плюса на время приобразования, просто пуллап на 750 Ом.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
- sheva_s
- Грызет канифоль
- Сообщения: 256
- Зарегистрирован: Пт апр 27, 2007 14:32:48
- Откуда: Украина Кривой Рог
- Контактная информация:
Подскажите датчик ds18b20 с завода настроен на какое разрешение ? Если я его перенастрою на другое разрешение сохраняються ли эти настройки в датчике после отключения питания, или стают на заводские. (может глупый вопрос просто хочу как можно больше упростить программу избавиться от настройки датчика)


