EEPROM AVR Adresse > 0xFF

Gast #5322111
Lesenswert?

Hallo,

ich habe ein Problem. Ich muss single Bytes im EEPROM ändern, die ganzen 
Bytes (bis 350) sind alle unabhängig voneinander und ohne Wissen über 
benachtbarte Bytes.

Mit der eeprom_read/write_byte ist es möglich bis 255 zu arbeiten, mit 
eeprom_read/write_word geht es, wie ich denke, bis 65535, allerdings 
bekomme ich dann auch ein 16 Bit Wert, das möchte ich vermeiden. Gibt es 
eine Funktion, mit der die Adresse der EEPROM Zelle 16 Bit ist, aber nur 
1 Byte Daten behandelt werden?!
#5322132
Lesenswert?

Mr. EEPROM schrieb:
> ich habe ein Problem. Ich muss single Bytes im EEPROM ändern, die ganzen
> Bytes (bis 350) sind alle unabhängig voneinander und ohne Wissen über
> benachtbarte Bytes.

Bahnhof. Was soll die 350 darstellen?

> Mit der eeprom_read/write_byte ist es möglich bis 255 zu arbeiten, mit
> eeprom_read/write_word geht es, wie ich denke, bis 65535, allerdings
> bekomme ich dann auch ein 16 Bit Wert, das möchte ich vermeiden. Gibt es
> eine Funktion, mit der die Adresse der EEPROM Zelle 16 Bit ist, aber nur
> 1 Byte Daten behandelt werden?!

Die EEPROM Adressen in den Funktionen aus avr/eeprom.h decken immer das 
ganze EEPROM ab. Es sind Zeiger. Der Datentyp worauf so ein Zeiger 
zeigt, hat nichts mit der Länge des Zeigers selber zu tun.
Persönliche Seite #5322392
Lesenswert?

Marco H. schrieb:
> warum ist der Zeiger 32bit breit wenn er doch auf(eine) 8bit Adresse
> zeigt?

Wo ist da ein 32 Bit breiter Zeiger?

Ein Zeiger ist eine Adresse, und damit so groß wie eine Adresse.

Was sich hinter der Adresse verbirgt, ein Byte, ein 16-Bit-Wert oder ein 
double ändert nichts an der Größe der Adresse.


Auch wenn Onkel Herbert 250 kg wiegt, ist seine Telephonnummer nicht 
länger als die von Tante Hiltrud, die gerade mal 45 kg auf die Waage 
bekommt.
#5322505
Lesenswert?

Kaj G. schrieb:
> Axel S. schrieb:
>> Bahnhof. Was soll die 350 darstellen?
> Vermutlich meint er, das er im EEPROM insgesammt 350 Bytes speichert.

Dann hätte er das auch schreiben sollen. Statt dessen faselt er etwas 
von ganzen Bytes (im Gegensatz zu was? Halben Bytes? Kaputten Bytes?)

Aber so langsam habe ich genug Bier intus, um mich auf sein Niveau 
herunter denken zu können. Irgendwie glaubt er wohl, das "uint8" in 
"uint8_t *__p" würde bedeuten, daß dieser Pointer nur 256 Adressen 
darstellen könnte. Typischer Fall von fehlenden Grundlagen. Er hätte 
sich vielleicht wenigstens mal einen Überblick über C verschaffen 
sollen. Naja. Gab wohl kein Youtube Video zum Thema. Da konnte er das 
natürlich nicht lernen </sarkasmus>
Gast #5322528
Lesenswert?

Der gedankliche Fehler von Mr. EEPROM ist, dass der EEPROM kein externes 
Gerät ist sondern bei AVR teil des Adressraums.


Daher verlangt die Funktion auch einen Pointer auf die entsprechende 
Speicherstelle im EEPROM Bereich.
1
uint8_t   eeprom_read_byte (const uint8_t *__p)
Pointer __p zeigt auf eine Speicherstelle mit Größe uint8_t.



Wäre es ein externes Gerät würde die Funktion vermutlich ohne Pointer 
aufgerufen und die abzufragende Speicherstelle übergeben.
1
uint8_t   ext_eeprom_read_byte (const uint8_t add)
In diesem Fall wäre der adressierbare Speicher so wie vom 
Threadersteller gedacht wirklich auf uint8_t Adressen begrenzt.
#5322530
Lesenswert?

1
#include <avr/eeprom.h> 
2

3
void main(void)
4
{
5
  uint8_t eep_byte;
6
  uint16_t eep_adr = 320;
7

8
  // Wert aus EEPROM Speicherstelle 320 lesen
9
  eep_byte = eeprom_read_byte((uint8_t*)eep_adr);
10

11
  eep_byte -= '0';      // konvertiert bspw. eine Ascii-Ziffer in
12
                        // eine einstellige Zahl
13

14
  // und Wert ins EEPROM zurueckschreiben
15
  eeprom_write_byte((uint8_t*)eep_adr, eep_byte);
16

17
  while(1);
18
}

Der Typcast (uint8_t *) konvertiert die in der Variable enthaltene 
Adresse (320) zu einem Pointer, der auf Speicherstelle 320 im EEPROM 
zeigt.

Die (16-Bit große) Adresse zeigt auf einen 8-Bit großen Wert im (EEPROM) 
Speicher.
#5322533
Lesenswert?

Blub schrieb:
> uint8_t   ext_eeprom_read_byte (const uint8_t add)
> In diesem Fall wäre der adressierbare Speicher so wie vom
> Threadersteller gedacht wirklich auf uint8_t Adressen begrenzt

Eine ext_eeprom_read_byte Funktion gibt es meines Wissens nicht 
vorgefertigt und die wuerde man wohl (so es ein EEPROM > 256 Byte 
Speicher ist) so deklarieren:
1
uint8_t ext_eeprom_read_byte (const uint16_t add);
#5322633
Lesenswert?

Kaj G. schrieb:
> Marco H. schrieb:
>> Ich glaube er kommt mit den Bit breiten der Zeiger nicht zurecht.
> Das gilt offenbar auch fuer dich.
>
> Axel S. schrieb:
>> Es sind Zeiger. Der Datentyp worauf so ein Zeiger
>> zeigt, hat nichts mit der Länge des Zeigers selber zu tun.

Das stimmt ich meinte er den Zusammenhang wie ein EEROM organisiert ist 
und wie dieser Adressiert wird.
#5323606
Lesenswert?

Marco H. schrieb:
> Das stimmt ich meinte er den Zusammenhang wie ein EEROM organisiert ist
> und wie dieser Adressiert wird.

na ja, aber Blub schrieb:

Blub schrieb:
> uint8_t   ext_eeprom_read_byte (const uint8_t add)

Und hier wäre der Datentyp für die Adresse nur 8-Bit und somit die 
höchste Adresse 0xff (womit der TO dann wieder -so er ein externes 
EEPROM hätte - keine Speicheradressen > 255 erreichen könnte)

: - )  ... wieder Konjunktiv

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren