PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DS18B20 auslesen



martin66119
09.12.2012, 00:19
Guten Abend,

irgendwie bekomme ich es nicht mehr hin!

Hier der Code. Im Moment habe ich nur die ersten 2 Sensoren angeschlossen

Auf dem Display wird 155,1 Grad und 155,2 angezeigt. Wenn ich die Sensoren anfasse steigt auch die angezeigte Temperatur. Das ergebnis ist aber viel zu groß. Was ist denn in meinem Code falsch?


$regfile = "m8def.dat"
$crystal = 4000000 '3686400
$hwstack = 46
$swstack = 40
$framesize = 40

'**************************Funktionen LCD-Display*******************************
Config Lcd = 40 * 4
Config Lcdpin = Pin , Rs = Portb.0 , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , E2 = Portd.7
Config Lcdbus = 4
Config Lcdmode = Port


Dim ___lcdno As Byte

___lcdno = 0
Initlcd
Cursor Off
Cls

___lcdno = 1
Initlcd
Cursor Off
Cls
'**************************Def. allgemeiner Variabeln***************************
Dim Tempmessstelle(8) As Single


Waitms 60

'***************************Config 1Wire****************************************

Config 1wire = Portc.1 'DS1820

Match_rom Alias &H55
Read_scratchpad Alias &HBE
Start_conversion Alias &H44

Innen Alias 0
Vorlauf Alias 1
Rücklauf Alias 2
Aussen Alias 3
Kessel Alias 4
Boiler Alias 5


Dim Read_temp As Integer
Dim Sensor_ids(48) As Byte
Dim Id As Byte
Dim Offset As Byte
Dim Ds_array(7) As Byte
Dim Bruchteil As Single
Dim Temperatur As Single
Dim I As Integer
'***************************ID 1Wire configurieren******************************
For Id = 1 To 40 'Einlesen der 5 Sensoren IDs (5*8 Byte)
I = Id - 1
Readeeprom Sensor_ids(id) , I
Next Id
'***********************************Hauptprogramm* ******************************
Do
Gosub 1wire
Loop
End
'**********************************1Wire********** ******************************
1wire:

Wait 1
For Id = Innen To Kessel
Offset = Id * 8
Offset = Offset + 1 'Offset geht auf 1, 9, 17, 25 und 33
1wreset 'hier wird der Temperaturwert eingelesen
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8 '8 Byte ID wird übertragen
1wwrite Read_scratchpad
For I = 1 To 7 'nur bis 7, weil 8 und 9 uninteressant
Ds_array(i) = 1wread()
Next I
Read_temp = Makeint(ds_array(1) , Ds_array(2))
1wreset 'jetzt wird wieder die Konvertierung gestartet
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8
1wwrite Start_conversion
Shift Read_temp , Right
'If 127 < Read_temp Then Read_temp = Read_temp - 32768
Bruchteil = 16 - Ds_array(7)
Bruchteil = Bruchteil / 16
Bruchteil = Bruchteil - 0.25


Temperatur = Read_temp + Bruchteil
Tempmessstelle(id + 1) = Temperatur

If Temperatur <> 85.0 Then ' < 80.0 And Temperatur > -20.0 Then
Tempmessstelle(id + 1) = Temperatur
End If

'Innen Alias 0
'Vorlauf Alias 1
'Rücklauf Alias 2
'Aussen Alias 3
'Kessel Alias 4
'Boiler Alias 5
___lcdno = 0
Select Case Id
Case Innen:
Locate 1 , 1 : Lcd "WZ: "
Locate 1 , 5 : Lcd Fusing(temperatur , "#.#")
Case Aussen:
Locate 1 , 11 : Lcd "AT: "
Locate 1 , 14 : Lcd Fusing(temperatur , "#.#")
Case Vorlauf: 'ausgabe im Display ist dann z.B.
Locate 2 , 1 : Lcd "VL: "
Locate 2 , 5 : Lcd Fusing(temperatur , "#.#" ) ' Inn Auss Kess Rück Vorl
Case Rücklauf: ' 14.4 52.4 67.3 43.0 62.8
Locate 2 , 11 : Lcd "RL: "
Locate 2 , 14 : Lcd Fusing(temperatur , "#.#")
End Select

___lcdno = 1
Select Case Id
Case Kessel:
Locate 1 , 11 : Lcd "KE: "
Locate 1 , 14 : Lcd Fusing(temperatur , "#.#")
End Select

Cursor Off
Next Id
Return
'-----------------------------------------

$eeprom

Data &H28 , &H25 , &H67 , &HAA , &H03 , &H00 , &H00 , &H55
Data &H28 , &HA2 , &H75 , &HAA , &H03 , &H00 , &H00 , &HC5
Data &H10 , &H78 , &H37 , &H39 , &H01 , &H08 , &H00 , &H11
Data &H10 , &HC0 , &H46 , &H19 , &H01 , &H08 , &H00 , &H67
Data &H10 , &HE8 , &HF4 , &H23 , &H01 , &H08 , &H00 , &HEF '

for_ro
09.12.2012, 11:00
Hallo Martin,
das Motto "Viel hilft viel" gilt sicherlich nicht für die Anzahl Threads zu einem Thema. Warum führst du nicht einen weiter?
Zu deinem Problem: Du hast offensichtlich andere Sensoren erwischt. Früher hattest du die DS18(S)20 mit dem Family Code &H10, jetzt sind es DS18B20 mit dem Family Code &H28. Schau mal ins Datenblatt, die funktionieren ganz anders.
Du kannst bei denen einfach die ersten beiden Byte auslesen und in eine Integer stecken.
Read_temp = Makeint(ds_array(1) , Ds_array(2))
Das ist dann deine Temperatur * 16. Dann teilst du entweder in eine Single
Read_Single = Read_temp/16
und lässt sie dir anzeigen (Vorsicht: das könnten einige Stellen hinter dem Komma werden)
oder du nimmst die Bits 4-11 als ganzzahlige Temperatur und die Bits 0-3 als Bruchteil hinter dem Komma.

martin66119
09.12.2012, 12:11
Vielen Dank für die Hilfe!

Es hat geklappt!

Wegen dem 2-ten Beitrag. Ich dachte, es ist besser einen neuen zu starten, da ich gesehen hatte, dass ich einen DS18B20 habe.

Das war dann wohl dann nicht so gut. Sorry

Martin

martin66119
09.12.2012, 16:29
Muss leider noch eine Frage nachlegen!

Nun habe ich noch 2 weitere DS18B20 engeschlossen und die entsprechenden SN (3 und 4te Zeile der SN) eingetragen. Doch es werden nur die ersten beiden ausgelesen. Was mache ich denn schon wieder falsch!? Kannst du mir bitte noch einmal helfen.

Hier der Code mit den 4 Sensoren wobei nur die ersten beiden funktionieren.

Ach so. Den MC habe ich noch ausgetauscht. Mit dem neuen funktionieren die beiden ersten.


$regfile = "m168def.dat"
$crystal = 4000000 '3686400
$hwstack = 46
$swstack = 40
$framesize = 40

'**************************Funktionen LCD-Display*******************************
Config Lcd = 40 * 4
Config Lcdpin = Pin , Rs = Portb.0 , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , E2 = Portd.7
Config Lcdbus = 4
Config Lcdmode = Port

Dim ___lcdno As Byte

___lcdno = 0
Initlcd
Cursor Off
Cls

___lcdno = 1
Initlcd
Cursor Off
Cls
'**************************Def. allgemeiner Variabeln***************************

$baud = 19200

Match_rom Alias &H55
Skip_rom Alias &HCC
Read_scratchpad Alias &HBE
Write_scratchpad Alias &H4E
Copy_scratchpad Alias &H48
Start_conversion Alias &H44

' Pin für 1wire Schnittstelle festlegen. => DS1820 am Port C.1
Config 1wire = Portc.1
Dim Ds1820id(32) As Byte
Dim Sc(9) As Byte '????
Dim T As Integer
Dim I As Byte
Dim Id As Byte
Dim T_mess As Single


'Die Adresse aller meiner DS1820 die ich vorher ausgelesen habe:
Restore Sensor_ids
For I = 1 To 32
Read Ds1820id(i)
Next I
1wreset
1wwrite Skip_rom
1wwrite Start_conversion 'Alle angeschlossenen DS1820 zum Messen veranlassen
Waitms 500 'Ausgabe alle 0,5 Sekunden
Do
For Id = 1 To 25 Step 8 'ID für alle 4 DS1820 1,9,17,25
Incr I
1wreset '1Wire Reseten
1wwrite &H55 'MATCHROM=>Adress.den DS1820 anhand des ROM Inhaltes
1wwrite Ds1820id(id) , 8 '8 Byte ID wird uebertragen
1wwrite &HBE 'READ SCATCHPAD => Liest alle Bytes des SP Memorys
Sc(1) = 1wread(9)
T = Sc(1)
T = Makeint(sc(1) , Sc(2)) 'komprimiert zwei Bytes in die Integervariable T
T_mess = T / 16 'Die Nachkommastelle entfernen
Locate I , 11 'Temperatur in ganzen Grad ausgeben
Lcd Fusing(t_mess , "#.#" )
Next Id
I = 0
1wreset
1wwrite Skip_rom
1wwrite Start_conversion 'Alle angeschlossenen DS1820 zum Messen veranlassen
Waitms 500 'Ausgabe alle 0,5 Sekunden
Loop

End

Sensor_ids:

Data &H28 , &H25 , &H67 , &HAA , &H03 , &H00 , &H00 , &H55
Data &H28 , &HA2 , &H75 , &HAA , &H03 , &H00 , &H00 , &HC5
Data &H28 , &HA7 , &H64 , &HAA , &H03 , &H00 , &H00 , &H9F
Data &H28 , &HE6 , &H63 , &HAA , &H03 , &H00 , &H00 , &H8C
Data &H10 , &HE8 , &HF4 , &H23 , &H01 , &H08 , &H00 , &HEF

martin66119
09.12.2012, 21:19
Habs gefunden. Die Ausgabe der Messwerte de 3. und 4-ten Sensors war nicht mehr auf dem Display.

Habe folgendes ersetzt:

'Locate I , 11
Spalte = I * 6
Spalte = Spalte - 5
Locate 1 , Spalte 'Temperatur in ganzen Grad ausgeben
Lcd Fusing(t_mess , "#.#" )

Danke an dieser Stelle für die Hilfe
Martin