Pages: [1]   Go Down
Author Topic: EEPROMAnything  (Read 513 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Zusammen,

ich möchte gern ein größeres Struct Array im EEPROM Speichern, funktioniert soweit mit EEPROMAnything ganz gut.

Allerdings ändern sich die ein oder anderen Daten in diesem Struct die ich dann zurück ins EEPROM schreiben will.

Leider schreibt EEPROM_writeAnything immer alle Daten statt nur diese die sich geändert haben.

eeprom_update_byte kann ich leider nicht nutzen, da es scheinbar nicht in der Arduino EEPROM Library vorhanden ist.

Drum wollte ich die EEPROM_writeAnything Funktion soweit umschreiben das sie erst den EEPROM ausließt, mit dem zu schreibenden Wert vergleicht und erst dann schreibt wenn der neue Wert anderst ist.

Leider habe ich wohl irgendwo einen Denkfehler drin... einige Blöcke scheint er immer zu schreiben (Egal ob sich Daten ändern oder nicht)

Wenn ich Explizit Daten ändere (Counter hochzähle) dann scheint ihn dass meist nicht zu interessieren....

Könnte vielleicht mal einer drüberschauen?

Danke!

Gruß,
Frank

Original:

Code:
template <class T> int EEPROM_writeAnything(int ee, const T& value)
{
    const byte* p = (const byte*)(const void*)&value;
    unsigned int i;
    for (i = 0; i < sizeof(value); i++)
          EEPROM.write(ee++, *p++);
    return i;
}

Mein "Versuch":
Code:
template <class T> int EEPROM_updateAnything(int ee, const T& value)
{
    const byte* p = (const byte*)(const void*)&value;
    unsigned int i;
    for (i = 0; i < sizeof(value); i++) {
       if (memcmp((const byte*)EEPROM.read(ee), (const byte*)*p, 8) == 0) {
         // Gleich - Nicht schreiben
       } else {
          // Ungleich - Schreiben
          EEPROM.write(ee, *p);
        }
        ee++;
        *p++;
    }
    return i;
}
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 252
Posts: 21283
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wieso machst Du es mit memcmp() und kontrollierst 8 Bytes?
Wenn Du nur 1 Byte schreibst, mußt Du auch nur 1 Byte lesen bzw vergleichen.

Code:
template <class T> int EEPROM_writeAnything(int ee, const T& value)
  {
  const byte* p = (const byte*)(const void*)&value;
  for (int i = 0; i < sizeof(value); i++)
    {
    if (EEPROM.read(ee) !=*p)
      {
      EEPROM.write(ee++, *p++);
      }
    }
  }
Habs nicht getestet darum hoffe ich es ist kein Fehler drin.
Grüße Uwe
« Last Edit: March 17, 2013, 02:16:29 pm by uwefed » Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Wieso machst Du es mit memcmp() und kontrollierst 8 Bytes?
Wenn Du nur 1 Byte schreibst, mußt Du auch nur 1 Byte lesen bzw vergleichen.

Code:
template <class T> int EEPROM_writeAnything(int ee, const T& value)
  {
  const byte* p = (const byte*)(const void*)&value;
  for (int i = 0; i < sizeof(value); i++)
    {
    if (EEPROM.read(ee) !=*p)
      {
      EEPROM.write(ee++, *p++);
      }
    }
  }
Habs nicht geteste darum hoffe ich es ist kein Fehler drin.
Grüße Uwe
Leider doch. Du erhöhst ee und p nur wenn geschrieben wird, es muss aber immer erhöht werden.
Code:
template <class T> int EEPROM_writeAnything(int ee, const T& value)
  {
  const byte* p = (const byte*)(const void*)&value;
  for (int i = 0; i < sizeof(value); i++)
    {
    if (EEPROM.read(ee) !=*p)
      {
      EEPROM.write(ee, *p);
      }
    ee++;
    p++;
    }
  }
Logged

_______
Manfred

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oh man - Ich Trottel..... sah wohl den Wald vor lauter Bäumen nicht...


Vielen Dank für eure Hilfe!


Gruß,
Frank
Logged

Pages: [1]   Go Up
Jump to: