ATmega8 EEPROM update

Gast #4999540
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!
Gast #4999556
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.
Gast #4999625
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);
  }

}
#5000135
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
}
#5000533
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.