Re: Anschluß 1-Wire Temperatursensoren DS18B20 an DS2482 Kategorie: I²C-Bus (von Joerg C. - 31.01.2008 16:13) | ||
Als Antwort auf Re: Anschluß 1-Wire Temperatursensoren DS18B20 an DS2482 von eagle1311 - 31.01.2008 8:28 | ||
| ||
Hallo Eagle, > 1.) Die Application Note von maxim hatte ich bereits gelesen. Es unterstreicht ja gerade das von mir > beschriebene Phänomen. Ja, leider. > 2.) Was bedeutet im Detail "Lesen des Default Temp Wertes sowie CRC-Fehler ? (Pkt.5!) Wenn ein Sensor +85°C, also seinen Default-Wert zurückliefert, glaube ich das einfach nicht :) Dann war das sicher ein Fehler. CRC: siehe unten > 3.) Schirm-Erdung > Sämtliche YStY-Schirm-Leitungen sind alle miteinander im Elektroverteiler (Sternpunkt) verbunden > und anschlie�end über PE-Leitung, Potentialausgleichschiene und (Ring)-Fundamenterder geerdet. > Die andere Seite der YStY-Leitung (Taster- bzw. Sensoren in den Räumen) ist natürlich offen > (meistens bereits aus Mangel an PE-Leiter) ACK > Eine Verbindung zwischen Versorgungsmasse (für 5V- und 12V-Versorgung der verschiedenen > Module) und PE-Erdung fehlt momentan noch => Probiere ich heute Nachmittag mal aus, ob dabei > ein Unterschied=> Besserung festzustellen ist. Wie, keine Verbindung der Massen derzeit? Würde ich auch am Sternpunkt vornehmen, um irgendwelche Ausgleichsströme auf jeden Fall zu vermeiden. > 4.) Die 5V-Versorgung der Temp.-Sensoren wird über eine Ader extra mitgeführt => KEIN parasitär mode Na dann können wir das schon mal als Fehlerquelle ausschliessen. > 5.) Vorschlag würde ich dankend annehmen, was das Posten der CRC-Prüfung scratchpad betrifft Ok. Das ist ein Ausschnitt meiner Sensor Funktionen: const DS18S20_POR_VAL = 0x00AA; // == +85°C const DS18B20_POR_VAL = 0x0550; // == +85°C // 1-wire lookup table for CRC calculation const CRC[] = 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53; Das StartConversion Kommando fehlt hier, lediglich das Auslesen der Sensoren folgt. Sollte für's Verständnis aber ausreichen. for j=0...<CRC_MAX_RETRY { // readSCRATCHPAD command to a single sensor ds2482.matchROM (cfg,ROM[sensor]); ds2482.writeByte(cfg,READSCRATCHPAD); // read all 9 bytes of scratchpad for i=0...8 d[i]=ds2482.readByte(cfg); // calculate the CRC crc=0; for i=0...7 { crc = CRC[crc xor d[i]]; } if crc==d[8] break; // break loop, if CRC correct; else repeat } if j >= CRC_MAX_RETRY { return TEMP_CRC_ERR; } // first 2 bytes are the temp bytes x= d[0] or (d[1] shl 8); // process 18B20 and 18S20 devices if ROM[sensor] == 0x28 { // it's a 18B20 family code if (x == DS18B20_POR_VAL) return TEMP_POR_ERR; if x and 0xF000 t = (x shr 4) or 0xF000; else t = x shr 4; temp.data = (t*10000 + (x and 0xF)*625); return TEMP_OK; } else if ROM[sensor] == 0x10 { // It's a 18S20 family code. if (x == DS18S20_POR_VAL) return TEMP_POR_ERR; // To get a resolution greater than 9 Bit, decode // the COUNT_REMAIN value (available in Byte 6 of scratchpad) if x and 0xFF00 t = (x shr 1) or 0xFF00; else t = x shr 1; temp.data = (t*10000 - 2500 + (10000/16)*(16-d[6])); return TEMP_OK; } return TEMP_TYP_ERR; Bei CRC Fehlern probier ich's ein paar mal, bis sich dann aufgebe, und den Fehlergrund speichere sowie einen Fehlerzähler erhöhe. Damit sehe ich, ob und wie oft Fehler auftreten. Bei mir sind derzeit 6 Sensoren im Einsatz in einer Sterntopologie (naja, an einem Strang sind zwei Sensoren). Fehler treten auf, je nach Kabellänge so 2..3 am Tag, bei einer Abfrage alle 5 Sekunden. Aber nachdem ich die Fehler abfange, klappt's auch mit der Regelung (meine Wärmepumpe "erschrickt" doch recht arg, wenn's im Referenzraum +85°C hat :) Hoffe geholfen zu haben. Viele Grüsse, Jörg C. | ||
Antwort schreiben Antworten: |