unterschied zwischen eeprom_write und eeprom_update

Gast #3593960
Lesenswert?

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.
2
void eeprom_write_byte (uint8_t *__p, uint8_t __value);
3

4
//Update a byte \a __value to EEPROM address \a __p.
5
void eeprom_update_byte (uint8_t *__p, uint8_t __value);

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
#3593967
Lesenswert?

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.
Gast #3593978
Lesenswert?

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
Gast #3614199
Lesenswert?

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_t data = 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_t myVar = eeprom_read_byte(p); // liest von der EEPROM-Adresse 0xAF
17
sei(); //interrupts aktivieren

Grüße
#3614208
Lesenswert?

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:
1
uint8_t x=5;
2
uint8_t y EEMEM;
3

4
int main() {
5
//schreiben
6
eeprom_write_byte(&y,x);
7

8
//lesen
9
x=eeprom_read_byte(&y);
10
}
#3615006
Lesenswert?

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.
#3615046
Lesenswert?

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 ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren