PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ds1621 auslesen



patti16
24.10.2005, 19:27
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

hrei
24.10.2005, 20:31
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

patti16
24.10.2005, 21:29
hi

danke werde ich gleich morgen abend nach der arbeit ausrpobieren.

gruß
patrick

24.10.2005, 21:44
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

patti16
24.10.2005, 21:50
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

hrei
24.10.2005, 22:05
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

24.10.2005, 22:13
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

hrei
24.10.2005, 22:20
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

hrei
24.10.2005, 22:32
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

patti16
25.10.2005, 17:36
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