ich habe heute mal ausprobiert ob ich Minustemperaturen auch anzeigen lassen kann. Doch wenn die Temperatur unter 0 fällt, läuft er von 256 abwärtz.
Das ist jetzt mein aktuelles Programm
Dieses Programm funktioniert glaub ich mal so weit. Die temperatur wir aber ohne Komma angezeigt.Code:$regfile = "M32def.dat" ' chip $crystal = 16000000 ' frequenz $baud = 19200 ' baud rate ' we do not use software emulated I2C but the TWI Config Scl = Portc.0 ' we need to provide the SCL pin name Config Sda = Portc.1 ' we need to provide the SDA pin name Dim Lowtemp As Byte Dim Hightemp As Byte Dim Value As Word '!!!!!!! I2cinit Do I2cstart I2cwbyte 144 I2cwbyte &HEE 'Temperaturmessung anstoßen I2cstop I2cstart I2cwbyte 144 I2cwbyte &HAA 'Temperaturmessung Lesekommando I2cstop I2cstart I2cwbyte 145 I2crbyte Lowtemp , Ack 'LSB holen I2crbyte Hightemp , Nack 'MSB holen I2cstop Value = Lowtemp * 10 If Hightemp = 128 Then Value = Value + 5 End If Print value ' oder LCD value waitms 500 'kurze Pause Loop End
was bedeutet denn das rechnen mit value +5 oder *10?
kann ich das ganze nicht mit hardware twi lösen?
da sind doch die befehle auch kürzer.
ich habe heute mal ausprobiert ob ich Minustemperaturen auch anzeigen lassen kann. Doch wenn die Temperatur unter 0 fällt, läuft er von 256 abwärtz.
Och mann 0815,Zitat von Zeroeightfifteen
was hatte ich geschrieben? Richtig:
Grundlagen und nochmal Grundlagen lernen, Datenblätter lesen, verstehen und dann variieren.
Da fragst Du:
1) Wie man Zahlen ohne Komma in Zahlen mit Komma verwandelt. Das hattest Du bereits in einem anderen Thread gefragt und auch eine Methode genannt bekommen, wie das zu bewerkstelligen ist. In meinem komplettbeispiel, das ich unten nochmal einfüge, lernst Du noc eine Methode kennen. Was die Operation mit *10 und +5 darfst Du nun selbst herausfinden.Dieses Programm funktioniert glaub ich mal so weit. Die temperatur wir aber ohne Komma angezeigt.
was bedeutet denn das rechnen mit value +5 oder *10?
kann ich das ganze nicht mit hardware twi lösen?
da sind doch die befehle auch kürzer.
2)Natürlich kannst Du das auch mit Hardware TWI lösen. Nur ändern sich die Befehle überhaupt nicht. Der einzige Unterschied ist der, daß die Bascom Library Hardware TWI anspricht und damit gerinfügig weniger Platz verbraucht.
3)Minus kann das Programmbeisiel nicht, ich habe es bewußt einfach gehalten, für Dich aber wohl noch nicht einfach genug.
Irgendwie scheinst Du die Funktion eines Forums falsch zu verstehen. Hier gibt es Hilfe zur Selbsthilfe, keine Rundum Sorglospakete für Denkfaule.
Ein letztes Mal --- Komplettprogramm einfach:
und eine Erweiterung auf negative Temperaturen:Code:'------------------------------------------------------------------------------- '----- Beispiel für das Auslesen des Temperatursensors DS1621/1631 ------------ ' HR 2006 ' 'Anmerkung: Dieses Beispiel ist sowohl für den 1621 als auch für den 1631 'geeignet. Der 1631 wird dabei im 1621 Kompatibilitätsmodus betrieben. 'Auf die Auswertung negativer Temperaturen wird verzichtet. '------------------------------------------------------------------------------- $regfile = "m8def.dat" $crystal = 7372800 $baud = 9600 $hwstack = 32 $swstack = 32 $framesize = 32 Config Scl = Portc.5 Config Sda = Portc.4 Portc.5 = 1 'Pullup Widerstand ein Portc.4 = 1 'Pullup Widerstand ein I2cinit 'entbehrlich '------------------------------------------------------------------------------- Declare Sub Readtemp(byval Device As Byte) Declare Sub Convertvalue_komma1() Dim Value As Word Dim Convert_strg As String * 10 Const Ds1 = 150 'ggf. anpassen '----------------------------- Hauptprogramm ----------------------------------- Do Call Readtemp(ds1) Call Convertvalue_komma1() Print Convert_strg Waitms 500 Loop End '----------------------------- Subroutinen ------------------------------------- 'Readtemp liest die Temperatur und stellt sie nach Aufruf in der Variable Value 'in 10tel Grad zu Verfügung. Übergeben wird die Deviceadresse des Sensors. Sub Readtemp(byval Device As Byte) Local Deviceread As Byte Local Lowtemp As Byte Local Hightemp As Byte Deviceread = Device + 1 I2cstart I2cwbyte Device I2cwbyte &HEE 'Temperaturmessung anstoßen I2cstop I2cstart I2cwbyte Device I2cwbyte &HAA 'Temperaturmessung Lesekommando I2cstop I2cstart I2cwbyte Deviceread I2crbyte Lowtemp , Ack 'LSByte holen (Ganze Grad) I2crbyte Hightemp , Nack 'MSByte holen (0,5 Grad Indikator) I2cstop Value = Lowtemp * 10 If Hightemp = 128 Then Value = Value + 5 End If End Sub '------------------------------------------------------------------------------- 'Convertvalue_komma1 wandelt Value in einen String mit einer Nachkommastelle. 'Es wird gezeigt wie ein Zahlenwert in ein String gewandelt wird und dieser 'formatiert werden kann. 'Alternativ kann natürlich auch die "/10, Mod 10 Methode" angewandt werden. Sub Convertvalue_komma1() Convert_strg = Str(value) Convert_strg = Format(convert_strg , " 0.0") End Sub '-------------------------------------------------------------------------------
Bevor Du Dich nun wieder mit Fragen meldest, wäre es schön, wenn Du endlich mal die Grundlagen von I2C lernen würdest und das Datenblatt liest. Dann wirst Du evtl. auch weitere Antworten erwarten können.Code:Sub Readtemp(byval Device As Byte) Minusflag = 0 Local Deviceread As Byte Local Lowtemp As Byte Local Hightemp As Byte Local Templow As Byte Deviceread = Device + 1 I2csend , Device , &HEE 'Temperaturmessung anstoßen I2csend , Device , &HAA 'Temperaturmessung Lesekommando I2cstart I2cwbyte Deviceread I2crbyte Lowtemp , Ack 'LSByte holen (ganze Grad) Templow = Lowtemp And &H80 If Templow = 128 Then Minusflag = 1 Lowtemp = 255 - Lowtemp Lowtemp = Lowtemp + 1 End If I2crbyte Hightemp , Nack 'MSByte holen (0,5 Indikator) I2cstop Value = Lowtemp * 10 Value_x = Lowtemp 'um das LSB für EEprom 'Ausgabe zu retten If Hightemp = 128 Then '+/- Auswertung If Minusflag = 0 Then Value = Value + 5 ' If Minusflag = 1 Then Value = Value - 5 End If End Sub
Henrik
hallo
es gab schonmal das problem einfach mal suchen dann findet man was.
hier der link:
https://www.roboternetz.de/phpBB2/ze...ghlight=ds1621
gruß
patrick
Das mit den Grundlagen lernen ist schon richtig. Doch mit den englischen Datenblättern kann ich mir halt nicht so weit helfen.
Ich stehe erst am Anfang mit der Programiererei.
Hallo
Ich habe einmal dass oben von hrei, angepasst und probiert, jedoch spuckt er immer nur 255.0 aus, was mache ich falsch? Achja, ich benütze dass RN-Controll.
mfg LucaCode:'------------------------------------------------------------------------------- '----- Beispiel für das Auslesen des Temperatursensors DS1621/1631 ------------ ' HR 2006 ' 'Anmerkung: Dieses Beispiel ist sowohl für den 1621 als auch für den 1631 'geeignet. Der 1631 wird dabei im 1621 Kompatibilitätsmodus betrieben. 'Auf die Auswertung negativer Temperaturen wird verzichtet. '------------------------------------------------------------------------------- $regfile = "m32def.dat" $crystal = 16000000 $baud = 9600 $hwstack = 32 $swstack = 32 $framesize = 32 Config Scl = Portc.0 Config Sda = Portc.1 I2cinit 'entbehrlich '------------------------------------------------------------------------------- Declare Sub Readtemp(byval Device As Byte) Declare Sub Convertvalue_komma1() Dim Value As Word Dim Convert_strg As String * 10 Const Ds1 = 150 'ggf. anpassen '----------------------------- Hauptprogramm ----------------------------------- Do Call Readtemp(ds1) Call Convertvalue_komma1() Print Convert_strg Waitms 500 Loop End '----------------------------- Subroutinen ------------------------------------- 'Readtemp liest die Temperatur und stellt sie nach Aufruf in der Variable Value 'in 10tel Grad zu Verfügung. Übergeben wird die Deviceadresse des Sensors. Sub Readtemp(byval Device As Byte) Local Deviceread As Byte Local Lowtemp As Byte Local Hightemp As Byte Deviceread = Device + 1 I2cstart I2cwbyte Device I2cwbyte &HEE 'Temperaturmessung anstoßen I2cstop I2cstart I2cwbyte Device I2cwbyte &HAA 'Temperaturmessung Lesekommando I2cstop I2cstart I2cwbyte Deviceread I2crbyte Lowtemp , Ack 'LSByte holen (Ganze Grad) I2crbyte Hightemp , Nack 'MSByte holen (0,5 Grad Indikator) I2cstop Value = Lowtemp * 10 If Hightemp = 128 Then Value = Value + 5 End If End Sub '------------------------------------------------------------------------------- 'Convertvalue_komma1 wandelt Value in einen String mit einer Nachkommastelle. 'Es wird gezeigt wie ein Zahlenwert in ein String gewandelt wird und dieser 'formatiert werden kann. 'Alternativ kann natürlich auch die "/10, Mod 10 Methode" angewandt werden. Sub Convertvalue_komma1() Convert_strg = Str(value) Convert_strg = Format(convert_strg , " 0.0") End Sub '---------------------------------
Sollte ein Bild von mir nicht angezeigt werden, einfach eine PM schicken!
So gehts bei mir
'----------- Temperatur abfragen --------------------------------
Sub Thermometer()
Local Device As Byte
Device = &H90
Local Deviceread As Byte
Local Lowtemp As Byte
Local Hightemp As Byte
Deviceread = Device + 1
I2cstart
I2cwbyte Device
I2cwbyte &HEE 'Temperaturmessung anstoßen
I2cstop
I2cstart
I2cwbyte Device
I2cwbyte &HAA 'Temperaturmessung Lesekommando
I2cstop
I2cstart
I2cwbyte Deviceread
I2crbyte Lowtemp , Ack 'LSByte holen
I2crbyte Hightemp , Nack 'MSByte holen
I2cstop
Temperatur = Lowtemp * 10
If Hightemp = 128 Then
Temperatur = Temperatur + 5
End If
Temperatur = Temperatur / 10
End Sub
'Ende -------------- Temperatur ----------------------------------------
Hallo
Leider funktioniert dein Code bei mir nicht. So sieht dass ganze aus:
Leider bekomme ich immer nur 0 zugeschickt. Was mache ich falsch?Code:------------------------------------------------------------------------------- '----- Beispiel für das Auslesen des Temperatursensors DS1621/1631 ------------ ' HR 2006 ' 'Anmerkung: Dieses Beispiel ist sowohl für den 1621 als auch für den 1631 'geeignet. Der 1631 wird dabei im 1621 Kompatibilitätsmodus betrieben. 'Auf die Auswertung negativer Temperaturen wird verzichtet. '------------------------------------------------------------------------------- $regfile = "m32def.dat" $crystal = 16000000 $baud = 9600 Declare Sub Thermometer() Dim Temperatur As Word Config Scl = Portc.0 'Ports fuer IIC-Bus Config Sda = Portc.1 Do Call Thermometer() Print Temperatur Print Waitms 500 Loop '----------- Temperatur abfragen -------------------------------- Sub Thermometer() Local Device As Byte Device = &H90 Local Deviceread As Byte Local Lowtemp As Byte Local Hightemp As Byte Deviceread = Device + 1 I2cstart I2cwbyte Device I2cwbyte &HEE 'Temperaturmessung anstoßen I2cstop I2cstart I2cwbyte Device I2cwbyte &HAA 'Temperaturmessung Lesekommando I2cstop I2cstart I2cwbyte Deviceread I2crbyte Lowtemp , Ack 'LSByte holen I2crbyte Hightemp , Nack 'MSByte holen I2cstop Temperatur = Lowtemp * 10 If Hightemp = 128 Then Temperatur = Temperatur + 5 End If Temperatur = Temperatur / 10 End Sub 'Ende -------------- Temperatur ----------------------------------------
mfg Luca
Edit: "Device = &H90" heisst das alle Ports nach GND gezogen sind, also Hex90?
Sollte ein Bild von mir nicht angezeigt werden, einfach eine PM schicken!
Hallo,
Dein Programm ist richtig. Genau so läuft es bei mir auch.
Wenn Du immer 255, 65535 oder 0 als Antwort bekommst, so liegt dies ziemlich sicher an deiner Verlötung oder einer falschen I2C-Adresse.
Also prüfe nochmals folgende Punkte:
1) Hast Du irgenwelche Pins vertauscht SCL mit SDA
2) Hast Du 5V und GND auf dem Chip /I2C_Bus.
Falls du RN-Control hast, ist der 5V Jumper und der I2C Jumper gesteckt?
3) Ja HEX90 heisst alle A0-A2 auf GND
Übrigens: 0,255,65535 (je nach I2C-Chip) heisst eigentlich immer, daß das Programm den Baustein nicht gefunden hat.
Mehr Ferndiagnose geht leider nicht.
Gruß
Zur Sicherheit nochmals das Datenblatt
http://pdfserv.maxim-ic.com/en/ds/DS1621.pdf
Hallo
Ich habe Heute noch mal alles duchprobiert, aber ich fand keinen Fehler:
VDD: 4.97V
GND: Gnd
A0: Gnd
A1: Gnd
A2: Gnd
Scl: Mit Port b.0 verbunden, spannung 4.97 - 4.96
Sda: Mit Port b.1 Verbunden, spannung 4.97 - 4.96
Tout: Nichts angeschlossen, Spannung 4.97V (ist das Normal?)
Was könnte falsch sein?
mfg Luca
Edit: Ich habe jetzt schnell umgelötet, jetzt habe ich auf A0-A2 +5V, die Hex habe ich auf 9E eingestellt (im prog.), funktioniert aber immer noch nicht.
Sollte ein Bild von mir nicht angezeigt werden, einfach eine PM schicken!
Lesezeichen