mikrocontroller.net

Forum: Compiler & IDEs EEPROM nicht ganz verstanden


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
#include <stdint.h>
...
(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.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fritz Ganter (fritzg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du mehr als 2 Bytes hast, nimm    eeprom_read_block ().

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.