- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 36

Thema: Frage zu RP6 I2C Library: Funktionen der Lib von Peter Fleury?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    Frage zu RP6 I2C Library: Funktionen der Lib von Peter Fleury?

    Hallo an alle,
    wir haben eine Frage zu der I²C Master Library des RP6’. In der Library von Peter Fleury gibt es z.B. i2c_stop oder i2c_rep_start. Diese Funktionen werden anscheinend von einigen Slaves benötigt. Wie kann man sowas mit der RP6 I2C Master Library machen? Hier ein Code Beispiel, (damit wir einfach verstehen, wie das mit der RP6 Library funktioniert):

    Code:
    [...]
    i2c_start_wait(ADR+I2C_WRITE);
    i2c_write(0x07);
        
    i2c_rep_start(ADR+I2C_READ);
    b1 = i2c_readAck();
    b2 = i2c_readAck();
    b3 = i2c_readNak();
    i2c_stop();
    [...]
    Bei dem Beispiel will der Slave das i2c_rep_start und das i2c_stop wie gesagt unbedingt haben.
    Wäre das Beispiel dann in der RP6 Library das?

    Code:
    I2CTWI_transmitByte(ADR,0x07);
    
    I2CTWI_readRegisters(ADR+1, 0x07, sensorBuf, 3);
    //Daten in sensorBuf[0] - sensorBuf[2]
    Vielen Dank für Eure Hilfe und
    Viele Grüße
    teamohnename
    Geändert von teamohnename (18.02.2012 um 19:43 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @teamohnename:
    Im Prinzip ist das Beispiel der RP6 Library so richtig, wobei sogar noch die ADR bei transmit und readRegisters gleich bleiben kann (also nicht ADR+1) und der Parameter 0x07 im readRegisters weg muss.
    Die Lib sendet Ack und Nack automatisch. Schau dir die ISRs in beiden Libs an!
    Gruß
    Dirk

  3. #3
    Hi Dirk,
    danke für Deine Antwort.
    Was soll da denn anstatt 0x07 (ist das Startregister, was ausgelesen werden soll) stehen? Wenn man das weglässt, meckert der Compiler doch?! Oder haben wir Dich falsch verstanden?
    Grüße
    teamohnename
    Geändert von teamohnename (27.02.2012 um 15:36 Uhr)

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi,

    dass ab Register 7 gelesen werden soll, hast du ja dem Slave vermutlich ja schon mit I2CTWI_transmitByte(ADR,0x07) mitgeteilt.
    Der I2CTWI_readBytes-Befehl (NICHT ..._readRegisters,- das ist ein Bytearray der Lib!) kennt nur 3 Parameter.

    Was ist das denn für ein Slave?
    Gruß
    Dirk

  5. #5
    Hi Dirk,
    das ist ein MLX90614 Infrarot Thermometer. Hier der Originalcode.

    Folgendes ist jetzt zwar OT, aber egal.
    Wir haben den Sensor schon angeschlossen und ein paar Dinge beobachtet:
    1) Mit dem Code:
    Code:
    I2CTWI_transmitByte(0x5A,0x07);
    I2CTWI_readBytes(0x5A, sensorBuf, 3);
    mlx90614_l = sensorBuf[0];
    Bekommen wir im Terminal ,,I2C ERROR - TWI STATE: 0x20". Wenn wir aber schreiben:

    Code:
    I2CTWI_transmitByte(0x5A<<1,0x07);
    I2CTWI_readBytes(0x5A<<1, sensorBuf, 3);
    mlx90614_l = sensorBuf[0];
    Kommt der Fehler nicht mehr, sensorBuf ist aber immer 255 (egal ob sensorBuf[0], [1] oder [2]).
    Wenn man aber jetzt die I²C Verbindung unterbricht, bleibt der Wert 255 und es gibt keinen Error im Terminal.

    Dass mit dem letzten Codebeispiel kein Error mehr erscheint, ist doch ein gutes Zeichen, oder? Hängt das mit dem kein-Error-ohne-Verbindung irgendwie mit dem Programm bzw. der I²C ISR zusammen, sodass das auch normal ist?

    Wie sollen wir jetzt weiter vorgehen? Der Sensor scheint sich ja angesprochen zu fühlen. Das Problem ist also nur, dass wir momentan mit dem letzten Codeausschnitt noch keine Daten auslesen können... Vielleicht kann man da auch noch weiteres aus dem Originalcode übersetzen, wir wissen nur nicht wie...

    Vielen Dank deshalb weiterhin für Eure Hilfe und
    Viele Grüße
    teamohnename

    EDIT:
    Hier nochmal der Code, der wirklich übersetzt werden muss, wobei das Fett geschriebene die I²C Sache ist:
    Code:
    int dev = 0x5A<<1;
    int data_low = 0;
    int data_high = 0;
    int pec = 0;
      
    i2c_start_wait(dev+I2C_WRITE);
    i2c_write(0x07);
      
    // read
    i2c_rep_start(dev+I2C_READ);
    data_low = i2c_readAck(); //Read 1 byte and then send ack
    data_high = i2c_readAck(); //Read 1 byte and then send ack
    pec = i2c_readNak();
    i2c_stop();
      
    //This converts high and low bytes together and processes temperature, MSB is a error bit and is ignored for temps
    double tempFactor = 0.02; // 0.02 degrees per LSB (measurement resolution of the MLX90614)
    double tempData = 0x0000; // zero out the data
    int frac; // data past the decimal point
      
    // This masks off the error bit of the high byte, then moves it left 8 bits and adds the low byte.
    tempData = (double)(((data_high & 0x007F) << 8) + data_low);
    tempData = (tempData * tempFactor)-0.01;
      
    float celcius = tempData - 273.15;
    float fahrenheit = (celcius*1.8) + 32;
    Geändert von teamohnename (21.02.2012 um 17:51 Uhr)

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @teamohnename:
    Der MLX90614 braucht ja wohl sehr genau die Befehlsfolge, die du auch schon angegeben hast. Ob die RP6-I2C-Lib die SMBus-kompatibel genau so sendet, kann ich nicht sicher sagen.

    Was man probieren könnte:

    1. Den I2C-Takt auf 50 kHz heruntersetzen
    2. Als Adresse für den MLX90614 0x00 probieren
    3. SlyD (den Autor der RP6-Libs) fragen, ob man die Befehlsfolge so mit der RP6-Lib hinbekommt
    Gruß
    Dirk

Ähnliche Themen

  1. LCD library von Peter Fleury ÄÖÜ fehlt
    Von Woftschik im Forum C - Programmierung (GCC u.a.)
    Antworten: 21
    Letzter Beitrag: 18.04.2009, 14:31
  2. LCD an Mega8 mit Lib von Peter Fleury
    Von Mr Bean im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 04.10.2007, 08:01
  3. 4x20 LCD und Peter Fleury
    Von hansbausn im Forum C - Programmierung (GCC u.a.)
    Antworten: 11
    Letzter Beitrag: 27.01.2006, 17:06
  4. Anfängerproblem mit i2c und Peter Fleury
    Von hansbausn im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 20.11.2005, 17:26
  5. Peter Fleury LCD Lib Problem mit LCD
    Von Cybrix im Forum C - Programmierung (GCC u.a.)
    Antworten: 13
    Letzter Beitrag: 30.09.2005, 10:05

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad