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
volatile unsigned int eeAnzahl=0 EEMEM; würde ich sagen. Welcher Compiler? Dein Code müsste eigentlich eine Warnung spucken (uninitialisized eeprom o.ä.)
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?
Jap hab ich nochmal den Post weiter oben lesen,... genauer lesen und mit deinem vergleichen. Gruß ErgoProxy
volatile unsigned int eeAnzahl EEMEM=0; DAS habe ich auch nicht geschrieben, schau noch mal genau hin :-) Kenne aber den GCC nicht.
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.
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.
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.
Da man sich mit der Position von "EEMEM" nicht einig ist: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM Also ist unsigned int eeAnzahl EEMEM=0; richtig. Was genau (Quelltext) wird compiliert und welche Fehlermeldung kommt? Am besten mit eingeblendeten Zeilennummern.
>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?
Genau das ist ja mein Problem! ich will nicht bei jedem Neustart die Variable auf "0" setzten, sondern nur beim kompalieren. Wie mache ich das?
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".
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.
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
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.