Gast
#475261
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