Forum: Mikrocontroller und Digitale Elektronik EEPROM Wert von einer bestimmten Adresse ermitteln


von Tim (Gast)


Lesenswert?

Guten Morgen,

ich habe vor aus dem EEPROM des Atmega48 den Wert auszulesen, der an der 
Adresse 0x10 liegt.

Wie muss ich da vorgehen? Kann ich eine Variable direkt auf die 
Speicheradresse setzen. Hab gerade im Tutorial geschaut, dort ist aber 
nur beschrieben, wie man den ganzen Bereich des EEPROM's auf feste 
Adressen legt.

Gruß

von Der M. (steinadler)


Lesenswert?

Schau mal ins Datenblatt.

Zumindest beim ATMEGA8 ist der Zugriff auf den EEPROM ausführlich 
beschrieben. Sogar glaube mit Code.

von Karl H. (kbuchegg)


Lesenswert?

Tim wrote:
> Guten Morgen,
>
> ich habe vor aus dem EEPROM des Atmega48 den Wert auszulesen, der an der
> Adresse 0x10 liegt.
>
> Wie muss ich da vorgehen? Kann ich eine Variable direkt auf die
> Speicheradresse setzen. Hab gerade im Tutorial geschaut, dort ist aber
> nur beschrieben, wie man den ganzen Bereich des EEPROM's auf feste
> Adressen legt.
>

In C?

Das geht ganz einfach:
1
uint8_t myByte;
2
 
3
    myByte = eeprom_read_byte((void*)0x10);

Besser ist es aber sich für die magische Konstante 0x10 zumindest
ein #define zu machen
1
#define MY_VALUE_ADDR  ((void*)0x10)
2
3
uint8_t myByte;
4
 
5
    myByte = eeprom_read_byte(MY_VALUE_ADDR);

  

von Frank (Gast)


Lesenswert?

...wie man den ganzen Bereich des EEPROM's auf feste
Adressen legt...

Ich dachte immer das die EEPROM Adressen eh fest vorgegeben sind. Wie 
genau steht im Datenblatt. Auslesen ist eigentlich ganz leicht. Mit dem 
passenden Register wird die Speicherzelle adressiert und dann einfach in 
ein anderes Register reingelesen mit Dem dann weitergearbeitet wird. Wie 
schon geschrieben wurde gibts in den Datenblättern sogar Codebeispiele, 
meistens sogar in Assembler und in C.

bye

Frank

von Tim (Gast)


Lesenswert?

Das EEPROM beschreiben und auslesen krieg ich hin, halt nur nicht von 
einer bestimmten Adresse. Und das steht leider nicht nicht im 
Datenblatt.

Benutze das AVR-Studio mit dem GCC-Compiler. Hab dort die eeprom.h 
eingebunden und benutze die Schreib- und Lesebefehle aus dem 
GCC-Tutorial.

von Der M. (steinadler)


Lesenswert?

Du musst doch der Funktion nur als Parameter die Adresse übergeben. Wo 
ist dein Problem? Funktioniert die Adressübergabe nicht?

von Karl H. (kbuchegg)


Lesenswert?

Tim wrote:
> Das EEPROM beschreiben und auslesen krieg ich hin, halt nur nicht von
> einer bestimmten Adresse. Und das steht leider nicht nicht im
> Datenblatt.
>
> Benutze das AVR-Studio mit dem GCC-Compiler. Hab dort die eeprom.h
> eingebunden und benutze die Schreib- und Lesebefehle aus dem
> GCC-Tutorial.

Die Funktion eeprom_read_byte will einfach nur diese
Adresse haben. Mehr nicht. Du hast diese Adresse als
Zahlenwert und musst nur noch dafür sorgen, dass der
Datentyp stimmt. (Siehe weiter oben)


von Tim (Gast)


Lesenswert?

Hallo Karl Heinz,

funktioniert einwandfrei. Vielen Dank!

Dann kann ich das doch beim Schreiben genauso anwenden. Oder muss ich 
mir da immer ne Variable so definieren:

unsigned int myByte EEMEM;  ?

von Johannes M. (johnny-m)


Lesenswert?

Da auch die eeprom_write_byte- bzw. eeprom_write_word-Funktion die 
Adresse der Speicherzelle übergeben bekommen, geht das 
selbstverständlich auch. Für einen (unsigned) int nimmste dann natürlich 
eeprom_write_word() und eeprom_read_word().

von Karl H. (kbuchegg)


Lesenswert?

Tim wrote:
> Dann kann ich das doch beim Schreiben genauso anwenden. Oder muss ich
> mir da immer ne Variable so definieren:
>
> unsigned int myByte EEMEM;  ?

Nein musst du nicht.
Du benutzt das genauso wie im Read Fall.

Wenn du die EEMEM Sache benutzt, dann übernimmt
der Compiler für dich die ganze Adressauszählerei
und sorgt dafür, dass es zu keinen Überschneidungen
der 'Variablen' kommt.

von Tim (Gast)


Lesenswert?

Super, Danke! Klappt alles.

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.