Forum: Mikrocontroller und Digitale Elektronik auslesen eines DS1820 m. Atmega128


von Tom (Gast)


Lesenswert?

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

von A.K. (Gast)


Lesenswert?

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.

von Tom (Gast)


Lesenswert?

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

von A.K. (Gast)


Lesenswert?

Ein externer Pullup 4K7 ist schon nötig und im Datasheet unübersehbar in 
jedem Anschlussbeispiel drin.

2- oder 3-adrig angeschlossen?

von Tom (Gast)


Lesenswert?

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

von A.K. (Gast)


Lesenswert?

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.

von A.K. (Gast)


Lesenswert?

Apropos: Der Sensor bezieht seinen Strom während der Messung nicht über 
den Pullup-Widerstand, sondern über einen aktiven Pullup.

von Tom (Gast)


Lesenswert?

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.

von A.K. (Gast)


Lesenswert?

> Hab' noch mal ohne die 750ms Pause probiert, funktioniert auch so noch.

Mit Warteschleife, nehme ich an.

von A.K. (Gast)


Lesenswert?

...Abfrageschleife meinte ich natürlich.

von Tom (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.