Atmega644 EEPROM Initialisieren

Gast #4928016
Lesenswert?

Hallo,

Ich habe folgende Frage. Ich möchte den EEPROM meines Atemga 
initialisieren und machen das wie folgt:
1
static struct
2
{
3
//Konfigurationswerte:
4
uint16_t  Range_VStart_O200mV_O2V_VEnd_O200mV_O2V[7][8];
5
uint16_t  Zwei_mV_V_Gain_Pot_Postion;          
6
uint16_t  Zwei_mV_V_Off200mV;  
7
      
8
//...und weiter Variablen hier zur besseren übersicht rausgelöscht
9

10
}gsEEConfig = {{   
11
      {1,1030,1562,1536,2044,1578,1536,1898},
12
      {64,1029,1546,1613,2043,1536,1692,1884},
13
      {32,1029,1537,1575,2042,1542,1614,1888},
14
      {16,1029,1540,1556,2042,1536,1576,1891},
15
      {8,1029,1513,1549,2042,1541,1556,1893},
16
      {4,1030,1536,1542,2043,1537,1547,1896},
17
      {2,1030,1574,1536,2043,1602,1536,1901}
18
},1233,1519,1544,'y',0x01,0x800320,0x1FFF10,0,0,0,0,0,0,0};

Jetzt zu meinem Problem. Die Werte werden bei jedem Neustart 
initialisiert. Sprich, wenn ich EEPROM Werte verändert habe werden diese 
bei einem Neustart wieder überschrieben.
Ergänzende Frage: Wird bei einem Reset beim debuggen der EEPROM immer 
mit den Initialisierungswerten geladen?

Gruß
#4928265
Lesenswert?

Robin B. schrieb:
> Stefan E. schrieb:
>> Die im ersten Post gezeigte Struktur (die in module.c steckt) landet
>> nicht im EEPROM, sondern im RAM. Und wird dort natürlich bei jedem Start
>> neu initialisiert.
>
> ja,könnte sein. Muss ich nochmal prüfen.

Da ich den selben Aufbau für verschiedene Projekte verwende muss es hier 
auch gehen. Hatte an einen Copy Paste Fehler gedacht. Bei meinem anderen 
Projekt funktioniert es genau so nur mit dem Unterschied das der Inhalt 
der Struktur wesentlich größer ist. Dies sollte ich aber mit
1
uint8_t  eeConfig[170] EEMEM;
 abgedeckt haben.

Gruß
#4928335
Lesenswert?

Robin B. schrieb:
> Da ich den selben Aufbau für verschiedene Projekte verwende muss es hier
> auch gehen. Hatte an einen Copy Paste Fehler gedacht. Bei meinem anderen
> Projekt funktioniert es genau so nur mit dem Unterschied das der Inhalt
> der Struktur wesentlich größer ist. Dies sollte ich aber mit
> uint8_t eeConfig[170] EEMEM;
> abgedeckt haben.

Und wo ist da jetzt der Zusammenhang zwischen diesem eeConfig und der 
oben gezeigten Struktur?
#4928348
Lesenswert?

Stefan E. schrieb:
> Robin B. schrieb:
>> Da ich den selben Aufbau für verschiedene Projekte verwende muss es hier
>> auch gehen. Hatte an einen Copy Paste Fehler gedacht. Bei meinem anderen
>> Projekt funktioniert es genau so nur mit dem Unterschied das der Inhalt
>> der Struktur wesentlich größer ist. Dies sollte ich aber mit
>> uint8_t eeConfig[170] EEMEM;
>> abgedeckt haben.
>
> Und wo ist da jetzt der Zusammenhang zwischen diesem eeConfig und der
> oben gezeigten Struktur?

Über die folgende Fkt. gebe ich die Adresse und die Länge erstmal 
weiter, damit die Fkt. die später die Werte in den EEPROM übertragen 
soll weiß wo die Daten stehen. Siehe "moduleInit()":
1
e2SetConfig((uint8_t*) &gsEEConfig, sizeof(gsEEConfig));
und über e2WriteConfig();(e.c) werden die Daten dann in den EEPROM 
übertragen.
#4928351
Lesenswert?

Robin B. schrieb:
>> Und wo ist da jetzt der Zusammenhang zwischen diesem eeConfig und der
>> oben gezeigten Struktur?

Über
1
static void e2WriteToEeprom(void)
2
{
3
  uint8_t i, bBlock[10];
4

5
  // SW-ID aktualisieren, falls erforderlich
6
  if(eeprom_read_word(&eeSwId) != swId)
7
  {
8
    eeprom_write_word(&eeSwId, swId);
9
  }
10

11
  // Belegten config-Block aktualisieren, falls erforderlich
12
  for(i = 0; i < length; i++)
13
  {
14
    if(eeprom_read_byte(&eeConfig[i]) != config[i])
15
    {
16
      eeprom_write_byte(&eeConfig[i], config[i]);
17
    }
18
  }
19

20
  // Seriennummer aktualisieren
21
  eeprom_read_block(bBlock, eeSerial, 10);
22
  if (memcmp(bBlock, gbSerial, 10) != 0)
23
  {
24
    eeprom_write_block(gbSerial, eeSerial, 10);
25
  }
26

27
  // Kalibrierungszeitpunkte uebernehmen
28
  for (i = 0; i < 3; i++)
29
  {
30
    if (eeprom_read_word(&eeCalibration[i]) != giCalibration[i])
31
    {
32
      eeprom_write_word(&eeCalibration[i], giCalibration[i]);
33
    }
34
  }
35
}
werden die Daten dann in den deklarierten Bereich eeConfig[i] 
geschrieben
#4928364
Lesenswert?

;-) die NOPs sind nur zum debuggen eingebaut. Kommen wieder RAUS.
Mit..
1
bool e2ReadConfig(void)
2
{
3
  // Falls Konfiguration in EEPROM ungueltig, Fehler zurueckgeben
4
  if (configValid == false)
5
  {
6
    return false;
7
  }
8

9
  eeprom_read_block(config, eeConfig, length);
10

11
  return true;
12
}
kann dann der Inhalt wieder ausgeleden werden.
#4928375
Lesenswert?

Peter II schrieb:
> Robin B. schrieb:
>> kann dann der Inhalt wieder ausgeleden werden.
>
> schon klar, aber wo rufst du es denn auf?

Du hast vollkommen recht. Der Aufruf fehlt. Anderes Projekt anderer 
Ablauf. Hatte ich rausgenommen und vergessen an der passenden Stelle 
wieder einzusetzen. Klar das die Werte dann immer gleich bleiben.

Also vielen Dank an alle die ihren Beitrag zur Lösung meines einfachen 
Problems geleistet haben. Und besonders dir Peter.

Gruß
Robin

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren