Archiv verlassen und diese Seite im Standarddesign anzeigen : temp auslesen
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?
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 ?
Probier es auch mal mit "ERR=" Abfrage
https://www.roboternetz.de/wissen/index.php/Sensorarten#Programm-Beispiel_f.C3.BCr_LM75
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
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
darum sag ich ja der "neue" funkt nicht
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
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?
A0-A2 sollte Masse sein (f.addr &H90)
sind auch masse µC und Masse DS16.. verbunden ?
Hat der DS16.. Saft ? (+5V)
Ja der hat seine eigene 5V versorgung gleiche wie controller
mmmmh. Hat das was zu bedeuten ?:
Ds1631 = 158
Ds1631r = 159
&H90 is eigentlch 144 dezimal oder spinn ich jetzt
die ds1631 ist die schreibadresse
ds1631r leseadresse wenn a0,a1,a2 nicht auf GND liegen
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?
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.