- 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
    Hi,
    sorry, aber entweder ich bin zu blöd dafür oder es ist falsch...
    Was meinst Du mit transmit/read Funktionen? Die I2C Read etc. aus der Library oder meine selbst geschriebenen, die die einzelnen Sensoren abfragen? Ersteres wäre ja sinnlos...
    Es ändert sich am Oszilloskop nur etwas, wenn ich direkt in der ISR TWSTO komplett ändere, dass generell kein STop mehr gemacht wird, dann gibt es aber auch wieder einen Error.
    Habe ich es denn wenigstens richtig verstanden, dass ich in die task_i2c() no_rep auf 1 setzen soll, vor jede eigene Funktion auch no_rep auf 1 setze und dieses dann in der Routine zum Abfragen des Sensors auf 0 setze, dass das also dann so aussieht:
    Code:
    //no_rep wird in der ISR vor TWSTO eingetragen, in task_i2c() am Anfang auf 1 gesetzt und in dieser einen Funktion auf 0 gesetzt
    void getIR(void)
    {
      no_rep_start = 0;
      I2CTWI_transmitByte(0x00,0x07);
      I2CTWI_readBytes(0x00, sensorBuf, 3);
    }
    Vielen Dank und
    Viele Grüße
    teamohnename

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    In den I2CTWI_transmit Funktionen in der Lib - direkt bevor TWCR gesetzt wird - muss das auf 1 gesetzt werden.
    In den anderen Funktionen könnte man es auch setzten - geht aber glaub ich auch ohne.
    no_rep sollte übrigens ein uint_8t sein.


    In der task_I2CTWI sollte dann in der if(TWI_operation)
    no_rep auf 1 gesetzt werden....
    Im einfachsten fall einfach immer ohne unterscheidung welcher Zustand.

    readRegisters kannst Du dann übrigens nicht dafür verwenden - das müsste auch noch passend modifiziert werden mit zusätzlichem Zustand in der task_I2CTWI... aber egal. Probier erstmal das.


    I2CTWI_transmitByteREPEATED_START(0x00,0x07); <<<---- Deine Eigene Funktion
    I2CTWI_readBytes(0x00, sensorBuf, 3);

    müsste dann aber klappen.

    MfG,
    SlyD

  3. #3
    Hallo,
    no_rep_start wird jetzt in allen I2C Transmit Funktionen über der TWCR Zuweisung auf 1 gesetzt, außer in einer Funktion I2CTWI_transmitByteREPEATED_START(0x00,0x07);), dort wird es über TWCR auf 0 gesetzt. Auf 1 gesetzt wird es in der task_I2CTWI in if(TWI_operation).
    Diese Variable wird dann nur in Zeile 381 der I2CMaster Libs TWSTO zugewiesen:
    Code:
    case TWI_MTX_DATA_ACK:      // Data byte has been transmitted and ACK received
    		  if (TWI_bufPos < TWI_msgSize) {
    			TWDR = I2CTWI_buf[TWI_bufPos++];
    			TWCR = (1<<TWEN)|                                 // TWI Interface enabled
    				   (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag to send byte
    				   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           //
    				   (0<<TWWC);                                 //  
    		  } else {                   // Send STOP after last byte
    			TWI_statusReg.lastTransOK = 1;                 // Set status bits to completed successfully. 
    			TWCR = (1<<TWEN)|                                 // TWI Interface enabled
    				   (0<<TWIE)|(1<<TWINT)|                      // Disable TWI Interrupt and clear the flag
    				   (0<<TWEA)|(0<<TWSTA)|(no_rep_start<<TWSTO)|           // Initiate a STOP/REP_START condition.
    				   (0<<TWWC);                                //
    		  }
    		  break;
    Sonst niergends!

    Das Resultat ist der TWI Error 0x30.
    Wenn ich in meiner neuen, angepassten Funktion:
    Code:
    void I2CTWI_transmitByte_RepeatedStart(uint8_t targetAdr, uint8_t data)
    {
    	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();
    	I2CTWI_delay();
    	TWI_msgSize = 2;
    	I2CTWI_buf[0] = targetAdr;
    	I2CTWI_buf[1] = data;
    	TWI_statusReg.all = 0;
    	no_rep_start = 0;
    	TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(0<<TWEA)|(1<<TWSTA)|(0<<TWSTO);
    }
    Das no_rep_start auf 1 setze, ist alles wie vorher...

    Muss eventuell noch irgendwas (ein TWSTO) mit no_rep_start gesetzt oder ergänzt werden?

    Danke und
    Viele Grüße
    teamohnename
    Geändert von teamohnename (25.02.2012 um 18:59 Uhr)

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    Hallo,

    die Bedeutung der Fehlercodes steht übrigens in der Header Datei.
    In diesem Fall kam ein NACK nach nem Datentransfer zurück.

    > Auf 1 gesetzt wird es in der task_I2CTWI in if(TWI_operation).

    wo genau? Muss ganz oben gemacht werden nicht unter den Fallunterscheidungen.
    (also wieder bevor TWCR gesetzt wird)

    > Muss eventuell noch irgendwas (ein TWSTO) mit no_rep_start gesetzt oder ergänzt werden

    Schon möglich. Wie gesagt - ich hab keine Zeit das zu testen das oben gesagte war alles
    frei aus dem Kopf ohne nochmal ins Datenblatt zu schauen.


    MfG,
    SlyD

  5. #5
    Hi,
    wenn es ganz oben in task_I2CTWI steht, ist auch wieder alles wie vorher, also ohne Repeated Start...
    Was könnte denn noch geändert werden müssen? Wenn Du keine Zeit hast, ist das auch erstmal nicht so schlimm... Wir werden dann wohl noch etwas experimentieren müssen... Aber wenn Dir noch etwas einfällt; nur her damit!

    Vielen, vielen Dank für Deine Hilfe bis jetzt und
    Viele Grüße
    teamohnename

    Hier übrigens nochmal ein Bild vom Scope, wie es war, als das Nack kam:
    Klicke auf die Grafik für eine größere Ansicht

Name:	MLX90614_RP6_0x00_2_Error.jpg
Hits:	3
Größe:	52,9 KB
ID:	21622

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

    SlyD hatte gesagt, dass das no_rep = 1 nicht ganz oben in der task_I2CTWI, sondern nach if(TWI_operation) eingefügt werden soll:
    Code:
    void task_I2CTWI(void)
    {
     if (!I2CTWI_isBusy()) {
      if (TWI_statusReg.lastTransOK) {
       if(TWI_operation) {
        no_rep = 1;
    ...
    Probier das doch mal!
    Gruß
    Dirk

  7. #7
    Hi Dirk,
    danke für Deine Antwort.
    Zuletzt hat SlyD doch gesagt, dass das nach ganz oben muss?!
    Wenn ich das unter die Abfragen mache, kommt die Fehlermeldung und das, was ich zuletzt als Bild gepostet habe am Oszilloskop.
    Viele Grüße
    teamohnename

    EDIT:
    Anscheinend haben wir den Fehler gefunden, nachdem wir uns nochmal das Datenblatt angeschaut haben. Vorher war das so in der ISR:
    Code:
    TWCR = (1<<TWEN)|                                 // TWI Interface enabled
    (0<<TWIE)|(1<<TWINT)|                      // Disable TWI Interrupt and clear the flag
    (0<<TWEA)|(0<<TWSTA)|(no_rep_start<<TWSTO)|           // Initiate a STOP condition.
    (0<<TWWC);                                //
    Dabei würde aber ein Stop durchgeführt werden, wenn no_rep_start 1 ist. Wenn das 0 ist, passiert irgendwas anderes, auf jeden Fall kein Repeated Start, da ein Repeated Start nur durchgeführt wird, wenn das so aussieht:
    Code:
    TWCR = (1<<TWEN)|                                 // TWI Interface enabled
    (0<<TWIE)|(1<<TWINT)|                      // Disable TWI Interrupt and clear the flag
    (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|           // Initiate a REPEATED START condition.
    (0<<TWWC);                                //
    Jetzt haben wir das so in eine if-Abfrage gepackt:
    Code:
    if(no_rep_start == 1){
      TWCR = (1<<TWEN)|                                 // TWI Interface enabled
      (0<<TWIE)|(1<<TWINT)|                      // Disable TWI Interrupt and clear the flag
      (0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|           // Initiate a STOP condition.
      (0<<TWWC);                                //
    }
    else{
      TWCR = (1<<TWEN)|                                 // TWI Interface enabled
      (0<<TWIE)|(1<<TWINT)|                      // Disable TWI Interrupt and clear the flag
      (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|           // Initiate a REPEATED START condition.
      (0<<TWWC);                                //
    }
    Jetzt wird definitiv ein repeated Start gesendet, nachdem die Leseanfrage gesendet wird, bricht der Slave aber mit einem Nack ab (Fehlercode 0x48).
    Woran könnte das liegen? Wahrscheinlich ja an der Lesefunktion, wenn man die ausklammert, ist der Fehler da nicht mehr. Was muss man da aber ändern?

    EDIT2:
    Das Nack liegt daran, dass no_rep_start nicht wieder auf 1 zurückgesetzt wird, nachdem es in der Transmit Funktion auf 0 gesetzt wurde.
    Woran liegt das? Vermutlich ja an task_i2c... Aber wo muss das jetzt genau hin?

    EDIT3:
    So haben wir den test durchgeführt:
    Code:
    void getIR(void)
    {
    	I2CTWI_transmitByte_RepeatedStart(0x55<<1,0x07);
    	while(no_rep_start == 0){} //hier bleibt der Code hängen
    	I2CTWI_readRegisters(0x55<<1, 0x07, sensorBuf, 3);
    	
    // This masks off the error bit of the high byte, then moves it left 8 bits and adds the low byte.
        //mlx90614_l = (((sensorBuf[1] & 0x007F) << 8) + sensorBuf[0]);
    }
    Wenn wir jetzt aber neben no_rep_start = 1 eine LED anschalten, geht diese an...
    Komisch.
    Geändert von teamohnename (25.02.2012 um 20:43 Uhr)

Ä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
  •  

Solar Speicher und Akkus Tests