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

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

Добавлено: Чт апр 18, 2013 19:19:13
Сериг
Кошачьи-образные,привет! :)
помогите пожалуйста отобразить минусовую температуру вот как я делаю,но не выходит,при минусовой температуре датчик начинает выдавать показания 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 спасибо!

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

Добавлено: Чт апр 18, 2013 19:54:34
Аlex
Значит переменная unsigned.

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

Добавлено: Чт апр 18, 2013 19:59:57
uk8amk
Сериг писал(а):Temp = (( !Temp_H & 0b00001111) << 4 ) | ( !Temp_L >> 4 );
Это что такое?
! - операция логического НЕ, результатом является TRUE( !=0 ) или FALSE( ==0 ).

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

Добавлено: Чт апр 18, 2013 23:21:07
Сериг
Аlex писал(а):Значит переменная unsigned.
Ни как нет,переменная типа signed...

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

Добавлено: Пт апр 19, 2013 07:45:19
Аlex
Temp_H и Temp_L , как я понял, - 2 считанных байта ?
Куда выводите переменную и как ?

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

signed int   Temp;

Temp = Temp_H<<8 + Temp_L;
Temp /=16;
.......
Тут выводим переменную Temp, в ней целое знаковое значение температуры.
.......

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

Добавлено: Пт апр 19, 2013 16:49:15
Сериг
Так точно,два байта.
Вывожу на индикатор винстаровский 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; ?
спасибо!

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

Добавлено: Пт апр 19, 2013 23:24:54
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[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[0]));
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(500);
};
};
}




Но в результате на ЖКИ появляется лишь <t=.3f>
Как я понимаю здесь U-порядковый номер устройства, а какую же переменную в буфер дисплея записывать???

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

Добавлено: Сб апр 20, 2013 12:15:25
ChipKiller
Но в результате на ЖКИ появляется лишь <t=.3f>.....
а вместо &rom_code[0] случайно &rom_code[0] не пробовали записать?

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

Добавлено: Вс апр 21, 2013 20:50:29
Аlex
Сериг писал(а):а что означает "/" в строке Temp /=16; ?
Деление :)

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

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

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

Добавлено: Пн апр 22, 2013 18:17:58
uk8amk
Real lev писал(а):И как это лечится?
1. Заменой датчика. Был один вроде нормальный, а при -15 его заклинило и поперло аж +40.
2. Выносом его с платы
3. Увеличением интервала между опросами
4. Улучшением теплопроводности датчик-окружающая среда. Можно его намазать термопастой и прижать к алюминиевой пластинке.

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

Добавлено: Пн апр 22, 2013 18:55:16
shads
Real lev писал(а):Сделал термометр на DS18B20, температуру прееобразует нормально, но постепенно нагревается. Нагревается примерно на +5 градусов, вследствие показывает неправильно, вместо 23 например 28-29 гр. У кого нибудь такое было? И как это лечится?
Я тоже с таким сталкивался:
http://radiokot.ru/forum/viewtopic.php? ... D#p1156778
а вот в чем была причина:
http://radiokot.ru/forum/viewtopic.php? ... 0#p1243687

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

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



Пробывал, ничего не изменилось. Самое интересное что другая программа, работающая с одним датчиком, все показвает

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

Добавлено: Вт апр 23, 2013 08:50:59
Gudd-Head
Кто-нибудь озадачивался оптоизоляций 18В20 в частности и 1-Wire в общем? :)

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

Добавлено: Вт апр 23, 2013 09:29:27
shads
А зачем это нужно?

Если все таки нужно, то наверное двухканальный оптрон с обвязкой нужен и 2 вывода контроллера задействовать, вход и выход.....

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

Добавлено: Вт апр 23, 2013 09:32:03
Gudd-Head
shads писал(а):А зачем это нужно?
Мало ли :)

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

Добавлено: Вт апр 23, 2013 10:00:48
Леонид Иванович
На картинке хоть и не DS18B20, а аналоговый датчик LM335, но изолированный. Тоже подойдет как вариант. А изолировать действительно есть нужда иногда. Можно поставить рядом с DS18B20 маленький контроллер (типа ATtiny) и изолировать однонаправленные линии интерфейса. Или можно взять оптронную развязку, которая применяется для шины I2C. Когда-то хотел попробовать сделать для DS18B20 трансформаторную развязку, чтобы через него и питание датчик получал, и данные передавал. Но руки не дошли, даже не уверен, что получится.

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

Добавлено: Вт апр 23, 2013 10:18:30
Gudd-Head
Леонид Иванович писал(а):Или можно взять оптронную развязку, которая применяется для шины I2C.
Именно это у меня и получилось — CPC5902 :)

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

Добавлено: Пт май 03, 2013 19:05:36
RoboC
В Standby микросхема уходит когда :oops: ?
Подоплека вопроса: по паспорту ток сна - 1мкА, но DS злобно потребляет 7 :evil: , и дело точно не в мультиметре..

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

Добавлено: Сб май 04, 2013 17:24:54
Pika4u
Хз. В своей последней поделке я не поленился потратить ещё одну ножку порта ввода-вывода и,когда 18b20 не нужна,то отрубал питание насовсем. :))