- LiFePO4 Speicher Test         
Ergebnis 1 bis 6 von 6

Thema: Beispielprogramm für DS1820 Temperatursensor und RN-AVR Universal

  1. #1
    Administrator Robotik Visionär Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    5.116
    Blog-Einträge
    1

    Beispielprogramm für DS1820 Temperatursensor und RN-AVR Universal

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Das Beispielprogramm dürfte sich selbst erklären. Es demonstriert wie man den beliebten Temperatursensor DS18S20 anspricht. Wahlweise einen oder mehrere an einem beliebigen Port!

    Code:
    '##############################################################
    'BeispielDS18S20.bas
    '
    'Ein  Programm für die Universalplatine RN-AVR UNIVERSAL
    '
    'Das Programm zeigt wie man den 3 poligen Temperatursensor
    'DS18S20 ausliest. Nach dem Aufruf wird die Temperatur alle 5 Sekunden
    'ausgegen. Es können auch mehrere Sensoren auf einer Leitung
    'angesprochen werden.
    '
    ' (c) 2013 Frank
    'Bezug für Board und Sensor und DVD: www.robotikhardware.de
    'Weitere Beispiele auf der Robotikhardware DVD oder
    'im www.Roboternetz.de und rn-wissen.de
    '######################################################################
    'Portbelegung bzw. Modulverbindung
    'PD3  Sensor Daten DS18S20      (nicht vergessen ein 4,7k Widerstand von PD3 nach +3,3V)
    'GND  Sensor GND
    '3V   Sensor 3V
     
    Declare Sub Ds1820_seriennummer()
    Declare Sub Ds1820_alleseriennummern()
    Declare Sub Ds1820_temperatur_ausgeben()
    Declare Sub Ds1820_sensor_temperatur()
    
    $programmer = 12                                            'MCS USB  (Zeile weglassen wenn anderer Programmer)
    $prog &HFF , &HFF , &HD9 , &HFE                             'Fusebits richtig programmieren (Quarz ein,Jtag aus)
    $regfile = "m644pdef.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 64
    $crystal = 8000000                                          'QuarzFrequenzuenz
    $baud = 9600
    Baud = 9600
     
    Config Pind.6 = Output                                      'LED
    Led1 Alias Portd.6
    Led1 = 0                                                    'ein
    Config 1wire = Portd.3
    Dim Sensordaten(9) As Byte
    Dim Sensornummer(8) As Byte
    
    Wait 2
    Print "Beispielprogramm fuer RN-Avr Universal um Temperatur mit DS18S20 auszulesen"
    Print "Serienummer notieren!"
    Print "Einzelabruf:"
    Ds1820_seriennummer
    Print
    Print "Falls es mehrere gibt, gleich alle abrufen::"
    Ds1820_alleseriennummern
    Print
    Print "Temperatur ausgeben:"
    Do
    '  Ds1820_temperatur_ausgeben                               'Diese Funktion wenn nur ein Sensor am Bus
      Ds1820_sensor_temperatur                                  'Diese Funktion wenn man mehrere an gleicher
                                                                'Leitung hat und einen davon ansprechen möchte
      Wait 5
    Loop
     
    
    ' ************ Hilfsfunktionen zur Kommunikation mit dem temperatursensor DS18S20 (c) Robotikhardware.de *********
    '  (nähere Infos im Datenblatt des Sensors auf der www.Robotikhardeware.de DVD)
    ' Hilfreich auch der RN-Wissen Artikel unter http://www.rn-wissen.de/index.php/Bascom_und_1-Wire
    ' ************  **************  ************  ************** ************  ************** ************  **********
    
    'Gibt die Seriennummer über RS232 aus
    'diese ist in jedem Sensor eindeutig vorhanden
    'sie wird nur benötigt wenn mehrere Sensoren an einer Leitung hängen
    Sub Ds1820_seriennummer()
    Local I As Integer
    Local Crc As Byte
       1wreset
       1wwrite &H33                                             ' ROM-Befehl zum lesen der SerienNr
       Sensornummer(1) = 1wread(8)                              ' 8 Bytes lesen
       Crc = Crc8(sensornummer(1) , 7)
       If Crc <> Sensornummer(8) Then Print "Daten fehlerhaft gelesen (CRC-Fehler)!"
       For I = 1 To 8
         Print Hex(sensornummer(i));                            ' Ausgeben
         Print " ";
       Next
       Print
    End Sub
    
    'Gibt die Seriennummer aller Sensoren an einem Bus über RS232 aus
    Sub Ds1820_alleseriennummern()
    Local Crc As Byte
    Local I As Integer
    Local Anzahl As Integer
       Sensornummer(1) = 1wsearchfirst()
       If Err = 0 Then                                          'Wenn err, dann gibt es keinen Sensor
         Do
           Crc = Crc8(sensornummer(1) , 7)
           If Crc <> Sensornummer(8) Then Print "Daten fehlerhaft gelesen (CRC-Fehler)!"
           For I = 1 To 8
             Print Hex(sensornummer(i));
             Print " ";
           Next
           Print
           Sensornummer(1) = 1wsearchnext()                     'nächste suchen
         Loop Until Err = 1
       End If
       Print
       Anzahl == 1wirecount()                                   'Anzahl der Sensoren
       Print "Anzahl der Sensoren am Bus: " ; Anzahl
    End Sub
    
    'Diese Funktion gibt Temperaturbereich +85 bis -55 mit Vorzeichen auf ein halbes Grad genau aus
    'Diese Funktion ist nur geeignet, wenn nur ein Sensor am Bus liegt
    'Auf Fließkommazahlen wird verzichtet
    Sub Ds1820_temperatur_ausgeben()
    Local Temp As Integer
    Local S As String * 5
    Local Crc As Byte
       1wreset                                                  ' Initialisierung
       1wwrite &HCC                                             ' SKIP ROM
       1wwrite &H44                                             ' CONVERT T / Temperaturmessung starten
       Waitms 500                                               ' warten
       1wreset                                                  ' Initialisierung
       1wwrite &HCC                                             ' SKIP ROM
       1wwrite &HBE                                             ' READ SCRATCHPAD
       Sensordaten(1) = 1wread(9)                               ' Daten lesen
       Temp = Sensordaten(1)
       If Sensordaten(2) > 0 Then                               'Minus Temperatur
         Temp = 256 - Temp
         Temp = Temp * 10
         Temp = Temp / 2
         Temp = 0 - Temp                                        'Vorzeichen -
       Else
         Temp = Temp * 10
         Temp = Temp / 2
       End If
       S = Str(temp)
       Print
       Print Format(s , "0.0") ; "  Grad C"
       Crc = Crc8(sensordaten(1) , 8)
       If Crc <> Sensordaten(9) Then Print "Daten fehlerhaft gelesen (CRC-Fehler)!"
    End Sub
    
    'Diese Funktion macht das gleiche wie die Funktion Ds1820_temperatur_ausgeben
    'Jedoch wird hier gezielt ein bestimmter Sensor angesprochen, es können also
    'mehrere an der gleichen Leitung hängen
    'Die Seriennummer des anzusprechenden Sensors muss vor dem Aufruf
    'in das Array Sensornummer eingetragen werden
    Sub Ds1820_sensor_temperatur()
    Local Temp As Integer
    Local S As String * 5
    Local Crc As Byte
       1wverify Sensornummer(1)                                 'Seriennummer muss in Array Sensornummer stehen
       If Err = 0 Then
          1wwrite &H44
          Waitms 500                                            'warten
          1wverify Sensornummer(1)                              'Gerät auswählen
          1wwrite &HBE                                          'Temperatur lesen
          Sensordaten(1) = 1wread(9)                            'Daten lesen
        Else
           Print "Diesen Sensor nicht gefunden!"
        End If
       Temp = Sensordaten(1)
       If Sensordaten(2) > 0 Then                               'Minus Temperatur
         Temp = 256 - Temp
         Temp = Temp * 10
         Temp = Temp / 2
         Temp = 0 - Temp                                        'Vorzeichen -
       Else
         Temp = Temp * 10
         Temp = Temp / 2
       End If
       S = Str(temp)
       Print
       Print Format(s , "0.0") ; "  Grad C"
       Crc = Crc8(sensordaten(1) , 8)
       If Crc <> Sensordaten(9) Then Print "Daten fehlerhaft gelesen (CRC-Fehler)!"
    End Sub

    Bild hier  
    Geändert von Frank (22.01.2013 um 14:39 Uhr)
    Mit bestem Gruß
    Frank

    Admin Roboternetz.de - RN-Wissen.de - Elektronik-Blog
    Überzeugter und begeisterter Elektroauto Fahrer seit 2018

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    73
    Beiträge
    1.175
    Blog-Einträge
    1
    Bekomme nur alles FF als ID und CRC Fehler
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  3. #3
    Unregistriert
    Gast

    Messung mit Problemen

    Hallo,

    ich bekomme bei meinem DS1820 folgendes Ergebnis ausgelesen:
    Einlesen: 1 - 123
    Einlesen: 2 - 1
    Einlesen: 3 - 75
    Einlesen: 4 - 70
    Einlesen: 5 - 12
    Einlesen: 6 - 255
    Einlesen: 7 - 5
    Einlesen: 8 - 16
    Einlesen: 9 - 29
    Die Zimmertemperatur beträgt etwar 22,5C.
    Wenn ich das Programm nun nutze um die Temperatur in Bascom auszurechnen, teile ich

    ++Temp = 256 - Temp
    Temp = 256 - 123 (=133)
    ++ Temp = Temp * 10
    ++Temp = 0 - Temp

    So kann ich doch niemals auf die 22,5C kommen!

    Ich habe schon einen zweiten Sensor angeschlossen. Auch er zweigt mit diese Werte

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    174
    sicher das du die werte bekommst???

    Welchen Sensor hast du denn dran den DS18S20 (Wert/2) oder den DS18B20 (Wert/16)


    ++Temp = 256 - Temp
    Temp = 256 - 123 (=133)
    ++ Temp = Temp * 10
    ++Temp = 0 - Temp

    Dies wird nur bei negativen Temps angewendet, abhängig vom TEMP_MSB = 0 positive Temps / 1 = negative Temps

    und das steht sogar als Kommentar dahinter.

    Der Wert für 22,5°C ist 45dez = 2D hex

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    12.03.2005
    Beiträge
    33
    Hallo Frank!

    Siehst du eine Möglichkeit, wie das vom Tempsensor gewünschte Timing auch mit nur 1MHz unter Bascom eingehalten werden kann?
    8MHz geht problemlos aber bei 1MHz kommen die von "oderlachs" erwähnten CRC Fehler und falsche ID zusammen.

  6. #6
    Administrator Robotik Visionär Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    5.116
    Blog-Einträge
    1
    Also eigentlich bin ich von aus gegangen das dies auch mit 1 Mhz noch klappt, habe es aber damals nur mit 8 Mhz getestet. Dazu kann ich dir leider heute nichts mehr sagen, liegt schon einige Jahre zurück, heute nutze ich meist eine Arduino Lib zur Abfrage.
    Mit bestem Gruß
    Frank

    Admin Roboternetz.de - RN-Wissen.de - Elektronik-Blog
    Überzeugter und begeisterter Elektroauto Fahrer seit 2018

Ähnliche Themen

  1. Bascom Funksteckdosen mit RN AVR-Universal (und RFM12b) ansteuern
    Von Frank im Forum Bascom / C / ASM / Sketch / Codesammlung / Programmschnipsel
    Antworten: 0
    Letzter Beitrag: 18.01.2013, 17:33
  2. Bascom DCF-Funkuhr mit RN-AVR Universal und LCD
    Von Frank im Forum Bascom / C / ASM / Sketch / Codesammlung / Programmschnipsel
    Antworten: 0
    Letzter Beitrag: 18.01.2013, 17:18
  3. RN-AVR Universal Funk V. 1.3 mit LCD 2 x 16 und DCF77
    Von dh2faa im Forum Eigene fertige Schaltungen und Bauanleitungen
    Antworten: 3
    Letzter Beitrag: 30.05.2012, 22:41
  4. Temperatursensor DS1820
    Von copcom-weber im Forum Robby RP6
    Antworten: 6
    Letzter Beitrag: 13.08.2010, 12:51
  5. DS1820 Temperatursensor
    Von Andy_b im Forum Sensoren / Sensorik
    Antworten: 1
    Letzter Beitrag: 21.05.2006, 18:53

Stichworte

Berechtigungen

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

LiTime Speicher und Akkus