Forum: Mikrocontroller und Digitale Elektronik ATmega8 EEPROM update


von TO (Gast)


Lesenswert?

Hallo!

Hätte mal eine kurze Frage.

Ich verwende in meinem C-Programm für einen ATmega8 EEPROM-Variablen.

Ich lese sie am Anfang des Programms auf normale Variablen ein und 
schreibe sie nur ins EEPROM, wenn sie sich ändern. (Was sehr selten 
passiert)

Die Frage wäre, ob es in der Geschwindigkeit des Programms einen 
Unterschied macht, ob ich eeprom_update_byte() verwende, oder eine 
eigene Funktion, die die RAM-Variablen abspeichert, sie dann bei jedem 
Aufruf auf Änderungen überprüft und nur wenn Änderungen da sind, in den 
EEPROM schreibt?

Der Aufruf der Funktionen wäre alle 32ms.

Danke im Voraus!

von DraconiX (Gast)


Lesenswert?

Wie sieht den die eeprom_update_byte() aus? Meiner Vermutung macht diese 
nämlich genau das, wie du es auch vorhast:

- EEPROM lesen
- Variable mit gelesenem Wert vergleichen
- Bei != Variable ins EEPROM speichern

Dazu kann aber nur etwas sagen, wenn man sieht wie genau diese 
eeprom_update_byte() aussieht. Ist es eine Std Function, dann kannst du 
eigentlich davon ausgehen das sie ihre "Aufgabe" schnellst als Möglich 
abarbeitet.

von TO (Gast)


Lesenswert?

Hallo!

eeprom_update_byte ist die Standardfunktion aus eeprom.h vom avr-gcc.

DraconiX schrieb:
> - EEPROM lesen
> - Variable mit gelesenem Wert vergleichen
> - Bei != Variable ins EEPROM speichern

Man könnte aber auch machen:

- RAM-Variable vergleichen mit RAM-Variable aus dem vorigen Zyklus
- Wenn ungleich -> ins EEPROM schreiben
- RAM-Variable für den nächsten Zyklus abspeichern (ins RAM natürlich)

Ungefähr so:

void update_eeprom(void)
{
  static uint8_t old=0;

  if(variable != old)
  {
    old=variable;
    eeprom_writeByte(&variable_eeprom, variable);
  }

}

von TO (Gast)


Lesenswert?

Keine Ideen? :(

von Ralf G. (ralg)


Lesenswert?

Wenn du deine Variablen als Block in einer Struktur zusammenfassen 
kannst, würde sich evtl. 'eeprom_update_block' eignen.

Wenn du das vorher prüfen willst, würde ich das auch im Block machen:
1
#define MAX  10
2
void eeprom_update(uint8_t *src)
3
{
4
  static uint8_t old[MAX];
5
  static uint8_t EEMEM e[MAX];
6
  for (uint8_t i = 0; i < MAX; i++)
7
  {
8
    if (src[i] != old[i])
9
    {
10
      eeprom_write_byte(&e[i],src[i]);
11
      old[i] = src[i];
12
    }
13
  }
14
}

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Wenn:
TO schrieb:
> eeprom_update_byte ist die Standardfunktion aus eeprom.h vom avr-gcc.

Dann kann man sich doch in der .h Datei diese Funktion suchen - oder wo 
ist mein Denkfehler?

MfG

von batman (Gast)


Lesenswert?

In dem Glauben, daß der Prozedurkopf weiterhilft?

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Darin wird wohl irgendwo, von mir aus in Einem der vierundzwanzig 
weiteren Includes, eine Funktion zu finden sein, Die diesen Namen trägt.

Zur Not die Platte nach genau dieser Zeichenfolge, also dem 
Funktionsnamen, durchsuchen lassen.

Aber jesses - ob diese Funktion sturr im Eeprom rumkritzelt oder nicht, 
verrät Euch gleich das Licht ... oder nicht.

Wenn man den Zugriff selber schreibt, weiß man, was passieren wird - 
wenn man per c&p 'arbeitet', muß man halt im Forum fragen und DANN 
selber was zusammen schreiben, da es ja nicht zumutbar ist, sich diese 
Funktion anzusehen.

Vll. hättest Du dann besser den Ort der Funktion (wohl dann der Name mit 
anderer Endung ?) nennen können - aber NACHdenken muß auch nicht immer 
sein ;)

MfG

: Bearbeitet durch User
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.