- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 35

Thema: DS18B20 zu hoher Temperaturwert!

  1. #11
    Benutzer Stammmitglied Avatar von Socke
    Registriert seit
    04.10.2005
    Ort
    Speyer
    Beiträge
    44
    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen,
    beim DS18B20 müssen 2 Bytes gelesen werden und dann durch 16 geteilt werden.
    Gruß Socke

  2. #12
    Hi Leute,
    ich habe jetzt den Wirdestand drin, leider bekomme ich nur am LCD 255 angezeigt. Ich verwende übrigend den DS18S20+
    Muss ich da am Code was anders machen?

    Gruß
    SteKoLos
    www.ldap2doc.de -geniale MS Wordvorlagen Schnittstelle zum MS Active Directory-

  3. #13
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von stekolos
    Muss ich da am Code was anders machen?
    Welchen Code benutzt du denn?

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.07.2008
    Ort
    Villingen-Schwenningen
    Beiträge
    143

    So funktioniert's!

    Hi,

    so wie ich deinen Code interpretiere, liest du nur 1 byte aus. Der Sensor liefert aber 2 Byte als Temperaturwert. Am besten das komplette Scratchpad auslesen (also 9 Byte einschließlich CRC).

    Ich hab das so gemacht:

    ' ROM-Kommandos
    Const DS_SEARCH_ROM = &hF0
    Const DS_READ_ROM = &h33
    Const DS_MATCH_ROM = &h55
    Const DS_SKIP_ROM = &hCC
    Const DS_APARL_SEARCH = &hEC

    ' Funktions-Kommandos
    Const DS_CONVERT = &h44
    Const DS_WRITE_SCRATCHPAD = &h4E
    Const DS_READ_SCRATCHPAD = &hBE
    Const DS_COPY_SCRATCHPAD = &h48
    Const DS_RECALL = &hB8
    Const DS_READ_POWER_SUPPLY = &hB4

    Dim BusData(9)
    Dim DSTemp as Integer at DSData(1) Overlay
    Dim Temperatur as Single

    1wreset pind , 4
    1wwrite DS_SKIP_ROM , 1 , pind , 4
    1wwrite DS_READ_SCRATCHPAD , 1 , PinD , 4
    BusData(1) = 1wread(9 , PinD , 4) ' 9 Datenbyte ins Array laden
    Waitms 800
    1wreset pind , 4
    1wwrite DS_SKIP_ROM , 1 , pind , 4
    1wwrite DS_CONVERT , 1 , pind , 4

    ' Temperatur aus Array BusData lesen und umrechnen
    Temperatur=DSTemp/2

    Das Programm ist auf einen einzelnen Sensor am Bus ausgelegt (Skip Rom). Das kannste aber umschreiben für deine Zwecke.

    Mitch.

  5. #15
    Hallo zusammen,

    nach längerem melde ich wieder zurück.
    Ich habe den Code von Mitch64 getestet, leider geht es nicht.

    Ich benutze das AVRFunk Board von Pollin mit einem Mega8 und Bascom.

    Weiter habe ich den Temperatursensor DS18S20+ an PortB4 über die parasitäre Stromversorgung angeschlossen. (direkte Versugrung geht leider auch nicht)

    Meine Fragen: Laut Datenblatt muss ich dem 1Wire Bus mitteilen wie die Stromversorgung erfolgt. Wie kann ich das machen?

    Kann ich den 1Wire Bus an einem beliebigen PIN des Mega8 machen?
    Hat jemand das Pollin Board mit dem DS18S20+ im Einsatz?

    Muss der exterene Quartz einen bestimmten Wert haben? Derzeit habe ich einen 12MHz drin.

    Der Sensor wurde auch nicht mit dem Code gefunden:
    http://www.rn-wissen.de/index.php/Ba...er_Ger.C3.A4te

    Ich verzweifle langsam, aber ich denke es muss eine rationale Lösung geben.

    Für eure Ideen schon mal besten Dank.

    Gruß SteKoLos
    www.ldap2doc.de -geniale MS Wordvorlagen Schnittstelle zum MS Active Directory-

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.07.2008
    Ort
    Villingen-Schwenningen
    Beiträge
    143
    Hallo SteKoLos,

    Beim 1Wire-Bus muss das Timing stimmen. Du kannst da nicht einfach irgend ein Quarz rein drücken nach belieben.

    Du must unbedingt in den Fusebits den externen Quarz einstellen. Und in deinem Code muss dann auch der 12MHz angegeben werden ($Crystal=12000000), sonst wird das nichts.

    Wenn das nicht stimmt, geht natürlich nichts. Den Temperatursensor kannste im Prinzip an jeden Pin hängen, allerdings muss das im Source dann auch so konfiguriert bzw. angepasst werden.

    Vielleich postest du mal deinen Code. Dann kann man dir bestimmt besser helfen.

    Mitch.

  7. #17
    Hallo Mitch,

    das dachte ich mir eben, ich habe gerade im Netz gesucht.

    Kannst du mir sagen wie ich die Fusebits einstellen muß?
    Ich benutze Bascom und PonyProg. Ich habe gelesen, dass das mit den FuseBits nicht ganz ohne Gefahr verbunden ist. Ich kenne mich damit leider noch garnicht aus. Bin eben neu in der Materie.

    Gruß
    SteKoLos
    www.ldap2doc.de -geniale MS Wordvorlagen Schnittstelle zum MS Active Directory-

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.07.2008
    Ort
    Villingen-Schwenningen
    Beiträge
    143
    Ich stelle die Fuses immer mit Bascom ein. Mit Poniprog geht das auch, aber ich kenne das Teil zu wenig.

    Ich vermute einfach mal, dass dein Atmega mit 1MHz internem Takt läuft. Du kannst ja mal spaßeshalber im Code den Wert von $Crystal auf 1000000 einstellen, compilieren und Proggen. Wenns dann geht, liegt es an den Fuses.

    Hab da etwas gefunden, was dir weiter helfen sollte:http://wiki.ctbot.de/index.php/Ponyprog

    Soweit ich das auf die schnelle Blicke musst du die Fuses CKSEL3 bis CKSEL0 einstellen. Wenn du mit Bascom Flashen kannst, kann ich dir besser weiter helfen.

    Bascom zeigt mir an, beim ATmega8, wenn ich den auf externes Quarz schalten würde, dass die Einstellung SUT=11 und CKSEL=1111 in Ordnung wäre. Diese Bits setzen. Ob ein gesetztes Häkchen=1 entspricht muste noch raus bekommen.

  9. #19
    Hallo zusammen,

    ich habe folgende Konfiguration der Fuse Bits:
    (in PonyProg)
    BOOTSZ1
    BOOTSZ0
    SUT0
    CKSEL3
    CKSEL2
    CKSEL1
    Häcken drin, was beutet: BIT = 0
    Bei den Andern FuseBits ist nichts aktiviert was BIT =1 bedeutet.

    An meinem Pollin Board habe ich ein zweizeiliges LCD dran, diese funktioniert auch.
    Ich habe verwende den internen Quarz, hoffe ich jedenfalls.

    Nach dem ich jetzt das Programm (siehe unten) hochgeladen habe, erhalte ich auch die Seriennummern der Sensoren.
    Wenn ich einen Sensor abklemme erhalte ich auch die Fehlermeldung, das der entsprechende Sensor nicht am Bus ist.

    Leider erhalte ich nur irgendwelche Werte als Min, MAX und aktuelle Temperatur.
    Kann es sein, dass der Code mit der Umwandlung der 9 Bits falsch ist?
    oder muss ich einen speziellen Quarz verwenden?
    Im Anhang ist die LCD Ausgabe.
    Das Beispiel ist von dem Bascom Hersteller MCS.


    Folgenden Code habe ich drin:

    Code:
    $regfile "m8def.dat"
    $crystal = 1000000
    
    Declare Sub Init
    Declare Sub Convallt                                        ' Convert T on ALL sensors
    Declare Function Decigrades(byval Sc(9) As Byte) As Integer
    
    
     Config Lcd = 16 * 2                                        'wir verwenden ein 16*2 Zeichen Display
     ' Im I/O Mode wird jeder Prozessor Pin einzeln angegeben
     Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portd.5 , Rs = Portd.6
    
    Cursor Off Noblink
    
    Config 1wire = Portd.4                                      '0,1,2 NOP 3,4,5,6,7 works good ON MY Equipment
    
    'Temp variables
    Dim B As Byte
    Dim W As Word
    
    'Program variables
    'Implicit Err created by compiler
    Dim Dg As Integer                                           'DECIgrades, I call it, cause I have no space for commas on the display....
    Dim Min1 As Integer
    Dim Min2 As Integer
    Dim Max1 As Integer
    Dim Max2 As Integer
    
    Dim Dsid1(8) As Byte                                        'Dallas ID 64 bits incl CRC
    Dim Dsid2(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 Sc(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
    
    Lcd "This is a 2sensor DS18B20 thermometer"
    Locate 2 , 1
    Lcd " by gote@sys-op.com"
    
    For B = 1 To 20
     Shiftlcd Left
     Waitms 250
    Next
    
    Cls
    W = 1wirecount()
    
    ' Here I assume 2 sensors - no errorcontrol made, but would be easy to do with the "Err"-variable
    ' Getting the two sensors IDs.
    Dsid1(1) = 1wsearchfirst()
    Do
     Dsid2(1) = 1wsearchnext()
    Loop Until Err = 1
    
    ' If displayed, everything went well.
    ' First sensor identified and stored in variable
    If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       ' Control that the received CRC match the calculated
     Locate 1 , 1
     Lcd "CRC OK Sensor 1 ID"
     Wait 1
     Locate 1 , 1
     For B = 1 To 8
     Lcd Hex(dsid1(b))
     Next
    End If
    
    ' Second sensor
    If Dsid2(8) = Crc8(dsid2(1) , 7) Then
     Locate 2 , 1
     Lcd "CRC OK Sensor 2 ID"
     Wait 1
     Locate 2 , 1
     For B = 1 To 8
     Lcd Hex(dsid2(b))
     Next
    End If
    Wait 1
    Cls
    
    Init
    
    ' Main loop
    Do
     Convallt                                                   ' "Convert ALL T on the 1w-bus"
     Waitms 800                                                 'if you use 2-wire, could be reduced to 200us
    
     1wverify Dsid1(1)                                          'Issues the "Match ROM "
     Locate 1 , 1
     If Err = 1 Then
     Lcd "Err "                                                 'Err = 1 if something is wrong
     Elseif Err = 0 Then                                        'lcd " Sensor found"
     1wwrite &HBE
     Sc(1) = 1wread(9)                                          'read bytes into array
     If Sc(9) = Crc8(sc(1) , 8) Then
     Dg = Decigrades(sc(9))
     If Min1 > Dg Then Min1 = Dg
     If Max1 < Dg Then Max1 = Dg
     Lcd Dg : Locate 1 , 7 : Lcd Min1 : Locate 1 , 14 : Lcd Max1
     End If
     End If
    
     1wverify Dsid2(1)
     Locate 2 , 1
     If Err = 1 Then
     Lcd "DsId2 not on bus "
     Elseif Err = 0 Then                                        ' lcd " Sensor found "
     1wwrite &HBE
     Sc(1) = 1wread(9)
     If Sc(9) = Crc8(sc(1) , 8) Then
     Dg = Decigrades(sc(9))
     If Min2 > Dg Then Min2 = Dg
     If Max2 < Dg Then Max2 = Dg
     Lcd Dg : Locate 2 , 7 : Lcd Min2 : Locate 2 , 14 : Lcd Max2
     End If
     End If
     Wait 1
    Loop
    End                                                         'end program
    
    'Sets variables and LCD for further use'''''''''''''''''''''''''''''''''''''''''
    Sub Init
     Cls
     Lcd " Min Max"
     Locate 2 , 1
     Lcd " Min Max"
     Min1 = 999                                                 ' to get a real value from start
     Min2 = 999
    End Sub
    
    'Makes the Dallas "Convert T" command on the 1w-bus configured in "Config 1wire = Portb. "
    'WAIT 200-750 ms after issued, internal conversion time for the sensor''''''''''
    'SKIPS ROM - so it makes the conversion on ALL sensors on the bus simultaniously
    'When leaving this sub, NO sensor is selected, but ALL sensors has the actual
    'temperature in their scratchpad ( within 750 ms )
    Sub Convallt
     1wreset                                                    ' reset the bus
     1wwrite &HCC                                               ' skip rom
     1wwrite &H44                                               ' Convert T
    End Sub
    
    'Makes a integer value of the first two bytes in scratchpad'''''''''''''
    'Works on DS18 B 20 , observe "B". The R0 and R1 in Sc(5) tells you how many bits are accurate
    
    
    Function Decigrades(byval Sc(9) As Byte)
     Decigrades = 0
     Decigrades = Makeint(sc(1) , Sc(2))
     Decigrades = Decigrades * 10
     Decigrades = Decigrades / 16
    End Function
    
    ' If you have DS1820 or DS18 S 20 , you can use this algo instead:
    ' Observe that DsId1(1) contains the info value of which sensor is used.
    
    '(
    Function Decigrades(byval Sc(9) As Byte)
    Dim Tmp As Byte , T As Integer , T1 As Integer
    
     Tmp = Sc(1) And 1                                          ' 0.1C precision
     If Tmp = 1 Then Decr Sc(1)
     T = Makeint(sc(1) , Sc(2))
     'Print Hex(t)
     'Print T
     T = T * 50                                                 'here we calculate the 1/10 precision like
     T = T - 25                                                 'DS18S20 data sheet
     T1 = Sc(8) - Sc(7)
     T1 = T1 * 100
     T1 = T1 / Sc(8)
     T = T + T1
     Decigrades = T / 10
    'As integer, this routine gives T*10, with 1/10 degree precision
    End Function
    ')
    [/code]
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken lcd_142.jpg  
    www.ldap2doc.de -geniale MS Wordvorlagen Schnittstelle zum MS Active Directory-

  10. #20
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.07.2008
    Ort
    Villingen-Schwenningen
    Beiträge
    143
    Hallo,

    du machst aber ne komische Umrechnung.
    Da braucht man doch garnix viel rechnen.

    Definier doch einfach eine Integervariable als Overlay auf die Arrayadresse. Das ist viel bequemer.

    Du hast ja dein Array so definiert:
    Dim Sc(9) as Byte

    Wenn die Daten eingelesen sind, ist der Temperaturwert in Sc(1) und Sc(2) und zwar in der Reihenfolge Lowbyte dann Highbyte.

    Definier eine Variable z.B.

    Dim TemperaturInteger as Integer at Sc(1) overlay

    und eine Single-variable für den Realwert.

    Dim Temperatur as Single

    Dann die Variable lesen und du hast fast den Temperaturwert. Noch durch 2 Teilen bei Auflösung 0,5°C oder durch 10 bei Auflösung 0,1°C.

    Temperatur=TemperaturInteger/2 ' in °C mit Kommastelle

    Das sollte bei allen DS18xxx funktionieren.

    Mitch

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test