Hallo Zusammen,
habe mir ein kleines Board mit ATMEGA328P, SHT31 Sensor und einem
Arduino OLED Display gebaut.
So Display funktioniert! Ich versuche über den I2C Bus die Werte vom
Sensor auszulesen. Dies klappt irgendwie nicht ganz. Ich bekomme für
alle data 0-5 die Zahl 17476 zurück.
Wer hat eine Idee?
i2c_rep_start(SHT31+I2C_WRITE);
data[0] = ((uint8_t)i2c_readAck())<<8;
data[0]|= i2c_readAck();
Wenn man lesen will nimmt man bestimmt nicht I2C_WRITE.
Hi
Alain F. schrieb:> i2c_stop();>> // i2c_init();> // Read 6 bytes of data> // temp msb, temp lsb, temp crc, hum msb, hum lsb, hum crc> i2c_rep_start(SHT31+I2C_WRITE);
Wieso eigentlich STOP und darauf folgend ein REPEAT-START?
Ok, unterm Strich sind START und REPEAT-START 100% identisch (auf dem
Bus kommt das Gleiche an), aber 'mit Sinn und Verstand' ist Das nicht,
eher C&P.
Von einem Init eines Display sehe ich in dem Code Nichts.
Ebenfalls dürften, irgendwo, auch Spezialitäten des verwendeten µC
includiert werden - sehe ich auch Nichts von.
Auch beziehst Du Dich auf die Header-Datei XYZ.h, Welche nur includiert
wird, also mit dem eigentlichen Problem wohl wenig bis Nichts zu tun
hat.
Meine Frage:
Ist das Programm ggf. doch etwas umfangreicher, als hier gezeigt?
(ein einfaches Ja würde, theoretisch, schon reichen, aber nicht wirklich
helfen)
MfG
Alain F. schrieb:> #define SHT31 0x44 // I2C Address A of SHT31> i2c_start(SHT31+I2C_WRITE);
Bist du sicher, dass du den SHT31 mit dem I2C_Start-Aufuf überhaupt
erreichst. Laut Datenblatt liegt der auf 0x44 (ADDR an Gnd) bzw. 0x45
(ADDR an VCC). So wie du den Aufruf gemacht hast versuchst du es auf
0x22.
Guck dir mal den Unterschied zwischen I2C-Adresse und dem für deinen
Funktionsaufruf erforderlichen Argument an. So ist das jedenfalls
sinnfrei.
http://www.nxp.com/documents/user_manual/UM10204.pdf
Alain F. schrieb:> Wieso ist der Aufruf auf 0x22? Ich habe ja i2c_start(SHT31+I2C_WRITE);
Eben.
Ich kenne jetzt die von dir verwendete I2C-Bibliothek nicht, aber bei
den meisten Bibliotheken erwartet die i2c_start()-Funktion als Argument
das komplette erste Byte der I2C-Übertragung, also in den oberen 7 Bit
die I2C-Adresse und im LSB das R/W-Bit.
Alain F. schrieb:> Hier die I2C Lib.
Dann guck dir dort mal den Beispiel-Code an. Dort ist die Adresse des
24C02 als 0xA2 angegeben. Das ist eine 8 Bit Angabe, die wenig mit der
Adressdefinition nach I2C-Spezifikation (7 Bit) zu tun hat.
Du muss für deinen Funktionsaufruf die im Datenblatt angegebene Adresse
mit 2 multiplizieren.
Versuch es mal mit
Hallo Wolfang,
ok danke! Ja jetzt werden die Werte auf dem Display angezeigt. Jedoch
mit hohen Schwankungen und es macht noch nicht viel Sinn.....muss dass
mal untersuchen jetzt.
Guten Morgen,
kann mir jemand von euch nochmal erklären, warum ich als Adresse die
0x88 verwende und nicht die 0x44??
Wäre euch echt sehr dankbar darüber??
Mit freundlichen Grüßen
Dennis
Wolfgang schrieb:> Dann guck dir dort mal den Beispiel-Code an. Dort ist die Adresse des> 24C02 als 0xA2 angegeben. Das ist eine 8 Bit Angabe, die wenig mit der> Adressdefinition nach I2C-Spezifikation (7 Bit) zu tun hat.
Die i2c Adresse sind die ersten 7 bit von den ersten 8 die übertragen
werden. Das letzte gibt an, ob geschrieben oder gelesen wird.
Wenn die die Adresse in die 8 bit "hineinschreibst", also um 1 bit nach
links verschiebst entspricht das einer Multiplikation mit 2.
Das kommt jetzt stark auf die verwendete Bibliothek an, ob du die
Adresse um 1 Bit shiften musst oder nicht.