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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
eduardo
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

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

Сообщение eduardo »

А кто что-нибудь может сказать про DS1822? С ней может попроще работать,чем с 18B20?
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Что значит "попроще" ? В чём возникли сложности ?
Что у 22, что у 20 - 1-Wire.
Реклама
dimmar
Открыл глаза
Сообщения: 78
Зарегистрирован: Чт июл 07, 2011 14:42:13

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

Сообщение 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
Что поиск рулит знаю. Забанен во всех поисковых системах.
Вадиматоричик
Грызет канифоль
Сообщения: 299
Зарегистрирован: Пн май 16, 2011 10:54:32
Откуда: Красноярск

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

Сообщение Вадиматоричик »

Перенес свой вопрос по поводу ассемблерной реализации интерфейса Wire1 в отдельную тему.
Все можно сделать, было бы желание!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Вадиматоричик писал(а):в отдельную тему.

Здорово. Обычно после этого ещё дают ссылку на тему.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Вадиматоричик
Грызет канифоль
Сообщения: 299
Зарегистрирован: Пн май 16, 2011 10:54:32
Откуда: Красноярск

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

Сообщение Вадиматоричик »

Да, прошу прощения :)) . Вот ссылка с готовым "решением на скорую руку" http://radiokot.ru/forum/viewtopic.php?f=61&t=98826.
Все можно сделать, было бы желание!
Реклама
Gordon011
Встал на лапы
Сообщения: 131
Зарегистрирован: Пн апр 21, 2008 13:53:59

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

Сообщение Gordon011 »

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

Строка вывода из учебника
sprintf(lcdbuf,"Temp=%-i.%-uC",temp/10, abs(temp%10));


если надо, могу показать остальной код но там все дефолтно. Брак? Другие не пробовал подцеплять еще
eduardo
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

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

Сообщение eduardo »

Короче,вот состряпал прогу термометра для 2х датчиков с выводом на два 7-мисегментника.Индикация нормальная,но
при отсутствии датчиков индикаторы показывают -15.Почему,понять не могу? И может кто-нить знает,как можно
сделать вывод десятых долей градуса? Применена мега16. Хотел сначала на меге8 сделать,но побоялся по 2 раз-
ряда на 1 вывод вешать а ключи на транзюках было лень делать.Пришлось лупить из гаубицы по мухам....
Вложения
2DS+Mega16.rar
(86.31 КБ) 209 скачиваний
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

eduardo писал(а):Почему,понять не могу?

Видимо, "111111111111111111111111" в отсутствие датчика воспринимается как число в доп. коде, и после махинаций с битами дробной части и/или знака получается "11111111111111110000". Количество "1" примерное.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

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

Сообщение a_skr »

Если датчика нет, то ds18b20_temperature(&rom_code[0][0]) вернет -9999, что в 16-ричном целочисленном виде есть D8F1, а так, как переменная temp1 - типа unsigned char (вот тут и ошибка), то в нее попадет F1 - что соответствует -15 в знаковом представлении. И, вообще-то, ds18b20_temperature(&rom_code[0][0]) возвращает float (это к тому, что можно десятые доли спокойно использовать).
eduardo
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

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

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

А как дробную часть выделить?
Аватара пользователя
Halex
Грызет канифоль
Сообщения: 281
Зарегистрирован: Пт ноя 15, 2013 20:58:23

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

Сообщение Halex »

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

Побитное И по маске с байтом, в котором единицы в дробной части, конкретно для 18b20 LS байт содержит дробную часть в младших четырех битах, т.е. байт маски 0x0F. Аналогично можно определить знак - побитное И старшего MS байта температуры c байтом, в котором единичка только в старшем разряде - 0x80.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

eduardo писал(а):И может кто-нить знает,как можно сделать вывод десятых долей градуса?
Если что глянь как я сделал...
http://asis-kbr.ru/forum/viewtopic.php?f=11&t=160
kolobok0
Грызет канифоль
Сообщения: 296
Зарегистрирован: Ср дек 30, 2009 09:55:39

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

Сообщение kolobok0 »

eduardo писал(а):...как можно сделать вывод десятых долей градуса?...


из родного даташита, можно узнать как сканировать датчик с повышенной разрядностью. для данного семейства - до 0,0625.
для другого - можно и до 0,01.

собственно ничего сложного - читай и делай...
удачи вам
(круглый)
eduardo
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

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

Сообщение 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 град)

Это я знаю,а дальше как? Деление? Остаток от деления?
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

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

Сообщение uk8amk »

eduardo
1)Деление, остаток от деления.
2)Арифметика с фиксированной точкой(например T*10).
3) ds18b20_temperature написать самостоятельно, прочитать результат, отмасштабировать битовыми операциями.
4)Удобный, но жирный printf
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

eduardo писал(а):Почему,понять не могу?
Вся проблема в использовании каких-то сторонних недобиблиотек, и от незнания их работы. 100500-ый раз совет - разберитесь с протоколом 1-Wire, потом покурите даташит на датчик и сделайте всё самостоятельно. Ничего там сложного нет - обычное ногодрыганье с задержками.
eduardo
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

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

Сообщение eduardo »

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




Да только я не знаю как это делать.... Как например сделать на Си,чтобы контроллер установил шину в низкое состояние на
какой-либо период времени?
eduardo
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

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

Сообщение eduardo »

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



Спасибо,писать код Си я кое-как могу,но читать,уж не обессудьте, чужие коды не умею. :)
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

eduardo писал(а):Спасибо,писать код Си я кое-как могу,но читать,уж не обессудьте, чужие коды не умею. :)
Аналогично :).....
Мне всегда легче самому написать с нуля, чем разбираться в чужой писанине...
Ответить

Вернуться в «Периферия»