PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehrere Temperatursensoren am 1wire Bus



haus51
27.03.2006, 15:41
Wie kann ich mehrere Temperatursensoren am 1wire Bus betreiben?
Ich hab zwar die ID ausgelesen aber ich finde nirgends eine Beschreibung, wie ich die verschiedenen Sensoren adressieren kann.
Weiss jemand Hilfe.
Danke

SeaLion
27.03.2006, 15:47
Um welchen Sensor geht es denn?
Ich habe mal den DS18S20 programmiert. Da steht im Datenblatt eigentlich alles über das Protokoll und wann man was senden kann drin.

franzl
27.03.2006, 20:01
Hallo,
Schau doch einfach einmal unter Suche DS18S20 da müsstest du ein
Beispiel finden.
mfg franzl

enterprise30
28.03.2006, 20:49
Du musst erst von allen Sensoren die Adresse wissen (vorher auslesen)
Wenn Du die dann hast, kannst Du jeden Sensor gezielt ansprechen.
Hab das so gelöst:
(Der Code mit den Anführungsstrichen ist für eine genauere Messung)

''
'--------------------------------------------------------------
' Datei: City_el_Temperaturmessung_2_DS1822.BAS
' Demo: 3-Draht Temperaturmessung mit dem DS-18S22, mit 9-Bit Auflösung
' Port D ist fürs LCD-Display
' An PortC.6 "hängen" 2 "1-Wire" i-Buttons
' Lcd-Display 1x16 an PortC
'--------------------------------------------------------------

$crystal = 8867238
Config 1wire = Portc.6

Const Ds1822 = &H22
Const Skiprom = &HCC ' überspringe ROM Kommandos
Const Read_rom = &H33 ' Lese ROM
Const Convertt = &H44 ' Start Temperaturmessung
Const Match_rom = &H55 'Suche einzelnen Sensor
Const Read_ram = &HBE ' Lese Scratchpad RAM
Const Write_ram = &H4E ' Schreibe Scratchpad RAM
Const Copy_ram = &H48 ' Kopiere Scratchpad RAM
Const Aufloesung = &H5F ' Auflösung 11 Bit
Const Th = 00 ' Alarmschwelle High
Const Tl = 00 ' Alarmschwelle Low

'Dim Scratch(2) As Byte ' Sratchpad RAM Kopie
Dim Lsb As Byte
Dim Msb As Byte

Dim I As Byte ' Index für Schleifenzähler
Dim Temp As Word ' Temperaturwert 1. Sensor
Dim Temp1 As Integer
Dim Stemp_1 As Single

Dim Stemp_2 As Single

Deflcdchar 1 , 28 , 20 , 28 , 32 , 32 , 32 , 32 , 32 ' LCD Zeichen für °C
Cls
Cursor Off

'************************************************* ******************************
'### Alle 1-Wire Devices initialisieren ###

1wreset
1wwrite Skiprom 'überspringe Adressierung
1wwrite Write_ram 'Scratchpad zum schreiben vorbereiten
1wwrite Th 'Alarmschwelle Max.Temp
1wwrite Tl 'Alarmschwelle Min.Temp
1wwrite Aufloesung 'Konfigurationsbyte ins Scratchpad schreiben...
1wwrite Copy_ram '...und im EEProm sichern

'************************************************* ******************************
'Beginn 1.Sensor

Do
1wreset '1-Wire Bus reseten
1wwrite Skiprom 'Adressierung überspringen
1wwrite Convertt 'Temperaturmessung bei allen Sensoren einleiten

1wreset
1wwrite Match_rom 'Gezielten Sensor anwählen....
1wwrite 34 'Werte stammen aus Sensor,Dezimal
1wwrite 211
1wwrite 182
1wwrite 22
1wwrite 0
1wwrite 0
1wwrite 0
1wwrite 234

1wwrite Read_ram '....und auslesen (Scratch Pad)

'Scratch(1) = 1wread()
'Scratch(2) = 1wread()
Lsb = 1wread()
Msb = 1wread()


'Temp = Scratch(2) 'MSB holen
'Shift Temp , Left , 8 'Platz für LSB machen
'Temp = Temp + Scratch(1) 'zu Word Format zusammenfügen
'Temp1 = Temp 'Integer Format
'Stemp = Temp1 / 16

Temp = Msb 'MSB holen
Shift Temp , Left , 8 'Platz für LSB machen
Temp = Temp + Lsb 'zu Word Format zusammenfügen
Temp1 = Temp 'Integer Format
Stemp_1 = Temp1 / 16


Locate 1 , 1
Lcd "T1:";
Lcd Fusing(stemp_1 , "##.#");
Lcd Chr(1)



'################################################# ##############################
'Beginn 2ter Sensor

1wreset 'Reset i-Button
1wwrite Match_rom
1wwrite &H22
1wwrite &H2F
1wwrite &HC6
1wwrite &H16
1wwrite &H00
1wwrite &H00
1wwrite &H00
1wwrite &H88
1wwrite Read_ram 'lese Scratch Pad


Lsb = 1wread()
Msb = 1wread()


'Temp = Scratch(2) 'MSB holen
'Shift Temp , Left , 8 'Platz für LSB machen
'Temp = Temp + Scratch(1) 'zu Word Format zusammenfügen
'Temp1 = Temp 'Integer Format
'Stemp = Temp1 / 16

Temp = Msb 'MSB holen
Shift Temp , Left , 8 'Platz für LSB machen
Temp = Temp + Lsb 'zu Word Format zusammenfügen
Temp1 = Temp 'Integer Format
Stemp_2 = Temp1 / 16

'Scratch(1) = 1wread() 'LSB und MSB holen
'Scratch(2) = 1wread()

'Temp = Scratch(2) 'MSB holen
'Shift Temp , Left , 8 'Platz für LSB machen
'Temp = Temp + Scratch(1) 'zu Word Format zusammenfügen
'Temp1 = Temp 'Integer Format
' Stemp_a = Temp1 / 16

Locate 2 , 1
Lcd "T2:";
Lcd Fusing(stemp_2 , "##.#");
Lcd Chr(1)


Loop