Parameter in uC-EEPROM schreiben

OP #2654632
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
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
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
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
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
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
Gast #2654769
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
OP #2655360
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.