- 12V Akku mit 280 Ah bauen         
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
    Uups, leider zu früh gefreut.

    Hab jetzt den Code nach Stefan's Hinweisen modifiziert und das Stack-Problem beseitigt. Die Simulation mit avrstackview bringt nun folgendes Ergebnis:

    Analysis complete: 0 errors, 0 warnings
    flash usage (words): 2155
    global RAM usage (bytes): 609
    maximum func. subroutine levels: 6
    maximum func. stack (bytes): 35
    maximum int. subroutine levels: 1
    maximum int. stack (bytes): 8
    nested interrupts: 0
    maximum nest. int. stack (bytes): 0
    maximum total stack (bytes): 43
    maximum total subroutine levels: 7
    maximum total RAM usage (bytes): 652

    Also o.k.

    Jedoch zeigt sich nun folgendes Fehlerbild:
    Nur noch der erste Sensor (Adresse E0) wird korrekt gelesen. Der zweite mit Adresse E2 wird auch noch gelesen, aber der Wert 02 kann nicht sein (so nahe Werte kann der US Sensor nicht ausgeben), auf dem LCD wird dieser Wert auch nicht mehr ausgegeben, sondern abrupt die FOR-Schleife vorzeitig beendet.
    Dann wird das andere Sensorboard korrekt ausgelesen (i2c Adresse 0xD0).

    Hat jemand noch eine Idee?
    Anbei nochmal alle Sourcen, Daten und ein Bild vom Logic Analyzer gesammelt im File "Problem.zip".

    Danke, Dirk.

    P.S. Frage noch an Stefan: welches sind string Konstanten in meinem Code?
    P.P.S. Wenn ich die Schleife auflöse und alle 3 US-Sensoren einzeln abfrage, funktioniert alles!!! Es muß also an dieser verflixten FOR-Schleife liegen, so sieht sie jetzt aus:

    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("  ");
        
        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
       }
      }
    Angehängte Dateien Angehängte Dateien
    Geändert von uffi (15.03.2011 um 22:15 Uhr) Grund: Ergänzung

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Wie groß können denn die gelieferten Werte werden? Bestimmt doch auch größer als 99, oder? In dem Fall ist buffer zu klein. Für eine dreistellige Zahl muss buffer die Größe 4 haben (drei Ziffern plus Null-Terminierung).

    P.S. Frage noch an Stefan: welches sind string Konstanten in meinem Code?
    All die Strings in Anführungszeichen, z.B.
    Code:
    lcd_puts("Sensor Board 2 Results: ");
    Die belegen aktuell auch Platz im RAM, was aber nicht nötig wäre.
    MfG
    Stefan

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2007
    Ort
    München
    Alter
    62
    Beiträge
    199
    ja, Du hast Recht, bei buffer kommen Zahlen bis 3-stellig vor:

    es muß heißen static char buffer(4);

    Komischerweise hat das aber bisher keinen Fehler gegeben, die LCD Anzeige ist korrekt mit 3 Ziffern. Kann das für den Schleifenabbruch verantwortlich sein?

    Vielen Dank für Deine Hilfe!

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von uffi Beitrag anzeigen
    Komischerweise hat das aber bisher keinen Fehler gegeben, die LCD Anzeige ist korrekt mit 3 Ziffern.
    Klar, für die Ausgabe ist ja primär auch nur wichtig an der entsprechenden Adresse die entsprechenden Daten zu finden. Dass bei der Erstellung der Daten andere Variablen zerstört wurden interessiert da ja erst mal nicht.

    Zitat Zitat von uffi Beitrag anzeigen
    Kann das für den Schleifenabbruch verantwortlich sein?
    Du überschreibst dort eine andere Variable (außer du hast das Glück, dass buffer die letzte Variable im Speicher ist). Das kann alle möglichen Auswirkungen haben. Wie wäre es einfach mit Ausprobieren?
    MfG
    Stefan

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2007
    Ort
    München
    Alter
    62
    Beiträge
    199
    o.k. hab es ausprobiert:

    Leider ist der fehler unverändert da.

    Noch eine Idee?

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2007
    Ort
    München
    Alter
    62
    Beiträge
    199
    Hallo,

    irgendwo muß noch der Wurm drin sein.
    Ich vermute ja nach wie vor die FOR Schleife!
    Aber was mache ich da falsch?

    Bitte helft mir weiter, ich steh auf dem Schlauch...

    Danke und Gruß, uffi.

  7. #7
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Wie sieht der Code jetzt aus?
    Wie sieht der weiter oben erwähnte funktionierende Code ohne for-Schleife aus?
    MfG
    Stefan

Berechtigungen

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

LiFePO4 Speicher Test