www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik EEPROM beschreiben vorab und während des Betriebs


Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine Frage zum beschreiben des EEPROMS. DAs Tutorial dazu habe 
ich mir durchgelesen, bin aber noch nicht ganz schlau geworden.
Folgende Frage/Problemstellung:
Ich möchte einen array zuvor im EEPROM ablegen, d.h. eine .eep oder .hex 
Datei muss erzeugt werden, die ich per ISP programmieren kann. Erzeugt 
der Compiler bzw. das Makefile mir direkt durch die Vorbelegung beim 
Deklarieren einer Variable diese Datei:
uint8_t eeFooByteArray1[] EEMEM = { 18, 3 ,70 }; 

Nach diesem Quelltext würde also in der .eep Datei mein array stehen? 
Ist das richtig? Ist es nur so möglich, das EEPROM "vorab" zu 
beschreiben?

Diese array kann/soll vom Benutzer selbst Werte erlangen. Also muss ich 
diesen während des Programmbetriebs ändern. Dies erledige ich dann mit 
der Schreibe Block Funktion richtig?
uint8_t myByteBuffer[3]; 
eeprom_write_block(myByteBuffer,eeFooByteArray1,sizeof(myByteBuffer));  
Wird dort der komplette Block geschrieben, also alle 4 Stellen 
(0,1,2,3)? Weil in C habe ich gelernt, dass man jede Stelle des arrays 
über eine Schleife beschreiben muss.

So, das waren meine Fragen. Ich wäre froh, wenn sich jemand findet, der 
mir das Licht anschaltet :-)

Danke vorab.

Viele Grüße
Manuel

Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte ja nicht unhöflich sein, aber könnte mir jemand helfen?
Danke.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manuel schrieb:

> ich habe eine Frage zum beschreiben des EEPROMS. DAs Tutorial dazu habe
> ich mir durchgelesen, bin aber noch nicht ganz schlau geworden.
> Folgende Frage/Problemstellung:
> Ich möchte einen array zuvor im EEPROM ablegen, d.h. eine .eep oder .hex
> Datei muss erzeugt werden, die ich per ISP programmieren kann. Erzeugt
> der Compiler bzw. das Makefile mir direkt durch die Vorbelegung beim
> Deklarieren einer Variable diese Datei:
>
> uint8_t eeFooByteArray1[] EEMEM = { 18, 3 ,70 }; 

Ja.

> Nach diesem Quelltext würde also in der .eep Datei mein array stehen?

So ungefähr.
In der EEP Datei steht drinnen welche Werte im EEPROM wo abzulegen sind. 
Das ist so angeordnet, dass diese Daten an genau der Stelle ins EEPROM 
gebrannt werden, die der Compiler/Linker als die Adresse des Arrays 
eeFooByteArray festgelegt haben.

> Ist das richtig? Ist es nur so möglich, das EEPROM "vorab" zu
> beschreiben?

Ja.
Du kannst dir natürlich das HEX-File auch selber zusammenbauen, wenn du 
unbedingt möchtest und das Format kennst.

Aber wenn du die Daten vor dem ersten Flashen eines Programms im µC 
stehen haben willst, dann gehts nur so.

Man kann natürlich auch sein Programm so schreiben, dass es beim ersten 
Start selber rausfindet, dass die Werte im EEPROM noch nicht gültig sind 
und vom eigentlichen Programm aus die Erstbelegung machen.


> Diese array kann/soll vom Benutzer selbst Werte erlangen. Also muss ich
> diesen während des Programmbetriebs ändern. Dies erledige ich dann mit
> der Schreibe Block Funktion richtig?

Zum Beispiel mit dieser Funktion, ja.
Es gibt ja auch noch andere Funktionen. Aber für ein Array ist das schon 
ein guter Ansatz.

>
> uint8_t myByteBuffer[3];
> eeprom_write_block(myByteBuffer,eeFooByteArray1,sizeof(myByteBuffer));
> 

> Wird dort der komplette Block geschrieben, also alle 4 Stellen
> (0,1,2,3)? Weil in C habe ich gelernt, dass man jede Stelle des arrays
> über eine Schleife beschreiben muss.

eeprom_write_block weiß nichts von einem Array.
Dem eeprom_write_block sagt man

   * da hast du eine Adresse im SRAM Speicher
   * da hast du noch eine Adresse im EEPROM Speicher
   * ich will dass du x Bytes von A nach B umkopierst.

Wenn man nun das x so gestaltet, dass es genau der Arraygröße in Bytes 
entspricht, dann wird das komplette Array umkopiert. Genauer: Alle Bytes 
die zu diesem Array gehören.

und jetzt schaun wir mal: sizeof( myByteBuffer )
Aha. sizeof gibt die Anzahl der Bytes in seinem Argument zurück. IN 
deinem Fall das komplette Array. Also wird hier dem write_block mehr 
oder weniger gesagt: Kopiere soviele Bytes, wie in myByteBuffer 
verbraucht wurden

> So, das waren meine Fragen. Ich wäre froh, wenn sich jemand findet, der
> mir das Licht anschaltet :-)

Einfach mal ein bischen nachdenken. Sich die Funktionsargmuente ansehen 
und überlegen, was das alles wohl bedeuten mag.

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.