HYT 221 an 8051 liefert keine Werte

Gast #4316086
Lesenswert?

Hallo zusammen,

ich versuche an einem Atmel AT89C5131 einen HYT221 Sensor von Conrad in 
Betrieb zu nehmen. Leider liefert der Sensor keine Werte zurück und 
irgendwie komme ich nicht weiter.

Hat jemand eine Idee, warum keine Werte zurück geliefert werden?

1
#include <at89c5131.h>                                //  Registeradressen                  
2
#include <stdio.h>                        // für sprintf    
3
#include <lcd.h>  
4
#include <math.h>
5
#include "emuI2C.h"
6

7
#define HYT_ADRESS  0x28
8
#define HYT_ADRESS1  0x28
9

10

11
   double taupunkt;
12

13
 float    temperature;
14
 float    humidity;
15
 
16
extern void initlcd (void);                  // in \hilf_c\lcd.c  
17

18

19
 extern void loeschenlcd (void);                // in \hilf_c\lcd.c                  
20
 extern void textlcd (unsigned char *, unsigned char);  // in \hilf_c\lcd.c        
21

22
void warte100us (unsigned int anzahl)  
23
  {
24
  unsigned int z1,z2;
25
  for (z2 = anzahl;  z2 != 0;  --z2)
26
    {
27
    for (z1 = 255;   z1!= 0;   --z1);
28
    };
29
  }
30

31
float calc_dewpoint(float h,float t)
32
//--------------------------------------------------------------------
33
// calculates dew point
34
// input: humidity [%RH], temperature [°C]
35
// output: dew point [°C]
36
{ 
37
float k,dew_point;
38
k = (log10(h)-2)/0.4343 + (17.62*t)/(243.12+t);
39
dew_point = 243.12*k/(17.62-k);
40
return dew_point;
41

42
}
43

44
  
45
  void main (void)
46
  {
47
// sende Daten ueber I2C
48
//unsigned char test[1] ={0x00};   
49

50
unsigned char buf [20] ;                  //  für LCD-Anzeige                    float  kommazahl;  
51
unsigned char raw_value_temp;
52
unsigned char raw_value_humid;
53

54

55
float ausw_taupunkt = taupunkt;
56

57
  P2 = 0;
58
  initlcd ();                            //  Initialisierung LCD-Display an P0      
59
  loeschenlcd ();                        //  Anzeige löschen  
60

61

62

63
  while (1)
64
    {  
65

66
unsigned char msg[4] ={0x00}; 
67
unsigned char msg1[4] ={0x00};
68
unsigned char test[4] ={0x00}; 
69

70
msg[0] = HYT_ADRESS; // Slave Adresse    
71
EmuI2C_SendData (msg, 1); // Daten senden via I2C
72
      
73
warte100us(100);
74
      
75
msg1[0] = HYT_ADRESS1; // Slave Adresse
76
EmuI2C_ReceiveData(msg, 4); // Daten empfangen via I2C      
77

78

79

80
      
81
raw_value_temp = ((msg[2] << 8) | msg[3]) >> 2;
82
        // Rohwert der Feuchte als 14bit -Wert im 1. und 2. Datenbyte, der Wert ist rechtsbuendig
83
        // ausgerichtet, im 1. Datenbyte mussen die beiden Statusbits geloescht werden
84
          raw_value_humid = ((msg[0] & 0x3F) << 8) | test[1]; 
85
          temperature = ((float)(raw_value_temp) * 165.0F / 16383.0F) - 40.0;
86
          humidity = (float)raw_value_humid * 100.0F / 16383.0F;  
87
          taupunkt = calc_dewpoint(humidity,temperature);
88
  
89
      sprintf (buf,"T: %3.1f\xdf H:%3.1f%%",temperature,humidity);  
90
      
91
    textlcd (buf,1);              
92
                
93
                
94
    
95
    sprintf (buf,"Taupunkt:  %3.1f\xdf ",taupunkt);
96
        
97
    textlcd (buf,2);    
98
    
99

100
                                                                
101
     }                                
102

103
  
104
}
Gast #4316354
Lesenswert?

Habe den HYT221 vor einiger Zeit an ein MSP430-Launchpad mit einem
MSP430G2452 im Sockel angeschlossen und nur stur das "Geschreibsel"
im HYT221-Datenblatt in meinem Programm umgesetzt:

case 'h':  // get HYT221 Humidity/Temperature

           i2cStart();                // start HYT221 measurement cycle
           __delay_cycles(64);
           i2cWrite(SlaveAddr_HYT221 << 1);// 7-bit SlaveAddr shift 1x 
left
           __delay_cycles(64);
           i2cStop();
           __delay_cycles(128);

           //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
           i2cStart();                               // query HYT221
            __delay_cycles(64);
           i2cWrite((SlaveAddr_HYT221 << 1) + 1);    // 7-bit SlaveAddr
                                //shift 1x left + 1 == i2c read command
           __delay_cycles(64);
           Cap_Data_1MSB = i2cRead(OK_I2C_ACK); // High-Byte des HYT221
                                                // Humidityregisters
           __delay_cycles(64);
           Cap_Data_2LBS = i2cRead(OK_I2C_ACK); // Low-Byte des HYT221
                                                // Humidityregisters
           __delay_cycles(64);
           Temp_Data_1MSB = i2cRead(OK_I2C_ACK);// High-Byte des HYT221
                                                // Temperaturregisters
           __delay_cycles(64);
           Temp_Data_2LBS = i2cRead(NO_I2C_ACK);// Low-Byte des HYT221
                                                // Temperaturregisters
           __delay_cycles(64);
           i2cStop();
           __delay_cycles(128);

// logische UND-Verknüpfung: das Ergebnisbit ist 1,
// falls beide Bits 1 sind, ansonsten 0
               Humidity_Word = Cap_Data_1MSB & 0x3f;  // AND 00111111 ->
                     // Wegmaskieren der beiden MSBits von Cap_Data_1MSB
               Humidity_Word = (Humidity_Word << 8) + Cap_Data_2LBS;

               Temperature_Word = Temp_Data_2LBS >> 2;  // 2x shift 
right
                     // -> Entfernen der beiden LSBits von 
Temp_Data_2LBS
               Temperature_Word = Temperature_Word + (Temp_Data_1MSB << 
6);

Sicher nicht der eleganteste Code ABER völlig transparent (wenn man die
verwendeten I2C-Routinen kennt).
Gast #4316378
Lesenswert?

#4316449
Lesenswert?

Der Baustein hat also die Schreibadresse 0x51 und die Leseadresse 0x50 
(0x28<<1+1).
> Slave Address Manipulationen in meinem Code
Ich sehe keine Address-Manipulation in dem Code-Teil. Ich sehe nur, dass 
Du die (identischen) Adressen jeweils in ein Array kopierst, das nich 
vollständig initialisiert ist. Was die Funktionen 
EmuI2C_ReceiveData(char * Array, char Irgendeinsteuerzeichen) und 
EmuI2C_SendData(...) machen sollen, geht aus dem Ausschnitt auch nicht 
hervor.

Vielleicht solltest Du als Hausaufgabe nochmal zu den I2C-Basics 
zurückgehen.

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