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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

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

Сообщение Сериг »

Кошачьи-образные,привет! :)
помогите пожалуйста отобразить минусовую температуру вот как я делаю,но не выходит,при минусовой температуре датчик начинает выдавать показания 254 и тд...
if (( Temp_L & 0b11110000) == 0xF0){
Temp = -Temp;
Temp = (( !Temp_H & 0b00001111) << 4 ) | ( !Temp_L >> 4 );
}
else {
if ((Temp_L & 0b11110000) == 0x00) {
Temp = (( Temp_H & 0b00001111) << 4 ) | ( Temp_L >> 4 );};

};

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

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

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

Значит переменная unsigned.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

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

Сообщение uk8amk »

Сериг писал(а):Temp = (( !Temp_H & 0b00001111) << 4 ) | ( !Temp_L >> 4 );

Это что такое?
! - операция логического НЕ, результатом является TRUE( !=0 ) или FALSE( ==0 ).
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

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

Сообщение Сериг »

Аlex писал(а):Значит переменная unsigned.

Ни как нет,переменная типа signed...
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Temp_H и Temp_L , как я понял, - 2 считанных байта ?
Куда выводите переменную и как ?

Код: Выделить всё

signed int   Temp;

Temp = Temp_H<<8 + Temp_L;
Temp /=16;
.......
Тут выводим переменную Temp, в ней целое знаковое значение температуры.
.......
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

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

Сообщение Сериг »

Так точно,два байта.
Вывожу на индикатор винстаровский 2х16

Код: Выделить всё

 
unsigned char lcd_buf [16] , lcd_buf_1 [16];

{ sprintf ((char*) lcd_buf, "Teјѕepaїypa=");   //0x%X   T=%dc 
                    sprintf ((char*) lcd_buf_1, "%dc",Temp); }
        lcd_gotoxy(0, 0);
        lcd_puts(lcd_buf);
        lcd_gotoxy(12, 0);
        lcd_puts(lcd_buf_1);

а что означает "/" в строке Temp /=16; ?
спасибо!
Dmitrich_163
Родился
Сообщения: 5
Зарегистрирован: Пт апр 12, 2013 21:54:42

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

Сообщение Dmitrich_163 »

Здравствуйте, подскажите пожалуйста. Птаюсь работать с датчиком ds18b20. Использую пример из CODEVISIONAVR, а именно


Спойлер#asm
.equ __w1_port=0x1b
.equ __w1_bit=6
#endasm


#asm
.equ __lcd_port=0x15
#endasm

#include <lcd.h> // LCD driver routines
#include <ds18b20.h>
#include <delay.h>
#include <stdio.h>

char lcd_buffer[33];

/* maximum number of DS18B20 connected to the 1 Wire bus */
#define MAX_DEVICES 8

/* DS18B20 devices ROM code storage area */
unsigned char rom_code[MAX_DEVICES][9];

main()
{
unsigned char i,j,devices;

lcd_init(16);
lcd_putsf("CodeVisionAVR\n1 Wire Bus Demo");
delay_ms(2000);
lcd_clear();

/* detect how many DS18B20 devices
are connected to the 1 Wire bus */
devices=w1_search(0xf0,rom_code);
sprintf(lcd_buffer,"%u DS18B20\nDevice detected",devices);
lcd_puts(lcd_buffer);
delay_ms(2000);

/* display the ROM codes for each device */
if (devices)
{
for (i=0;i<devices;i++)
{
sprintf(lcd_buffer,"Device #%u ROM\nCode is:",i+1);
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(2000);
lcd_clear();
for (j=0;j<8;j++)
{
sprintf(lcd_buffer,"%02X ",rom_code[i][j]);
lcd_puts(lcd_buffer);
if (j==3) lcd_gotoxy(0,1);
};
delay_ms(5000);
};
}
else
while (1); /* stop here if no devices were found */

/* configure each DS18B20 device for 12 bit temperature
measurement resolution */
for (i=0;i<devices;)
if (!ds18b20_init(&rom_code[i++][0],20,30,DS18B20_12BIT_RES))
{
sprintf(lcd_buffer,"Init error for\ndevice #%u",i);
lcd_clear();
lcd_puts(lcd_buffer);
while (1); /* stop here if init error */
};

/* measure and display the temperature(s) */
while (1)
{
j=1;
for (i=0;i<devices;i++)
{
sprintf(lcd_buffer,"t%u=%+.3f\xdfC",j++,ds18b20_temperature(&rom_code[i][0]));
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(500);
};
};
}




Но в результате на ЖКИ появляется лишь <t=.3f>
Как я понимаю здесь U-порядковый номер устройства, а какую же переменную в буфер дисплея записывать???
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Но в результате на ЖКИ появляется лишь <t=.3f>.....
а вместо &rom_code[i][0] случайно &rom_code[0][i] не пробовали записать?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Сериг писал(а):а что означает "/" в строке Temp /=16; ?
Деление :)
Аватара пользователя
Real lev
Родился
Сообщения: 15
Зарегистрирован: Вс дек 25, 2011 12:15:48
Откуда: Владимир

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

Сообщение Real lev »

Сделал термометр на DS18B20, температуру прееобразует нормально, но постепенно нагревается. Нагревается примерно на +5 градусов, вследствие показывает неправильно, вместо 23 например 28-29 гр. У кого нибудь такое было? И как это лечится?
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

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

Сообщение uk8amk »

Real lev писал(а):И как это лечится?

1. Заменой датчика. Был один вроде нормальный, а при -15 его заклинило и поперло аж +40.
2. Выносом его с платы
3. Увеличением интервала между опросами
4. Улучшением теплопроводности датчик-окружающая среда. Можно его намазать термопастой и прижать к алюминиевой пластинке.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Real lev писал(а):Сделал термометр на DS18B20, температуру прееобразует нормально, но постепенно нагревается. Нагревается примерно на +5 градусов, вследствие показывает неправильно, вместо 23 например 28-29 гр. У кого нибудь такое было? И как это лечится?

Я тоже с таким сталкивался:
viewtopic.php?f=20&t=64022&p=1156778&hilit=%D1%84%D0%B5%D0%BD%D0%BE%D0%BC%D0%B5%D0%BD#p1156778
а вот в чем была причина:
viewtopic.php?f=20&t=64022&p=1243687&hilit=%D1%84%D0%B5%D0%BD%D0%BE%D0%BC%D0%B5%D0%BD%D0%B0#p1243687
Dmitrich_163
Родился
Сообщения: 5
Зарегистрирован: Пт апр 12, 2013 21:54:42

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

Сообщение Dmitrich_163 »

ChipKiller писал(а):
Но в результате на ЖКИ появляется лишь <t=.3f>.....
а вместо &rom_code[i][0] случайно &rom_code[0][i] не пробовали записать?



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

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

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

Кто-нибудь озадачивался оптоизоляций 18В20 в частности и 1-Wire в общем? :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

А зачем это нужно?

Если все таки нужно, то наверное двухканальный оптрон с обвязкой нужен и 2 вывода контроллера задействовать, вход и выход.....
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

shads писал(а):А зачем это нужно?

Мало ли :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

На картинке хоть и не DS18B20, а аналоговый датчик LM335, но изолированный. Тоже подойдет как вариант. А изолировать действительно есть нужда иногда. Можно поставить рядом с DS18B20 маленький контроллер (типа ATtiny) и изолировать однонаправленные линии интерфейса. Или можно взять оптронную развязку, которая применяется для шины I2C. Когда-то хотел попробовать сделать для DS18B20 трансформаторную развязку, чтобы через него и питание датчик получал, и данные передавал. Но руки не дошли, даже не уверен, что получится.
Вложения
LM335_iso.gif
(18.97 КБ) 487 скачиваний
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Леонид Иванович писал(а):Или можно взять оптронную развязку, которая применяется для шины I2C.

Именно это у меня и получилось — CPC5902 :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
RoboC
Мудрый кот
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк
Контактная информация:

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

Сообщение RoboC »

В Standby микросхема уходит когда :oops: ?
Подоплека вопроса: по паспорту ток сна - 1мкА, но DS злобно потребляет 7 :evil: , и дело точно не в мультиметре..
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

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

Сообщение Pika4u »

Хз. В своей последней поделке я не поленился потратить ещё одну ножку порта ввода-вывода и,когда 18b20 не нужна,то отрубал питание насовсем. :))
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Ответить

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