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
Du verwechselst den Pointer mit dem, worauf er zeigt. Der Pointer selber ist natürlich groß genug, den gesamten Speicher abzudecken.
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
>> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.