auslesen eines DS1820 m. Atmega128

Gast #475261
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
Gast #475269
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
Gast #475274
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
Gast #475278
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.
Gast #475280
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren