- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 26

Thema: Fehler in For-Schleife mit I2C Kommunikation

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2007
    Ort
    München
    Alter
    62
    Beiträge
    199
    Weil es schon beim ersten Ausführen der Schleife auftritt. Dies erkennt man daran, dass nach dem Reset zuerst die Sensoren über I2C general Command an Adresse 0x00 gestartet werden. Danach wird die Schleife das erste Mal ausgeführt, Antwort ist mit 0x0F im erwarteten Bereich, dieser Wert ist auch auf dem LCD zu sehen. Bei i=1 wird der zweite Sensor adressiert, die Antwort ist 0x02 (was nicht erwartet wird, da der US Sensor so dicht gar nicht messen kann), dieser Wert wird auf dem LCD nicht mehr ausgegeben. Als nächstes wird das Sensorboard2 addressiert und ausgelesen. Das ist jedenfalls auf dem I2C Bus und auf dem LCD zu sehen.

    Zur Info: Der Logik Analyser wird mit der SDA Leitung auf negative Flanke getriggert und der Baustein wird aus dem Reset losgelassen.

    Dass die Schleife abgebrochen wird, merke ich daran, dass gar nicht mehr versucht wird, mit i=2 den 3. Sensor abzufragen. Ein entsprechendes I2C Read Kommando an Adresse 0xE4 (bzw. 0xE5, da es ein read ist) wird vom I2C Master nicht mehr ausgegeben.
    Geändert von uffi (18.03.2011 um 14:31 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Darf ich daraus schließen, dass du LA-Protokolle von jeweils der kompletten I2C-Kommunikation hast? Poste die bitte mal (auch wenn ich nicht so der I2C-Experte bin). Und baue doch mal ein paar Marker in den Code ein, die dann auch auf dem LA zu sehen sind. Z.B. in der For-Schleife als erstes einen Port-Pin auf High und als letztes wieder auf Low setzen (um zu sehen, ob die Schleife über einen unzulässigen Pfad verlassen wird). Und nach der Schleife den Wert von i ausgeben lassen.

    Wenn die Schleife tatsächlich abgebrochen wird, sehe ich nur die Möglichkeit eines Fehlers im I2C-Code oder dass i irgendwo korrumpiert wird.

    Ergänzung: oder im LCD-Code natürlich
    Geändert von sternst (18.03.2011 um 14:59 Uhr)
    MfG
    Stefan

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2007
    Ort
    München
    Alter
    62
    Beiträge
    199
    o.k. stelle ich am Wochenende ein.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2007
    Ort
    München
    Alter
    62
    Beiträge
    199
    So, hab nun nochmal die i2c-Signale am Logik-Analyser aufgezeichnet für drei Fälle. Für alle drei Fälle ist die Startsequenz auf dem I2C Bus identisch, siehe Datei i2c_first_start.png. Nun die 3 Fälle:

    1. ohne FOR-Schleife US-Sensoren einzeln abgefragt und Messung neu gestartet: das ist die Referenz, alles läuft wie es soll, siehe Dateien i2c_first_meas.png und i2c_second_start.png.

    2. mit FOR-Schleife von i=0 bis i=2 alle US-Sensoren abgefragt, er versucht noch den 2. Sensor zu lesen, aber die Schleife wird nicht weiter ausgeführt, siehe Datei i2c_first_meas_error.png.

    3. wie Fall 2, bloß noch einen Marker eingefügt nach der LCD Ausgabe, bei dem der Wert von i auf den I2C Bus ausgegeben wird. Dies ist bei i=0 auch der Fall, aber i=1 wird nicht mehr ausgegeben, d.h. die Schleife wird gar nicht bis dort ausgeführt, siehe Datei i2c_first_meas_error_marker.png.

    Der Code (mit jeweils auskommentierten Sequenzen) ist ebenfalls beigefügt: allrounder.c

    Bitte schaut nochmal drauf und gebt mir Tipps, was der Fehler sein könnte mit der Ausführung der FOR-Schleife. Eigentlich sehe ich im Moment nur die Erklärung, dass bei i=1 die Abfrage des 2. US Sensors mit busy[1]=... dazu führt, dass dieser noch als busy angesehen wird (dies ist auch bei allen folgenden Abfragen der Fall [Ausführung der großen while Schleife] und die Sensoren werden nie mehr neu gestartet mit einer Messung). Aber warum? Denn im Fall 1 ohne FOR Schleife ist er ja nicht busy.

    Hier der Code für Fall 1 (ohne FOR-Schleife, wird fehlerfrei abgearbeitet):
    Code:
       busy_US[0] = i2c_start(US_left + I2C_READ);
     
       // address I2C device ultrasonic sensor with read access
       if (busy_US[0] == 0)
       {
        distance[0] = i2c_readNak(); // read one byte
        i2c_stop(); // release I2C bus
     
        utoa(distance[0], buffer, 10);
     
        // move cursor to position on line 0
        lcd_gotoxy(10,0);  
        // put string to display (line 0)
        lcd_puts(buffer);
        lcd_puts("  ");
       }
     
       else
       {
        i2c_stop(); // release I2C bus
       }
     
       busy_US[1] = i2c_start(US_front + I2C_READ);
     
       // address I2C device ultrasonic sensor with read access
       if (busy_US[1] == 0)
       {
        distance[1] = i2c_readNak(); // read one byte
        i2c_stop(); // release I2C bus
     
        utoa(distance[1], buffer, 10);
     
        // move cursor to position on line 0
        lcd_gotoxy(14,0);  
        // put string to display (line 0)
        lcd_puts(buffer);
        lcd_puts("  ");
       }
     
       else
       {
        i2c_stop(); // release I2C bus
       }
     
       busy_US[2] = i2c_start(US_right + I2C_READ);
     
       // address I2C device ultrasonic sensor with read access
       if (busy_US[2] == 0)
       {
        distance[2] = i2c_readNak(); // read one byte
        i2c_stop(); // release I2C bus
     
        utoa(distance[2], buffer, 10);
     
        // move cursor to position on line 0
        lcd_gotoxy(18,0);  
        // put string to display (line 0)
        lcd_puts(buffer);
        lcd_puts("  ");
     
        i2c_start(US_general + I2C_WRITE);
        // address I2C device ultrasonic sensor with write access
        i2c_write(Start_US); //start new ultrasonic measurement
        i2c_stop(); // release I2C bus
       }
     
       else
       {
        i2c_stop(); // release I2C bus
       }
    Hier der Code für Fall 2 & 3 (mit FOR-Schleife, bricht bei i=1 ab):
    Code:
      // select display
      lcd_select(0);     
     
      for ( i = 0 ; i < 3 ; i++ )
      {
      // check if ultrasonic sensor is busy
       busy_US[i] = i2c_start(US_left + (2*i) + I2C_READ);
     
       // address I2C device ultrasonic sensor with read access
       if (busy_US[i] == 0)
       {
        distance[i] = i2c_readNak(); // read one byte
        i2c_stop(); // release I2C bus
     
        utoa(distance[i], buffer, 10);
     
        // move cursor to position on line 0
        lcd_gotoxy(10+(4*i),0);  
        // put string to display (line 0)
        lcd_puts(buffer);
        lcd_puts("  ");
     
        //marker: put out i on I2C bus
        i2c_start(i);
        i2c_stop();
     
        if (i==2)
        {
         i2c_start(US_general + I2C_WRITE);
         // address I2C device ultrasonic sensor with write access
         i2c_write(Start_US); //start new ultrasonic measurement
         i2c_stop(); // release I2C bus
        }
     
       }
     
       else
       {
        i2c_stop(); // release I2C bus
       }
      }
    Danke und Gruß, Dirk.
    Angehängte Dateien Angehängte Dateien
    Geändert von uffi (22.03.2011 um 13:25 Uhr) Grund: Ergänzung

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress