mikrocontroller.net

Forum: Compiler & IDEs Verständnisfrage eeprom.h


Autor: Lutz (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Lutz (Gast)
Datum:

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

Autor: Mark .. (mork)
Datum:

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

Autor: Lutz (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun hat es "Klick" gemacht, Tausend Dank !!!

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.