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


von Manuel (Gast)


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:
1
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?
1
uint8_t myByteBuffer[3]; 
2
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

von Manuel (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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:
>
1
> 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.

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

> 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.

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.