Parameter in uC-EEPROM schreiben

OP #2654632
Lesenswert?

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!
Gast #2654676
Lesenswert?

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.
OP #2654679
Lesenswert?

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.
Gast #2654694
Lesenswert?

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.
Gast #2654703
Lesenswert?

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.
#2654767
Lesenswert?

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
OP #2655360
Lesenswert?

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 ... .
Gast #2655366
Lesenswert?

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
Gast #2655368
Lesenswert?

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.
OP #2655494
Lesenswert?

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.
#2656233
Lesenswert?

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
Gast #2656420
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren