DS 1820 hőmérő - nem lehet kolvasni többet - hol a probléma?

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
kukuri
Bitmanipulátor
Hozzászólások: 132
Csatlakozott: 2014. január 20. hétfő, 12:50

DS 1820 hőmérő - nem lehet kolvasni többet - hol a probléma?

Hozzászólás Szerző: kukuri »

Üdvözletem!

Van 4db DS18B20 hőmérőm.
Ha csak 2-3 van a renszerben akkor kiolvassa az értékeket a rendszer.
Ha beteszem a 4. et is akkor valamiért nem tudja kiolvasni egyik hőmérőt sem. Ha bármelyik hőmérőt leveszem akkor a többit ismét ki tudja olvasni.
Mi lehet a gond?
Közös tápon vannak. Mindegyik hőmérő adatlába külön bekötve 4,7K ellenállással a VCC re.
Ha egy csatlakozási pontra akarom bekötni őket akkor már a 2. hőmérőnél sem működik.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: Robert »

Mert parazita módban van. Nincs önálló Vcc.
A Vcc-t is mindegyik hőmérőn kössed be. Igaz csak 1 felhúzóellenállás van és nem hőmérőnként 1-1 4k7-es?

A hőmérsékletkonverzió csak hőmérőnként indítható, nem egyszerre az összes hőmérőn!
kukuri
Bitmanipulátor
Hozzászólások: 132
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: kukuri »

Minden szenzoros van ellenállás. Készítek kapcsolási rajzot róla este. Rövid kábellel egymás után ki tudtam olvasni a szenzorokaz
. A csillagpontos bekötés is lehet gond?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: Robert »

TILOS minden szenzorra az ellenállás! A belső kapcsolótranzisztor leéghet!
Csak a drót végére lehet.

Olvasnivaló: 1Wire design guide (maxim-ic.com)
kukuri
Bitmanipulátor
Hozzászólások: 132
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: kukuri »

Mellékelem a nyák ide vonatkozó részét.
Jelenleg egy áramforrás van. Egy DC-DC átalakító ami 12V ról leveszi 5V ra a feszültséget. Erről kap minden tápot.
Az ellenállásokat jumperrel tudom Vcc re vagy földre húzni. A kompatibilitás miatt minden csatlakozáshoz betettem az ellenállást.
Elméletileg ha csak 1 jumper van feltéve akkor kellene működnie. Gyakorlatilag minél több jumper van feltéve, annál több szenzort képes beolvasni. 4 jumperrel olvas be 3 szenzort. Ami nekem még nem elég. :(
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: Robert »

Programkód?
A nem olvas mit jelent?
- nincs a buszon a hőmérő?
- 85 fok az eredmény?
kukuri
Bitmanipulátor
Hozzászólások: 132
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: kukuri »

Nem hinném hogy a program kóddal van a gond. Tudok kiolvasni szenzort, csak ha sok szenzor van(ez esetben 4) akkor nem olvassa be.
Próba képpen a meglévő 4db 4K7 ellenállás mellé betettem még egyet. (A kapcsolást megnézve a 4 ellenállás egy 1.125K ellenállásnak felelt meg)Így az eredő ellenállás 1K körül van. Be is olvassa a szenzorokat. Hogy miért, nem tudom. A lényeg hogy most kiolvasható mind a 4 szenzor. Lehet hogy az ellenállás helyére egy potit kell tenni, mert a kiépített szenzor db szám és kábelhossz miatt változik a VCC és adatbusz közé betehető ellenállás?
kukuri
Bitmanipulátor
Hozzászólások: 132
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: kukuri »

A kódom a következő:

Kód: Egész kijelölése

  if(!sensor_olvas)
  {
    sensor_olvas++;
  if ( !ds.search(addr))
  {
 //   Serial.println("No more addresses.");
 //   Serial.println("Nincs tobb szenzor. Ujra lessz inditva a beolvasás.");
 //    Serial.println("ROM szamlalo ujraindítás");
    ds.reset_search();
    delay(100);
    return;
  }
  else
  {
// Ha van még szabad ROM beolvasni  
  temp="";
//  Serial.println("ROM =");  
  for( i = 0; i < 8; i++)
  {
 //   Serial.write(' ');
 //   Serial.print(addr[i], HEX);
    temp1=String(addr[i], HEX);
    if (temp1.length()==1)
    {
      temp=temp+0;
    }
    temp=temp+temp1;
  }
    rom_cim0=temp;

  if (OneWire::crc8(addr, 7) != addr[7])
  {
      Serial.println("CRC is not valid!");
      return;
  }
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
 //     Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
 //     Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
 //     Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
 //     Serial.println("Device is not a DS18x20 family device.");
      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
  for ( i = 0; i < 9; i++)
 {           // we need 9 bytes
    data[i] = ds.read();
 }
  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s)
  {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10)
    {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else
  {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  homerseklet = celsius = (float)raw / 16.0;

  }
Ebből érdekes lehet a következő sor:
ds.write(0x44, 1); // start conversion, with parasite power on at the end
A szenzorok szerintem nem parazita módban vannak bekötve. Rá van vezetve külön a VCC és a GND is. Vagy Én értelmezem rosszul a parazita módot.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: Robert »

A hőmérőkhöz 3 vezeték megy?
Vcc/GND és DQ?

A hőmérés egyesével megy végig...

Kód: Egész kijelölése

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end

85 fokot kapsz vissza, vagy nincs eszköz a buszon?
A felhúzóra elvileg érzéketlen. 2k2...4k7 lehet (10 k már zavarérzékennyé teszi).
kukuri
Bitmanipulátor
Hozzászólások: 132
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: kukuri »

Mind a 3 vezeték be van kötve.
A kód lekérdezi a címeket és utána ciklusonként minden talált címe lekérdezi a hőfokot.

Most azt vettem észre hogy a 0,06 °C pontosságú mérés helyett csak 0.5°C pontossággal dolgozik. :(

1 szenzornál van eredmény. 4K7 ellenállásnál.
2 szenzornál akkor van eredmény ha 2db 4K7 van párhuzamosítva. Tehát 2K35
És így tovább. Akkor olvassa be a következő szenzort ha mindig párhuzamosan beteszek egy újabb ellenállást.
A 4 szenzort úgy olvassa be ha 5db 4K7 ellenállás van párhuzamosan betéve. Ez az amit nem értek.
kukuri
Bitmanipulátor
Hozzászólások: 132
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: kukuri »

Szerintem kiiratom az összes adatot amit kiszed a program a szenzorból és átnézem végig.
A SCRATCHPAD - CONFIGURATION REGISTER része a felelős hogy 9,10,11,12 bites az eredmény.
Mivel a 12 az alapértelmezett ezért gyanítom hogy rosszul olvassa ki az adatokat és ezért rontja el.

Kipróbálom fix ROM címekkel is az olvasást. Így lehet még a sebessége is gyorsabb lesz.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: kapu48 »

Szerintem a felhúzó R-eket a mérő egységeken kellene elhelyezni, nem pedig 1 kupacba a központi egységen!
Ez okozhatja nálad a hibát!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: Robert »

A vcc kábeled szakadt.
kukuri
Bitmanipulátor
Hozzászólások: 132
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: kukuri »

kapu48 írta:Szerintem a felhúzó R-eket a mérő egységeken kellene elhelyezni, nem pedig 1 kupacba a központi egységen!
Ez okozhatja nálad a hibát!
Ez lehet hiba. Bár az okát nem értem.
Levettem a jumpert a felhúzó ellenállásról és forrasztottam egyet az egyik csatlakozóhoz.
Most úgy tűnik működik vele.
Már csak vissza kell állítani a szenzorokat 12 bites módra, mert úgy látom most csak 9 bitesben megy. Ha a szenzort lecserélem egy olyanra amit még nem használtam akkor működik a 0,06 °C felbontás. Amúgy meg csak a 0,5°C ban dolgozik.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: DS 1820 hőmérő élesztés

Hozzászólás Szerző: Robert »

A szenzoroknak _te_ mondod meg, hogy hány bites módban működjenek.
Alap: 0,5 fok (9bites) és ez rakható át 10-11-12 bitesre.

A hibát megkeresném. A felhúzóellenállás értékének csökkenése mögött még 1 ok lehet:
A kábeled hosszú és nagy kapacitás van a GND/DQ közt. Pl. UTP kábel sodort párját használod. Ekkor a Vcc/GND az egyik sodorpár és a DQ ettől független éren/érpáron legyen.
Válasz küldése