Датчики DS18B20

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
xagxag
Родился
Сообщения: 19
Зарегистрирован: Чт ноя 18, 2010 09:34:35

Датчики DS18B20

Сообщение xagxag »

Здравствуйте, у меня возникла проблема работы с двумя и более датчиками (DS18B20) на duino. Я могу читать по порядку температуру с каждого датчика (ниже код), а вот как теперь считать данные с определенного датчика(по адресу) например с первого? Напишите пожалуйста пример кода..

первый датчик
R=28 D8 3 64 2 0 0 E4 P=1 AC 1 4B 46 7F FF 4 10 86 T=26.75 CRC=865
второй датчик
R=28 91 F8 9F 2 0 0 34 P=1 AB 1 4B 46 7F FF 5 10 92 T=26.68 CRC=9210
void loop(void)
{
byte i;
byte present = 0;
byte data[12];
byte addr[8];
int Temp;
if ( !ds.search(addr)) {
//Serial.print("No more addresses.\n");
ds.reset_search();
return;
}
Serial.print("R="); //R=28 Not sure what this is
for( i = 0; i < 8; i++) {
Serial.print(addr, HEX);
Serial.print(" ");
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.print("CRC is not valid!\n");
return;
}
if ( addr[0] != 0x28) {
Serial.print("Device is not a DS18S20 family device.\n");
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.

present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
Serial.print("P=");
Serial.print(present,HEX);
Serial.print(" ");
for ( i = 0; i < 9; i++) { // we need 9 bytes
data = ds.read();
Serial.print(data, HEX);
Serial.print(" ");
}
Temp=(data[1]<<8)+data[0];//take the two bytes from the response relating to temperature

Temp=Temp;//divide by 16 to get pure celcius readout

Serial.print("T=");//output the temperature to serial port
Serial.print(Temp/16);
Serial.print(".");
Serial.print(((Temp%16)*100)/16);
Serial.print(" ");
Serial.print(" CRC=");
Serial.print( OneWire::crc8( data, 8), HEX);
Serial.println();
}
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Датчики DS18B20

Сообщение ChipKiller »

xagxag писал(а):Я могу читать по порядку температуру с каждого датчика (ниже код), а вот как теперь считать данные с определенного датчика(по адресу) например с первого?
... а в чем отличие Я могу читать по порядку температуру с каждого датчика от считать данные с определенного датчика? :)
xagxag писал(а):Напишите пожалуйста пример кода..
- так вроде все уже написано... раз
Я могу читать по порядку температуру
- просто подставьте в код индекс нужного датчика :)
Реклама
xagxag
Родился
Сообщения: 19
Зарегистрирован: Чт ноя 18, 2010 09:34:35

Re: Датчики DS18B20

Сообщение xagxag »

ChipKiller писал(а):
xagxag писал(а):Я могу читать по порядку температуру с каждого датчика (ниже код), а вот как теперь считать данные с определенного датчика(по адресу) например с первого?
... а в чем отличие Я могу читать по порядку температуру с каждого датчика от считать данные с определенного датчика? :)
xagxag писал(а):Напишите пожалуйста пример кода..
- так вроде все уже написано... раз
Я могу читать по порядку температуру
- просто подставьте в код индекс нужного датчика :)
Вот вот..у меня не получается подставить индекс датчика....
я как понимаю что бы вывести на экран с нужного датчика нужно прописать


const x=28 D8 3 64 2 0 0 E4; // это же индекс или???
...
Serial.print(x);

но это же не правильно?
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Датчики DS18B20

Сообщение ChipKiller »

const x=28 D8 3 64 2 0 0 E4; // это же индекс или???
.. это не индекс. Опрашивая все датчики на линии функцией Поиск ROM - Вы находите их количество N. Диапазон 0..(N-1) и есть индекс.
Реклама
Эиком - электронные компоненты и радиодетали
xagxag
Родился
Сообщения: 19
Зарегистрирован: Чт ноя 18, 2010 09:34:35

Re: Датчики DS18B20

Сообщение xagxag »

ChipKiller писал(а):
const x=28 D8 3 64 2 0 0 E4; // это же индекс или???
.. это не индекс. Опрашивая все датчики на линии функцией Поиск ROM - Вы находите их количество N. Диапазон 0..(N-1) и есть индекс.

а я думал у каждого датчика есть идентификационный номер, который и есть индекс...
а Вы можете написать программно? Заранее огромное спасибо))
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Датчики DS18B20

Сообщение ChipKiller »

xagxag писал(а):а я думал у каждого датчика есть идентификационный номер,
.. так и есть, а индекс - это порядковый номер, который указывает на массив из 8-ми байт (ID код) и позволяет с помощью функции MATCH ROM обратиться к нужному устройству на шине .... а вообще-то все доступно описано в datasheet_е, так что лучше его почитать....
Реклама
Аватара пользователя
Rimsky
Грызет канифоль
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск
Контактная информация:

Re: Датчики DS18B20

Сообщение Rimsky »

Доброе время суток, уважаемые форумчане.

При нагревании датчика DS18B20 феном, датчик неожиданно выдал значение температуры, которое находится за границей +125 С. Может такое быть и кто с этим сталкивался?

+69,0 C +96,5 C +91,0 C +85,0 C +102,0 C+126,5 C+119,0 C+111,5 C+104,0 C+98,0 C +92,0 C +87,0 C +82,5 C +79,5 C +114,0 C+108,5 C+101,0 C+95,5 C +90,5 C +86,0 C +82,0 C +78,0 C +74,5 C +72,0 C +68,0 C +58,5 C +56,0 C +55,0 C +53,5 C
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: Датчики DS18B20

Сообщение a_skr »

цена мл. разряда при 12-битной оцифровке 0.0625°C, таким образом +125°C - это не максимальный код (7D0), а максимальный - 7FF = 127.9375°C и датчик действительно может мерить чуть больше (проверено паяльником)
Аватара пользователя
Rimsky
Грызет канифоль
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск
Контактная информация:

Re: Датчики DS18B20

Сообщение Rimsky »

a_skr писал(а):цена мл. разряда при 12-битной оцифровке 0.0625°C, таким образом +125°C - это не максимальный код (7D0), а максимальный - 7FF = 127.9375°C и датчик действительно может мерить чуть больше (проверено паяльником)
понял, спасибо :beer:
acvarium
Родился
Сообщения: 8
Зарегистрирован: Вс мар 20, 2011 00:53:11

Re: Датчики DS18B20

Сообщение acvarium »

Пытаюсь разобраться в работе с датчиком DS18B20. Пока дошел только до эмуляции в Протеусе, но уже столкнулся с проблемой. Датчик реагирует на инициализацию, но не реагирует на команды начала измерения температуры (0x44) и чтения памяти (0xBE). Микроконтроллер PIC16f877, тактовая частота 4МГц. Программа в принципе не моя и должна работать, но, видимо, что-то не так. Я уже начал думать что мне датчик в Протеусе сгоревший попался) Вот программа:

delay_7us

goto $+1 ; 7 us Pause

nop



return





delay_80us

movlw 0x19 ; 80 us warten

movwf d1

delay_80us_loop

decfsz d1, f

goto delay_80us_loop



return



write_one

bcf PORTA, 2

call delay_7us ; 7 us warten

bsf PORTA, 2

call delay_80us ; 80 us warten



return





write_zero

bcf PORTA, 2

call delay_80us ; 80 us warten

bsf PORTA, 2

call delay_7us

return





init_ds1820

bsf STATUS, RP0 ; Bank 1

bcf TRISA, 2 ; RA2 Ausgang

bcf STATUS, RP0 ; Bank 0



bcf PORTA, 2

call delay_600us ; 600 us low -> Reset

bsf PORTA, 2



bsf STATUS, RP0 ; Bank 1

bsf TRISA, 2 ; RA2 Eingang

bcf STATUS, RP0 ; Bank 0



call delay_50us ; 50 us Pause



init_ds1820_loop

btfsc PORTA, 2

goto init_ds1820_loop ; Warten bis Presence = Low



return





write_ds1820

bsf STATUS, RP0 ; Bank 1

bcf TRISA, 2 ; RA2 Ausgang

bcf STATUS, RP0 ; Bank 0



movlw 0x08

movwf KEY



write_ds1820_loop

rrf ds1820, f ; Nach rechts verschieben

nop



btfss STATUS, C

goto $+3

call write_one

goto $+2

call write_zero

decfsz KEY, f

goto write_ds1820_loop ; Weitermachen, bis alle 8 Bits gesendet

bsf STATUS, RP0 ; Bank 1

bsf TRISA, 2 ; RA2 Eingang

bcf STATUS, RP0

return





read_ds1820

clrf ds1820

bcf STATUS, C

movlw 0x08

movwf KEY



read_ds1820_loop

bsf STATUS, RP0 ; Bank 1

bcf TRISA, 2 ; RA2 Ausgang

bcf STATUS, RP0 ; Bank 0



bcf PORTA, 2 ; Low

nop

bsf STATUS, RP0 ; Bank 1

bsf TRISA, 2 ; RA2 Eingang

bcf STATUS, RP0 ; Bank 0

bsf PORTA, 2 ; High, wird nicht ausgegeben

nop

nop

nop

nop

nop

nop

bsf STATUS, C

btfss PORTA, 2 ; Bus samplen

bcf STATUS, C

rrf ds1820, f ; Nach rechts verschieben



call delay_80us ; 80 us Pause

decfsz KEY, f

goto read_ds1820_loop ; Weitermachen, bis alle 8 Bits empfangen

return





read_temp

call init_ds1820 ; DS1820 initialisieren & erkennen

call delay_600us



movlw 0xcc

movwf ds1820

call write_ds1820 ; ROM-Kommando 0xCC: Skip ROM

call delay_600us



movlw 0x44

movwf ds1820

call write_ds1820 ; Kommando 0x44: Convert Temperature


call delay_1s

call init_ds1820

call delay_600us



movlw 0xcc

movwf ds1820

call write_ds1820 ; ROM-Kommando 0xCC: Skip ROM

call delay_600us

movlw 0xBE

movwf ds1820

call write_ds1820 ; Kommando 0xBE: Read Scratchpad

call read_ds1820

movf ds1820, w

movwf temp1 ; Temperatur LSB

call read_ds1820

movf ds1820, w

movwf temp2 ; Temperatur MSB

return





convert_temp

bcf rest, 1

movf temp2, w

sublw 0xFF

btfss STATUS, Z ; Negative Temperatur?

goto $+4

comf temp1, f ; Ja, 2-er Komplement bilden

incf temp1, f

bsf rest, 1 ; Merken, dass Temperatur negativ war


movf temp1, w ; Temperatur durch 2 teilen, Rest setzen

movwf loops

bcf rest, 0

bcf rest, 2

bcf STATUS, C

rrf temp1, f ; Durch 2 teilen

bcf STATUS, C

rlf temp1, w ; Mit 2 multiplizieren

subwf loops, w ; Rest ermitteln

btfss STATUS, Z

bsf rest, 0 ; rest,0 = 1

return
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»