Forum: Mikrocontroller und Digitale Elektronik HYT 221 an 8051 liefert keine Werte


von Matze (Gast)


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
}

von msp430-freak (Gast)


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).

von msp430-freak (Gast)


Lesenswert?


von Bernhard S. (b_spitzer)


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.

: Bearbeitet durch User
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.