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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Mr. EEPROM (Gast)


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


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

: Bearbeitet durch User
von Mitlesa (Gast)


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


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


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


Bewertung
-5 lesenswert
nicht 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) (Moderator) Benutzerseite


Bewertung
5 lesenswert
nicht 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)


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


Bewertung
-2 lesenswert
nicht 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)


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


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


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


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


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


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

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]
  • [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.