Forum: Mikrocontroller und Digitale Elektronik MLX90614 ansprechen


von krach (Gast)


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

von krach (Gast)


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.

von krach (Gast)


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!

von chris (Gast)


Lesenswert?

laut datenblatt kann der sensor kein read oder write byte, sondern nur 
word.

von krach (Gast)


Lesenswert?

Was bedeutet das?

von krach (Gast)


Lesenswert?


von Dieter W. (dds5)


Lesenswert?

Hmm, mir ist irgendwie entgangen auf welche Art du das crcbyte 
berechnest, das will der Baustein nämlich sehen sonst reagiert er nicht.

Ich habe vor einigen Jahren mal ein Programm in PIC18 Assembler 
geschrieben, das hat funktioniert - liegt aber irgendwo auf dem Server 
im Büro.

von Ronny S. (ronnysc)


Lesenswert?

ich hatte mal als Vorlage die Demo-Software von: 
http://www.propox.com/download/software/Software_EVBavr05_1.zip 
genommen. Damit lief der Sensor auf Anhieb. Das CRC-Byte musste ich 
nicht berechnen.

von Jochen (Gast)


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

von Jim (Gast)


Lesenswert?

prüf noch mal deine read-funktion! die standard-adresse ist 0x5a (laut 
datenblatt und eigenem auslesen).

von Jochen (Gast)


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

von Erazo (Gast)


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.

von Kalti (Gast)


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

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.