Hallo Leute,
ich arbeite zur Zeit an einer Anwendung, bei der es erforderlich ist,
das ich ein paar Byte im EEPROM ablege. Das Schreiben und Lesen
funktioniert auch tadellos, mit den eeprom-Funktionen aus der
1
#include<avr/eeprom.h>
Jetzt gibt es in der Headerdatei aber write-Funktion und
update-Funktionen, also:
1
//Write a byte \a __value to EEPROM address \a __p.
Jetzt die Frage: Was ist da jetzt der genaue unterschied zwischen write
und update?
Gibt es hier jemanden der den Unterschied kennt, und ihn mir erklaert?
Controller: ATmega2560
IDE: Atmel Studio 6.1
Programmer: Atmel JTAGICE 3
OS: Win7 64bit
Gruese
Kaj schrieb:> Jetzt die Frage: Was ist da jetzt der genaue unterschied zwischen write> und update?
Update prüft vorher, ob der zu schreibende Wert nicht schon im EEPROM
steht.
Hintergrund: Das EEPROM hat eine begrenzte Anzahl von SChreibzyklen.
Schreibt man 10000 mal den immer gleichen Wert ins EEPROM, dann hat man
diese Zahl für nichts schnell aufgebraucht.
Karl Heinz schrieb:> Update prüft vorher, ob der zu schreibende Wert nicht schon im EEPROM> steht.
Wird geprueft ob der Wert generell irgendwo im EEPROM steht, oder wird
geprueft ob der Wert an der Adresse steht, an die ich schreiben moechte?
Ansonsten schon vielen Dank Karl Heinz =)
Gruesse
Kaj schrieb:> Karl Heinz schrieb:>> Update prüft vorher, ob der zu schreibende Wert nicht schon im EEPROM>> steht.> Wird geprueft ob der Wert generell irgendwo im EEPROM steht, oder wird> geprueft ob der Wert an der Adresse steht, an die ich schreiben moechte?
Natürlich nur an der jeweiligen Adresse. Alles andere würde ja auch
nichts bringen.
Hey,
ich versuche zurzeit Bytes im EEPROM abzulegen und auch wieder
abzufragen, aber dies funktioniert einfach nicht :(
Ich benutze die avr/eeprom.h, muss ich erst definieren, welchen Atmega
ich habe?
Hat vll jemand einen Code für mich?
Korbinian Faber schrieb:> aber dies funktioniert einfach nicht :(
Wie stellst du fest, das es nicht funktioniert?
Mit welcher Platform arbeitest du? (Windows und Atmel Studio, oder
Linux)
Wenn du unter Windows mit Atmel Studio arbeitest, dann kannst du das
ganz entspannt im Simulator testen, falls du nicht die entsprechende
Hardware zum debuggen hast.
Korbinian Faber schrieb:> Ich benutze die avr/eeprom.h, muss ich erst definieren, welchen Atmega> ich habe?
Nicht das ich wüsste.
Korbinian Faber schrieb:> Hat vll jemand einen Code für mich?
Ich habs so gemacht: (das mit dem pointer ist nicht schön!)
1
// schreiben
2
uint8_tdata=0xCC;
3
uint8_t*p=0xAF;// Adresse für eeprom
4
cli();//Interrupts deaktivieren
5
eeprom_busy_wait();//warten bis eeprom bereit ist
6
eeprom_write_byte(p,data);//schreibt den Wert 0xCC an
7
//die EEPROM-Adresse 0xAF
8
sei();//interrupts wieder aktivieren
9
10
11
12
//lesen
13
uint8_t*p=0xAF;// Adresse für eeprom
14
cli();//Interrupts deaktivieren
15
eeprom_busy_wait();//warten bis eeprom bereit ist
16
uint8_tmyVar=eeprom_read_byte(p);// liest von der EEPROM-Adresse 0xAF
Kaj schrieb:> Ich habs so gemacht: (das mit dem pointer ist nicht schön!)
Die Adresse händisch reintippen ist doch Pfusch und unnötig. Machst du
für den RAM doch auch nicht. Lass das den Compiler selber machen mit
EEMEM. Damit bekommst du in der avr-size Ausgabe auch gleich den
belegten Speicher im EEPROM.
Korbinian Faber schrieb:> Bei uint8_t y EEMEM; sagt er immer "Abschnitt Attribut kann nicht für> lokale Variablen angegeben werden"??
Wieso LOKAL? In einer Funktion geht das natürlich auch nicht. Die müssen
GLOBAL definiert werden. Das sollte doch einleuchten. Im EEPROM wird
doch kein Stack geführt, da gibts doch nur globale Variablen drin.
Also muss man hier alles vorkauen? Dann halt nochmal:
KF KF schrieb:> Super mercy! War mir nicht bewusst, dass ich sie als lokale Variable> deklariert hatte.
Schon lustig.
Du sagst dir war gar nicht bewusst, dass es eine lokale Variable ist,
der Compiler sagt dir das es eine lokale Variable ist (und daher nicht
geht) und du brauchst dann auch noch ein Forum, dass dir bestätiogt,
dass du
* eine lokale Variable hast und
* dass das nicht geht.
Jetzt weiß ich gar nicht, welchen Facepalm ich aus meiner Sammlung
benutzen soll.
Und dann gibt es immer wieder Leute, die sich darüber aufregen und mich
beschimpfen, wenn ich den Leuten nahelege, doch bitte ihre Sprache zu
lernen. In welche merkwürdiger Zeit wir doch leben.
Karl Heinz schrieb:> Schon lustig.> Du sagst dir war gar nicht bewusst, dass es eine lokale Variable ist,> der Compiler sagt dir das es eine lokale Variable ist (und daher nicht> geht) und du brauchst dann auch noch ein Forum, dass dir bestätiogt,> dass du> * eine lokale Variable hast und> * dass das nicht geht.
Wahre Weise Worte. Zum Glück war ich gestern so gut gelaunt ;-)
KF ------ schrieb:> Naja, ich merke Einsteiger haben hier wohl nichts verloren.
Würde ich so nicht sagen. Aber ich bin auch mal die Schnauze gefallen,
als ich jmdn hier im Forum gebeten habe, allen Code für mich zu tippen.
Und das war genau richtig. Wie soll man den sonst was lernen?