Я первоначально именно так и сделал. В итоге всё время на семисегментном индикаторе отображается число 85 и не каких изменений даже если охладить или нагреть датчик.Аlex писал(а):Не нужно ничего ждать. После команды преобразования подождите 1 сек, имп. сброса, выбор датчика либо пропуск РОМ, затем читаем температуру. Всё !
Вопросы по работе с термометрами DS18B20
- Реклама
Подскажите, что за хрень? В протеусе конвертация температуры происходит мгновенно! То есть, сразу после отправки команды "Convert T", можно уже сбрасывать датчик и считывать результат. И он оказывается верным.
не замечал такого эффекта... может, версия древняя у вас? но во всяком случае протеус - это глюкавый протеус, чего от него требовать!AI_Disable писал(а):Подскажите, что за хрень? В протеусе конвертация температуры происходит мгновенно! То есть, сразу после отправки команды "Convert T", можно уже сбрасывать датчик и считывать результат. И он оказывается верным.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Опять datasheet (как много там интересногоroma писал(а):В итоге всё время на семисегментном индикаторе отображается число 85 и не каких изменений даже если охладить или нагреть датчик.
*The power-on reset value of the temperature register is +85°C.
Следовательно датчик правильно возвращает начальное значение по причинам:
1. не получил команду convert t
2. был сброшен по питанию (слишком длинный init)
Как питаете датчик?
2: Alex datasheet лучше читать "родные" с сайта производителя, т.к. при переводе многое изменяется до неузнаваемости....
- Реклама
Датчик питаю от внешнего источника. А что означает сброс по питанию слишком длинный init?md5sum писал(а):roma писал(а):
Как питаете датчик?
2: Alex datasheet лучше читать "родные" с сайта производителя, т.к. при переводе многое изменяется до неузнаваемости....
Когда в AVR studio отлаживаю програмулину то вижу что всё передаётся правильно.
а как можно в AVR Studio видеть что передается правильно?roma писал(а): Когда в AVR studio отлаживаю програмулину то вижу что всё передаётся правильно.
При аналогичной проблеме копал именно тайминги передачи команд. Правильность удалось достоверно увидеть только логическим анализатором.
кстати, порядок бит не перепутан при передаче? тоже благополучно сел на эти грабли, недочитав как следует.
Это касается только паразитного питания....roma писал(а): А что означает сброс по питанию слишком длинный init?
есть вот такой код, датчик 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);
}
}
УРРААААА!! Товарищи коты!
Заработала!!!!!!
Чтоб другие по моим граблям не топтались,(на которых я уже МЕСЯЦА ДВА танцую!)
ОКАЗЫВАЕТСЯ тайм-слот контроллера "читать бИт" НЕ ДОЛЖЕН БЫТЬ больше микросекунды!!
В описании "Интерфейс 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 раз.
уже ответил в теме о статье. без эмоций: ваш частный случай не есть закономерность.VIY писал(а):Ох и найифался я с этой злосчастной микросекундой... Постукаюсь к автору, может добавит эту поправку...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Всё, успокоился, выспался
.. Всем спасибо..
Наконец-то можно заняться самим девайсом..
..
Я ведь ещё летом написал программу работы с интерфейсом, но тогда быстро забросил,.. так-что в сумме 3 месяца!!! Ну как-же тут без эмоций совсем уж
.
Наконец-то можно заняться самим девайсом..
Я ведь ещё летом написал программу работы с интерфейсом, но тогда быстро забросил,.. так-что в сумме 3 месяца!!! Ну как-же тут без эмоций совсем уж
Что-то не совсем понятно, в описании сказано не менее 1мкС!! Вот тоже, только вчера закончил конструкцию термостата на таком датчике, так вот просто теоретически не могу получить надежный тайм-слот менее 2мкС при частоте кварца 4мГц. Вроде все работает. Беда была со считыванием, но при длинном шлейфе и импульсной помехи с импульсного блока питания, вылечилось установкой керамического кондера на 2,2нФ 1кВ между цифровой землей и питающим минусом сети. Теперь 5м кабель от датчика и вроде сбоев нет. А сначала тоже грешил на временные интервалы и возможные косяки с подпрограммой чтения из датчика. В электронике опыт большой, а вот изучать программирование начал недавно, потребности не возникало. Можно поподробнее, что вы называете "тайм-слотом контроллера "читать бИт" НЕ ДОЛЖЕН БЫТЬ больше микросекунды!" может у себя еще что подправлю.VIY писал(а): Чтоб другие по моим граблям не топтались,(на которых я уже МЕСЯЦА ДВА танцую!)
ОКАЗЫВАЕТСЯ тайм-слот контроллера "читать бИт" НЕ ДОЛЖЕН БЫТЬ больше микросекунды!! .......
Ох и найифался я с этой злосчастной микросекундой... Постукаюсь к автору, может добавит эту поправку... нужно = 1 микросек.(и ни как не иначе!)
Нужна подправленая библиотека для КОД ВИЖЕН работы с датчиком 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; //выключаем нагреватель
};
};
}


