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
}
}
Lesezeichen