AVR EEPROM mit Startwerten versehen

Gast #1092587
Guten Abend alle zusammen,
ich möchte beim kompilieren Startwerte im EEPROM defieren, die ich dann 
bei jedem Programm durchlauf um "1" erhöhe.

volatile unsigned int eeAnzahl EEMEM;

eeprom_write_word(&eeAnzahl, eeprom_read_word(&eeAnzahl)+1);

Wie kann ich die Variable eeAnzahl im EEPROM beim flashen 
initialisieren?
Also eeAnzahl=0; setzen.

Vielen Dank für Euer bemühen
Simone
Gast
volatile unsigned int eeAnzahl=0 EEMEM;

würde ich sagen.
Welcher Compiler? Dein Code müsste eigentlich eine Warnung spucken 
(uninitialisized eeprom o.ä.)
Gast
ich verwende den GCC-Compiler

bekomme die Warnings:
170: warning: passing argument 1 of 'eeprom_read_word' discards 
qualifiers from pointer target type
170: warning: passing argument 1 of 'eeprom_write_word' discards 
qualifiers from pointer target type

kann mit den Warnungen aber nichts anfangen!

Habe es auch gerade mit der Befehlszeile versucht, ohne Erfolg...
volatile unsigned int eeAnzahl EEMEM=0;

hat noch jemand einen Tipp?
Volatile Variable im EEPROM? Ergibt das einen Sinn???

Schon allein die Tatsache, daß das EEPROM-Schreiben eine ziemlich 
langwierige Sache ist, die nicht von weiteren Schreib- oder 
Leseoperationen auf das gesamte EEPROM - nicht nur die eine Variable - 
unterbrochen werden kann, spricht doch stark dagegen.
Gast
Es gibt ausserordentlich wenige Compiler, die behandeln EEPROM wie RAM, 
zb der ELAB Pascal kann MyEEPROMVar:=1234; Eine normale C Schwarte kann 
das nicht, da der Prozessor das schon nicht kann. Der Prozessor 
beschreibt das EEPROMauf einigen Seiten, und zum AVR gibt es daher eine 
Library funktion zum lesen und schreiben von einem einzigen byte.
Gast
Bei der Befehlszeile:
unsigned int eeAnzahl=0 EEMEM;
bekomme ich dann die Fehlermeldung:
error: expected ',' or ';' before '__attribute__'
deshalb hab ich
unsigned int eeAnzahl EEMEM=0;
geschrieben.

Habe es jetzt auch mal ohne volatile versucht, aber auch kein Erfolg...

Ich möchte die Programmdurchläufe protokollieren und dafür muss ich die 
Variable halt in nem ROM speichern, da der Controller öfters 
spannungslos ist.
Gast
>Ich möchte die Programmdurchläufe protokollieren und dafür muss ich die
>Variable halt in nem ROM speichern, da der Controller öfters
>spannungslos ist.

Da die Anzahl der Schreibzyklen des EEPROMS begrenzt ist würde ich den 
Spannungsausfall mittels eines dicken Kondensators verzögern und nur 
beim abschalten die Anzahl der Durchläufe speichern.

Was ich jedoch nicht verstanden habe:
Wenn Du die anzahl der Programmdurchläufe mitzählen willst, Dein System 
aber häufiger spannungsfrei ist, beim Neustart aber den Zählerwert im 
Eeprom löscht, wann willst Du denn dann die Anzahl der Durchläufe 
auswerten?
Gast
Wenn Du einfach nur einen Wert ins EEPROM schreiben willst (bei den AVR 
steht ja werksmäßig überall 0xFF drin), kannst Du die beim kompilieren 
entstehende .eep-Datei z.B. mit dem AVR Studio raufspielen, Quellcode so 
wie oben beschrieben (natürlich kompilierbar, mit #include 
<avr/eeprom.h> oder so ähnlich etc..
Im Betrieb greifst Du dann einfach mit den avr-libc Funktionen wie z.B.
1
... was halt noch so reingehört ...
2

3
#include <avr/eeprom.h>
4
unsigned int eeAnzahl EEMEM = 0;
5
unsigned int loopcounter = 0;
6
loopcounter = eeprom_read_byte (&eeAnzahl);
7
loopcounter++;
8
eeprom_write_byte (&eeAnzahl, loopcounter; 
9

10
... was halt noch so reingehört ...

Wahrscheinlich kann mann die EEPROM-Datei auch einfacher erzeugen, 
einfach mal die AVR Studio Hilfe, Freund Google etc. bemühen. Eine 
einzelne .eep-Datei habe ich noch nie gebraucht; bei mir fiel sie beim 
kompilieren immer "so mit ab".
Gast
soweit habe ich das schon verstanden.
aber wenn ich eine fest definierte *.eep-Datei überspiele, woher weiß 
mein Compiler dann, welche Adresse er im EEPROM verwenden muss, um die 
Variablen zu speichern?
denke ich gerade sooo falsch??

War eigentlich der Meinung, dass das Problem recht flott gelöst sein 
sollte.
Hmm, wohl doch etwas verzwickt...
Mit der Definition

   unsigned int eeAnzahl EEMEM=0;

sagst du dem Compiler, daß du ein unsigned int im EEPROM mit Namen 
eeAnzahl reservieren willst und daß es mit 0 vorbesetzt werden soll.

Der Compiler sammelt alle Daten-Definitionen, die das Attribut EEMEM 
haben und baut damit das Speicherabbild des EEMEM-Segmentes. Die 
Variablennamen sind Offsets ins EEMEM-Segment, die man als Adresse für 
die eeprom_*-Routinen angeben kann. Es handelt sich nicht um echte 
Variablen, wie man sie im RAM hält.

Wenn der Linker den .hex-File zusammenbaut, setzt er das Speicherabbild 
des EEMEM-Segmentes, wie es sich aus den Vorbesetzungen ergibt dort ein 
und der Lader weiß dann, daß er die Daten ins EEPROM schreiben muß.

Wenn du dir den ASM-Output ansiehst, den der Compiler für dein Programm 
erzeugt, wirst du vor der Definition der EEPROM-Daten die 
Segment-Direktive finden, die sagt, daß die folgenden Daten nicht ins 
RAM, oder Flash, sondern ins EEPROM gehören.
Gast
SUPER!!!
Danke für die vielen und hilfreichen Antworten. Hab ne Lösung gefunden!!
Habe die ganze Zeit vergessen das *.eep-File zu übertragen.

Kann ich das AVR-Studio so einstellen, dass gleichzeitig das *.hex-File 
und das *.eep-File übertragen werden??

Nochmals Danke
Gast
> Kann ich das AVR-Studio so einstellen, dass gleichzeitig das *.hex-File
und das *.eep-File übertragen werden??

Der AVRISP MkII kann das z.B., einfach in "Auto" anklicken, was er tun 
soll.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.