Für z.B. HEX 20 kommt da einfach &H20 hin. Dein Beispiel mit Stop Convert T wäre dann &H22
Der Compiler macht dann daraus eh wieder ein Byte.
Aus irgendwelchen Gründen läuft bei mir meist SoftTWI besser als Hardware.
Für z.B. HEX 20 kommt da einfach &H20 hin. Dein Beispiel mit Stop Convert T wäre dann &H22
Der Compiler macht dann daraus eh wieder ein Byte.
Aus irgendwelchen Gründen läuft bei mir meist SoftTWI besser als Hardware.
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Alles klar, eigentlich hätte ich auch selbst draufkommen sollen.
Ich benutze ebenfalls Soft-I2C.
Inzwischen konnte ich bereits das EEPROM ansprechen, aber beim DS1631 beiße ich mir noch die Zähne aus. Mein Ansatz:
Laut Datenblatt funktioniert das Auslesen der Temperatur so (Seite 12, Absatz "2-Wire Reads"):
- I2C start
- Control Byte
- Read Temperature Command
- ACK from device
- Repeated start
- Conrol byte with same Slave Adress
- Read ACK (Byte 1)
- Read NACK (Byte 2)
- Stop
Das R/W-Bit im Control-Byte muss 1 sein, damit dem DS1631 eine Leseoperation mitgeteilt wird.
Ist das so richtig?
Grüße
Thomas
Hallo Klebwax!
Vielen Dank für deine Antwort.
Nach nochmaligen Durchlesen des entsprechenden Absatzes im Datenblatt habe ich jetzt auch gesehen, dass das R/W-Bit beim ersten Mal 0 sein muss.
Hier mein erster Versuch:
Als Var1 bekomme ich 22, wenn ich die Platine mit dem Föhn "anföhne" steit dieser Wert kontinuierlich auf etwa 38. Var2 bleibt immer bei 255. Ich nehme an, dass der DS1631 standardmäßig im 8-bit Modus arbeitet?Code:Do If S2 = 0 Then Led = 0 Waitms 500 Incr Count I2cstart I2cwbyte &H90 I2cwbyte &HAA I2crepstart I2cwbyte &H91 I2crbyte Var1 , Nack I2crbyte Var2 , Ack I2cstop Waitms 10 Cls Lcd "Gelesen:" Locate 2 , 1 Lcd "Var1=" ; Var1 Lcd " " Lcd "Var2=" ; Var2 Lcd " " Lcd Count Waitms 100 Led = 1 End If Loop
Grüße
Thomas
Danke. Hätte ich die Bascom-Hilfe besser gelesen wäre mir dieser Fehler erspart geblieben:
Specify ACK if there are more bytes to read.
Specify NACK if it is the last byte to read.
Jetzt bekomme ich die zwei Werte. Der erste scheint relativ konstant zu sein, der zweite springt bei Änderung der Temperatur. Interessant wird jetzt die Umrechung. Ich versuche, einen Lösungsansatz zu finden.
Grüße
Thomas
Ich habe mich jetzt stundenlang an der Berechnung versucht, bin aber nicht wirklich zufrieden damit:
Das erste Byte ergibt die Ganzzahl für die Temperatur, zusätzlich bestimmt Bit 7 das Vorzeichen. Das zweite Byte besteht eigentlich nur aus vier Bits, weil die letzten vier Bits immer null sind.
Somit:
Byte1 = Ganzzahl
Byte2 viermal nach rechts shiften und das Ergebnis mit 0,0625 multiplizieren ergibt jenen Wert, der zur Ganzzahl addiert werden muss.
Am Papier sowie am µC funktioniert es, aber durch die notwendige Single-Variable frisst es einiges an Speicherplatz.
Später möchte ich die Werte in einem EEPROM ablegen, ich nehme an das es einfacher ist, die beiden Bytes alleine nacheinander abzuspeichern (Zelle 1: Byte1, Zelle2: Byte2) und erst vor der Ausgabe umzuwandeln. Das Abspeichern einer Single-Variable wäre mit großem Aufwand verbunden, oder sehe ich das falsch?
Grüße
Thomas
Hallo Thomas,
für eine Single müsstest du halt 4 Byte abspeichern. Halte ich hier aber sowieso für unsinnig, da du nur 16 verschiedene Werte hinter dem Komma hast.
Ich habe es bei mir so gemacht, dass ich die 16 berechneten Werte in Data Befehlen abgespeichert habe. Die legst du einmal fest und gibst sie dann nur noch nach dem Komma aus. Das Addieren habe ich also auch nicht gemacht. Warum erst eine Single verwenden um sie dann für die Ausgabe wieder umzuwandeln.
Bei Vergleichen habe ich dann nur den Ganzzahlanteil genommen. Damit hast du dann auch gleich eine Hystere mit eingebaut.
Da wäre Code zum gucken besser. Bei meinen Bauteilen ist die Leseadresse um 1 höher als die Schreibadresse.
Config:
Lesen:Code:Const Si4703_read_addr = &H21 ' Lese Adresse SI4703 Const Si4703_write_addr = &H20
Code:I2cstart I2cwbyte Si4703_read_addr For I = 0 To 31 I2crbyte Register_read_byte(i) , Ack Next I I2cstop
Schreiben:
Hat sich überschnitten. Jetzt ist ja code zum gucken da.Code:Si4703_write_register: I2cstart I2cwbyte Si4703_write_addr For I = 1 To Anzahl I2cwbyte Registerbyte(i) Next I I2cstop Return
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Lesezeichen