I2C SHT31 i2cmaster.h

#4959540
Lesenswert?

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?

1
#include "i2cmaster.h"
2

3
#define SHT31    0x44      // I2C Address A of SHT31
4

5
//------------------------------------------------------------------------
6
  //            SHT31
7
  //------------------------------------------------------------------------
8

9

10
  // SHT31 I2C address is 0x44(68)
11
  unsigned int data[6];
12

13
  i2c_init();                                // init I2C interface
14
  i2c_start(SHT31+I2C_WRITE);
15

16
  i2c_write(0x2C);
17
  i2c_write(0x06);
18
  i2c_stop();
19

20
  _delay_ms(300);
21

22
  i2c_init();                                // init I2C interface
23
  i2c_start(SHT31+I2C_WRITE);
24
  i2c_stop();
25

26

27
//  i2c_init();
28
  // Read 6 bytes of data
29
  // temp msb, temp lsb, temp crc, hum msb, hum lsb, hum crc
30
  i2c_rep_start(SHT31+I2C_WRITE);
31

32

33
  data[0] = ((uint8_t)i2c_readAck())<<8;
34
  data[0]|= i2c_readAck();
35
  data[1] = ((uint8_t)i2c_readAck())<<8;
36
  data[1]|= i2c_readAck();
37
  data[2] = ((uint8_t)i2c_readAck())<<8;
38
  data[2]|= i2c_readAck();
39
  data[3] = ((uint8_t)i2c_readAck())<<8;
40
  data[3]|= i2c_readAck();
41
  data[4] = ((uint8_t)i2c_readAck())<<8;
42
  data[4]|= i2c_readAck();
43
  data[5] = ((uint8_t)i2c_readAck())<<8;
44
  data[5]|= i2c_readNak();
45

46
  
47
  i2c_stop();
48

49

50
  char char_data0[20];
51
  itoa( data[0], char_data0, 10 ); 
52
  
53
  char char_data1[20];
54
  itoa( data[1], char_data1, 10 ); 
55
  
56
  char char_data2[20];
57
  itoa( data[2], char_data2, 10 ); 
58
  
59
  char char_data3[20];
60
  itoa( data[3], char_data3, 10 );
61
  
62
  char char_data4[20];
63
  itoa( data[4], char_data4, 10 );
64
   
65
  char char_data5[20];
66
  itoa( data[5], char_data5, 10 );
#4959725
Lesenswert?

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
Gast #4959751
Lesenswert?

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
Gast #4959993
Lesenswert?

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.
Gast #4960036
Lesenswert?

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
1
i2c_start(0x88 + I2C_WRITE);
#4960681
Lesenswert?

Geschafft!
1
  // SHT31 I2C address is 0x44 8bit daher als Adresse 0x88 nehmen!!!
2
  unsigned data[6];
3

4
  i2c_init();                                // init I2C interface
5
  i2c_start(SHT31+I2C_WRITE);
6

7
  i2c_write(0x2C);
8
  i2c_write(0x06);
9
  i2c_stop();
10

11
  _delay_ms(300);
12

13
  //i2c_init();                                // init I2C interface
14
  //i2c_start(SHT31+I2C_WRITE);
15
  //i2c_stop();
16

17

18
  i2c_init();
19
  // Read 6 bytes of data
20
  // temp msb, temp lsb, temp crc, hum msb, hum lsb, hum crc
21
  //i2c_rep_start(SHT31+I2C_READ);
22
  i2c_rep_start(SHT31+I2C_READ);
23

24
  data[0]= i2c_readAck();
25
  data[1]= i2c_readAck();  
26
  data[2]= i2c_readAck();
27
  data[3]= i2c_readAck();
28
  data[4]= i2c_readAck();
29
  data[5]= i2c_readNak();  
30
  i2c_stop();
31

32

33

34
  char char_data0[20];
35
  itoa( data[0], char_data0, 10 ); 
36
  
37
  char char_data1[20];
38
  itoa( data[1], char_data1, 10 ); 
39
  
40
  char char_data2[20];
41
  itoa( data[2], char_data2, 10 ); 
42
  
43
  char char_data3[20];
44
  itoa( data[3], char_data3, 10 );
45
  
46
  char char_data4[20];
47
  itoa( data[4], char_data4, 10 );
48
   
49
  char char_data5[20];
50
  itoa( data[5], char_data5, 10 );
51

52

53

54

55

56
  float temp2 = (data[0] * 256) + data[1];
57
  float cTemp2 = -45.0 + (175.0 * temp2 / 65535.0);
58
  float fTemp2 = (cTemp2 * 1.8) + 32.0;
59
  float humidity2 = (100.0 * ((data[3] * 256.0) + data[4])) / 65535.0;
60

61
  char char_cTemp2[20];
62
  itoa( cTemp2, char_cTemp2, 10 ); 
63
  char char_RH2[20];
64
  itoa( humidity2, char_RH2, 10 ); 
65

66
  strcpy(char_cTemp2, char_cTemp2);
67
  strcat(char_cTemp2, " °C");
68
 
69
  strcpy(char_RH2, char_RH2);
70
  strcat(char_RH2, " %RH");
Gast #5014178
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren