@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-Dateihttp://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
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.
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
@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
unsignedchareeFooByteArray1[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
unsignedchareeFooByteArray2[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.
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
@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
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: