Forum: Mikrocontroller und Digitale Elektronik Parameter in uC-EEPROM schreiben


von Spiffman G. (spiffman)


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!

von Jojo S. (Gast)


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.

von Spiffman G. (spiffman)


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.

von Jojo S. (Gast)


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.

von Jojo S. (Gast)


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.

von Frank K. (fchk)


Lesenswert?

Spiffman G. schrieb:

> Woher weiß ich, an welcher Adresse welcher Wert abgelegt wird?

Steht im MAP-File, das der Compiler auf Wunsch erzeugt.

fchk

von Michael M. (technikus)


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

von spess53 (Gast)


Lesenswert?

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

von Spiffman G. (spiffman)


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

von spess53 (Gast)


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

von STK500-Besitzer (Gast)


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.

von Spiffman G. (spiffman)


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.

von Michael M. (technikus)


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

von Jojo S. (Gast)


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

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.