Archiv verlassen und diese Seite im Standarddesign anzeigen : ds1621 auslesen
hallo
Ich habe hier versucht den ds1621 auslesen über das Rn-Board V.1.4 über die Twileitung, dabei bin ich aber recht erfolgreich gescheitert.leider:-(
hier zeige ich euch erstmal das Programm:
$regfile = "m8def.dat"
$crystal = 7372800
$baud = 9600
$lib "i2c_twi.lbx"
Config Int0 = Low Level
Config Scl = Portc.5
Config Sda = Portc.4
Declare Function Twistart() As Byte
Declare Function Twisend(byval Databyte As Byte) As Byte
Declare Function Twireceive(byref Databyte As Byte) As Byte
Declare Sub Twistop()
Dim Status As Byte
Dim Datenbyte1 As Byte
Dim Datenbyte2 As Byte
Dim Command As Byte
Dim I As Byte
Dim B As Byte
I2cinit
Twbr = 0
Twsr = &B00000000
'----------------------------------------------Hauptprogramm------------------------------------------------------------
Do
Twsr.2 = 1
Twcr = &H08
Status = Twistart()
Status = Twisend(&B00000001 And &B7665321X90)
Status = Twireceive(datenbyte1)
Status = Twireceive(datenbyte2)
Print Datenbyte1
Print Datenbyte2
Twistop
Loop
End
Function Twistart() As Byte
Twcr = &B10100100
Do : Loop Until Twcr.twint = 1
Twistart = Twsr And &B11111000
End Function
'twi anweisungen
Function Twisend(byval Databyte As Byte) As Byte
Twdr = Databyte
Twcr = &B10000100
Do : Loop Until Twcr.twint = 1
End Function
Function Twireceive(byref Databyte As Byte) As Byte
Twcr = &B10000100
Do : Loop Until Twcr.twint = 1
Twireceive = Twsr And &B11111000
End Function
Sub Twistop()
Twcr = &B10010100
End Sub
Ich habe auch nicht gerade viel über das Thema Twi gefunden.
Habt ihr vielleicht ein paar Tipps oder könnt ihr mir auf eine andere Art helfen.
gruß
patrick
Ich habe auch nicht gerade viel über das Thema Twi gefunden.
Habt ihr vielleicht ein paar Tipps oder könnt ihr mir auf eine andere Art helfen.
Na, da steht in der Hilfe schon einiges. Ich werde auch das Gefühl nicht los, daß Du Dir das Leben schwerer machst, als wirklich notwendig.
BTW: Das Einbinden der TWI-Lib ist nur dann notwendig, wenn Du Hardware I2C nutzen willst (spart ein paar Byte Platz und geht mit dem Meega8). Dann musst Du aber auch die entsprechenden Pins nutzen.
Hier mal eine Subroutine zum einfache Auslesen des 1621/1631:
Sub Readtemp(byval Device As Byte)
Local Deviceread 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 'LSB holen
I2crbyte Hightemp , Nack 'MSB holen
I2cstop
Value = Lowtemp * 10
If Hightemp = 128 Then
Value = Value + 5
End If
End Sub
Nach Aufruf der Sub steht das Ergebnis in Value im Format Grad*10. Also für z.B. 18,5°C der Wert 185. Diese Routine erlaubt nur eine Auflösung von 0,5°C, wenn die möglichen 0,07°C benötigt werden, sieht es etwas komplizierter aus, das reiche ich gerne nach, wenn die einfache Lösung bei Dir funktioniert.
Viele Grüße
Henrik
hi
danke werde ich gleich morgen abend nach der arbeit ausrpobieren.
gruß
patrick
hi
danke, habe ds gerade auch mal umgeschrieben jedoch klappt es noch nicht habe ich was vergessen?
'------------------------------------die anweisungen für prozessor,use.-------------------------------------------------
$regfile = "m8def.dat"
$crystal = 7372800
$baud = 9600
Config Scl = Portc.5
Config Sda = Portc.4
Dim Device As Byte
Dim Deviceread As Byte
Dim Lowtemp As Byte
Dim Hightemp As Byte
Dim Value As Byte
I2cinit
'----------------------------------------------Hauptprogramm------------------------------------------------------------
Do
I2cstart
I2cwbyte Device
I2cwbyte &HEE 'temperaturmessung anstoßen
I2cstop
I2cstart
I2cwbyte Device
I2cwbyte &HAA 'Temperaturmessung Lesekommando
I2cstop
I2cstart
I2cwbyte Deviceread
I2crbyte Lowtemp , Ack 'LSB holen
I2crbyte Hightemp , Nack 'MSB holen
I2cstop
Value = Lowtemp * 10
If Hightemp = 128 Then
Value = Value + 5
End If
Loop
End
gruß
patrick
hier habe ich es das er mir das ausgibt praktisch müsste ich das nur noch durch 10 Teilen und dann hätte ich doch schon alles.
'------------------------------------die anweisungen für prozessor,use.-------------------------------------------------
$regfile = "m8def.dat"
$crystal = 7372800
$baud = 9600
Config Scl = Portc.5
Config Sda = Portc.4
Dim Device As Byte
Dim Deviceread As Byte
Dim Lowtemp As Byte
Dim Hightemp As Byte
Dim Value As Byte
I2cinit
'----------------------------------------------Hauptprogramm------------------------------------------------------------
Do
I2cstart
I2cwbyte Device
I2cwbyte &HEE 'temperaturmessung anstoßen
I2cstop
I2cstart
I2cwbyte Device
I2cwbyte &HAA 'Temperaturmessung Lesekommando
I2cstop
I2cstart
I2cwbyte Deviceread
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
Loop
End
so sieht das ganze glaube ich schon viel viel besser aus danke.
gruß
patrick
hi
danke, habe ds gerade auch mal umgeschrieben jedoch klappt es noch nicht habe ich was vergessen?
Ja, einiges. Woher soll denn der Chip wissen, daß er gemeint ist.
Bei meiner Sub wird die Adresse ja als Parameter übergeben, wenn Du es anders machst, musst Du Device schon mit einem Wert versehen.
Außerdem muss Value ein Word sein (zumindest wenn Temperaturen über 25,5°C gemessen werden sollen).
Und wie liest Du den Wert aus? Ich entdecke weder eine Print value noch eine Lcd value Anweisung. Ich hatte doch extra eine Sub vorgeschlagen, die Du dann natürlich declarieren musst, um das flexibel in eigenen Programmen verwenden zu können.
Aber bitte... untenstehend der korrigierte Code für Deinen Ansatz:
'------------------------------------die anweisungen für prozessor,use.-------------------------------------------------
$regfile = "m8def.dat"
$crystal = 7372800
$baud = 9600
Config Scl = Portc.5
Config Sda = Portc.4
Dim Device As Byte
Dim Deviceread As Byte
Dim Lowtemp As Byte
Dim Hightemp As Byte
Dim Value As Word '!!!!!!!
I2cinit
Device = 144 'Wenn alle Adressleitungen des 1621 auf GND sind.
Deviceread = 145
'----------------------------------------------Hauptprogramm------------------------------------------------------------
Do
I2cstart
I2cwbyte Device
I2cwbyte &HEE 'Temperaturmessung anstoßen
I2cstop
I2cstart
I2cwbyte Device
I2cwbyte &HAA 'Temperaturmessung Lesekommando
I2cstop
I2cstart
I2cwbyte Deviceread
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
Viele Grüße
Henrik
habe aber noch eine frage
woher weißt du das device = 144 ist habe das ihr im rb unter sensoren (den adressname anders gesagt bekommen)??
was hat deviceread der wert 145 zu sagen??
tut mir leid für die fragen aber bin bei i2c erst das erstemal am bearbeiten.
Device = 144 'Wenn alle Adressleitungen des 1621 auf GND sind.
Deviceread = 145
hier habe ich es das er mir das ausgibt praktisch müsste ich das nur noch durch 10 Teilen und dann hätte ich doch schon alles.
Ja, wenn Du die oben erwähnten paar Kleinigkeiten noch berücksichtigst O:) .
Die formatierte Ausgabe läßßt sich dann enteder mit der print value/10; ","; print value MOD 10 Methode erledigen oder, wenn solche Konvertierungen öfter benötigt werden:
Dim Convert_strg As String * 10
...
...
...
'------------------------------------------------------------
Sub Showvalue_komma1()
Convert_strg = Str(value)
Convert_strg = Format(convert_strg , " 0.0")
print Convert_strg
End Sub
Grüße
Henrik
woher weißt du das device = 144 ist habe das ihr im rb unter sensoren (den adressname anders gesagt bekommen)??
was hat deviceread der wert 145 zu sagen??
Ich weiß das, weil ich Datenblätter lese und mir daher bekannt ist, daß das höherwertige Adressnibble für den DS1621 feast auf &h09 (dezimal 144) liegt, er drei vom User zu definierende Pins (im niederwertigen Nibble) hat, die die ingesamt 16 möglichen Devices näher bestimmen. Das niederwertigste Bit entscheidet ob der Slave bei der nächsten Operation gelesen oder geschrieben werden soll. Bei Leseoperationen ist die Adresse also immer um eins höher als die Deviceadresse.
Das steht aber wirklich alles ganz ausführlich in den datenblättern und in ungezählten Artikeln im Netz. Wie hat Du denn Deinen Schaltkreis aufgebaut, ohne Kenntnisse dessen zu haben?
Viele Grüße
Henrik
nee ich habe habe mich schon informiert habe aber gedacht das dich das mit meiner version richtig wäre.
naja auf jeden fall wusste ich wie ich das ganze aufbauen sollte habe nach gefragt habe auch schon was gefunden in einem Buch.
naja muss das datenblatt mal richtig übersetzen.
gruß
patrick
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.