Forum: Mikrocontroller und Digitale Elektronik unterschied zwischen eeprom_write und eeprom_update


von Kaj (Gast)


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

von Karl H. (kbuchegg)


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.

von Kaj (Gast)


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

von Cyblord -. (cyblord)


Lesenswert?

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.

von Kaj (Gast)


Lesenswert?

cyblord ---- schrieb:
> Natürlich nur an der jeweiligen Adresse. Alles andere würde ja auch
> nichts bringen.
Hmm, ja, hast Recht :-/

Ich Danke euch =)

von KF -. (xanthos)


Lesenswert?

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?

von Cyblord -. (cyblord)


Lesenswert?

1
uint8_t x=5;
2
uint8_t y EEMEM;
3
4
//schreiben
5
eeprom_write_byte(&y,x);
6
7
//lesen
8
x=eeprom_read_byte(&y);

echt schwer...

Das konntest du nicht googlen und musstest noch einen Thread dafür 
kapern? Großes Kino!

alles weitere auch noch hier beschrieben:

http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html

von Kaj (Gast)


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

von Cyblord -. (cyblord)


Lesenswert?

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.

von KF -. (xanthos)


Lesenswert?

Bei uint8_t y EEMEM; sagt er immer "Abschnitt Attribut kann nicht für 
lokale Variablen angegeben werden"??

von Cyblord -. (cyblord)


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
}

von KF -. (xanthos)


Lesenswert?

Super mercy! War mir nicht bewusst, dass ich sie als lokale Variable 
deklariert hatte.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Korbinian Faber schrieb:
> Super mercy!

Gnade?!

von Karl H. (kbuchegg)


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.

von Cyblord -. (cyblord)


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

von KF -. (xanthos)


Lesenswert?

Naja, ich merke Einsteiger haben hier wohl nichts verloren. Trotzdem 
Danke jetzt hab ichs vertstanden.

von N. G. (newgeneration) Benutzerseite


Lesenswert?

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?

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
Noch kein Account? Hier anmelden.