Я первоначально именно так и сделал. В итоге всё время на семисегментном индикаторе отображается число 85 и не каких изменений даже если охладить или нагреть датчик.Аlex писал(а):Не нужно ничего ждать. После команды преобразования подождите 1 сек, имп. сброса, выбор датчика либо пропуск РОМ, затем читаем температуру. Всё !
Вопросы по работе с термометрами DS18B20
re
- Реклама
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18552
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
не замечал такого эффекта... может, версия древняя у вас? но во всяком случае протеус - это глюкавый протеус, чего от него требовать!AI_Disable писал(а):Подскажите, что за хрень? В протеусе конвертация температуры происходит мгновенно! То есть, сразу после отправки команды "Convert T", можно уже сбрасывать датчик и считывать результат. И он оказывается верным.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: re
Опять datasheet (как много там интересногоroma писал(а):В итоге всё время на семисегментном индикаторе отображается число 85 и не каких изменений даже если охладить или нагреть датчик.
*The power-on reset value of the temperature register is +85°C.
Следовательно датчик правильно возвращает начальное значение по причинам:
1. не получил команду convert t
2. был сброшен по питанию (слишком длинный init)
Как питаете датчик?
2: Alex datasheet лучше читать "родные" с сайта производителя, т.к. при переводе многое изменяется до неузнаваемости....
- Реклама
Re: re
Датчик питаю от внешнего источника. А что означает сброс по питанию слишком длинный init?md5sum писал(а):roma писал(а):
Как питаете датчик?
2: Alex datasheet лучше читать "родные" с сайта производителя, т.к. при переводе многое изменяется до неузнаваемости....
Когда в AVR studio отлаживаю програмулину то вижу что всё передаётся правильно.
-
artko
- Родился
- Сообщения: 1
- Зарегистрирован: Пт дек 04, 2009 12:11:04
- Откуда: DP,UA
- Контактная информация:
Re: re
а как можно в AVR Studio видеть что передается правильно?roma писал(а): Когда в AVR studio отлаживаю програмулину то вижу что всё передаётся правильно.
При аналогичной проблеме копал именно тайминги передачи команд. Правильность удалось достоверно увидеть только логическим анализатором.
кстати, порядок бит не перепутан при передаче? тоже благополучно сел на эти грабли, недочитав как следует.
Re: re
Это касается только паразитного питания....roma писал(а): А что означает сброс по питанию слишком длинный init?
- ssvd
- Нашел транзистор. Понюхал.
- Сообщения: 167
- Зарегистрирован: Ср ноя 04, 2009 18:00:56
- Откуда: Алтайский край
- Контактная информация:
есть вот такой код, датчик ds18b20 находится в комнате, постоянно показывает температуру: 241
кто сталкивался с таким?
кто сталкивался с таким?
Код: Выделить всё
lcd_init(16);
__beep(50);
devices=w1_search(0xf0,rom_codes);
while(1){
temp=ds18b20_temperature(&rom_codes[0][0]);
if ( temp & 0x8000){
temp^=0xFFFF;
temp++;
}
sprintf(lcd_buffer,"Temp in=%i.%u\xdfC",temp,temp%1);
lcd_gotoxy(0,0);
lcd_puts(lcd_buffer);
}
}
Re: Вопросы по работе с термометрами DS18B20
УРРААААА!! Товарищи коты!
Заработала!!!!!!
Чтоб другие по моим граблям не топтались,(на которых я уже МЕСЯЦА ДВА танцую!)
ОКАЗЫВАЕТСЯ тайм-слот контроллера "читать бИт" НЕ ДОЛЖЕН БЫТЬ больше микросекунды!!
В описании "Интерфейс 1-Wire.(автор ARV)" рассказано много о том, какие широкие диапазоны у этого интерфейса, и безобидный намёк > 1 микросек.(больше микросекунды) , и то, что опрос нужно устраивать на 14-15-ой микросекунде после начала таймслота наводят на праздные размышления о написании махонькой функции, которая будет отсчитывать микросекунды, и забить на *почти микросекунду*, необходимую чтобы обратится к ней, и вернуться обратно...
Оказалось ВСЁ НЕ ТАК!.. ( > 1 микросек.(больше микросекунды) не правильно, нужно = 1 микросек.(и ни как не иначе!) )
Я очень долго не мог получить ответа от датчика.. запрашивал у своей функции "еденичку". В ответ от датчика мне сыпались лишь единички
. Как я только не корячился, (целую статью можно написать),.. в результате у меня получилась целая коллекция подпрограммок для тестирования того, что происходит на линии...
Первое, RESET PRESENCE...
Точное время PRESENCE 30 -- 140 микросекунд после RESET-а(нет там ни плаваний значения ни вариаций).
Во вторых простое опрашивание пина командой *sbic* более одного раза за один тайм-слот, каким-то странным образом сбивается результат (сперва я писал программки которые делали множество опросов на протяжении промежутка в котором нужно ловить PRESENCE(в результате получал нечто непредсказуемое(но повторяемое!). Было даже решил, что неисправен датчик). мои сомнения закончились когда я написал программку, которая запрашивала "PRESENCE" для каждого нового опроса,.. Так я и выстроил эту шкалу 30 --140 мкс.)
Второе.. Как я уже писал выше, мне не удалось получить ответных БИТов от датчика, пака тайм чтения был две микросекунды(из-за нескольких паразитных операций). НАКОНЕЦ ТО я решился заменить обращение к функции на nop-ы, сделав тайм-опрос ТОЧНО микросекундой, и ВСЁ ЗАРАБОТАЛО!
... Приспособленная мною программка для составления временной шкалы уже была прицеплена, и поэтому я вот ещё что узнал, если датчик шлёт "0", то он удерживает линию ровно до 26-ой микросекунды. При этом точность снятия еденичек и ноликов АБСОЛЮТНА, т.е. если я читаю через пол микросекунды после отпускания линии, то результат ВСЕГДА читается верно, так-же как и на 26-ой микросекунде,.. На 27-ой секунде уже идёт совершенно стабильный высокий уровень(ни единого нолика не проскальзывает!).
Ох и найифался я с этой злосчастной микросекундой... Постукаюсь к автору, может добавит эту поправку... нужно = 1 микросек.(и ни как не иначе!)
Чтоб другие по моим граблям не топтались,(на которых я уже МЕСЯЦА ДВА танцую!)
ОКАЗЫВАЕТСЯ тайм-слот контроллера "читать бИт" НЕ ДОЛЖЕН БЫТЬ больше микросекунды!!
В описании "Интерфейс 1-Wire.(автор ARV)" рассказано много о том, какие широкие диапазоны у этого интерфейса, и безобидный намёк > 1 микросек.(больше микросекунды) , и то, что опрос нужно устраивать на 14-15-ой микросекунде после начала таймслота наводят на праздные размышления о написании махонькой функции, которая будет отсчитывать микросекунды, и забить на *почти микросекунду*, необходимую чтобы обратится к ней, и вернуться обратно...
Оказалось ВСЁ НЕ ТАК!.. ( > 1 микросек.(больше микросекунды) не правильно, нужно = 1 микросек.(и ни как не иначе!) )
Я очень долго не мог получить ответа от датчика.. запрашивал у своей функции "еденичку". В ответ от датчика мне сыпались лишь единички
Первое, RESET PRESENCE...
Точное время PRESENCE 30 -- 140 микросекунд после RESET-а(нет там ни плаваний значения ни вариаций).
Во вторых простое опрашивание пина командой *sbic* более одного раза за один тайм-слот, каким-то странным образом сбивается результат (сперва я писал программки которые делали множество опросов на протяжении промежутка в котором нужно ловить PRESENCE(в результате получал нечто непредсказуемое(но повторяемое!). Было даже решил, что неисправен датчик). мои сомнения закончились когда я написал программку, которая запрашивала "PRESENCE" для каждого нового опроса,.. Так я и выстроил эту шкалу 30 --140 мкс.)
Второе.. Как я уже писал выше, мне не удалось получить ответных БИТов от датчика, пака тайм чтения был две микросекунды(из-за нескольких паразитных операций). НАКОНЕЦ ТО я решился заменить обращение к функции на nop-ы, сделав тайм-опрос ТОЧНО микросекундой, и ВСЁ ЗАРАБОТАЛО!
Ох и найифался я с этой злосчастной микросекундой... Постукаюсь к автору, может добавит эту поправку... нужно = 1 микросек.(и ни как не иначе!)
Последний раз редактировалось VIY Вт мар 23, 2010 10:18:22, всего редактировалось 1 раз.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18552
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по работе с термометрами DS18B20
уже ответил в теме о статье. без эмоций: ваш частный случай не есть закономерность.VIY писал(а):Ох и найифался я с этой злосчастной микросекундой... Постукаюсь к автору, может добавит эту поправку...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по работе с термометрами DS18B20
Всё, успокоился, выспался
.. Всем спасибо..
Наконец-то можно заняться самим девайсом..
..
Я ведь ещё летом написал программу работы с интерфейсом, но тогда быстро забросил,.. так-что в сумме 3 месяца!!! Ну как-же тут без эмоций совсем уж
.
Наконец-то можно заняться самим девайсом..
Я ведь ещё летом написал программу работы с интерфейсом, но тогда быстро забросил,.. так-что в сумме 3 месяца!!! Ну как-же тут без эмоций совсем уж
- Хатуль_мадан
- Электрический кот
- Сообщения: 1007
- Зарегистрирован: Ср мар 03, 2010 11:48:00
- Откуда: Уфа
Re: Вопросы по работе с термометрами DS18B20
Что-то не совсем понятно, в описании сказано не менее 1мкС!! Вот тоже, только вчера закончил конструкцию термостата на таком датчике, так вот просто теоретически не могу получить надежный тайм-слот менее 2мкС при частоте кварца 4мГц. Вроде все работает. Беда была со считыванием, но при длинном шлейфе и импульсной помехи с импульсного блока питания, вылечилось установкой керамического кондера на 2,2нФ 1кВ между цифровой землей и питающим минусом сети. Теперь 5м кабель от датчика и вроде сбоев нет. А сначала тоже грешил на временные интервалы и возможные косяки с подпрограммой чтения из датчика. В электронике опыт большой, а вот изучать программирование начал недавно, потребности не возникало. Можно поподробнее, что вы называете "тайм-слотом контроллера "читать бИт" НЕ ДОЛЖЕН БЫТЬ больше микросекунды!" может у себя еще что подправлю.VIY писал(а): Чтоб другие по моим граблям не топтались,(на которых я уже МЕСЯЦА ДВА танцую!)
ОКАЗЫВАЕТСЯ тайм-слот контроллера "читать бИт" НЕ ДОЛЖЕН БЫТЬ больше микросекунды!! .......
Ох и найифался я с этой злосчастной микросекундой... Постукаюсь к автору, может добавит эту поправку... нужно = 1 микросек.(и ни как не иначе!)
- sheva_s
- Грызет канифоль
- Сообщения: 256
- Зарегистрирован: Пт апр 27, 2007 14:32:48
- Откуда: Украина Кривой Рог
- Контактная информация:
Re: Вопросы по работе с термометрами DS18B20
Нужна подправленая библиотека для КОД ВИЖЕН работы с датчиком DS18B20 что бы занимала поменьше места в памяти контролера . Нужно связать ТИННИ13 и датчик DS18B20 что бы уместить программный код , стандартная библиотека не влезет . У меня была подправленая которая влазила в нужные мне размеры но после замены жесткого диска исчезла. А найти немогу . Может у когото есть поделитесь. Нужно просто сделать термостат на такой связки ТИННИ13 и датчик DS18B20 ( схема уже собрана и работала вот нужно поменять пороги температуры, а библиотеки нету.
Может кому интересно код самой программы для ТИННИ13
Может кому интересно код самой программы для ТИННИ13
Код: Выделить всё
#include <tiny13.h>
#include <delay.h>
int T;
// 1 Wire Bus functions
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=4
#endasm
#include <1wire.h>
// DS1820 Temperature Sensor functions
#include <ds18b20_.h>
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out
// State5=T State4=T State3=T State2=P State1=0 State0=0
PORTB=0x04;
DDRB=0x03;
// 1 Wire Bus initialization
w1_init();
ds18b20_init(0,0,0,DS18B20_9BIT_RES);
while (1)
{
T = ds18b20_temperature(0)/16; //запускаем измерение температуры
PORTB.0=~PORTB.0;
delay_ms(450);
if(T!=-9999){ //если нету ошибки преобразование продолжаем
if(T>=22) PORTB.1=0; //включаем нагреватель
if(T<=23) PORTB.1=1; //выключаем нагреватель
};
};
}


