Hallo zusammen, ich möchte in das EEPROM meines ATMEGA8 an verschieden Stellen definierte Werte über den ISP schreiben. Diese werden dann von meinem Programm beim hochfahren eingelesen und verarbeitet. Beispiel: Adresse Wert 0x0010 0x30 0x0011 0xF1 ... Wie erstelle ich am besten eine Datei (.eep), die ich dann mit dem AVR-Studio flashen kann? Gibt es hier Tools oder eine andere elegante Möglichkeit? Danke schon mal!
einfach ein Stück C-Code, so etwa:
1 | #include <avr/io.h> |
2 | |
3 | #define EEPROM __attribute__ ((section (".eeprom")))
|
4 | |
5 | int8_t val1 EEPROM = 30; |
6 | int8_t val2 EEPROM = 1; |
7 | int8_t val3[] EEPROM = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; |
8 | int8_t val4[] EEPROM = "Test"; |
9 | |
10 | |
11 | int main(void) |
12 | {
|
13 | while(1) |
14 | {
|
15 | //TODO:: Please write your application code
|
16 | }
|
17 | }
|
Der Compiler erzeugt dir dann eine .eep Datei mit den Konstanten.
Jojo S. schrieb: > einfach ein Stück C-Code, so etwa: > #include <avr/io.h> > > #define EEPROM _attribute_ ((section (".eeprom"))) > > int8_t val1 EEPROM = 30; > int8_t val2 EEPROM = 1; > int8_t val3[] EEPROM = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; > int8_t val4[] EEPROM = "Test"; > > > int main(void) > { > while(1) > { > //TODO:: Please write your application code > } > } > > Der Compiler erzeugt dir dann eine .eep Datei mit den Konstanten. Danke für deine schnelle Anwort. Woher weiß ich, an welcher Adresse welcher Wert abgelegt wird? Ich möchte ja explizit an einer bestimmten Adresse einen bestimmten Wert ablegen.
das könnte man über eine Struktur machen. Wie liegen die Konstanten den vor? Eine andere Variante wäre eine Binärdatei in ein .eep (oder .hex) zu konvertieren: objcopy -I binary -O ihex test.bin test.eep das 'objcopy' liegt im AVR-Toolchain Verzeichnis.
und den guten alten Assembler gibt ja auch noch
1 | /* |
2 | * TestConstASM.asm |
3 | */ |
4 | |
5 | |
6 | .ESEG |
7 | |
8 | .org $0 |
9 | .db 1,2,3,4,5 |
10 | |
11 | .org $11 |
12 | .db 6,7,8,9 |
In den Projekteigenschaften dann das .eep File als Output aktivieren, beim 5er Studio ist das als Default ausgeschaltet.
Spiffman G. schrieb: > Woher weiß ich, an welcher Adresse welcher Wert abgelegt wird? Steht im MAP-File, das der Compiler auf Wunsch erzeugt. fchk
Spiffman G. schrieb: > Woher weiß ich, an welcher Adresse welcher Wert abgelegt wird? > Ich möchte ja explizit an einer bestimmten Adresse einen bestimmten Wert > ablegen. Ganz einfach: Mach eine Array-Variable, die genau so groß wie das ganze EEPROM des Controller ist, z.B. für den Mega8 512 Bytes: int8_t val3[512] EEPROM = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...}; Jetzt kannst Du bequem die Adressen 0x10 und 0x11 als Index anspringen. Lesen aus der Adresse 0x10 sieht dann so aus eeprom_read_byte(&val3[0x10]); Servus Michael
Hi
> Woher weiß ich, an welcher Adresse welcher Wert abgelegt wird?
Wieso willst du das wissen? Die Speicheradressen haben doch Namen mit
denen du auf deine Werte zugreifen kannst.
MfG Spess
Danke erst mal für eure Antworten! spess53 schrieb: > Hi > >> Woher weiß ich, an welcher Adresse welcher Wert abgelegt wird? > > Wieso willst du das wissen? Die Speicheradressen haben doch Namen mit > denen du auf deine Werte zugreifen kannst. > > MfG Spess Weil das EEPROM über ein BUS-System beschrieben/gelesen werden können sollen. Daher macht es keinen Sinn, die Werte über den Namen anzusprechen. Jojo S. schrieb: > das könnte man über eine Struktur machen. Wie liegen die Konstanten den > vor? Eine andere Variante wäre eine Binärdatei in ein .eep (oder .hex) > zu konvertieren: > > objcopy -I binary -O ihex test.bin test.eep > > das 'objcopy' liegt im AVR-Toolchain Verzeichnis. Die Konstanten liegen bis jetzt nur in einem Excel-Sheet vor. Also Adresse und Wert. Somit kann ich sie in jedes beliebige Format "gießen". Gibt es dazu irgendwo ein Tutorial? Wie muss die binärdatei aussehen? Michael M. schrieb: > Ganz einfach: Mach eine Array-Variable, die genau so groß wie das ganze > EEPROM des Controller ist, z.B. für den Mega8 512 Bytes: > int8_t val3[512] EEPROM = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...}; > > Jetzt kannst Du bequem die Adressen 0x10 und 0x11 als Index anspringen. > Lesen aus der Adresse 0x10 sieht dann so aus > eeprom_read_byte(&val3[0x10]); > > Servus > Michael Das mit dem Array scheint mir schon mal logisch zu sein. Aber warum liest du dann nicht direkt über die EEPROM Adresse sondern verwendest die Referenz auf das Array? Nicht, dass da intern noch etwas "gemauschelt" wird und die einzelnen Variablen dann doch wo anders stehen ... .
Hi >Weil das EEPROM über ein BUS-System beschrieben/gelesen werden können >sollen. Daher macht es keinen Sinn, die Werte über den Namen >anzusprechen. >ich möchte in das EEPROM meines ATMEGA8 an verschieden Stellen >definierte Werte über den ISP schreiben. Diese werden dann von meinem >Programm beim hochfahren eingelesen und verarbeitet. Wie passt das zusammen? MfG Spess
Spiffman G. schrieb: > Weil das EEPROM über ein BUS-System beschrieben/gelesen werden können > sollen. Daher macht es keinen Sinn, die Werte über den Namen > anzusprechen. Wie schaffst du es denn, das EEPROM mit einem Bus-System anzusprechen? Gehäuse aufsägen und dann den Chip neu bonden? Du musst doch irgendwie die Informationen vom Bus interpretieren. Da wäre es das einfachste, ein Array mit entsprechenden Indizes anzulegen.
spess53 schrieb: > Hi > >>Weil das EEPROM über ein BUS-System beschrieben/gelesen werden können >>sollen. Daher macht es keinen Sinn, die Werte über den Namen >>anzusprechen. > >>ich möchte in das EEPROM meines ATMEGA8 an verschieden Stellen >>definierte Werte über den ISP schreiben. Diese werden dann von meinem >>Programm beim hochfahren eingelesen und verarbeitet. > > Wie passt das zusammen? > > MfG Spess Hi, ich speichere einen Datensatz im EEPROM. Mein Programm startet dann ganz normal und funktioniert. Soll es jetzt anders funktionieren, dann überschreibe ich die Daten im EEPROM. Ich habe ein Funktion Read/Write by Adress. Diese nimmt Adresse und Wert vom Bus und beschreibt das EEPROM. Ich spreche also nicht das EEPROM direkt an, sondern mein uC macht das. Bin ich fertig löse ich über den Bus den Watchdog aus und mein Controller startet neu. Hier liegt aber eigentlich auch nicht mein Problem. Was ich bis jetzt noch nicht verstanden habe ist, wie ich mit dem AVR-Studio den ersten Datensatz ins EEPROM bekomme.
Spiffman G. schrieb: > Das mit dem Array scheint mir schon mal logisch zu sein. Aber warum > liest du dann nicht direkt über die EEPROM Adresse sondern verwendest Weil ich zu faul bin, mir über Sachen den Kopf zu zerbrechen, die Aufgabe des Compilers und der Library sind. Sich möglichst wenig in hardwarespezifische Interna einzumischen macht Programmcode gewöhnlich nicht nur portabler sondern auch fehlerfreier. > die Referenz auf das Array? Nicht, dass da intern noch etwas > "gemauschelt" wird und die einzelnen Variablen dann doch wo anders > stehen ... . Wenn ich dem Compiler sage, ich will ein Arry aus 8 Bit unsigned integern, dann muß der das entweder umsetzen oder einen Fehler ausspucken. So ist der C Sprachstandard. Servus Michael
Das die Quelle 'C' sein muss hatte spiffman ja nie gefordert, war halt mein Vorschlag weil es um AVRStudio ging. Wenn die Konstanten nix mit dem C-Code zu tun haben würde ich es nicht unbedingt mit C schreiben. Zum Bin-Dateiformat: da gibt es keine Formattierung, das erste Byte der Datei wird an die erste Flashaddresse (=0) geschrieben, das zweite Byte in die nächste usw. Um 512 Byte Flash zu füllen muss die Binärdatei eben alle 512 Byte in Folge definieren. Am einfachsten und flexibelsten finde ich ASM Variante, das lässt sich auch per Script in Excel generieren. Mit .org setzt man die Startadresse und dann folgen die Bytedefinitionen oder .dw, .dd, .dq für word/doubleword/quadword. Nur für floats gibts soweit ich weiss keine defs. Vorteil ist auch noch dass man den Flash teilweise beschreiben kann, also mit .org die Startadresse mehrmals setzen kann und die Lücken dazwischen werden dann auch nicht überschrieben. Und zu guter letzt kann man auch das Hexfile selber generieren, die Intel Hex-records sind gut dokumentiert und für die Konstanten fallen die sehr einfach aus (sieht man ja auch an den erzeugten .eep files).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.