Hallo Jungs (und Mädels...?) :-) Ich hab auf meinem Experimentierboard einen DS18B20 werksseitig, der bestens funktioniert. Jetzt habe ich mir noch vier dazugekauft und siehe da: schon fängt der Sch...ß an :-) Egal, welchen ich von den Neuen an die Strippe hänge, bekomme ich entweder -0,25 Grad angezeigt oder FFFFFFFFFFF. Wo liegt der Fehler? Mit dem Boardsensor klappt alles wunderbar, die Neuen klappen garnicht. Angeschlossen hab ich die Sensoren mit einem Widerstand von 4,7k zwischen + und DQ. Vielleicht liegt hier der Hund begraben? Aber so stehts im Datenblatt. Auch ein Reset, Programm-Neuinstallation, etc. hat nix gebracht. Wer weiß Rat?
Anhand welcher deiner üppig spriessenden Informationen sollen wir das erraten? Welches Board, welche Software, Quellcode (vor wem, von dir?), wie wo angeschlossen, ob mehrere gleichzeitig, ... Garantiert kein DS1820 oder DS18S20 auf dem Board? Die sind ähnlich aber nicht identisch.
Den Wiederstand brauchst du nur einmal in deiner One-Wire-Interface. Du musst Jeden DS1820 einzeln adressieren. Da gibt es Zwei verschidene Modus es gibt einmal einen Dresse auf die alle DS1820 ansprechen sinvoll bei nur einem einzelnen DS1820 in der Stripe sonst gibt es einen Datencrash oder mann liest den einzelnen sensoren die SERIENUMMER aus und adressiert sie damit.
Wie hängst Du die anderen DS18B20 dran? Beherrscht Dein Expermentierboard mehrere Sensoren am "Bus" (Algorithmus; Search-ROM; ...)? Kennt das Board genau Deinen Sensor? ...
Ok ok, ich hab mich nicht klar genug ausgedrückt: Ich will den vorhandenen DS18B20 nur gegen einen anderen austauschen, nichts anderes. Es geht NICHT um eine Reihenschaltung von mehreren Sensoren. Dann müßten alle adressiert werden, das weiß ich. Hier gehts wie gesagt nur darum, den Boardsensor gegen einen anderen gleichen Typs auszutauschen, und das klappt nicht. Hier der Code: Config 1wire = Portc.5 ' DS18S20 Const Ds1920 = &H10 Const Skiprom = &HCC Const Read_rom = &H33 Const Convertt = &H44 Const Read_ram = &HBE Const Write_ram = &H4E Const Copy_ram = &H48 Const Recall_ee = &HB8 Const Read_power = &HB4 Dim Family_code As Byte Dim Serial_number(6) As Byte Dim Crc As Byte Dim Scratch(9) As Byte Dim I As Byte Dim Temp As Word Dim Temp1 As Integer Dim Stemp As Single Do 1wreset 1wwrite Read_rom Family_code = 1wread() For I = 1 To 6 Serial_number(i) = 1wread() Next Crc = 1wread() 1wwrite Convertt Do Temp = 1wread() Loop Until Temp = &HFF 1wreset 1wwrite Skiprom 1wwrite Read_ram For I = 1 To 9 Scratch(i) = 1wread() Next Temp = Scratch(2) Shift Temp , Left , 8 Temp = Temp + Scratch(1) Temp1 = Temp Temp1 = Temp1 / 20 Stemp = Scratch(8) - Scratch(7) Stemp = Stemp / Scratch(8) Stemp = Stemp + Temp1 Stemp = Stemp - 0.25 Locate 1 , 1 Lcd "Air Exhaust" Locate 2 , 1 Lcd "Temp: " ; Fusing(stemp , "#.##") ; " Grad C" Cursor Off Waitms 500 Loop End
Elektor hatte da mal was. "Heute ist es mal wieder kalt" oder so. Den sorcecode kann man da glaub ich kostenlos herunterladen. Die Adresse liest man nur einmal aus.
Der DS18B20 hat in den ersten zwei Byte des Scratchpad bereits eine Auflösung von 0,0625°C. Eine Auflösungserweiterung über Byte 7 und 8 ist hier nicht möglich. Das bedeutet, Dein Code ist für den DS18S20. Dieser hat in den ersten Bytes "nur" eine Auflösung von 0,5°C. Dann ist da noch was anderes fault: 25,0°C bedeutet, dass Temp einen Wert von 50 hat. Diesen Wert teilst Du dann durch 20. Temp1 ist also 2 (Integer). Dann kommt die Berechnung der feineren Auflösung: Scratch(8) ist immer 16 (hard-wired). Scratch(7) ist ein Wert zwischen 0 und 16 (soweit ich weiß). Scratch(8)-Scratch(7) hat also ebenfalls einen Wert zwischen 0 und 16. Teilt man das ganze durch 16, wird das einen Wert zwischen 0 und 1 ergeben. Dazu kommt nun Dein Temp1 (in diesem Fall 2) - das ergibt maximal 3. Davon ziehtst Du noch 0,25 ab. Also maximal 2,75. Da kann also etwas nicht stimmen. Korrekt wäre es, wenn Du Temp1 nur durch 2 teilst. Also den Wert ein Bit nach rechts verschiebst. Das aber nur für den DS18S20. Beim DS18B20 sollte folgendes korrekt sein: Temp = Scratch(2) Shift Temp , Left , 8 Temp = Temp + Scratch(1) Stemp = Temp Stemp = Stemp / 16 Power-up default ist bereits eine Auflösung von 12-bit. Da muss also nichts speziell eingestellt werden. Die Messung dauert dann aber auch 750ms, also fast eine Sekunde.
Hallo Christian, danke für die detaillierten Infos. Ich hab den Code abgeändert: Const Ds1920 = &H10 Const Skiprom = &HCC Const Read_rom = &H33 Const Convertt = &H44 Const Read_ram = &HBE Const Write_ram = &H4E Const Copy_ram = &H48 Const Recall_ee = &HB8 Const Read_power = &HB4 Dim Family_code As Byte Dim Serial_number(6) As Byte Dim Crc As Byte Dim Scratch(9) As Byte Dim I As Byte Dim Temp As Word Dim Temp1 As Integer Dim Stemp As Single Do 1wreset 1wwrite Read_rom Family_code = 1wread() For I = 1 To 6 Serial_number(i) = 1wread() Next Crc = 1wread() 1wwrite Convertt Do Temp = 1wread() Loop Until Temp = &HFF 1wreset 1wwrite Skiprom 1wwrite Read_ram For I = 1 To 9 Scratch(i) = 1wread() Next Temp = Scratch(2) Shift Temp , Left , 8 Temp = Temp + Scratch(1) Stemp = Temp Stemp = Stemp / 16 Locate 1 , 1 Lcd "Raumtemperatur" Locate 2 , 1 Lcd "Temp: " ; Fusing(stemp , "#.##") ; " Grad C" Cursor Off Wait 1 Loop End Temperaturmessung stimmt jetzt fast 100%ig mit meinem Quecksilber-Thermometer überein. Sorry, ich arbiete mich grad erst in das 1Wire ein und kapier noch lange nicht alles. Zum Beispiel hier: Crc = 1wread() 1wwrite Convertt Do Temp = 1wread() Loop Until Temp = &HFF Was bedeutet &HFF? Kann das nirgends finden.
Uwe Heydemann schrieb: > Was bedeutet &HFF? Kann das nirgends finden. Das bedeutet Hexadezimal FF (=255 Dezimal). Die Schleife läuft also so lange bis Temp = 255 ist.
Nein, es geht nur darum, dass der Sensor, solange die Messung durchgeführt wird, ein dauerhaftes LOW sendet. Es wird erst high, wenn die Messung beendet ist. Im Datenblatt steht das dann so drin: If the DS18B20 is powered by an external supply, the master can issue read time slots after the Convert T command and the DS18B20 will respond by transmitting a 0 while the temperature conversion is in progress and a 1 when the conversion is done. Das ganze nennt sich "polling", funktioniert aber nur mit eigener Spannungsversorgung; nicht parasitär. Die Schleife wartet also solange, bis die Messung beendet ist.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.