Hallo, Freunde das Arduino..
Ich bin auf einen merkwürdigen Rechenfehler gestossen beim Schreiben von Long-Werten auf den internen EEPROM des Arduino mini pro:
Code-Beschreibung:
Die Laufvariablen a,b,c,d stellen die byte-Werte im EEPROM dar (das Reinschreiben ist richtig).
Um daraus wieder einen long-Wert zu machen, werden diese "stellenrichtig" nach links geschoben, wie man das halt so macht.
Ich habe nun die Byte Werte durch 4 Schleifen simuliert, damit jeder den Fehler ggf. bei sich zu Hause nachstellen kann...
Fehler:
Dabei tritt immer dann ein Rechenfehler auf, wenn eine 8-fache Linksverschiebung eines Wertes gemacht wird, wo das höchste Bit gesetzt ist (alle Werte >=128):
Die Verschiebung führt zu dem unten im 2. Codefenster zu sehenden Ergebnis...
Vollständiger Testcode:
#include <SoftwareSerial.h>
void setup()
{
Serial.begin(57600);
unsigned long l = 0;
for (byte c=0;c<0xff;c++) {
Serial.print("c="); Serial.print(c); Serial.print(" = ");
l = c << 8;
Serial.println(l, HEX);
if (l > 0xffffff) delay(100000);
}
}
void loop() {}
Alles anzeigen
Ergebnis des Testlaufes:
3 Möglichkeiten:
* Mein Code enthält einen Fehler (?)
* Der Compiler setzt den Code falsch um (Version 1.0.5-r2)
* Der Arduino rechnet intern falsch (Schiebeoperationen)
Was denkt ihr?
Kann diesen Fehler jemand auf seinem Arduino nachstellen?
/Edit:
Gleiches Fehlerbild bei Verwendung der "nightly run" Compliler-Version von gestern... :s
/edit2
Ich habe den Code gekürzt, durchlauf nur wenige Sekunden, gleiches Bild
Ich habe den Fehler bei Github eingestellt... mal sehen.