o.k. hab es ausprobiert:
Leider ist der fehler unverändert da.
Noch eine Idee?
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.
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
o.k. hab es ausprobiert:
Leider ist der fehler unverändert da.
Noch eine Idee?
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.
Wie sieht der Code jetzt aus?
Wie sieht der weiter oben erwähnte funktionierende Code ohne for-Schleife aus?
MfG
Stefan
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 13:06 Uhr)
Der logische Ablauf ist aber nicht der gleiche. Dieser Teilwird hier immer ausgeführt, in der Schleifen-Variante aber nur bei "busy_US[2] == 0".
MfG
Stefan
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
Die äußere FOR-Schleife ist auskommentiert.
Oder meinst Du die while-Schleife?
Welche Rolle spielt das jetzt? Der entscheidende Punkt ist, dass die innere for-Schleife mehrfach hintereinander ausgeführt wird, und mir mein obiges Szenario durchaus plausibel erscheint (*). Wenn du dir so sicher bist, dass das nicht sein kann, solltest du das schon genau begründen. Auch deshalb, weil sich aus diesem "genau begründen" neue Anhaltspunkte ergeben könnten.
Und warum zum Teufel weist du diese Möglichkeit gleich zurück und fängst das Diskutieren an, statt es einfach mal auszuprobieren? Wenn es eine funktionierende und eine nicht funktionierende Variante gibt, und es einen konkreten Unterschied zwischen beiden gibt, dann ist dieser Unterschied doch wohl mal einen genaueren Blick wert, und sei es auch nur, um eine weitere mögliche Fehlerquelle sicher auszuschließen.
(*): Ich kenne allerdings deine Sensoren nicht, und habe auch keine Lust mich damit auch noch zu beschäftigen, um zu analysieren, was das Nichtausführen des Code-Teils genau impliziert.
MfG
Stefan
Lesezeichen