Forum: Mikrocontroller und Digitale Elektronik Hygrosens I2C Tmp Modul antwortet nicht


von DisM (Gast)


Lesenswert?

Hallo,

ich hoffe ihr könnt mir weiterhelfen.
Im Rahmen eines Uni Projekts wurden 3 Hygrosens TEMOD I2C ASIC 
PT1000(480°) Module bestellt. 
(http://shop.hygrosens.com/Sensormodule-acma/Temperatur-Sensormodule/Digitaler-Ausgang-I-C/Innovatives-ASIC-Modul-zur-Temperaturmessung-acma-1.html)
Kommunizieren sollten diese mit dem USB I2C Interface Bausatz von ELV. 
(http://www.elv.de/output/controller.aspx?cid=74&detail=10&detail2=24012&flv=1&bereich=&marke=)

Abgesehen davon, dass wohl ein I2C Switch benötigt, wird um später drei 
von diesen an einem Bus zu betreiben, scheitere ich bislang schon beim 
ansprechen der Temperaturmodule.

Der Interface Bausatz wurde zusammengebaut, Treiber und Firmware (1.6) 
auch auf aktuellem Stand. Das USB Interface antwortet auch soweit auf 
alle Befehle.
Standard Einstellungen laut Dokumentation. 100khz, Baudrate 115200, 
8Daten,1Stop etc.
Verwendet wird die Software HTerm.

Alle Kontakte sowohl von Sensoren als auch beim Bausatz wurden 
überprüft.
Alles laut Dokumentation verkabelt.

Die Temperaturmodule werden von einem nicht stabilierten 9V Netzteil bei 
ca 14V gespeist. Der Analoge Ausgang wird auch korrekt ausgegeben (laut 
Multimeter), das Modul arbeitet also.
Die Adresse zum Lesen der 2 Byte für die Temperatur ist rechnerisch und 
auch laut diesem Forum 0xF1 (/0xF0). Laut I2C ASIC Doku (A0/A1).

Der Befehl zum Auslesen sollte <S F1 02 P> lauten? Als Antwort erhalte 
ich lediglich TWI:Read Error, bei den jeweiligen obigen Adressen.
Mit nem Logikfühler hab ich die SDA und SCL Leitungen überprüft, die 
Signale scheinen korrekt übermittelt zu werden.
Bislang hab ich das ganze bei 100khz,200khz und 400khz getestet.

In der Dokumentation zu den Thermomodulen steht, dass diese auf jedes 
gelesene Byte ein ACK vom Master erwartet und was von ACK related Clock 
Pulse?(ich hoffe das ist standard)
Ansonsten bin ich langsam mit meinem Latein am Ende. Da ich I2C Neuling 
bin, könnte es sein das ich irgendeine Einstellung den Bus selbst 
betreffend noch nicht so wahrgenommen habe.

Vielen Dank schonmal.

Gruß
DisM

von DisM (Gast)



Lesenswert?

Im Anhang erstmal die Dokumentationen die ich zuvor vergessen hab.

Vllt. hilfts wenn ich die generelle Frage stelle, welche typischen 
Fehler beim I2C Bus zu einem Read Error führen?

Einige im Forum verwenden ähnliche Module von Hygrosens. Muss ich diese 
erst für I2C initialisieren, bevor ich sie verwenden kann?

Um in der Zwischenzeit irgendwas messen zu können, würd ich gern die 
Analogen Messsignale verwenden.
Im Anhang meine Schaltung.
Sie besteht aus einem I2C Switch (PCA9546AD), 4x 12Bit ADC MCP3221 und 
nem OPV MCP6234. Das ganze wird mit 5V vom USB I2C Interface gespeist. 
Es gibt nen digital und analog GND. OPV und ADCs unterstützen 0-5V 
Input.

Vllt. hat ja jemand kurz Zeit draufzuschauen und mir ein Okay zu geben 
ob das so passt.

Spezielle Frage hätte ich noch wegen der Bypass C. Die einzelnen Chips 
werden mit Adapterplatinen auf ner Lochrasterplatine verschaltet, anders 
als beim normalen PCB und SMD Teilen dürfte die Leitung zum IC länger 
ausfallen.
Sollte man in diesem Fall ne höhere Kapazität als Bypass auswählen?

Gruß
DisM

von Krapao (Gast)


Lesenswert?

> Der Befehl zum Auslesen sollte <S F1 02 P> lauten?

Das Zeichen < startet eine Makro-Ausführung an der nachfolgend zu 
übergebenden Makro-Speicheradresse. Ich vermisse in deiner Sequenz die 
Makro-Speicheradresse.

Wie hast du die Sensoren an den I2C-Bus angeschlossen und welche 
Pull-Up-Widerstände benutzt du am I2C-Bus oder braucht man die laut Doku 
des USB-I2C-Interfaces nicht (finde dazu nix in der PDF-Doku)?

von David P. (chavotronic)


Lesenswert?

>Die Adresse des Bausteins ist default 0x78, unter
>dieser Adresse ist der Baustein immer anzusprechen.

Die Adresse wird meist als 7 Bit angegebn , ohne RW Bit
Bedeutet folgendes

0x78 ist 0111 1000,

erstes Bit abschneiden und ne 0 hinten dranhängen

1111 0000

Ist für mich auch 0xF0

Habe aber den Eindruck dass das ELV Ding die Adressen anders angibt. 
Hast du es mal mit der 0x78 probiert?

von DisM (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

also das mit den Klammern war mein Fehler..hätte Anführungszeichen 
verwenden sollen. Also ich sende normal SF1 02 P. (ohne makro support 
vom I2C USB interface zu nutzen).

Ich habs mit 0x78 probiert, genauso mit 0x79.
Im Schaltplan zu dem USB Interface, sind die SDA und SCL Leitungen 
jeweils mit 10kOhm Pullups versehen, deswegen denke ich das man nicht 
noch extra welche braucht.

Die Sensoren sind über einen Steckkontakt mit den Modulen verbunden. Wir 
haben zwar neue Stecker und Buchsen dran gemacht (Crimp Kontakte) aber 
auch da funktionieren eigentlich alle Kontakte.
Der Analog Ausgang hat auch eine Spannung ausgegeben, finde leider grad 
die Notizen nicht und werd morgen schauen ob da was brauchbares 
rauskommt bzw. ob das Modul auch ohne Sensor den analogen Ausgang 
schaltet.

Laut den Beispielen in der I2C Interface Doku, hält man sich an die 
normale Adressierung?!

Gruß

von O. H. (ohagendorf)


Lesenswert?

Ich habe die Module bei C.. gekauft. Das sollte aber, soweit ich weiß, 
egal sein.

Eine Aktivierung des I2C Busses o.ä. ist nicht notwendig.

Hier ein Auszug aus meinem Arduino Code:

#define ADDR_I2CPT1000 0x78

...

Wire.requestFrom(ADDR_I2CPT1000,2); // read 2 bytes
if(Wire.available()==2) {
  Th = Wire.receive(); // receive 1st byte
  Tl = Wire.receive(); // receive 2nd byte
  val = double((Th<<8 | Tl))/256.0 - 32.0;
}


Gruß
Olaf

von Krapao (Gast)


Lesenswert?

Strange!

501994_Serial_Digital_Interface.pdf:

"The general HYGROSENS ASIC slave address is 0x78 (7bit). As the address 
is completed with the R/W-Bit as LSB the address Byte (whole 8 bit) for 
reading data is 0xA1 for reading or 0xA0 for writing data to the 
ASIC."

von DisM (Gast)


Lesenswert?

@Krapao: das ist genau das was ich meinte. Allerdings funktionieren 
beide Adressvarianten nicht.
Die Module stammen auch von Congrad.

Seltsam ist v.a. folgendes:

Ich habe nochmal alle Analog Ausgänge der Module mit nem Multimeter 
gemessen.
Das erste Modul das ich heranzog lieferte korrekte 340mV für 22°C. Als 
ich den Sensor abzog, war zunächst die Spannung negativ -380mV. Danach 
war der Ausgang stets 1,2V! egal ob mit oder ohne Sensor. Die 
Stromverbindung jedesmal (auch kurzweilig für Reset) zu kappen änderte 
soweit auch nichts mehr daran.

Die anderen Module lieferten im Blindtest 5V oder ~135mV am Analog 
Ausgang und mit Sensor temporär 141mV und 110mV. Mittlerweile geben die 
beiden Module mit und ohne Sensor eine Spannung von 5V und 0.5V aus.

Vllt. haben die Module ihre EEPROMS geschrieben und verwenden nun diese 
dauerhaft für das Setzen der analog Ausgänge.
Dann sollte aber durch ein/ und abstöpseln der Reset durchgeführt werden 
und das Problem bereinigen?

Am Anfang hab ich fälschlicherweise versucht die Module mit 5V zu 
betreiben, Betriebsspannung ist von 6-24V.
Wie wahrscheinlich ist es, dass die Module dadurch beschädigt wurden?

Im gegenwärtigen Zustand kann ich die Dinger lediglich als 
Christbaumschmuck verwenden.

Immerhin war im Adventskalender eine A/D PCI Karte versteckt, so dass 
die Schaltung schon mal wegfällt.

Danke auch nochmals für die ganzen Antworten.

Gruß
DisM

von Cebulon (Gast)


Lesenswert?

Hallo,

ich möchte auch ein Hygrosens TEMOD I2C ASIC PT1000(480°) Modul mit 
einem Arduino auslesen. Leider verstehe ich hier nicht besonders viel.

Also, das auslesen des I2C Bus liefert mir den 1. Wert 14 Dezimal und 
beim 2. Wert 19 Dezimal, und das bei einer (mit anderem Messgerät) 
gemessenen Temperatur von 22 °C. Die oben beschriebene Berechnung von 
val "val = double(((Th<<8 | Tl))/256.0) - 32.0;" ergibt den Wert -17.

Ich finde nicht heraus, wie ich das Umrechnen kann, um eine schlaue 
Temperatur zu erhalten.

Oder kann mir jemand mal einen kompletten Sourcecode zum auslesen des 
Hygrosens TEMOD I2C ASIC PT1000(480°) Module senden? Vill. mach ich ja 
auch was anderes falsch.

mein Sourcecode:

#include <Wire.h>
#define DEV_ID 0x78
int Th,Tl,val =0;
void setup()
{
 Serial.begin(9600);
 Wire.begin();
}

void loop()
{
 delay(1000);
 Wire.requestFrom(DEV_ID,2); // read 2 bytes
 Th = Wire.receive(); // receive 1st byte
 Tl = Wire.receive(); // receive 2nd byte
 val = double(((Th<<8 | Tl))/256.0) - 32.0;
 Serial.print("Th=");
 Serial.print(Th);
 Serial.print("      Tl=");
 Serial.print(Tl);
 Serial.print("      val=");
 Serial.println(val);
}

Vielen dank für eure Bemühunen, mir unwissendem auf die Sprünge zu 
helfen.

von t3g (Gast)


Angehängte Dateien:

Lesenswert?

Laut dem Datenblatt musst du bei dem 480°C Modul (Typ R3) eine andere 
Formel hernehmen!

val = double(((Th<<8 | Tl))/64.0) - 32.0;

wäre des Rätsels Lösung ;)
Siehe Formel bei Typ-R3

Somit komm ich auf:
(14*256+19)/64-32=24,3°C

Beste Grüße,
Hoffe es hilft dir noch was, oder jemand anderem :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.