www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MLX90614 ansprechen


Autor: krach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Mein Code:
Do

   I2cstart
   Waitms 1
   I2cwbyte &H5A
   Waitms 1
   I2cwbyte &H07
   I2cstop

   Print Err


   I2cstart
   Waitms 1
   I2cwbyte 85
   Waitms 1
   I2crbyte Highbyte , Ack
   Waitms 1
   I2crbyte Lowbyte , Nack
   I2cstop


   Temp1 = Highbyte
   Temp1 = Temp1 * 256
   Temp1 = Temp1 + Lowbyte
   Temp1 = Temp1 * 0.01


   Summe1 = Summe1 + Temp1


   Print "temp: " ; Summe1

   Summe1 = 0

   Wait 3
Loop

Was mache ich falsch?
Danke

Autor: krach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner eine Idee?
So klappt es auch nicht:
$regfile = "M8def.dat"
$crystal = 1000000
$baud = 57600


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

Wait 2

Dim Highbyte As Byte
Dim Lowbyte As Byte
Dim Crc As Byte

Dim Temp1 As Single
Dim Summe1 As Single


Print "hallo"

Do

   I2cstart
   I2cwbyte &H5A                                            'or 00
   I2cwbyte &H07

   I2cstart

   I2cwbyte &H5A

   I2crbyte Highbyte , Ack
   I2crbyte Lowbyte , Ack
   I2crbyte Crc , Nack
   I2cstop


   Temp1 = Highbyte
   Temp1 = Temp1 * 256
   Temp1 = Temp1 + Lowbyte
   Temp1 = Temp1 * 0.01


   Summe1 = Summe1 + Temp1


   Print "temp: " ; Summe1

   Summe1 = 0


Loop
End

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

Autor: krach (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
laut datenblatt kann der sensor kein read oder write byte, sondern nur 
word.

Autor: krach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was bedeutet das?

Autor: krach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bzw an welcher Stelle im Datenblatt hast du es gefunden:

http://www.sparkfun.com/datasheets/Sensors/Tempera...

Autor: Dieter Werner (dds5)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ronny Schmiedel (ronnysc)
Datum:

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

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jim (Gast)
Datum:

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

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Erazo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kalti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.