PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : temp auslesen



Tom K
02.09.2006, 15:54
Hallo

Ich hab ein kleines Problem mit einem DS 1631 der am ic2 hängt
mit meinem Code gibt er mir immer 25 aus egal ob der temperaturfühler erwärmt oder abgekühlt wird warum?

$regfile = "m16def.dat"
$framesize = 60
$swstack = 60
$hwstack = 60
$crystal = 8000000
$baud = 4800

Declare Sub Showtemperatur()

Const Lm75slavewrite = &H90
Const Lm75slaveread = &H91
Dim Lm75high As Byte
Dim Lm75low As Byte
Dim Temperatur As Integer
Dim Nachkommastelle As String * 2

Config Scl = Portc.0
Config Sda = Portc.1
I2cinit
Start:
Showtemperatur
Wait 2
Goto Start


Sub Showtemperatur()
I2cstart
I2cwbyte Lm75slaveread
I2crbyte Lm75high , Ack
I2crbyte Lm75low , Nack
I2cstop

If Lm75high > 127 Then
Temperatur = Lm75high And 127
Temperatur = Not Temperatur
Incr Temperatur
Else
Temperatur = Lm75high
End If

Lm75low = Lm75low And 128
If Lm75low > 0 Then
Nachkommastelle = ",5"
Else
Nachkommastelle = ""
End If

Print Temperatur ; Nachkommastelle
End Sub

KANN MIR JEMAND HELFEN?

philiph
03.09.2006, 06:44
Also erstmal vermute ich das du den Chip auch richtig adressiert hast und SDA und SCL mit Pullups versehen hast. Übringens habe ich das selbe Problem mit einem fast Identischen Code (auch immer 25) und da ich es hoffentlich richtig angeschlossen habe muss es wohl am Codel iegen.
edit: ich benutze einen 1,8k pullupkann es daran liegen ?

PicNick
03.09.2006, 08:24
Probier es auch mal mit "ERR=" Abfrage
https://www.roboternetz.de/wissen/index.php/Sensorarten#Programm-Beispiel_f.C3.BCr_LM75

Tom K
03.09.2006, 11:04
Erstmals Danke für eure hilfe

Pullup´s sind dran nur bin ich drauf gekommen das der Code hinten und vorne nicht stimmt!

Früher ist in dieser Schaltung ne C-Controll gehangen und jetzt über enen Adapter ein Mega 16 der Fühler war schon in Betrieb hat auch funktioniert.
Jetzt hab ich den C Cod mal umgeschrieben in Bascom Tut sich aber gar nichts.
Datenblatt vom DS1631: http://www.datasheetcatalog.com/datasheets_pdf/D/S/1/6/DS1631.shtml

der alte Code:
http://www.csslabs.de/ccontrol/lib/bpp/Demo_Unit_M2.0_M1.2/BEISPIELE_ZUBEH%D6R_M2.0_M1.2/IICBUS_TEMPERATURSENSOR_/DS1631_READ.htm

(Libery):
http://www.fdos.de/ccforum/codelib/basic_plus_plus/Library_Micro_M2_Station2/DS1631_GENERIC.htm

neue Code:

$regfile = "m16def.dat"
$framesize = 60
$swstack = 60
$hwstack = 60
$crystal = 8000000
$baud = 4800

Config Scl = Portc.0
Config Sda = Portc.1

Dim Ds1631 As Byte
Dim Ds1631r As Byte
Ds1631 = 158
Ds1631r = 159
Const Addr = 159
Const Convert = &H51
Const Read_temp = &HAA
Const Conf = &HAC
Const Rese = &H54

Declare Sub Ds1631reset
Declare Sub Ds1631set_status
Declare Sub Ds1631convert
Declare Sub Ds1631wait_rady
Declare Sub Ds1631get_temp
Declare Sub Ds1631get_status
Dim A As Integer

Dim Dat As Byte
Dim Temp As Byte
Dim Tempold As Byte
A = 1


Do
Ds1631reset
Waitms 10
Ds1631set_status
Waitms 10
Ds1631convert
Waitms 10
Ds1631wait_rady
Wait 1
Ds1631get_temp

Print Temp ; " "
Print Tempold
Print " gh " ; A
Print
Print
A = A + 1
Tempold = Temp
Wait 1
Loop





Sub Ds1631reset
I2cstart
I2cwbyte Ds1631
I2cwbyte Rese
I2cstop
End Sub

Sub Ds1631set_status
I2cstart
I2cwbyte Addr
I2cwbyte Conf
I2cwbyte Dat
I2cstop
End Sub

Sub Ds1631convert
I2cstart
I2cwbyte Ds1631
I2cwbyte Convert
I2cstop
End Sub

Sub Ds1631get_status(data As Byte)
I2cstart
I2cwbyte Ds1631
I2cwbyte Conf
I2cstop
I2cstart
I2cwbyte Ds1631r
I2crbyte Dat , Nack
I2cstop
End Sub



Sub Ds1631wait_rady

End Sub

Sub Ds1631get_temp(temp As Word ; Dat As Byte)

I2cstart
I2cwbyte Ds1631
I2cwbyte Read_temp
I2cstop
I2cstart
I2cwbyte Ds1631r
I2crbyte Dat
Temp = Dat * 256
Print "1 " ; Dat
I2crbyte Dat
Temp = Temp + Dat
Print "2 " ; Dat
I2cstop
End Sub

philiph
03.09.2006, 12:03
Probier es auch mal mit "ERR=" Abfrage
https://www.roboternetz.de/wissen/index.php/Sensorarten#Programm-Beispiel_f.C3.BCr_LM75
ich habe es mal mit diesem Code versucht und bekomme immer nur 9999 also error

Tom K
03.09.2006, 13:31
darum sag ich ja der "neue" funkt nicht

PicNick
03.09.2006, 13:42
immer nur 9999 also error

Aha, also auf die I2C Adresse kommt kein "ACK". d.h. der Rest des Code ist mal piepegal.

Das ist irgendwas (Hardware-) I2C-mäßiges

philiph
03.09.2006, 14:08
Also woran könnte das den liegen eigentlich sind das ja nur zwei verbindungen mit widerständen. kann es an der adressieriung liegen? für die im bsp. benutzte müssten doch alle adressleitungen auf masse oder?

PicNick
03.09.2006, 14:19
A0-A2 sollte Masse sein (f.addr &H90)
sind auch masse µC und Masse DS16.. verbunden ?
Hat der DS16.. Saft ? (+5V)

Tom K
03.09.2006, 14:24
Ja der hat seine eigene 5V versorgung gleiche wie controller

PicNick
03.09.2006, 14:39
mmmmh. Hat das was zu bedeuten ?:


Ds1631 = 158
Ds1631r = 159


&H90 is eigentlch 144 dezimal oder spinn ich jetzt

Tom K
03.09.2006, 15:44
die ds1631 ist die schreibadresse
ds1631r leseadresse wenn a0,a1,a2 nicht auf GND liegen

Tom K
03.09.2006, 16:53
Hallo Leute

Vielen dank für eure hilfe ich habs geschafft O:)

Nun der Code der auch funktioniert:

$regfile = "m16def.dat"
$framesize = 60
$swstack = 60
$hwstack = 60
$crystal = 8000000
$baud = 4800

Config Scl = Portc.0
Config Sda = Portc.1


Declare sub Ds1631reset
Declare Sub Ds1631convert
Declare Sub Ds1631get_status
Declare Sub Ds1631set_status
Declare Sub Ds1631wait_ready
Declare Sub Ds1631get_temp

Dim Addr As Byte
Dim Dat As Byte
Const Convert = &H51
Const Stop_convert = &H22
Const Read_temp = &HAA
Const Conf = &HAC
Const Reset = &H54

Dim Temp As Word
Dim Temphi As Byte
Dim Templo As Byte
Dim Temp1 As Byte
Dim Temp2 As Byte
Const Ds1631 = &H90 'Adresse



'-------------------------------------------------------------
Ds1631reset
Ds1631set_status
I2cinit


Do
Waitms 10
Ds1631convert
Ds1631wait_ready

Ds1631get_temp
Shift Temp , Right , 7
Temp1 = Temp / 2
Temp2 = Temp + 1
Temp2 = Temp2 * 5
Print "TEMP: " ; Temp1 ; "." ; Temp2 ; " C " ; Temp
Wait 2
Loop



'-----------------------------------------------------
'------------------ DS1631 RESET ------------------
'-----------------------------------------------------
Sub Ds1631reset(addr As Byte)
Addr = Ds1631
I2cstart
I2cwbyte Addr
I2cwbyte Reset
I2cstop

End Sub
'-----------------------------------------------------
'------------------ DS1631 CONVERT ----------------
'-----------------------------------------------------
Sub Ds1631convert(addr As Byte)
Addr = Ds1631
I2cstart
I2cwbyte Addr
I2cwbyte Convert
I2cstop
End Sub
'-----------------------------------------------------
'----------------- GET DS1631 STATUS -----------------
'-----------------------------------------------------
Sub Ds1631get_status(addr As Byte)
Dim Data As Byte
Addr = Ds1631
I2cstart
I2cwbyte Addr
I2cwbyte Conf
I2cstop

I2cstart
Addr = Addr + 1
I2cwbyte Addr
I2crbyte Dat
Print "dat1 " ; Dat
I2cstop


End Sub
'-------------------------------------------------------
'----------------- SET DS1631 STATUS -----------------
'-------------------------------------------------------
Sub Ds1631set_status(addr As Byte , Dat As Byte)
Addr = Ds1631
I2cstart
I2cwbyte Addr
I2cwbyte Conf
I2cwbyte &HA1

I2cstop
End Sub
'-------------------------------------------------------
'----------------- WAIT DS1631 READY -----------------
'-------------------------------------------------------
Sub Ds1631wait_ready(addr As Byte)
Waitms 20
Ds1631get_status

End Sub
'-----------------------------------------------------
'----------------- GET DS1631 TEMP -----------------
'-----------------------------------------------------
Sub Ds1631get_temp(addr As Byte , Temp As Word , Dat As Byte )

Addr = Ds1631
I2cstart
I2cwbyte Addr
I2cwbyte Read_temp
I2cstop
Addr = Addr + 1
I2cstart
I2cwbyte Addr
I2crbyte Dat , Ack
Temp = Dat * 256
Print ; "dat2 " ; Dat
I2crbyte Dat , Nack
Temp = Temp + Dat
print;"dat3 ";dat
I2cstop

End Sub
Kann man ihn noch kürzen?