- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
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
    o.k. hab es ausprobiert:

    Leider ist der fehler unverändert da.

    Noch eine Idee?

  2. #2
    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.

  3. #3
    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

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2007
    Ort
    München
    Alter
    62
    Beiträge
    199
    Der fehlerbehaftete Code entspricht noch dem aus dem Anhang "Problem.zip", außer dass buffer[4] statt buffer[3] deklariert wurde.

    Der fehlerfreie Code sieht so aus (FOR-Schleife aufgelöst):

    Code:
      // select display
      lcd_select(0);     
     
      // check if ultrasonic sensor is busy
       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("  ");
       }
       else
       {
        i2c_stop(); // release I2C bus
       }
     
         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
    Geändert von uffi (18.03.2011 um 12:06 Uhr)

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von uffi Beitrag anzeigen
    Der fehlerfreie Code sieht so aus (FOR-Schleife aufgelöst):
    Der logische Ablauf ist aber nicht der gleiche. Dieser Teil
    Code:
         2c_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
    wird hier immer ausgeführt, in der Schleifen-Variante aber nur bei "busy_US[2] == 0".
    MfG
    Stefan

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2007
    Ort
    München
    Alter
    62
    Beiträge
    199
    Das ist korrekt.
    Im Fehlerfall springt er aber schon vorher aus der Schleife raus.
    Das kann also nicht die Ursache für den Fehler sein

  7. #7
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von uffi Beitrag anzeigen
    Das ist korrekt.
    Im Fehlerfall springt er aber schon vorher aus der Schleife raus.
    Das kann also nicht die Ursache für den Fehler sein
    Warum bist du dir da so sicher? Außenrum ist auch noch eine Schleife. Woher weißt du, dass der Fehlerfall nicht genau dann auftritt, wenn im Durchlauf vorher (bezogen auf die äußere Schleife) das entsprechende Code-Fragment nicht ausgeführt wurde?
    MfG
    Stefan

Berechtigungen

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

Labornetzteil AliExpress