Страница 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 микросхема уходит когда

?
Подоплека вопроса: по паспорту ток сна - 1мкА, но DS злобно потребляет 7

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