Forum: Mikrocontroller und Digitale Elektronik Array mit AVR Studio fest in den EEPROM brennen


von Thomas S. (thomass)


Lesenswert?

@all,

ich versuche ein Array fest in den EEPROM zu brennen.
In diesem Array sind Daten abgelegt die nach dem Abschalten wieder 
verfügbar sein sollen.
Leider habe ich es noch nicht geschaft den EEPROM direkt mit den Daten 
zu brennen. Schreibend und lesend auf den EEPROM zuzugreifen mit den 
Funktionen von eeprom.h eeprom_read_byte und eeprom_write_byte 
funktioniert jedoch die Daten direkt mit AVR Studio draufzuschreiben 
scheidert kläglich.
Ich habe die Beschreibung

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM-Speicherabbild_in_.eep-Datei
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Exkurs:_Makefiles

schon mehrmals gelesen doch verstehen tu ich es nicht so recht zumindest 
nicht was ich einstellen muss um eine eep Datei zu erhalten.

Ich benutze folgendes.

- AVR Studio 4.13 mit AVR Gcc
- einen MK 2 zum programmieren
- einen ATMEGA 128

Ich hoffe mir kann jemand sagen was ich unter AVR Studio einstellen 
muss.

Danke

Thomas

von Niels H. (monarch35)


Lesenswert?

Du definierst ein Array z.B.

uint8_t test[] EEMEM="test";

Wenn du die Quelle kompilierst, kommt unter anderem eine .eep Datei 
herraus, die du mit avrdude, oder was auch immer, direkt in das EEPROM 
des Kontrolers flashen kannst.

Das Auslesen des EEProms funktioniert dann über die von dir genannten 
Funktionen. Entweder liest du es Byte-für-Byte aus und behandelst jedes 
Zeichen einzeln oder du liesst dir die Zeichenkette erstmal komplett in 
einen Buffer im SRAM.

Direkt darauf zuzugreifen funktioniert allerdings nicht.

von Fred S. (Gast)


Lesenswert?

Hallo Thomas,

Deine Frage ist mir nicht 100% klar, da Du sowohl das Erzeugen der 
*.eep-Datei als auch das eigentliche Brennen ansprichst.

Sofern Deine *.c bzw. *.asm Datei so angelegt ist, dass EEPROM-Daten 
definiert sind, erzeugt AVR-Studio auch die zugehörige *.eep Datei (z.B. 
im Unterordner "default").

Hier ein Beispiel aus meinem aktuellen Projekt in C:

///////////////////////////////////////////////
// 2 Float-Werte werden ins EEPROM geschrieben
// EEPROM data

float eelat   EEMEM = 53.5;
float eelongit   EEMEM = 13.3;
///////////////////////////////////////////////

Je nach Programmierer-Hardware muss dann eingestellt werden, welche 
*.eep-Datei gebrannt werden soll. Manche Programmiersoftware kann auch 
die *.elf-Datei mit allen Definitionen übernehmen.

Viele Grüße

Fred

von Thomas S. (thomass)


Lesenswert?

@Niels,

Danke für Deine schnelle Antwort.

Ich glaube ich habe das Übel gefunden was nicht funktioniert.

Ich initialisiere 2 Arrays wie folgt eines im EEPROM eines im RAM.
1
unsigned char eeFooByteArray1[5][5] EEMEM =  {
2
                                              {0x01,0x01,0x01,0x01,0x01},
3
                                              {0x02,0x02,0x02,0x02,0x02},
4
                                              {0x03,0x03,0x03,0x03,0x03},
5
                                              {0x04,0x04,0x04,0x04,0x04},
6
                                              {0x05,0x05,0x05,0x05,0x05},
7
                                             };
8
unsigned char eeFooByteArray2[5][5] =  {
9
                                        {0x00,0xFF,0x00,0xFF,0x00},
10
                                        {0x00,0xFF,0x00,0xFF,0x00},
11
                                        {0x00,0xFF,0x00,0xFF,0x00},
12
                                        {0x00,0xFF,0x00,0xFF,0x00},
13
                                        {0x00,0xFF,0x00,0xFF,0x00},
14
                                       };

Nun lese ich eeFooByteArray2 ein und gebe die Werte per printf aus alles 
OK.
Nun schreibe ich die Werte von Array eeFooByteArray1 ins Array 
eeFooByteArray2.
1
eeFooByteArray2 [r][i] = eeprom_read_byte(&eeFooByteArray1[r][i]);

Lese ich nun das Array eeFooByteArray2 aus stehen zwar geänderte Werte 
im Array jedoch nicht die von eeFooByteArray1.

Nun schreibe ich die ausgelesenen Werte zuerst in eine Variable und 
speichere diese dann in eeFooByteArray2 dann stimmen die Werte.
1
t = eeprom_read_byte(&eeFooByteArray1[r][i]);
2
eeFooByteArray2 [r][i] = t;

Verstehen kann ich dies nicht, eventuell hat es etwas mit der Funktion 
zu tun.

Gruß

Thomas

von Thomas S. (thomass)


Lesenswert?

@Fred,

ja die eep Datei wird erzeugt da aber die Werte nie stimmten dachte ich 
das die eep Datei nicht richtig erzeugt wird jedoch lag es am auslesen 
siehe OBEN.

Thanks


Thomas

von Fred S. (Gast)


Lesenswert?

Versuch's doch mal mit

eeprom_read_block(
 (void *)&eeFooByteArray2, (const void *)&eeFooByteArray1, 25 );

Gruß

Fred

von Niels H. (monarch35)


Lesenswert?

Thomas S. wrote:

>
1
> t = eeprom_read_byte(&eeFooByteArray1[r][i]);
2
> eeFooByteArray2 [r][i] = t;
3
>

Das holen von Adressen eines einzelnen Elementes aus einem 
Zweidimensionalen Array ist ätzend. Die Pointer-Arythmetik, die sich 
dahinter verbirgt habe auch ich nie verstanden, jedenfalls hab ich sie 
auch nie sauber zum funktionieren gebracht, wenn man es, so wie du es 
gemacht hast, logisch ausschreibt.

 Ich habe allerdings positive erfahrungen mit einfachen Adresszählern 
gemacht:
1
uint8_t idx=0;
2
for (x=0;x<5;x++)
3
{
4
    for (y=0;y<5;y++)
5
    {
6
        t=eeprom_read_byte((&eeFooByteArray1)+idx);
7
        idx++;
8
    }
9
}

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.