-         
Ergebnis 1 bis 10 von 10

Thema: DS18B20 ID-auslesen - spezielles Thema

  1. #1

    DS18B20 ID-auslesen - spezielles Thema

    Anzeige

    Hallo Freunde.

    Wie es die Überschrift bereits verrät, ist mein Thema spezieller Natur und ich komme definitiv mit den Standard-Themen rund um den DS18B20 Temperatursensor nicht weiter.

    Da ich nicht mit Laufen das Gehen lernen möchte, möchte ich mich zunächst erst einmal um das 1-Wire-Busverfahren kümmern. Das Auslesen der Termperatur kann ich später immer noch mal ^^.
    Mein Problem liegt beim Auslesen der eingebrannten Seriennummer des Sensors. Soweit ich mich belesen habe, besteht dieser aus 3 Blöcken und zum Ansteuern mehrerer Datenbusse muss ich die gesamte Kennung auslesen und auch vollständig zur Adressierung eintragen können.

    Meine Frage nun ist also: Wie lese ich die ID vollständig aus?
    Wie lasse ich sie mir anzeigen?

    Zur Verfügung habe ich lediglich mein STK500 sowie einen einfachen Programmer (DIAMEX-AVR), Bascom in der Vollversion sowie ein 2-Zeilen-Display, direkt an das STK500 angeschlossen.

    Ich fand bislang nur Möglichkeiten, die Seriennummer in einem Array auszuwerten/anzuzeigen, aber dieses wurde immer mit einem Print-Befehl ausgegeben. Habe jedoch keine weitere Ausgabemöglichkeit.


    LG - Maik

    - - - Aktualisiert - - -

    Hm, anscheinend ist mein DS18B20 defekt.

    Angeschlossen ist er korrekt (Pin 1 an GND, Pin 3 an VDD (+5V), Pin 2 an PortC.5 sowie mit einem 4,7K-Widerstand an +5V). Wenn ich ihn ansteuere (Code unten) und nur die Temp auslesen möchte, bekomme ich immer ein FFFF in der ersten Zeile und in der 2ten steht nur eine 127, die sich nicht ändert.
    Soweit ich es mitbekommen habe, antwortet der Bus nicht, weshalb die FFFF erzeugt werden. Da ich keinen 2ten unterwegs mit habe, muss ich also bis zum Wochenende warten. Scheiße teuer die Dinger und dann auch noch kaputt.

    Code:
    $regfile = "m8def.dat"
    $crystal = 3686411
    $hwstack = 40
    $swstack = 16
    $framesize = 32
    $baud = 4800
    
    
    
    
    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
    Cursor Off
    
    
    Config 1wire = Portc.5
    
    
    Dim Ar(2) As Byte
    
    Cls
    
    Do
     1wreset
     1wwrite &HCC
     1wwrite &H44
     Waitms 500
     1wreset
     1wwrite &HCC
     1wwrite &HBE
     Ar(1) = 1wread(2)
    
     Waitms 500
     Locate 1 , 1
     Lcd Hex(ar(2)) ; Hex(ar(1))
     Locate 2 , 1
     Shift Ar(1) , Right , 1
     Lcd Ar(1)
    Loop
    
    End

    LG - Maik

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Maik,
    du schreibst, dass du die ID auslesen willst, dein Code liest aber die Temperatur.
    Bist du sicher, dass du einen Quarz mit der krummen Frequenz von 3686411 angeschlossen hast?
    Dass 1-wire Timing ist ziemlich empfindlich und da kann eine falsche Frequenzangabe den Unterschied machen.

  3. #3
    Hallo.

    Um ehrlich zu sein, habe ich zum QuarzTiming bislang noch gar nichts heraus gefunden. Die meisten Auslese- und Ansteuerungsprogramme, die man sich im Internet zusammensuchen kann, haben komplett unterschiedliche Frequenzen. Manche arbeiten mit 4MHz, manche mit 8MHz, andere sogar mit 12 oder 16MHz. Dieser hier hatte diese krumme Freequenz.

    Nein, einen Quarz habe ich nicht angeschlossen. Sollte es etwa daran liegen, dass ich den DS18B20 nicht ansteuern oder auslesen kann? Ich wollte wenigstens erst einmal eine Verbindung hinbekommen. Da das zuletzt mit dem Auslesen der ID nicht klapperte, versuchte ich das direkte Temp-Auslesen, aber ohne Erfolg. Darum auch dieser Code zum Auslesen der Temp.

    Habe verschiedene Code-Beispiele gestern Abend versucht, aber alle ohne Funktion. Seltsamerweise: Wenn ich den 4,7K-Widerstand mitsamt der VDD-Zuleitung vom Sensor (Pin 2) trenne und nur die reine Datenleitung zum Eingangspin stehen lasse, ändert sich der ausgegebene Wert von FFFF / 127 auf 0000 / 027 (das "/" symbolisiert die Zeilentrennung).



    LG - Maik

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Maik,
    die Angabe bei Crystal muss schon mit der tatsächlichen Frequenz des Controllers übereinstimmen.
    Wenn du keinen Quarz dran und die Fuses noch nie geändert hast, läuft der Mega8 standardmäßig auf 1MHz, glaube ich.
    Lass doch mal eine LED mit Wait 1 togglen und schau, ob die auch im 1sec Takt blinkt.
    Ansonsten nimm mal 1MHz bei Crystal.
    Ich meine mich aber zu erinnern, dass 1MHz zum sicheren Auslesen der Sensoren nicht reicht.
    Bevor dein Takt nicht korrekt ist, brauchst du dich mit den Sensoren gar nicht zu beschäftigen.

  5. #5
    Meine Controller konfiguriere ich mit der entsprechenden Fuse unter AVR-Studio immer mit 8MHz +64ms. So liefen die Zeitablauftabellen bislang immer korrekt (1 Sekunde war auch eine Sekunde ^^).

    Der Takt wird wie bereits geschrieben ohne Quarz intern erzeugt.
    Welche Frequenz muss ich denn haben, damit 1-Wire bzw. der DS18B20 richtig läuft? Mal noch mal ins Datenblatt schauen...

    Edit: Leider steht nichts Genaueres (bzw. für mich Erkennbares) im Datenblatt.


    LG - Maik
    Geändert von stardust19322 (27.11.2014 um 22:12 Uhr)

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Mit den 8MHz wird 1-wire funktionieren, also setze die bei Crystal rein.
    Dann probiere es noch einmal.

  7. #7
    Da kreigste doch die Tür nicht zu. Ich steh im Wald und seh den Baum nicht ^^.

    Jetzt zeigt der Sensor einen Hex-Wert von 0550 und einen Temperaturwert von 40, allerdings ändert sich dieser auch nicht, wenn ich ihn mit der Hand erwärme. Muss ich mal ein anderes Programm suchen ^^.


    LG - Maik

    - - - Aktualisiert - - -

    Danke dir gaaaanz lüb, for_ro. Dank deiner Hilfe konnte ich den Sensor nun auslesen.
    Leider ändert sich bei der Temperatur nichts. Mit unterschiedlichsten Code-Beispielen ändert sich nur der Ausgangswert. Erwärme ich den Sensor, tut sich gar nichts, selbst nach Miinuten nicht. Steht im jetzigen Programm nur auf 680°C:

    Code:
    Dim Dsid(8) As Byte
    ' Die Adresse meines DS1820 die ich vorher ermittelt habe
    Dsid(1) = &H28 : Dsid(2) = &H7A : Dsid(3) = &H42 : Dsid(4) = &HDB : Dsid(5) = &H05 : Dsid(6) = &H00 : Dsid(7) = &H00 : Dsid(8) = &H83
    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
      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
     Waitms 500
    Loop

    LG - Maik
    Geändert von stardust19322 (27.11.2014 um 23:37 Uhr)

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Maik,
    so wird das nichts!
    Du nimmst dir irgendwelche Programme aus dem Internet, die wie dein letztes überhaupt nicht zu dem Sensor passen.
    Dort steht DS1820, du hast einen DS18B20.
    Außerdem braucht der Sensor 750ms zur vollständigen Konvertierung, du gibst ihm aber nur 200µs.
    Nimm wieder dein ursprüngliches Programm und erhöhe die Wartezeit nach dem &H44.
    Die angezeigten 0550 sind der Standardwert, den der Sensor ausgibt, wenn er keine vollständige Konvertierung abgeschlossen hat. Die entsprechen 85° C.

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.11.2013
    Ort
    Home
    Beiträge
    212
    Hallo standust19322,

    sende mal mein Testprogramm. Habe versucht alles auf deiner Hardware anzupassen, aber noch mal prüfen. Wichtig ist die Einstellung auf 8MHz ob intern oder Quarz ist Wurst.
    Auf der schnelle noch ein paar Kommentare eingefügt.


    Code:
    '****************** Test-Platine ************************
    '* ist ein Testmodul für Digital Temperatur-Sensoren    *
    '* [DS18x20] DS18S20 ist ein 9 Bit Family Adr &H10      *
    '* und DS18B20 ein 12 Bit Family Adr &H28               *
    '* somit große Unterschiede bei der "Empfindlichkeit"   *
    '* Das lesen der Bit's ist somit auch Unterschiedlich.  *
    '********************************************************
    
    $regfile = "m8def.dat"
    $crystal = 8000000                                          'int 8MHz
    $hwstack = 40
    $swstack = 32
    $framesize = 32
    $baud = 4800
    
    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                                         'dies ist die Kennung für Lib Lcdpin
    Cursor Off Noblink                                          'Aus und nicht blinken
    Lcdinit
    Waitms 100
    'für Test die am Port B.0 angeschlossenen Temperatursensoren
    Declare Sub Ds1820_alleseriennummern()
    'Temperatursensor Anschluß an Portpin B.0
    Dim 1wtemp_adresse_1(8) As Byte                             ' Adresse des Temperatursensors 1
    Dim 1wtemp_adresse_2(8) As Byte                             ' Adresse des Temperatursensors 2
    Dim Temp_bytes(9) As Byte
    Dim Tempdif As Integer
    Dim Tempdif1 As Integer                                     'Variable zur Temp. Berechnung DeziGrad
    Dim Temp1 As Single
    Dim Temp2 As Single
    'Format für Single eine Nachkommastellen
    Config Single = Scientific , Digits = 1
    'Temperatursensoren DS 18x20 an PortC.5 (Bascom Unterprogramm einbinden)
    Config 1wire = Portc.5                                      'Temperatursensor 1und2
     Portc.5 = 1                                                'Port auf H schalten
    '------Temperatursensor erkennen-------
    'testet die am Portpin C.5 angeschlossenen Temperatursensoren
    Call Ds1820_alleseriennummern()
    1wtemp_adresse_1(1) = 1wsearchfirst()                       'ist der erste gefundene Sensor
    1wtemp_adresse_2(1) = 1wsearchnext()                        'suche nächsten
    '1wtemp_adresse_3(1) = 1wsearchnext()                        'wenn noch mehr erweitern
    Cls
    
    Do
    'Temperatursensoren Daten einlesen
      Gosub Temperaturmessung
      Print "  Temp1  " ; Temp1
      Print "  Temp2  " ; Temp2
    'nun was anzeigen
       Locate 1 , 1                                             'Cursor auf 1 Zeile, 1 Spalte
        Lcd "  Temp1  " ; Temp1
       Locate 2 , 1                                             'Cursor auf 2 Zeile, 1 Spalte
        Lcd "  Temp2  " ; Temp2
    Loop
        End
    
    Temperaturmessung:
       ' bei allen Sensoren den Messvorgang starten
       1wreset
       1wwrite &HCC                                             ' SKIP ROM, alle Sensoren ansprechen
       1wwrite &H44                                             ' CONVERT T, Temperatur messen
     'Zeit zum Messen geben
       Waitms 50
    '===== erster Temp.-Sensor ist ein S Typ=====
       1wreset
       1wverify 1wtemp_adresse_1(1)
       1wwrite &HBE                                             ' Read Scratchpad, Temperatur auslesen
    'Zeit zum Messen geben
       Waitms 100
        Temp_bytes(1) = 1wread(8)
        Tempdif = Makeint(temp_bytes(1) , Temp_bytes(2))        'erstes und 2 Byte(LSB+MSB) zusammenfügen
        Tempdif = Tempdif * 50
        Tempdif = Tempdif - 25.6
        Tempdif1 = Temp_bytes(8) - Temp_bytes(7)
        Tempdif1 = Tempdif1 * 100
        Tempdif1 = Tempdif1 / Temp_bytes(8)
        Tempdif = Tempdif + Tempdif1
        Temp1 = Tempdif / 100
    '(
    '===== zweiter Temp.-Sensor wenn auch ein S Typ  =====
       ' Anfrage senden
       1wreset
       1wverify 1wtemp_adresse_2(1)
       1wwrite &HBE                                             ' Read Scratchpad, Temperatur auslesen
        Temp_bytes(1) = 1wread(8)
        Tempdif = Makeint(temp_bytes(1) , Temp_bytes(2))        'erstes und 2 Byte(LSB+MSB) zusammenfügen.
        Tempdif = Tempdif * 50
        Tempdif = Tempdif - 25.6
        Tempdif1 = Temp_bytes(8) - Temp_bytes(7)
        Tempdif1 = Tempdif1 * 100
        Tempdif1 = Tempdif1 / Temp_bytes(8)
        Tempdif = Tempdif + Tempdif1
        Temp2 = Tempdif / 100
     'Zeit zum Messen geben
       Waitms 10
    ')
     '===== erster Temp.-Sensor wenn es ein B Typ ist =====
       ' Anfrage senden
       1wreset
       1wverify 1wtemp_adresse_2(1)
       1wwrite &HBE                                             ' Read Scratchpad, Temperatur auslesen
     'Zeit zum Messen geben
        Waitms 100
        Temp_bytes(1) = 1wread(8)
        Tempdif = Makeint(temp_bytes(1) , Temp_bytes(2))        'erstes und 2 Byte(LSB+MSB) zusammenfügen.
        Tempdif = Tempdif / 8                                   'hier der Unterschied
        Tempdif = Tempdif * 50
        Tempdif = Tempdif - 25.5
        Tempdif1 = Temp_bytes(8) - Temp_bytes(7)
        Tempdif1 = Tempdif1 * 100
        Tempdif1 = Tempdif1 / Temp_bytes(8)
        Tempdif = Tempdif + Tempdif1
        Temp2 = Tempdif / 100
     Return
    
    '-------------------------------------------------------------------------------
    '############# nach Neustart Temperatursensor Test ###############
    'wird dieser Test Erfolgreich beendet wird die "Messung" oben in den Variablen
    'geschrieben [1wtemp_adresse_1(1)] ist der erste Sensor und
    'und [1wtemp_adresse_2(1)] ist der zweite usw.
    'Gibt die Seriennummer aller Sensoren des Bus über COM(TTL) aus.
    'wenn Hardware-Fehler wird dieser angezeigt.
    Sub Ds1820_alleseriennummern()
    Local Crc As Byte
    Local I As Integer
    Local Anzahl As Integer
    Dim Adresse(8) As Byte
    Adresse(1) = 1wsearchfirst()                                'prüft den ersten Teilnehmer am Bus
    If Err = 0 Then                                             'Wenn err, dann gibt es keinen Sensor
    'ist nur für Info die Hex-Adresse ist "Name" mit dieser Kenntnis
    'kannst Du mit [1wwrite &H55 und 1wwrite Sensor1_id("Name") , 8
    'jeden einzeln ansprechen. Mach bei mehreren Sensoren Sinn.
    Print "sind Hex-Adresse der Ds1820"
    'ab hier prüfen
    Do
    Crc = Crc8(adresse(1) , 7)
     If Crc <> Adresse(8) Then Print "Daten fehlerhaft gelesen (CRC-Fehler)!"
        For I = 1 To 8
          Print Hex(adresse(i)) ;
          Print " ";
        Next
         Print
      Adresse(1) = 1wsearchnext()                               'nächste suchen
    Loop Until Err = 1
     End If
    'Print
     Anzahl = 1wirecount()                                      'Anzahl der Sensoren
      Print "Anzahl der Sensoren am Bus: " ; Anzahl
      Print
      Print "Test abgeschlossen"
      Print "Hauptprogramm wird gestartet"
      Print
       Wait 5
    End Sub
     
    
    Dim Sngeeprom As Single                                     'Single to/from EEPROM
    Dim Bytsngeep(4) As Byte At Sngeeprom Overlay
    Dim Wrdaddr As Word                                         'EEPROM address
    Dim Byttmp0 As Byte                                         'Temporary byte variable
    Dim Sngtmp0 As Single                                       'Temporary single variable
    'Declare subs
    Declare Sub Eepromwritesng(byref Sngsingle As Single)
    Declare Sub Eepromreadsng(byref Sngsingle As Single)
    Wrdaddr = 11                                                'EEPROM start address
    Sngtmp0 = 123.456                                           'Single to be stored in EEPROM
    Call Eepromwritesng(sngtmp0)                                'Store sngTmp0 to EEPROM
    Wrdaddr = 11
    Call Eepromreadsng(sngtmp0)                                 'Retrieve sngTmp0 from EEPROM
    '==============================================================================
    Sub Eepromwritesng(byref Sngsingle As Single)
    'Decode sngSingle to 4 bytes of bytSngEEP for writing to EEPROM
    'Input sngSingle is set to sngEEPROM, overlayed with bytSngEEP(i), i=1...4
    'The 4 bytes bytSngEEP(i)are written to EEPROM
    'Input:  sngSingle to be decoded & written to EEPROM
    '        wrdAddr first EEPROM address
       Sngeeprom = Sngsingle                                    'Set input
       For Byttmp0 = 1 To 4
          Writeeeprom Bytsngeep(byttmp0) , Wrdaddr
          Incr Wrdaddr
       Next Byttmp0
    End Sub
    '==============================================================================
    Sub Eepromreadsng(byref Sngsingle As Single)
    'Encode 4 bytes read from EEPROM to sngSingle
    'The 4 bytes are read to bytSngEEP(i), i=1...4
    'bytSngEEP is overlayed @ sngEEPROM
    'sngEEPROM is set to output sngSingle
    'Input:  wrdAddr first EEPROM address
    'Output: sngSingle encoded to single variable read from EEPROM
       For Byttmp0 = 1 To 4
          Readeeprom Bytsngeep(byttmp0) , Wrdaddr
          Incr Wrdaddr
       Next Byttmp0
       Sngsingle = Sngeeprom                                    'Set output
    End Sub
    
    Der Vorteil ist du kannst mehrere und unterschiedliche Family Typen parallel schalten.Glaube 2^35 sind möglich. Sollte doch reichen.


    Mit freundlichen Grüßen
    fredred
    Geändert von fredred (30.11.2014 um 11:43 Uhr)

  10. #10
    Danke sehr.
    Derzeit bin ich noch mit anderen Dingen busy, werde ich aber zeitnah nachholen.

    Momentan arbeite ich noch am Gehäuse für meine LED-RGB-Platine aus Kunststoff.


    LG - Maik

Ähnliche Themen

  1. Platinenlayout Platinenlayout Büglmethode -> Spezielles Tonertransferpapier
    Von Andree-HB im Forum Konstruktion/CAD/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 10
    Letzter Beitrag: 16.01.2013, 21:23
  2. DS18B20 auslesen
    Von martin66119 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 09.12.2012, 20:19
  3. Mehrere DS18B20 Auslesen
    Von Felix H. im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 14.04.2010, 17:30
  4. spezielles FlipFlop gesucht
    Von Paracetamol im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 23.09.2008, 10:14
  5. Spezielles Lotproblem
    Von Biometriker im Forum Elektronik
    Antworten: 28
    Letzter Beitrag: 23.01.2008, 15:44

Berechtigungen

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