Forum: Mikrocontroller und Digitale Elektronik EEPROM AVR Adresse > 0xFF


von Mr. EEPROM (Gast)


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?!

von Stefan F. (Gast)


Lesenswert?

> Gibt es eine Funktion, mit der die Adresse der EEPROM Zelle 16 Bit
> ist, aber nur 1 Byte Daten behandelt werden?!
1
uint8_t   eeprom_read_byte (const uint8_t *__p)

Der Parameter für die Adresse ist ein Zeiger auf ein Byte (uint8_t). Bei 
AVR sind Zeiger immer 16bit groß.

https://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html

von Mitlesa (Gast)


Lesenswert?

Mr. EEPROM schrieb:
> Gibt es
> eine Funktion, mit der die Adresse der EEPROM Zelle 16 Bit ist, aber nur
> 1 Byte Daten behandelt werden?!

Welche Tatsache veranlasst dich denn zu vermuten das die
vorhandenen Funktionen das nicht können?

von Axel S. (a-za-z0-9)


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.

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

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

von Marco H. (damarco)


Lesenswert?

Ich glaube er kommt mit den Bit breiten der Zeiger nicht zurecht. void 
eeprom_write_dword(uint32_t *__p,uint32_t __value) z.Bsp. warum ist der 
Zeiger 32bit breit wenn er doch auf(eine) 8bit Adresse zeigt?

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

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.

von Axel S. (a-za-z0-9)


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>

von Blub (Gast)


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.

von Ralph S. (jjflash)


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.

von Ralph S. (jjflash)


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);

von M. K. (sylaina)


Lesenswert?

Ralph S. schrieb:
> Eine ext_eeprom_read_byte Funktion gibt es meines Wissens nicht

Deswegen schrieb Blub auch im Konjunktiv (wäre, würde) ;)

von Marco H. (damarco)


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.

von Ralph S. (jjflash)


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

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.