MLX90614 ansprechen

Gast #1592742
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
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
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!
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.
Gast
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.