Ds18s20

foley

Neues Mitglied
06. März 2008
51
0
0
Sprachen
Hallo zusammen,

nachdem ich gestern endlich Teile für meine Bastelwut erhalten habe gibt's schon wieder die ersten Probleme.

Bei der Lieferung waren auch zwei DS18S20 dabei.

Also mal schnell ins Datenblatt geschaut und angeschlossen.

Nun ja der Erfolg war etwas überraschend, dachte das wären Sensoren und keine Heizelemente, nun gut.
Dann also den zweiten dran und los.

Erfolg wieder Erwarten mässig, Spannung bricht zusammen und das ding wird heiss. :mad:

Gut jetzt mal ne andere Anschlussbelegung, ok.

Sensor wird nicht heiss, aber der mühsam dem i-net entlockten Bascom code gibt mir leider als Temperatur nur 127°C aus.

Jetzt mal die Frage jemand eine Idee woran es liegen könnte, oder hab ich die Sensoren schon gehimmelt?

Anbei der Bascom Code und der Link zum Datenblatt.

Code:
'------------------------------------------------------------------------------
' LCD:  Db4-Db7 = Portd.4-Portd.7 E = Portd.3 Rs = Portd.2 Backlight = Portb.1
' I2C:  Sda = Portc.4 Scl = Portc.5
' UART: RxD = Portd.0 TxD = Portd.1
' 1wire Portb.0
' Frei: Portb.2-Portb.5 Portc.0-Portc.3
'------------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 3686411

' LCD konfigurieren Port auf Ausgabe setzten und Pin's entsprechend zuordnen
Ddrd = &HFF
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2

' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert
Config 1wire = Portc.5

Dim Ar(2) As Byte

Cls

Do
 1wreset
 1wwrite &HCC
 1wwrite &H44
 Wait 1

 1wreset
 1wwrite &HCC
 1wwrite &HBE
 Ar(1) = 1wread(2)


 Locate 1 , 1
 Lcd Hex(ar(2)) ; Hex(ar(1))
 Locate 2 , 1
 Shift Ar(1) , Right , 1
 Lcd Ar(1)
Loop

End



Anschluss bei Figure 2 auf seite 4: sensor wird heiss.

Anschluss bei Figure 3 auf seite 4: ohne den Transistor gzw. mosfet. sensor zeigt 127°C an.

http://pdf1.alldatasheet.com/datasheet-pdf/view/58558/DALLAS/DS18S20.html

Danke schonmal im Vorraus.

Gruss Alex
 
Hallo Alex,

gehn wir mal Schritt für Schritt vor. Also:

1. Ich stelle mal die Hypothese in den Raum dass zu Dein Target mit VTG = 5V betreibst. Richtig?

2. Ich würde erstmal mit dem Sensor pragmatisch vorgehen und ihn nach Gefühl anschließen. Und zwar so:GND auf GND, VDD auf VCC bzw VTG und damit 5V und DQ würde ich direkt an einen PIN des µC und mit 10kOhm gegen VCC (PullUp) beschalten. Damit ist schon mal auf jeden Fall nix falsch gemacht.

3. Bauelemente die mal heisse worden sind (wie heiß? gabs Brandblasen?) vertraue ich erstmal überhaupt nicht mehr. Mein Tipp, erst mal weg damit! Erst wenn mit einem neuen die HW und der Cod ein Betrieb genommen ist kannst Du schau in wie weit der verbrutzelte Schaden genommen hat.

4. So, und dan der Code, hmm, ja, der Code:)
Zum DS18S20 gibt es ne ganze Menge Zeug im Internet. Ich selbst habe den Chip noch nicht in Betrieb genommen und BASCOM-Code dazu realisiert. Ich habe aber mal auf der Seite vom BASCOM-Hersteller unter:
http://www.mcselec.com/
und dem dort auch enthaltenen Forum nach DS18S20 gesucht und ne ganze Menge gefunden. Mein erster Tipp hierzu wäre, dort einfach mal reinzuschauen.

5. Dann hab ich noch was gefunden:
Some devices consume some more power during special operations. The DS1820 consumes a lot of power during the operation "Convert Temperature". Because the sensors knows how they are powered (it is also possible to get this information from the devices) some operations, as "Convert T" takes different amount of time for the sensor to execute. The command "Convert T" as example, takes ~200mS on 2-wire, but ~700mS on 1-wire. This has to be considered during programming.

6. Habe im BASCOM-Forum einen Code gefunden von Jacob Pirna der mir ganz vernünftig vorkommt:
Code:
' Beispiel für das myAVR Board 1 & 2 mit LCD und 1wire Temperatursensor an Pin 5 von Port C
$regfile = "m8def.dat"
$crystal = 3686411

' LCD konfigurieren Port auf Ausgabe setzten und Pin's entsprechend zuordnen
Ddrd = &HFF
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2

' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert
Config 1wire = Portc.5

Dim Dsid(8) As Byte
' Die Adresse meines DS1820 die ich vorher ermittelt habe
Dsid(1) = &H10 : Dsid(2) = &H68 : Dsid(3) = &H17 : Dsid(4) = &H25 : Dsid(5) = &H01 : Dsid(6) = &H08 : Dsid(7) = &H00 : Dsid(8) = &H98
Dim Sc(9) As Byte
Dim T As Integer
Dim T1 As Integer
Dim I As Byte

Cls
Cursor Off
Locate 1 , 1 : Lcd "Mein Termometer"

Do
 ' Alle angeschlossenen DS1820 zum Messen veranlassen
 1wreset
 1wwrite &HCC
 1wwrite &H44
 Waitus 200
 ' Den gewünschten Sensor auswählen
 1wverify Dsid(1)
 ' Kommando READ SCRATCHPAD
 1wwrite &HBE
 Sc(1) = 1wread(9)
 If Sc(9) = Crc8(sc(1) , 8) Then
  ' Genauere Temperaturberechnung auf 0,1 °C
  I = Sc(1) And 1
  If I = 1 Then Decr Sc(1)
  T = Makeint(sc(1) , Sc(2))
  T = T * 50
  T = T - 25
  T1 = Sc(8) - Sc(7)
  T1 = T1 * 100
  T1 = T1 / Sc(8)
  T = T + T1
  T = T / 10
  ' Temperatur in 0,1 Grad Schritten ausgeben
  Locate 2 , 1
  Lcd T ; " Grad"
 Else
  ' Wenn Fehler Scratchpad zur Kontrolle Hexadezimal ausgeben
  Locate 2 , 1
  ' Es passen nur 8 Byte auf das Display
  For I = 1 To 8
   Lcd Hex(sc(i))
  Next
 End If
 ' Ausgabe alle 0,5 Sekunden
 Waitms 500
Loop

End

Ich hoffe ich konnte Dir ein bissle weiterhelfen und ein wenig Querdenken. Fertig durchgekaute Komplettlösungen gibt es eh nur in seltenen Fällen:D

Nun wünsch ich Dir viel Spass,

Grüße,
Markus
 
Danke dir,

querdenken war in den letzten Tagen wirklich angesagt.

Es läuft:D

Jetzt gibt es ein anderes Problem:

Sämtliche Beispiele laufen nicht, ändere ich aber den $crystal auf 1000000, dann funktioniert es, hat jemand vielleicht eine erklärung dafür? :confused:

auf meinem board ist ein 3686400 quarz dran.

Gruss Alex
 
Hi Alex,

ich vermute sehr stark, dass Du noch mit den alten FUSE-Einstellungen arbeitest. Via Default rennt der Kerle nämlich mit internen 1.000.000 Hz und damit würde Deine Einstellung mit $crystal stimmen.
Ein externer Quarz bedeutet noch lange nicht, dass dieser auch verwendet wird. Du musst im Mega auf jeden Fall die FUSEs auf extern umkonfigurieren und auch noch berücksichtigen, mit wie vielen Herzen Du extern taktest. Das hat nämlich einfluss auf die Anschwingvorgänge und die Stabilisierung der Taktfrequenz. Siehe hierzu in Datenblatt zum Mega!

Ich behaupt, wenn Fuses richtig auf extern stehen und der externe Quarz beschaltet ist dann kannst Du auch korrekter Weise bei BASCOM mit der richtigen Crystal-Einstellung arbeiten!

Grüße,
Markus
 
Code:
' Beispiel für das myAVR Board 1 & 2 mit LCD und 1wire Temperatursensor an Pin 5 von Port C
$regfile = "m8def.dat"
$crystal = 3686411

' LCD konfigurieren Port auf Ausgabe setzten und Pin's entsprechend zuordnen
Ddrd = &HFF
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2

' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert
Config 1wire = Portc.5

Dim Dsid(8) As Byte
' Die Adresse meines DS1820 die ich vorher ermittelt habe
Dsid(1) = &H10 : Dsid(2) = &H68 : Dsid(3) = &H17 : Dsid(4) = &H25 : Dsid(5) = &H01 : Dsid(6) = &H08 : Dsid(7) = &H00 : Dsid(8) = &H98
Dim Sc(9) As Byte
Dim T As Integer
Dim T1 As Integer
Dim I As Byte

Cls
Cursor Off
Locate 1 , 1 : Lcd "Mein Termometer"

Do
 ' Alle angeschlossenen DS1820 zum Messen veranlassen
 1wreset
 1wwrite &HCC
 1wwrite &H44
 Waitus 200
 ' Den gewünschten Sensor auswählen
 1wverify Dsid(1)
 ' Kommando READ SCRATCHPAD
 1wwrite &HBE
 Sc(1) = 1wread(9)
 If Sc(9) = Crc8(sc(1) , 8) Then
  ' Genauere Temperaturberechnung auf 0,1 °C
  I = Sc(1) And 1
  If I = 1 Then Decr Sc(1)
  T = Makeint(sc(1) , Sc(2))
  T = T * 50
  T = T - 25
  T1 = Sc(8) - Sc(7)
  T1 = T1 * 100
  T1 = T1 / Sc(8)
  T = T + T1
  T = T / 10
  ' Temperatur in 0,1 Grad Schritten ausgeben
  Locate 2 , 1
  Lcd T ; " Grad"
 Else
  ' Wenn Fehler Scratchpad zur Kontrolle Hexadezimal ausgeben
  Locate 2 , 1
  ' Es passen nur 8 Byte auf das Display
  For I = 1 To 8
   Lcd Hex(sc(i))
  Next
 End If
 ' Ausgabe alle 0,5 Sekunden
 Waitms 500
Loop

End


Hallo Marcus,

ich habe mich eben hier im Forum angemeldet da ich mich seit ein paar Wochen hobbymäßig mit AVR beschäftige und habe zu dem genannten Code eine Frage.
Ich hab mir ein myAVR Board aufgebaut und das oben genannte Programm funktioniert auf einem Atmega8 soweit ganz gut nun ich bekomme auf dem LCD die Temperatur als ganze Zahl und ohne Komma angezeigt.
Ich weiß nicht wo ich das korrigieren kann bzw. wo den Fehler liegt, bin halt noch nicht so fit in Bascom.

Gruß
Nico
 
Hallo Nico,

Du verwendest zum Berechnen der Temperatur die Variablen T und T1 welche Du als Integer angelegt hast.

Integer sind zwei Byte große ganzzahlige Variablen welche als 16-Bit vorzeichenbehaftete Binärzahl im Wertebereich von -32,768 bis +32,767 im Speicher abgelegt werden. Mit Integer (oder auch Word) wirst Du nie und nimmer nicht Kommas sehen und bekommen da sie Ganzzahl-Variablen sind und bleiben.

BASCOM treibt Dein Verwirrspiel beim Rechnen mit Integer schon ein ganzes Stück weit mit. Es ist aber so, dass das Ergebnis einer Berechnung immer auf einen Integer gecastet wird, bedeutet, weg mit den Nachkommastellen. Somit bekommst Du immer nur die ganzen Zahlen.

Damit Du Nachkommastellen angezeigt bekommst musst Du Dein Programm bzw. die verwendeten Variablen so umbauen, dass Du sogenannte Fließkommazahlen bearbeiten kannst. BASCOM stellt hier die Datetypen "single" (32-Bit) und "double" (64-Bit) zur Verfügung. Da Dir bei der Temperatur meistens 2 Nachkommastellen reichen würde ich single verwenden.

Mach mal für T und T1 aus Integer Single und probiers aus!

Grüße,
Markus
 
Hallo Marcus,

vielen Dank für das Info.
Ich habe im Netz noch einen anderen Code für die Temp.Auswertung gefunden und das funktioniert sehr gut, sogar mit 0,1°C.
Hier ein Ausschnitt:
Code:
' Die Variablen:

Dim Dsid1(8) As Byte

Dim I1(9) As Byte

Dim I As Byte , Tmp As Byte
Dim Crc As Byte
Dim T As Integer , T1 As Integer
Dim Ia As String * 4

'----------------------Messung der Temperatur-----------------------------------


   1wreset
   1wwrite &H55
   1wverify Dsid1(1)
   1wwrite &HBE
   I1(1) = 1wread(9)


   1wreset
   1wwrite &HCC
   1wwrite &H44
Waitms 300
Waitms 300


If I1(8) = Crc8(i1(1) , 7) Then
Crc = 0
End If
   If Crc = 0 Then
   Tmp = I1(1) And 1
   If Tmp = 1 Then Decr I1(1)
   T = Makeint(i1(1) , I1(2))
   T = T * 50 : T = T - 25 : T1 = I1(8) - I1(7) : T1 = T1 * 100
   T1 = T1 / I1(8) : T = T + T1 : T = T / 10
   End If
      If Crc = 1 Then
      Cls
      Locate 4 , 1 : Lcd " Sensor Error! "
      Else
      Locate 4 , 1
      Lcd "WaterTemp:"
      If Crc = 0 Then
      Locate 4 , 12
      Ia = Str(t)
      Lcd Left(ia , 2) : Lcd "."
      Lcd Mid(ia , 3 , 1)
      Locate 4 , 16 : Lcd Chr(0) ; "C"
      End If

'-------------------------------------------------------------------------------
' zeigt an ob die Temperatur seit letzter Messung gestiegen oder gefallen ist
If T > T1 Then
Locate 4 , 19 : Lcd Chr(7)
Else
If T < T1 Then
Locate 4 , 19 : Lcd Chr(6)
End If
End If
End If

Loop
End

Return

Womit ich nicht klar komme ist, wie ich noch anzeigen kann ob die Temperatur seit letzter Messung gestiegen oder gefallen ist. Wenn ich den Code richtig verstanden habe ist T für die erste und T1 für die zweite Messung.
Ich habe mir zwei Up/Down-Pfeile definiert um damit diese Änderung zeigen zu können. Nun mit der von mir erstellten Abfrage funktioniert es leider nicht... :confused:
Irgendwie habe ich als Anfänger den Code doch nicht ganz verstanden...

Gruß
Nico
 
Hi,

joooo, so kann man's auch machen. Hier wird auch mit Integer gearbeitet. Der Trick hier ist das Arbeiten mit Strings und das Betrachten der ersten Nachkommastelle als ganze Zahl. Kann man schon auch so machen, weiß nur nicht was einfacher und verständlicher ist. :confused:

Aber wenigstens funzt es, egal auf welchem Weg.

Grüße,
Ma
 
hallo zusammen,
hole den thread nochmal hoch, man möge es mir verzeihen. :eek:

hab mehrere programmteile zusammen gebastelt und nur noch folgendes problem.

die temperatur wird nicht vollständig angezeigt. z.B. im moment zeigt er 2,6° an wobei es eigentlich 22,6° sind.

ich komm aber nicht drauf woran es liegt, hab vielleicht auch bretter vorm kopf.

wäre jemand mal so gütig mal drüber zu schauen.

Vielen dank im vorraus.

Gruss alex

Code:
$regfile = "m8def.dat"
$crystal = 1000000

' LCD konfigurieren Port auf Ausgabe setzten und Pin's entsprechend zuordnen
Ddrd = &HFF
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2


Deflcdchar 0 , 14 , 10 , 14 , 32 , 32 , 32 , 32 , 32        ' replace ? with number (0-7)

Config 1wire = Portc.5



'Config Portc.1 = Output
'Config Portc.2 = Output
'Config Portc.3 = Output
'Dim ___lcdno As Bit
'Licht Alias Portd.7
'Const An = 1
'Const Aus = 0
'Config Pind.6 = Output                                      'RW=0
'Portd.6 = 0
'Config Pind.7 = Output
'Config Portb.0 = Input
'Licht = An
'Config 1wire = Portb.1
'Config Lcdpin = Pin , E = Portc.3 , E2 = Portd.7 , Rs = Portc.2 , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5
'Config Lcd = 20 * 4a , Chipset = Ks077
'Config Lcdbus = 4
Cls
Initlcd
Wait 1
Cursor Off Noblink
Dim Min1 As Single
Dim Max1 As Single
Dim Raus As Single
Dim Ident(8) As Byte
'When used like this : DsId(1) = 1wread(8)
'DsId(1) = family code           'Ds1820 10h, DS18B20 28h, Ds18s20 10h
'DsId(2)                         '48 Bits Serial, LSB
'DsId(3)
'DsId(4)
'DsId(5)
'DsId(6)
'DsId(7)                         '48 Bits Serial, MSB
'DsId(8)                         '8 CRC

Dim Datenarry(9) As Byte                                    'Scratchpad 0-8 72 bits incl CRC, explanations for DS18b20
'Sc(1)                           'Temperature LSB
'Sc(2)                           'Temperature MSB
'Sc(3)                           'TH/user byte 1         also SRAM
'Sc(4)                           'TL/user byte 2         also SRAM
'Sc(5)                           'config                 also SRAM    x R1 R0 1 1 1 1 1 - the r1 r0 are config for resolution - write FF to byte for 12 bit - others dont care
'Sc(6)                           'res
'Sc(7)                           'res
'Sc(8)                           'res
'Sc(9)                           '8 CRC

'DALLAS DS18B20 ROM and scratchpad commands''''''''''''''''''''''''''1wwrite....
'&H 33  read rom - single sensor
'&H 55  match rom, followed by 64 bits
'&H CC  skip rom
'&H EC  alarm search  - ongoining alarm >TH <TL
'&H BE  read scratchpad
'&H 44  convert T

Cls
Wait 2
Ident(1) = 1wsearchfirst()                                  '64 Bit Nr einlesen jeder Dalas Sensor hat
' eine andere Nr.
Wait 1
Cls

'Init
Min1 = 999
' Main loop
Do
   Gosub Lesen                                              ' "Convert ALL T on the 1w-bus"
                                                  'if you use 2-wire, could be reduced to 200us

  1wverify Ident(1)                                         'Issues the "Match ROM "
  Locate 1 , 1
  If Err = 1 Then
   Lcd "ID-Nicht gefunden "                                 'Err = 1 if something is wrong
  Elseif Err = 0 Then
   'Locate 1 , 1
   'Lcd "                    "
   'Waitms 800                                              'Überspringe ROM
    1wreset
    1wwrite &HCC                                            'lcd " Sensor found"
    1wwrite &HBE
    Datenarry(1) = 1wread(9)                                'read bytes into array
    If Datenarry(9) = Crc8(datenarry(1) , 8) Then
    Gosub Wandler                                           ' Dg = Decigrades(sc(9))
      If Min1 > Raus Then Min1 = Raus
       If Max1 < Raus Then Max1 = Raus
        Locate 1 , 1
         Lcd "Mi " ; Fusing(min1 , "##.#") ; Chr(0) ; "C"
          'Locate 2 , 1
       'Lcd "Ma " ; Fusing(max1 , "##.#") ; Chr(0) ; "C"
    End If
  End If
Locate 2 , 1
  Lcd "Temp: " ; Fusing(raus , "##.#") ; Chr(0) ; "C"
  Wait 1
Loop
End
Lesen:
   1wreset                                                  ' reset the bus
   1wwrite &HCC                                             ' skip rom
   1wwrite &H44
   Waitms 750                                               ' Convert T
Return
 Wandler:

   Raus = Datenarry(2)
   Shift Raus , Left , 8
   Raus = Raus + Datenarry(1)
  If Raus => 2048 Then

   Raus = Raus / 16
   Raus = Raus - 4096                                       'Für negative Temperaturen
   Else

   Raus = Raus / 16
   End If
  Return
 
Hallo Leute,

Entschuldigt das ich das Thema nochmal ausbuddel aber besser als neues Thema zu eröffnen ich versuche verzweifelt das Programm bei mir zum laufen zu bekommen mit einem DS18B20, leider bisher ohne erfolg. Weis einer rat?
Hab mal den Code angehangen vieleicht shet ihr meinen fehler. Ich bekomme auf meinem LCD immer Nur ganz viele FFFFF raus.



Code:
' Beispiel für das myAVR Board 1 & 2 mit LCD und 1wire Temperatursensor an Pin 5 von Port C
$regfile = "m8def.dat"
$crystal = 3686411

' LCD konfigurieren Port auf Ausgabe setzten und Pin's entsprechend zuordnen
Ddrd = &HFF
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2

' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert
Config 1wire = Portc.5

Dim Sc(9) As Byte
Dim T As Integer
Dim I As Byte

Cls
Cursor Off
Locate 1 , 1 : Lcd "Mein Thermometer"

Do
 ' Alle angeschlossenen DS18B20 zum Messen veranlassen
 1wreset
 1wwrite &HCC
 1wwrite &H44
 Wait 1
 1wreset
 1wwrite &H55
 1wwrite &HBE

 Sc(1) = 1wread(9)
 If Sc(9) = Crc8(sc(1) , 8) Then
  T = Makeint(sc(1) , Sc(2))
  ' Die Nachkommastelle entfernen
  T = T / 2
  ' Temperatur in ganzen Grad Schritten ausgeben
  Locate 2 , 1
  Lcd T ; " Grad Celsius"
 Else
  ' Wenn Fehler Scratchpad zur Kontrolle Hexadezimal ausgeben
  Locate 2 , 1
  ' Es passen nur 8 Byte auf das Display
  For I = 1 To 8
   Lcd Hex(sc(i))
  Next
 End If
 ' Ausgabe alle 0,5 Sekunden
Loop

End


Danke gruß

B4dy
 
Hallo,

Ich bekomme auf meinem LCD immer Nur ganz viele FFFFF raus.

auf die Schnelle ...

FFFF bekommt man eigentlich wenn das IC nicht am Bus ist oder nicht reagiert.
Richtigen Pin im Programm verwendet, an dem auch das IC hängt ?

0000 würde man bekommen wenn der Bus kurzgeschlossen ist.

Gruß
Dino
 
naja also hab jetzt nen neue probiert geht auch nicht.#

Anschluss DS18B20.

GND --> GND
Vcc --> +5V
DQ --> Port C.5 und pullup 10k gegen +5V

Sollte stimmen nach datenblatt, und im prgramm habe ich auch Port C.5 als Eingang genommen.

Mhh ich verweifel schon!!!

HILFE
 
Hallo!

Wie kommst Du auf die 10k?
Ich lese aus dem Datenblatt 4k7!

MfG
caargoo
 
jo ich probiere halt wiederstände aus mit nem 4,7k bekomm ich das gleiche langsamm weis ich wirklich nichtmehr was da noch schief geht
 
Hi!

Code:
1wreset
 1wwrite &HCC
 1wwrite &H44
 Wait 1
[B][COLOR="Red"] 1wreset
 1wwrite &H55[/COLOR][/B]
1wwrite &HBE

Ich verstehe nicht warum Du nochmals nach der 1 Sekunde Wartezeit einen 1Wire-Reset machst. Was soll das Senden von &H55?

Lass den Reset ein dei H55 mal weg sondern sende direkt das HBE zum Lesen der Messwerte und dann sollte es meiner Meinung nach funktionieren.

Grüße,
Markus
 
Hi Leute,

ich möchte gerne einen/mehrere Temperatursensoren vom Typ DS18S20 mit einem Atmega8 betreiben und mir die ausgegeben Temperatur auf einem LCD Display darstellen lassen.

Jetzt zu meinem Problem: egal welchen Code ich dafür ausprobiert habe ich bin immer dabei gelandet, dass ich eine Fehlermeldung des Sensors erhalten habe. Hier mal ein Beispiel-Code aus einem Buch zu Bascom (Kühnel):

Code:
$regfile = "m8def.dat"
$crystal = 1000000
$baud = 9600

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db7 = Portd.7 , Db6 = Portc.3 , Db5 = Portd.6 , Db4 = Portc.2 , E = Portc.1 , Rs = Portd.2
Initlcd

Config 1wire = Portb.0

Const Ds18s20 = &H10

Const Skiprom = &HCC 'Überspringe Rom Kommandos
Const Read_rom = &H33 'lese Rom
Const Convertt = &H44 'Start Temperaturmessung
Const Read_ram = &HBE 'Lese Scratchpad Ram
Const Write_ram = &H4E 'Schreibe Scratchpad RAM
Const Copy_ram = &H48 'Kopiere Scratchpad RAM
Const Recall_ee = &HB8 'Kopiere EEPROM nach RAM
Const Read_power = &HB4 'Abfrage Spannung

Dim Family_code As Byte
Dim Serial_number(6) As Byte 'Sensor Seriennummer
Dim Crc As Byte 'DS18S20 Crc
Dim Scratch(9) As Byte 'Scratchpad RAM Kopie

Dim I As Byte
Dim Temp As Word
Dim Temp1 As Integer
Dim Stemp As Single

Do
1wreset
If Err = 1 Then Lcd "Sensor Fehler"
Wait 1
Cls

1wwrite Read_rom 'Lese ROM Kommando

Family_code = 1wread() 'Auslesen ROM Inhalt
Lcd Family_code
Wait 5
Cls
For I = 1 To 6
Serial_number(i) = 1wread()
Next
Crc = 1wread()

If Family_code <> Ds18s20 Then Exit Do

1wwrite Convertt 'starte Temperaturmessung

Wait 2 'warte Temperaturmessung ab

Do
Temp = 1wread()
Loop Until Temp = &HFF 'warte bis Temperaturmessung beendet ist

1wreset
If Err = 1 Then Lcd "Sensor Fehler"
Wait 1
Cls

1wwrite Skiprom
1wwrite Read_ram

For I = 1 To 9
Scratch(i) = 1wread()
Next

Temp = Scratch(2)
Shift Temp , Left , 8

Temp = Temp + Scratch(i) 'Word Format
Temp1 = Temp 'Integer Format
Lcd "T=" ; Temp ; "Counts."
Wait 1
Cls
Temp1 = Temp1 / 2
Lcd "T=" ; Temp1 ; "Grad Celsius"
Wait 1
Cls
Stemp = Scratch( - Scratch(7) 'Interpolation
Stemp = Stemp / Scratch(
Stemp = Stemp + Temp1
Stemp = Stemp - 0.25
Lcd "exakte T="
Wait 1
Cls
Lcd Fusing(stemp , "#.##")
Wait 1
Cls
Lcd "Grad Celsius"
Wait 2
Cls

Loop

Lcd "Kein Temperatursensor"
Wait 1
Cls

End

Der Family Code sollte H10 also 16 betragen aber ausgegeben wird mir 256. Dieses Programm ist eigentlich für einen DS1820 geschrieben worden, liegt hier vielleicht das Problem? Im Datenblatt des DS18S20 (http://pdfserv.maximintegrated.com/en/ds/DS18S20.pdf) finde ich auch gar keinen Family Code...
Bei anderen getesteten Programmen (siehe http://www.avr-praxis.de/forum/showt...hp?108-Ds18s20 , http://bascom-forum.de/showthread.ph...ng-mit-DS18S20 , http://mikrocontroller.jacob-pirna.d..._ds1820_2.html) kam teilweise auch einfach der Standard Wert von 127° heraus.
Ich habe den Sensor genau wie im Datenblatt beschrieben angeschlossen, 1 auf GND , 2 mit 4,7k Vorwiderstand auf Vcc und 3 auf Vcc. 2 hab ich dann mit meinem Anschluss B0 am Atmega8 verbunden. D.h. ich hab den Sensor mit einer externen Spannung versorgt und ihn nicht parasitär betrieben.
Ich habe auch bereits verschiedene DS18S20 Sensoren getestet, die waren alle neu aber bei allen kam die gleiche Fehlermeldung (Zahl) heraus.
Kann mir jemand weiterhelfen und erklären wo hier das Problem liegt?

Gruß Mo und schonmal Danke im vorraus!
 
Hi,

ist das nun der Code den du wirklich verwendest oder nur einfach der aus dem Buch hier reingesetzt?

Der Family Code sollte H10 also 16 betragen aber ausgegeben wird mir 256.
Das deutet normalerweise darauf hin das der 1Wire-Bus vom Slave (dem DS18S20) nicht bedient wird. Das passiert auch wenn am Bus garkein Slave angeschlossen ist.

Dieses Programm ist eigentlich für einen DS1820 geschrieben worden, liegt hier vielleicht das Problem? Im Datenblatt des DS18S20 (http://pdfserv.maximintegrated.com/en/ds/DS18S20.pdf) finde ich auch gar keinen Family Code...
Sieh mal auf Seite 6 ... "64-BIT LASERED ROM CODE" da steht doch alles.
DS1820 und DS18S20 sollten gleich reagieren. Es gibt nach meiner Info auch nur noch den DS18S20. Da steht aber auch manchmal nur DS1820 drauf oder man bekommt welche mit dem Aufdruck geliefert. Funktionieren aber beide.

Warum fragst du die Temperatur ab wenn noch nichtmal die rohen Daten vernünftig rauskommen?
Reduzier doch einfach mal dein Programm soweit das du nur noch die ausgelesenen 9 Bytes (siehe Seite 7 im Datenblatt) auf nem LCD anzeigen läßt. Wenn das läuft, dann kann man weitersehen. Warum muß man immer den Fehler im ganzen Haus (Programm) suchen wenn nur der Wasserhahn leckt?

Ich habe den Sensor genau wie im Datenblatt beschrieben angeschlossen, 1 auf GND , 2 mit 4,7k Vorwiderstand auf Vcc und 3 auf Vcc. 2 hab ich dann mit meinem Anschluss B0 am Atmega8 verbunden. D.h. ich hab den Sensor mit einer externen Spannung versorgt und ihn nicht parasitär betrieben.
Ich habe auch bereits verschiedene DS18S20 Sensoren getestet, die waren alle neu aber bei allen kam die gleiche Fehlermeldung (Zahl) heraus.
Meißt liegt das Problem in einem falschen Anschluß (die beiden äußeren Pins vertauscht). Also versuch mal die Phantomspeisung. Dabei müssen die beiden äußeren Pins beide auf GND. Dann kann man nix mehr vertauschen und es ist wieder eine Fehlerquelle weg.

Dann ... hast du wirklich nirgendwo Wackelkontakte, kalte Lötstellen oder was anderes drin? Hast du wirklich alles richtig angeschlossen? Notfalls reiß es nochmal ab und bau es neu auf. Meißt wirst du beim Abreißen dann auch einen Schaltungsfehler finden (ging mir auch schon öfters so).

Soweit erstmal.

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)