Forum: Mikrocontroller und Digitale Elektronik Atmega644 EEPROM Initialisieren


von Robin80 (Gast)


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ß

von Peter II (Gast)


Lesenswert?

Robin80 schrieb:
> Jetzt zu meinem Problem.

das kann nicht sein - es gibt ja überhaupt keine code der etwas in den 
eeprom schreibt.

Da musst du schon etwas mehr zeigen.

von Stefan K. (stefan64)


Lesenswert?

Robin80 schrieb:
> Die Werte werden bei jedem Neustart
> initialisiert.

Ich denke eher, dass diese Werte beim Programmieren des Flashs durch die 
Entwicklungsumgebung ins Eeprom geschrieben werden.

Je nachdem, welche Entwicklungsumgebung Du verwendest, ist das aber auch 
abschaltbar.

Gruß, Stefan

von Robin B. (robin1980)


Angehängte Dateien:

Lesenswert?

Ich verwende..
AvrStudio 4.18
WinAVR-20100110

und anbei mein Code

von Robin B. (robin1980)


Angehängte Dateien:

Lesenswert?

hier noch die header datei des eeprom

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

Du bestimmst doch ob beim flashen dein EEPROM erhalten bleibt oder 
gelöscht wird, das FLAG heisst EEsave

: Bearbeitet durch User
von Stefan E. (sternst)


Lesenswert?

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.

von Robin B. (robin1980)


Lesenswert?

Joachim B. schrieb:
> Du bestimmst doch ob beim flashen dein EEPROM erhalten bleibt oder
> gelöscht wird, das FLAG heisst EEsave

das habe ich bereits überprüft. Hacken ist nicht drin

von Robin B. (robin1980)


Lesenswert?

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.

von Robin B. (robin1980)


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ß

von Stefan E. (sternst)


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?

: Bearbeitet durch User
von Robin B. (robin1980)


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.

von Robin B. (robin1980)


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

von Peter II (Gast)


Lesenswert?

Robin B. schrieb:
> und über e2WriteConfig();(e.c) werden die Daten dann in den EEPROM
> übertragen.

und wo werden sie gelesen? Ich finde Readconfig nirgends?

was sollen die ganzen NOPs im code? muss du den Flash voll bekommen?

von Robin B. (robin1980)


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.

von Peter II (Gast)


Lesenswert?

Robin B. schrieb:
> kann dann der Inhalt wieder ausgeleden werden.

schon klar, aber wo rufst du es denn auf?

von Robin B. (robin1980)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.