Dauerhafte Datenspeicherung eines Arrays mittels Eeprom

Ich versuche für ein Projekt zu programmieren, dass Daten/Variablen auch beim neustart erhalten bleiben. Ich möchte hierfür den Eeprom von meinen RTC DS3231 Modul benutzen. Hierfür habe ich auch bereits ein Versuchsprogramm geschrieben, bekomme jedoch völlig unsinnige Ausgaben.


#include "Arduino.h"
#include "Wire.h"
#include "uEEPROMLib.h"

int ad[7][3]={
  {1,1,1},
  {0,23,59},
  {1,0,0},
  {1,4,23},
  {0,0,0},
  {1,17,17},
  {0,6,9},
};
int tmp;
// uEEPROMLib eeprom;
uEEPROMLib eeprom(0x57);

class Speicher
{
  public:
    Speicher(int addr, int tmpint){}
    void writeint(int addr, int tmpint)
    {
      if(eeprom.eeprom_read(addr) != tmpint)
      {
        eeprom.eeprom_write(addr, tmpint);
      }
    }
    int readint(int addr)
    {
      eeprom.eeprom_read(addr, &tmp);
      return tmp;
    }
};
Speicher Speicher(0, 0);
unsigned int pos;

void setup() {
delay (2000);
	Serial.begin(9600);
    Serial.println("Serial OK");

	delay(2500);
	Serial.println("Delay OK");
		Wire.begin();
      for(int i=0; i<8; i++)
      {
        for(int j=0; j<3; j++)
        {
          Serial.print(ad[i][j]);
          Serial.print(", ");
        }
        Serial.println();
      }
      pos=1;
      for(int i=0; i<8; i++)
      {
        for(int j=0; j<3; j++)
        {
          Speicher.writeint(pos, ad[i][j]);
          pos++;
        }
      }
      pos=1;
      for(int i=0; i<8; i++)
      {
        for(int j=0; j<3; j++)
        {
          ad[i][j]=Speicher.readint(pos);
          pos++;
        }
      }
      for(int i=0; i<8; i++)
      {
        for(int j=0; j<3; j++)
        {
          Serial.print(ad[i][j]);
          Serial.print(", ");
        }
        Serial.println();
      }

	pos = 0;
 
}

void loop() {


}

Ausgabe:

Serial OK
Delay OK
1, 1, 1,
0, 23, 59,
1, 0, 0,
1, 4, 23,
0, 0, 0,
1, 17, 17,
0, 6, 9,
0, 0, 738,
257, 257, 1,
5888, 15127, 315,
1, 0, 256,
1025, 5892, 23,
0, 0, 256,
4353, 4369, 17,
1536, 2310, 9,
0, -7680, 738,

Vielen Dank im Vorhinein für die Unterstützung!

Also, dein Konstrukt mit der 'Speicher'-Klasse ist schon mal höchst verwirrend, du Hast da einen Konstruktor mit Parametern definiert, die nicht verwendet werden, die Variable tmp ist außerhalb der Klasse definiert und letztendlich hast du nur den Aufruf der eeprom_read und eeprom_write funktionen nochmal gekapselt.
die uEEPROMLib kenn ich nicht, aber bei der Arduino EEPROM kann man mit einem read bzw. write genau 1 Byte lesen/schreiben. du hast dir aber ein Array aus int-Werten angelegt, somit besteht jeder Wert aus 4 Byte. Daher mein Tipp, wenn die Werte zwischen 0 und 255 liegen, dann nimm für dein array als Typ uint8_t und subtrahiere deine 'Speicher'-Klasse aus dem Source.

Deshalb gibt es ja auch put und get, mit denen man beliebige Datentypen schreiben/lesen kann.

Gruß Tommy

Danke für deine Antwort,
also die extra Klasse dient dazu um das ganze später zu erweitern und in ein größeres Projekt einzugliedern. Die Parameter des Konstrucktors hab ich angegeben, da ich ohne die einen Error bekommen hab. Die Speicherung als uint8_t (also 1 byte) wäre grundsätzlich kein Problem. Zu der Libary: Ich hatte es auch schon mit der EEPROM libary versucht, diese nutzt meines Wissens nach jedoch den integrierten eeprom des Controllers, was bei mir dazu geführt hat, dass das Programm gar nicht startet, weshalb ich den eeprom vom DS3231 nutzen wollte.

Probier das mal, ist aber ohne Gewähr, hab ich nur auf die schnelle zusammengesucht und nicht selber getestet.

#include <EEPROM.h>

uint8_t parameter = 0;

void setup()
{
	Serial.begin(115200);

	EEPROM.begin(1);

	parameter = EEPROM.read(0);
	Serial.println(parameter);
	
	if(parameter != 42)
	{
		EEPROM.write(0, 42);
		EEPROM.commit();
	}

	parameter = EEPROM.read(0);
	Serial.println(parameter);

	EEPROM.end();
}

1 Like

Also mit deinen Funktionen funktionierts jetzt, nur 2 Anmerkungen hätte ich noch und zwar
Musste ich bei "EEPROM.begin(1) " die 1 rausnehmen und den Befehl "EEPROM.commit()" komplett rausnehmen, da sonst Errors aufgetreten sind, ich gehe mal davon das diese nicht weiter wichtig sind.

Auf jeden Fall vielen Dank für deine Hilfe, ich weiß zwar nicht warum ichs zuerst mit der EEPROM-libary nicht geschafft hab, aber du hast mir damit auf jeden Fall weiter geholfen.

Da du nicht sagst, welchen µC du nutzt, darfst du dich auch nicht wundern, wenn man dir Code für einen "anderen" zeigt, als du willst.

Ansonsten:
Es gibt schon bessere/schönere Wege, mit einem AVR eingebauten EEPROM umzugehen, als der gezeigte.

.... und hat auch nichts mit einem EEPROM zu tun, den es zusammen mit einer DS3231 oft auf einem Uhrenmodul gibt.

Ist mir bewusst, ich wollte den jedoch auch nur benutzen, da meine Versuche den integrierten zu nutzen, immer zu Abstürzen geführt haben.

welchen Microcontroller programmierst du?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.