Страница 32 из 59

Re: Всё по DS18(B/S)20.

Добавлено: Чт ноя 28, 2013 02:00:16
eduardo
А кто что-нибудь может сказать про DS1822? С ней может попроще работать,чем с 18B20?

Re: Всё по DS18(B/S)20.

Добавлено: Чт ноя 28, 2013 09:00:42
Аlex
Что значит "попроще" ? В чём возникли сложности ?
Что у 22, что у 20 - 1-Wire.

Re: Всё по DS18(B/S)20.

Добавлено: Сб ноя 30, 2013 00:47:37
dimmar
В общем не пошла стандартная библиотека в CVAVR. И так как в термостате нужен только один датчик, то сделал так: Всё вроде бы работает индикаторы не мерцают никаких 9999 не проскакивает.
Индикация динамическая, кнопки настроек 4шт. работают по прерыванию таймера. Буду гонять и смотреть.
Не знаю на сколько всё правильно сделал, возможно всё не правильно, но в железе вроде бы всё стабильно.
Спойлерwhile (1)
{

//////////////////////////////// замер температуры //////////////////////////////////////////

if (flag==30){ // замер t по таймеру 0
w1_init();
w1_write(0xcc);
w1_write(0x44);
if (z==1){
delay_ms(800); // задержка вводится только 1 раз после включения питания
}
w1_init();
w1_write(0xcc);
w1_write(0xbe);
temper=w1_read(); //формирование полученного значения температуры
temper=((w1_read())<<8)+temper;
temper=temper/16; // плюсовая температура с датчика приходит умноженная на 16, поэтому делим на 16

flag=0; // обнуляем переменную flag
z=3;
c=temper; // присваиваем переменной с значение переменной temper

if (temper<0){ // если температура меньше 0 то -
temper=0.0-temper; // преобразуем в понятный вид
}

display1=temper; // присваиваем переменной display значение переменной temper для вывода на индикатор
b++;
}

//////////////////////////////// управление нагрузкой

if (temper>=display){ // если температура достигнет заданной термостатом
PORTC.5=0; // выключить нагрузку
}
if ((temper<termdown)&(b==2)){ // если температура достигнет нижнего значения гистерезиса
PORTC.5=1; // включить нагрузку
}
b=1;
termdown=display-m+1; // переменная termdown нижний предел термостата, равен разности term и m

Re: Всё по DS18(B/S)20.

Добавлено: Чт янв 02, 2014 15:53:00
Вадиматоричик
Перенес свой вопрос по поводу ассемблерной реализации интерфейса Wire1 в отдельную тему.

Re: Всё по DS18(B/S)20.

Добавлено: Чт янв 09, 2014 09:56:08
Gudd-Head
Вадиматоричик писал(а):в отдельную тему.
Здорово. Обычно после этого ещё дают ссылку на тему.

Re: Всё по DS18(B/S)20.

Добавлено: Ср янв 29, 2014 15:08:14
Вадиматоричик
Да, прошу прощения :)) . Вот ссылка с готовым "решением на скорую руку" http://radiokot.ru/forum/viewtopic.php?f=61&t=98826.

Re: Всё по DS18(B/S)20.

Добавлено: Ср фев 05, 2014 17:36:42
Gordon011
Подскажите, какие есть идеи.
Есть DS1820, подключил к атмеге16, вывожу на дисплей.
Только при комнатной температуре датчик показывае минус 33 градуса. Греешь пальцами - показыает минус 27.5, если греть зажигалкой осторожно - то уходит выше нуля температура. В чем может быть проблема?

Строка вывода из учебника
sprintf(lcdbuf,"Temp=%-i.%-uC",temp/10, abs(temp%10));
если надо, могу показать остальной код но там все дефолтно. Брак? Другие не пробовал подцеплять еще

Re: Всё по DS18(B/S)20.

Добавлено: Вт апр 29, 2014 20:47:34
eduardo
Короче,вот состряпал прогу термометра для 2х датчиков с выводом на два 7-мисегментника.Индикация нормальная,но
при отсутствии датчиков индикаторы показывают -15.Почему,понять не могу? И может кто-нить знает,как можно
сделать вывод десятых долей градуса? Применена мега16. Хотел сначала на меге8 сделать,но побоялся по 2 раз-
ряда на 1 вывод вешать а ключи на транзюках было лень делать.Пришлось лупить из гаубицы по мухам....

Re: Всё по DS18(B/S)20.

Добавлено: Ср апр 30, 2014 10:08:39
Gudd-Head
eduardo писал(а):Почему,понять не могу?
Видимо, "111111111111111111111111" в отсутствие датчика воспринимается как число в доп. коде, и после махинаций с битами дробной части и/или знака получается "11111111111111110000". Количество "1" примерное.

Re: Всё по DS18(B/S)20.

Добавлено: Ср апр 30, 2014 13:40:44
a_skr
Если датчика нет, то ds18b20_temperature(&rom_code[0][0]) вернет -9999, что в 16-ричном целочисленном виде есть D8F1, а так, как переменная temp1 - типа unsigned char (вот тут и ошибка), то в нее попадет F1 - что соответствует -15 в знаковом представлении. И, вообще-то, ds18b20_temperature(&rom_code[0][0]) возвращает float (это к тому, что можно десятые доли спокойно использовать).

Re: Всё по DS18(B/S)20.

Добавлено: Ср апр 30, 2014 22:58:08
eduardo
Cпасибо,замечательно,но к сожалению я не знаю как работать с типом float... :dont_know:

К примеру:
int temp;

w1_write(0x50); // читать младший байт
temp=ds18b20_temperature(&rom_code[0][0]);

w1_write(0x05); //читать старший байт
temp=ds18b20_temperature(&rom_code[0][0]);

А как дробную часть выделить?

Re: Всё по DS18(B/S)20.

Добавлено: Чт май 01, 2014 06:53:59
Halex
eduardo писал(а):А как дробную часть выделить?
Побитное И по маске с байтом, в котором единицы в дробной части, конкретно для 18b20 LS байт содержит дробную часть в младших четырех битах, т.е. байт маски 0x0F. Аналогично можно определить знак - побитное И старшего MS байта температуры c байтом, в котором единичка только в старшем разряде - 0x80.

Re: Всё по DS18(B/S)20.

Добавлено: Чт май 01, 2014 13:36:03
shads
eduardo писал(а):И может кто-нить знает,как можно сделать вывод десятых долей градуса?
Если что глянь как я сделал...
http://asis-kbr.ru/forum/viewtopic.php?f=11&t=160

Re: Всё по DS18(B/S)20.

Добавлено: Сб май 03, 2014 03:47:37
kolobok0
eduardo писал(а):...как можно сделать вывод десятых долей градуса?...
из родного даташита, можно узнать как сканировать датчик с повышенной разрядностью. для данного семейства - до 0,0625.
для другого - можно и до 0,01.

собственно ничего сложного - читай и делай...
удачи вам
(круглый)

Re: Всё по DS18(B/S)20.

Добавлено: Вс май 04, 2014 02:34:46
eduardo
ds18b20_init(0,20,30,DS18B20_9BIT_RES)---9битное разрешение(точность 0,5 град.)
........_10_.......................0,25
........_11_.......................0,125
ds18b20_init(0,20,30,DS18B20_12BIT_RES)---12битное разрешение(точность0,0625 град)

Это я знаю,а дальше как? Деление? Остаток от деления?

Re: Всё по DS18(B/S)20.

Добавлено: Вс май 04, 2014 10:01:44
uk8amk
eduardo
1)Деление, остаток от деления.
2)Арифметика с фиксированной точкой(например T*10).
3) ds18b20_temperature написать самостоятельно, прочитать результат, отмасштабировать битовыми операциями.
4)Удобный, но жирный printf

Re: Всё по DS18(B/S)20.

Добавлено: Вс май 04, 2014 10:44:55
Аlex
eduardo писал(а):Почему,понять не могу?
Вся проблема в использовании каких-то сторонних недобиблиотек, и от незнания их работы. 100500-ый раз совет - разберитесь с протоколом 1-Wire, потом покурите даташит на датчик и сделайте всё самостоятельно. Ничего там сложного нет - обычное ногодрыганье с задержками.

Re: Всё по DS18(B/S)20.

Добавлено: Вт май 06, 2014 01:24:18
eduardo
Аlex писал(а):
eduardo писал(а):Почему,понять не могу?
Вся проблема в использовании каких-то сторонних недобиблиотек, и от незнания их работы. 100500-ый раз совет - разберитесь с протоколом 1-Wire, потом покурите даташит на датчик и сделайте всё самостоятельно. Ничего там сложного нет - обычное ногодрыганье с задержками.


Да только я не знаю как это делать.... Как например сделать на Си,чтобы контроллер установил шину в низкое состояние на
какой-либо период времени?

Re: Всё по DS18(B/S)20.

Добавлено: Вт май 06, 2014 01:29:12
eduardo
shads писал(а):
eduardo писал(а):И может кто-нить знает,как можно сделать вывод десятых долей градуса?
Если что глянь как я сделал...
http://asis-kbr.ru/forum/viewtopic.php?f=11&t=160

Спасибо,писать код Си я кое-как могу,но читать,уж не обессудьте, чужие коды не умею. :)

Re: Всё по DS18(B/S)20.

Добавлено: Вт май 06, 2014 22:20:03
shads
eduardo писал(а):Спасибо,писать код Си я кое-как могу,но читать,уж не обессудьте, чужие коды не умею. :)
Аналогично :).....
Мне всегда легче самому написать с нуля, чем разбираться в чужой писанине...