Hallo zusammen, als blutiger Anfänger versuche ich nun schon seit einer Woche, den Dallas Ds1820 auszulesen. Ich habe glaube ich auch schon alle Beiträge zu diesem Thema gelesen. Aber entweder sind die Beispiele in C oder ich habe sie nicht zum Laufen bekommen. Ich habe hier ein Beispiel mal für meine Bedürfnisse angepasst. Vielleicht kann einer von euch mal eine Blick draufwerfen, was da evtl. falsch dran sein kann. Wie gesagt, habt bitte nachsicht, da ich gerade erst mit den programmieren beginne. Der Datapin des DS1820 liegt am Pin C.0, Vcc auf 5V und GND auf Masse. Als Controller verwende ich den Atmega128 m. 14,74MHz falls das evtl. fürs Timing von Bedeutung sein sollte. Beim ersten Print #1 , Scratch(i) bekomme ich schon nur Nullen angezeigt. Ich denke, das hier evtl. schon die Initalisierung nicht funktioniert. Könnte das sein? Danke schon einmal für eure Mühe, Tom $regfile = "m128def.dat" 'Quarz: 14,74 MHz $crystal = 14745600 $baud1 = 9600 Open "COM2:" For Binary As #1 'DS1820 Kommandos (Es werden nicht alle benutzt..aber später vielleicht mal) Const Read_rom = &H33 Const Skip_rom = &HCC Const Convertt = &H44 Const Read_ram = &HBE Const Write_ram = &H4E Const Copy_ram = &H48 Const Recall_ee = &HB8 Const Read_power = &HB4 Dim Busy As Byte Dim I As Byte 'Scratchpad Dim Scratch(9) As Byte 'Variablen für die Berechnung der Nachkommastelle Dim Tmp As Byte , T As Integer , T1 As Integer , Decigrades As Integer ' variablen für die display routine Config 1wire = Portc.0 Do 'Hauptschleife 'Diese Sequenz dient zum Auslesen des DS1820 (vgl.Datenblatt vom DS1820) 1wreset ' 1wire Reset 1wwrite Skip_rom ' Read ROM command 1wwrite Convertt ' Measure Temperature 'Vom Testen übrig, um zu sehen, wann das Umwandeln abgeschlossen ist 'Do 'Busy = 1wread() 'Loop Until Busy = &HFF ' Wait for end of conversion 'Waitms 100 1wreset ' 1wire Reset 1wwrite Skip_rom ' Skip ROM command 1wwrite Read_ram ' Read Scratch command 'Die ersten 9 Byte in das Scratchpad einlesen For I = 1 To 9 Scratch(i) = 1wread() Print #1 , Scratch(i) Next 'Scratch(1) = 170 vom Ausprobieren übrig 'Scratch(2) = 0 'Scratch(7) = 0 'Scratch(8) = 16 1wreset ' 1wire Reset Tmp = Scratch(1) And 1 ' 0.1C precision If Tmp = 1 Then Decr Scratch(1) T = Makeint(scratch(1) , Scratch(2)) 'Print Hex(t) 'Print T T = T * 50 'here we calculate the 1/10 precision like T = T - 25 'DS18S20 data sheet T1 = Scratch(8) - Scratch(7) T1 = T1 * 100 T1 = T1 / Scratch(8) T = T + T1 Decigrades = T / 10 'As integer, this routine gives T*10, with 1/10 degree precision Print #1 , Decigrades Wait 1 Loop End
Nach dem Start der Messung kann man entweder so lange abfragen bis fertig (im Code auskommentiert drin, ob richtig weiss ich nicht) oder 750msec warten. 100ms ist zu kurz, zudem auskommentiert.
Hallo A.K., habe ich gleich mal getestet m. 750ms Wartezeit, gleiches Ergebnis. Das mit dem Abfrage im Code hatte ich auch schon probiert, allerdings bleibt der Prozessoer dann immer in einer Endlosschleife. Muss ich beim Anschluss des DS1820 noch irgend etwas beachten, wie z.B. Pullup-Widerstand oder ähnliches? Einen anderen Port u. DS1820 habe ich auch schon probiert, um einen defekt auszuschliessen. Tom
Ein externer Pullup 4K7 ist schon nötig und im Datasheet unübersehbar in jedem Anschlussbeispiel drin. 2- oder 3-adrig angeschlossen?
Hallo A.K., hatte ich oben deswegen direkt mit angegeben das 3 adrig angeschlossen. Ich hatte gedacht, das bei ext. Vorsorgung kein Pullup nötig wäre, da der Ds1820 nun seine eingene Versorgung hat. Tom
Egal ob 2- oder 3-adrig: Der Widerstand muss rein. Wie im Anschlussbild im Datasheet auch unübersehbar drin. In meinem Exemplar sind auf Seite 5 Fig.4+5 beide Varianten gezeigt, wobei ein AVR in der parasitären Variante allerdings ohne Pullup-FET auskommt, weil sein Pin im Unterschied zum normalen 8051 einen aktiven interen Pullup hat.
Apropos: Der Sensor bezieht seinen Strom während der Messung nicht über den Pullup-Widerstand, sondern über einen aktiven Pullup.
Ich Doofkopp, funktioniert natürlich auf Anhieb. Man lernt eben nie aus. Du hast mir sehr geholfen und eine weitere Woche sinnlosen rumprobierens gespart. Vielen dank. Tom Hab' noch mal ohne die 750ms Pause probiert, funktioniert auch so noch.
> Hab' noch mal ohne die 750ms Pause probiert, funktioniert auch so noch.
Mit Warteschleife, nehme ich an.
genau, die ist noch mit 1s drin, ich meine die pause vor dem 2. 1wreset, das scheint auch noch ohne zu gehen. Tom
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.