MLX90614 ansprechen

Gast #1592742
Lesenswert?

Hallo,

ich versuche den MLX90614 auszulesen, allerdings gelingt es mir noch 
nicht. SDA und SCL haben 10k Pullups.

Mein Code:
1
Do
2

3
   I2cstart
4
   Waitms 1
5
   I2cwbyte &H5A
6
   Waitms 1
7
   I2cwbyte &H07
8
   I2cstop
9

10
   Print Err
11

12

13
   I2cstart
14
   Waitms 1
15
   I2cwbyte 85
16
   Waitms 1
17
   I2crbyte Highbyte , Ack
18
   Waitms 1
19
   I2crbyte Lowbyte , Nack
20
   I2cstop
21

22

23
   Temp1 = Highbyte
24
   Temp1 = Temp1 * 256
25
   Temp1 = Temp1 + Lowbyte
26
   Temp1 = Temp1 * 0.01
27

28

29
   Summe1 = Summe1 + Temp1
30

31

32
   Print "temp: " ; Summe1
33

34
   Summe1 = 0
35

36
   Wait 3
37
Loop

Was mache ich falsch?
Danke
Gast #1593967
Lesenswert?

Keiner eine Idee?
So klappt es auch nicht:
1
$regfile = "M8def.dat"
2
$crystal = 1000000
3
$baud = 57600
4

5

6
$lib "i2c_twi.lbx"                                          ' Für Hardware TWI
7
Config Scl = Portc.5                                        ' we need to provide the SCL pin name
8
Config Sda = Portc.4                                        ' we need to provide the SDA pin name
9
I2cinit
10
Config Twi = 50000                                          ' Init TWBR und TWSR
11
Twcr = &B00000100                                           ' nur TWEN setzen
12

13
Wait 2
14

15
Dim Highbyte As Byte
16
Dim Lowbyte As Byte
17
Dim Crc As Byte
18

19
Dim Temp1 As Single
20
Dim Summe1 As Single
21

22

23
Print "hallo"
24

25
Do
26

27
   I2cstart
28
   I2cwbyte &H5A                                            'or 00
29
   I2cwbyte &H07
30

31
   I2cstart
32

33
   I2cwbyte &H5A
34

35
   I2crbyte Highbyte , Ack
36
   I2crbyte Lowbyte , Ack
37
   I2crbyte Crc , Nack
38
   I2cstop
39

40

41
   Temp1 = Highbyte
42
   Temp1 = Temp1 * 256
43
   Temp1 = Temp1 + Lowbyte
44
   Temp1 = Temp1 * 0.01
45

46

47
   Summe1 = Summe1 + Temp1
48

49

50
   Print "temp: " ; Summe1
51

52
   Summe1 = 0
53

54

55
Loop
56
End

Es kommt immer nur der gleiche Wert raus. Sensor hängt an 5v mit 10k 
Pullups.
Gast #1594238
Lesenswert?

Hallo,

würde es irgendwie bei der Fehlersuche helfen, wenn ich ein Oszilloskop 
besorge? Ich wollte sowieso schon länger eins haben und das wäre jetzt 
ein guter Grund. Würde den Sensor wirklich gerne zum Laufen bekommen.

Dankwe!
Gast #1644602
Lesenswert?

Hallo,

habe folgendes Problem: möchte mehrere MLX90614 an den I2C Bus 
anschließen, wenn ich den MLX90614 mit der SLAVEADRESSE (0x55) 
anspreche, dann bekomme ich keine Werte, bzw. der Sensor antwortet 
nicht. Die Slave Adresse 0x55 habe ich vorher über das EEPROM 
ausgelesen.

Mit der Standardadresse 0x00 funtkioniert der Sensor ohne Probleme, 
allerdings nur ein Sensor am Bus.

Kann mir jemand weiterhelfen.

Danke
gruß
Jochen
Gast #1687024
Lesenswert?

Hallo jim,

also ich kann keinen Fehler finden. Hier ist mal meine Funktionen:

so funktioniert es:
int16_t temperature;
temperature = read_MLX_RAM(0x00, 0x07);


und so funktioniert es nicht:
int16_t temperature;
temperature = read_MLX_RAM(0x55, 0x07);



/* Function read 16-bit RAM data */
uint16_t read_MLX_RAM(uint8_t slaveADDR, uint8_t ADDR)
{
  uint8_t data_4lsb;
  uint8_t data_4msb;
  uint8_t data_crc;

  uint8_t regAddress;
  uint8_t rc;

  uint16_t data;

  regAddress = 0;
  rc = twiWrite( slaveADDR, &regAddress, 1 );
  rc = twiWrite( ADDR|RAM_access, &regAddress, 1 );
  rc = twiWrite( slaveADDR|0x01, &regAddress, 1 );

  rc = twiRead( slaveADDR, data_4lsb, 1 );
  rc = twiRead( slaveADDR, data_4msb, 1 );
  rc = twiRead( slaveADDR, data_crc, 1 );

  data |= data_4msb;
  data |= data<<8;
  data |= data_4lsb;

  return data;
}


//********************************************************************** 
*******
//                     twiWrite - Master Transmist

uint8_t twiWrite( uint8_t  sla, uint8_t* data, uint8_t  count )
{
  uint8_t rc;

  // send SLA+W
  rc = sendSla( sla, TW_WRITE );
  if ( rc != 0 ) return rc;

  // send data byte(s)

  do
  {

    // send next data byte
    TWDR = *data++;
    TWCR = _BV( TWINT ) | _BV( TWEN );

    // wait for data byte transmitted
    WAIT_FOR_TWINT;

    // check for timeout and check status code
    if ( !TWI_READY ) return 7;
    if ( TW_STATUS != TW_MT_DATA_ACK )
    {
      if ( TW_STATUS == TW_MT_DATA_NACK ) generateStop( );
      return 8;
    } // end if

  } while ( --count != 0 );

  // generate STOP
  rc = generateStop( );
  if ( rc != 0 ) return rc;

  return 0;

} // end twiWrite



//********************************************************************** 
*******
// twiRead - Master Receive

uint8_t twiRead( uint8_t  sla, uint8_t* data, uint8_t  count)
{
  uint8_t rc;

  // send SLA+R
  rc = sendSla( sla, TW_READ );
  if ( rc != 0 ) return rc;

  // read data byte(s)

  do
  {

    // set up to receive next data byte
    TWCR = _BV( TWINT ) | _BV( TWEN) | ( ( count != 1 ) ? _BV( TWEA ) : 
0 );

    // wait for data byte
    WAIT_FOR_TWINT;

    // check for timeout and check status
    if ( !TWI_READY ) return 9;
    if ( TW_STATUS !=
         ( ( count != 1 ) ? TW_MR_DATA_ACK : TW_MR_DATA_NACK ) )
    {
      generateStop( );
      return 10;
    } // end if

    // read data byte
    *(data++) = TWDR;

  } while ( --count != 0 );

  // generate STOP
  rc = generateStop( );
  if ( rc != 0 ) return rc;

  return 0;

} // end read data
Gast #3367849
Lesenswert?

Guten Abend.
Entschuldigung, dass ich so ein altes Thema wieder ausgrabe. Mir stellen 
sich aber zu dem oben genannten Code ein paar Fragen.

Aus dem Code geht nicht hervor, welche library eigentlich genutzt wurde.

Weißt jemand wie die Kosntante WAIT_FOR_TWINT aussehen müsste?
Wäre das so richtig?:  #define  WAIT_FOR_TWINT; while(!(TWCR & 
(1<<TWINT)));

Ist die slaveADDR mit 0x5A korrekt gewählt? So sieht es jedenfalls für 
mich aus. Bei ADDR und RAM_access stehe ich auch etwas auf dem Schlauch. 
0xBA und 0xBB ?

Es wäre super, wenn mir jemand helfen könnte.
Gast #4136407
Lesenswert?

Hallo,

Versuche auch einen MLX90614 auszulesen aber es will trotz tagelangen 
Recherchen und Versuchen nicht klappen. Verwenden einen Atmega8 und 
BASCOM. Hat dazu vielleicht jemand ein fertiges Programm welches ich 
übernehmen könnte.

Danke
Kalti

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