Verständnisfrage eeprom.h

Gast #820031
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
Gast
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!!!
>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
Gast
>> 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!
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.