Всё по DS18(B/S)20.
Re: Всё по DS18(B/S)20.
А кто что-нибудь может сказать про DS1822? С ней может попроще работать,чем с 18B20?
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Всё по DS18(B/S)20.
Что значит "попроще" ? В чём возникли сложности ?
Что у 22, что у 20 - 1-Wire.
Что у 22, что у 20 - 1-Wire.
Re: Всё по DS18(B/S)20.
В общем не пошла стандартная библиотека в CVAVR. И так как в термостате нужен только один датчик, то сделал так: Всё вроде бы работает индикаторы не мерцают никаких 9999 не проскакивает.
Индикация динамическая, кнопки настроек 4шт. работают по прерыванию таймера. Буду гонять и смотреть.
Не знаю на сколько всё правильно сделал, возможно всё не правильно, но в железе вроде бы всё стабильно.
{
//////////////////////////////// замер температуры //////////////////////////////////////////
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
Индикация динамическая, кнопки настроек 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.
Вадиматоричик писал(а):в отдельную тему.
Здорово. Обычно после этого ещё дают ссылку на тему.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
-
Вадиматоричик
- Грызет канифоль
- Сообщения: 299
- Зарегистрирован: Пн май 16, 2011 10:54:32
- Откуда: Красноярск
Re: Всё по DS18(B/S)20.
Да, прошу прощения
. Вот ссылка с готовым "решением на скорую руку" http://radiokot.ru/forum/viewtopic.php?f=61&t=98826.
Все можно сделать, было бы желание!
Re: Всё по DS18(B/S)20.
Подскажите, какие есть идеи.
Есть DS1820, подключил к атмеге16, вывожу на дисплей.
Только при комнатной температуре датчик показывае минус 33 градуса. Греешь пальцами - показыает минус 27.5, если греть зажигалкой осторожно - то уходит выше нуля температура. В чем может быть проблема?
Строка вывода из учебника
если надо, могу показать остальной код но там все дефолтно. Брак? Другие не пробовал подцеплять еще
Есть DS1820, подключил к атмеге16, вывожу на дисплей.
Только при комнатной температуре датчик показывае минус 33 градуса. Греешь пальцами - показыает минус 27.5, если греть зажигалкой осторожно - то уходит выше нуля температура. В чем может быть проблема?
Строка вывода из учебника
sprintf(lcdbuf,"Temp=%-i.%-uC",temp/10, abs(temp%10));
если надо, могу показать остальной код но там все дефолтно. Брак? Другие не пробовал подцеплять еще
Re: Всё по DS18(B/S)20.
Короче,вот состряпал прогу термометра для 2х датчиков с выводом на два 7-мисегментника.Индикация нормальная,но
при отсутствии датчиков индикаторы показывают -15.Почему,понять не могу? И может кто-нить знает,как можно
сделать вывод десятых долей градуса? Применена мега16. Хотел сначала на меге8 сделать,но побоялся по 2 раз-
ряда на 1 вывод вешать а ключи на транзюках было лень делать.Пришлось лупить из гаубицы по мухам....
при отсутствии датчиков индикаторы показывают -15.Почему,понять не могу? И может кто-нить знает,как можно
сделать вывод десятых долей градуса? Применена мега16. Хотел сначала на меге8 сделать,но побоялся по 2 раз-
ряда на 1 вывод вешать а ключи на транзюках было лень делать.Пришлось лупить из гаубицы по мухам....
- Вложения
-
- 2DS+Mega16.rar
- (86.31 КБ) 209 скачиваний
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Всё по DS18(B/S)20.
eduardo писал(а):Почему,понять не могу?
Видимо, "111111111111111111111111" в отсутствие датчика воспринимается как число в доп. коде, и после махинаций с битами дробной части и/или знака получается "11111111111111110000". Количество "1" примерное.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Всё по DS18(B/S)20.
Если датчика нет, то 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.
Cпасибо,замечательно,но к сожалению я не знаю как работать с типом float... 
К примеру:
int temp;
w1_write(0x50); // читать младший байт
temp=ds18b20_temperature(&rom_code[0][0]);
w1_write(0x05); //читать старший байт
temp=ds18b20_temperature(&rom_code[0][0]);
А как дробную часть выделить?

К примеру:
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.
eduardo писал(а):А как дробную часть выделить?
Побитное И по маске с байтом, в котором единицы в дробной части, конкретно для 18b20 LS байт содержит дробную часть в младших четырех битах, т.е. байт маски 0x0F. Аналогично можно определить знак - побитное И старшего MS байта температуры c байтом, в котором единичка только в старшем разряде - 0x80.
Re: Всё по DS18(B/S)20.
Если что глянь как я сделал...eduardo писал(а):И может кто-нить знает,как можно сделать вывод десятых долей градуса?
http://asis-kbr.ru/forum/viewtopic.php?f=11&t=160
Re: Всё по DS18(B/S)20.
eduardo писал(а):...как можно сделать вывод десятых долей градуса?...
из родного даташита, можно узнать как сканировать датчик с повышенной разрядностью. для данного семейства - до 0,0625.
для другого - можно и до 0,01.
собственно ничего сложного - читай и делай...
удачи вам
(круглый)
Re: Всё по DS18(B/S)20.
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 град)
Это я знаю,а дальше как? Деление? Остаток от деления?
........_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.
eduardo
1)Деление, остаток от деления.
2)Арифметика с фиксированной точкой(например T*10).
3) ds18b20_temperature написать самостоятельно, прочитать результат, отмасштабировать битовыми операциями.
4)Удобный, но жирный printf
1)Деление, остаток от деления.
2)Арифметика с фиксированной точкой(например T*10).
3) ds18b20_temperature написать самостоятельно, прочитать результат, отмасштабировать битовыми операциями.
4)Удобный, но жирный printf
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Всё по DS18(B/S)20.
Вся проблема в использовании каких-то сторонних недобиблиотек, и от незнания их работы. 100500-ый раз совет - разберитесь с протоколом 1-Wire, потом покурите даташит на датчик и сделайте всё самостоятельно. Ничего там сложного нет - обычное ногодрыганье с задержками.eduardo писал(а):Почему,понять не могу?
Re: Всё по DS18(B/S)20.
Аlex писал(а):Вся проблема в использовании каких-то сторонних недобиблиотек, и от незнания их работы. 100500-ый раз совет - разберитесь с протоколом 1-Wire, потом покурите даташит на датчик и сделайте всё самостоятельно. Ничего там сложного нет - обычное ногодрыганье с задержками.eduardo писал(а):Почему,понять не могу?
Да только я не знаю как это делать.... Как например сделать на Си,чтобы контроллер установил шину в низкое состояние на
какой-либо период времени?
Re: Всё по DS18(B/S)20.
shads писал(а):Если что глянь как я сделал...eduardo писал(а):И может кто-нить знает,как можно сделать вывод десятых долей градуса?
http://asis-kbr.ru/forum/viewtopic.php?f=11&t=160
Спасибо,писать код Си я кое-как могу,но читать,уж не обессудьте, чужие коды не умею.
Re: Всё по DS18(B/S)20.
Аналогичноeduardo писал(а):Спасибо,писать код Си я кое-как могу,но читать,уж не обессудьте, чужие коды не умею.
Мне всегда легче самому написать с нуля, чем разбираться в чужой писанине...


