Forum: Compiler & IDEs Verständnisfrage eeprom.h


von Lutz (Gast)


Lesenswert?

Hallo,

wahrscheinlich verstehe ich es nicht, weil Samstag Abend ist:

In der eeprom.h der avr-libc gibt es die Funktion eeprom_read_byte. 
Diese nimmt einen Pointer auf unsigned char als Adresse im EEPROM. Nun 
ist doch aber bei z.B. 512 Byte EEPROM-Größe ein unsigned char zum 
Adressieren zu klein; es sind nur 256 Byte adressierbar. Es gibt das 
ganze zwar auch für words, aber ich will hier nur bytes lesen. Auch im 
Datenblatt vom ATmega88 gibt es für die Adresse des EEPROM 2 Register, 
EEARH und EEARL. Wo denke ich falsch?

Danke und Gruß
Lutz

von Stefan E. (sternst)


Lesenswert?

Du verwechselst den Pointer mit dem, worauf er zeigt.
Der Pointer selber ist natürlich groß genug, den gesamten Speicher 
abzudecken.

von Lutz (Gast)


Lesenswert?

Also ich blicke das immer noch nicht:
In der avr-libc ist die Funktion folgendermaßen deklariert:

uint8_t  eeprom_read_byte (const uint8_t *addr)

Mit meinem (ja leider noch arg beschränkten, deshalb ja auch das 
Verständnisproblem) C-Wissen verstehe ich die Funktion so, daß sie einen 
Wert vom Typ unsigned char zurückgibt, also einen 8 bit Wert. Kein 
Problem.

Als Funktionsargument wird ein Pointer auf ein unsigned char übergeben, 
d.h. der Ausdruck *addr soll ein unsigned char sein (der Adresswert 
besteht also auch nur aus 8 bit). Mit 8 bit kann man 256 verschiedene 
Werte darstellen (hier also 256 verschiedene Adressen angeben). Aber für 
512 byte EEPROM bräuchte ich mindestens 9 bit, also als nächsten 
"ganzzahligen" Wertetyp einen 16 bit-Wert.

Bitte laßt mich nicht dumm sterben!!!

von Mark .. (mork)


Lesenswert?

>der Adresswert besteht also auch nur aus 8 bit

Nein, die Größe eines Zeigers hat absolut nichts mit der Größe des 
Datentypen zu tun, auf den es zeigt. Bei den AVRs hat ein Zeiger immer 
16 Bit und kann somit 65536 verschiedene Werte annehmen.

MfG Mark

von Lutz (Gast)


Lesenswert?

>> Nein, die Größe eines Zeigers hat absolut nichts mit der Größe des
>> Datentypen zu tun, auf den es zeigt.

Das habe ich verstanden, aber

uint8_t *addr

bedeutet doch, das der Pointer auf einen uint8_t-Datentyp namens "addr" 
zeigt, und dieser kann nur 256 verschiedene Werte (hier Adressen) 
annehmen, und das EEPROM hat 512 Adressen. Hilfe!

von Stefan E. (sternst)


Lesenswert?

Nein, der Pointer heißt "addr", er enthält die Adresse, an der dann 
ein uint8_t zu finden ist, nämlich die Daten, die du aus dem EEPROM 
lesen willst.
Oder anders: der Pointer zeigt nicht auf Daten, die die Adresse 
enthalten (wie du denkst), er ist die Adresse.

von Lutz (Gast)


Lesenswert?

Nun hat es "Klick" gemacht, Tausend Dank !!!

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.