Forum: Compiler & IDEs EEPROM nicht ganz verstanden


von Markus (Gast)


Lesenswert?

Hi.
Also ich versuche grad das EEPROM eines ATMega8515 anzusprechen.
Nur aus dem AVR-GCC Tutorial werde ich nicht richtig schlau.

Es steht ja da das ich bei der Funktion "eeprom_write_byte" die
Adresse und den Inhalt angeben  muss.
Wie ist diese Adresse aufgebaut?
Also wenn ich dort jetzt die Zahl 1 als Adresse hinschreib (geht das
überhaupt) wird dann der Speicherbereich "1" beschrieben?
Musst ich dann danach auf Adresse 9 mit dem nächsten Byte
weiterschreiben?

Wäre super wenn mir jemand das Grundlegend erklären könnte. Hier im
Forum steht viel zum Thema EEPROM aber nicht eben wie das mit den
Speicherbereichen genau aussieht.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Also wenn ich dort jetzt die Zahl 1 als Adresse hinschreib
> geht das überhaupt)

Jein, du wirst eine Warnung bekommen, dass du eine Zahl übergibst,
obwohl eine Adresse erwartet wird.  Aber es funktioniert.
``Politisch korrekt'' wäre
1
#include <stdint.h>
2
...
3
(uint8_t *)1

als Adressangabe.

> wird dann der Speicherbereich "1" beschrieben?

Ja.

> Musst ich dann danach auf Adresse 9 mit dem nächsten Byte
> weiterschreiben?

Wieso 9?  Das wäre dann 8 Bytes weiter.  Außerdem ist 1 natürlich
nicht die erste Adresse, sondern 0.

von Markus (Gast)


Lesenswert?

Danke Jörg für die schnelle Antwort.
Wegen der Adresse 9 ich dachte es geht Bit weise und nicht byte weise.

Also mit Adressen hab ich mich noch überhaupt  nicht beschäftigt
deswegen hab ich im AVR-GCC Tutorial auch nicht verstanden warum dort
steht

"eeprom_write_byte(&eeFooByte,myByte);"

Woher weiß ich nun welche Adresse das ist ?

Meines achtens wurde es ja nicht davor festgelegt oder hab ich
irgendetwas übersehen?

Beim lesen aus dem EEPROM ist das selbe Problem es steht im  Tut.:
"mybyte = eeprom_read_byte(&eeFooByte);

(zuvor wurde noch geschrieben "uint8_t eeFooByte EEMEM = 123;) ?
Und nach der schreib anweisung steht nun das die Variable mybyte nun
den Wert 123 erzhält?
Aber wurde nicht vorher die Adresse dann auf 123 gesetzt?

Du sieht ich bin durch den Code leicht verwirrt.

von Simon K. (simon) Benutzerseite


Lesenswert?

Momeeent. Bei der Deklaration
uint8_t eeFooByte EEMEM = 123;

sagst du dem Compiler, dass er die Variable im EEPROM anlegen soll. Wo
genau interessiert dich, als Programmierer erstmal nicht.

Wenn du nun
mybyte = eeprom_read_byte(&eeFooByte);

ausführst, dann siehst du vor der Variable ein "&" Zeichen. Steht vor
einer Variable das "&" Zeichen, wird deren Adresse zurückgegeben.
Mit der Anweisung sagst du dem Compiler also "Lese den Wert aus dem
EEPROM, der an der Adresse [Adresse von eeFooByte] steht".

würdest du
mybyte = eeprom_read_byte(eeFooByte);

Also ohne "&" nehmen, dann würde er den Inhalt der Variable eeFooByte
als Adresse interpretieren und in diesem Falle auf die Adresse 123
zugreifen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

eeFooByte ist eine Variable, die in einer EEPROM section
deklariert ist.  Deren Adresse kann man sofort nehmen (mit
dem &-Operator), ohne dass man die exakte Adresse kennt
(kann irgendwo im EEPROM liegen).  Man spricht damit also
eine EEPROM-Zelle an, ohne dass man sich dafür interessiert,
welche es denn genau ist.

Um den Initialwert zu erhalten, lädt man die EEPROM-Datei
einmalig in selbigen (mit einem Programmier-Werkzeug).

> mybyte = eeprom_read_byte(eeFooByte);

Nein, grundverkeht.  Das würde die Adresse von eeFooByte benutzen,
damit aber den RAM (also eine normale Variable) aufsuchen, dann
den Inhalt der entsprechenden RAM-Zelle lesen und als EEPROM-
Adresse interpretieren, um den an dieser Stelle befindlichen
Wert zu extrahieren.  Das ist sehr wahrscheinlich nicht, was du
wirklich willst. ;-)

von Simon K. (simon) Benutzerseite


Lesenswert?

@Jörg:
Hm? Das ohne "&" Operator habe ICH geschrieben (nicht der
fragesteller), zur demonstration. und auch genau so wie du erklärt.

von Markus (Gast)


Lesenswert?

Ahja.
Dank euch erst mal aber ich dachte es ist so wichtig die Adresse zu
kennen.
Ich möchte jetzt am Anfang nur zum testen ein Lauflicht programmieren
das an der letzten Stelle vor dem ausschalten wieder weitermacht (vor
dem Ausschalten drückt man einfach eine "save" Taste).

Hab ich das jetzt so richtig verstanden?
Also ich möchte einfach eine 8bit Variable in den EEPROM schreiben und
auch lesen.

Also lege damit "uint8_t eeFooByte EEMEM = 123;" die Variable im
EEPROM an und kann sie dann später über eeFooByte beschreiben und
auslesen?
Kann ich diese Variable dann auch ganz einfach als Array (eben für den
Datenlogger anlegen) ?

Und dann eben mit den read und write methoden beschreiben bzw. lesen?

Später will ich einen Datenlogger realisieren aber ich denke das ist
dann nicht mehr schwer wenn ich mal das grundlegende verstanden hab.

von Fritz G. (fritzg)


Lesenswert?

Wenn du mehr als 2 Bytes hast, nimm    eeprom_read_block ().

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.