Forum: Compiler & IDEs interne EEPROM Daten mit ICCAVR erzeugen


von Oerni (Gast)


Lesenswert?

Hallo,
ich erzeuge mit dem ICCAVR direkt im C-File EEPROM Daten. Also mit

#pragma data:eeprom
char table[] = { 0, 1, 2, 3, 4, 5 };
#pragma data:data

so dass beim compilieren eine *.eep Datei entsteht.
Jetzt suche ich eine Möglichkeit der geziehlten Adressbelegung. Z.B.
will ich direkt auf die EEPROM Adresse 0x100 einen Wert schreiben und
als nächstes auf die 0x200.
Kennt da jemand eine Möglichkeit in C? Z.B. ".org 0x100" oder so
ähnlich.
Tschau Oerni

von Oerni (Gast)


Lesenswert?

Hat denn noch niemand was beim Compilieren im internen EEPROM abgelegt
was nicht grad bei Adresse 0 anfing?

Tschau Oerni

von Stefan K. (_sk_)


Lesenswert?

>Hat denn noch niemand was beim Compilieren im internen EEPROM
>abgelegt was nicht grad bei Adresse 0 anfing?

Klar. Aber nur mit dem gcc.

bdw:
Warum postest Du eine ICCAVR-spezifische Frage im gcc-Forum?

Gruß, Stefan

von Oerni (Gast)


Lesenswert?

Hallo,
wo sonst???
Im GCC Forum deshalb, weil ich dachte, dass es auch ein etwas
allgemeingültiges C- Forum ist.
Wo anders hätte es auch schlecht reingepasst.
Dann sag mir doch bitte die Lösung unter dem GCC. Vielleicht kann
daraus ja was ableiten.
Die einzige Lösung, die ich beim Suchen hier gefunden habe war: den
ganzen EEPROM Speicher als Array zu initialisieren. Das kann aber nicht
die Lösung sein.

Tschau Oerni

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Im GCC Forum deshalb, weil ich dachte, dass es auch ein etwas
> allgemeingültiges C- Forum ist.

Solange es sich um allgemeingültiges C handelt, funktioniert das
einigermaßen, ja.  Wenn du aber komplett in den compilerspezifischen
Bereich abrutschst (wie in diesem Falle), dann lesen in diesem
Forum einfach mal nicht die richtige Leute mit.  Leute, die andere
Compiler als GCC benutzen, werden vermutlich nicht sehr viel Grund
haben, hier mitzulesen.

> Dann sag mir doch bitte die Lösung unter dem GCC. Vielleicht kann
> daraus ja was ableiten.

Ich würde einfach eine numerische Adresse in den entsprechenden
eeprom_read_byte() etc. Funktionen benutzen, sinnvollerweise wohl
durch ein #define erzeugt.

Alternativ (wenn man unbedingt will) kann man mehrere EEPROM
sections anlegen, aber das könnte schon haarig werden.

von Stefan K. (_sk_)


Lesenswert?

> dass es auch ein etwas allgemeingültiges C- Forum ist.

Ein ICCAVR-spezifisches Problem ist aber kein allgemeingültige Problem,
oder verwechsel ich da was?

Im gcc lege ich mir Sectionen an, in die ich die Variablen packe. Aber
das wird Dir nichts nützen , weil es sehr gcc-spezifisch ist:

uint8_t
  meine_variable[] _attribute_ ((section (".SPEZIAL_SECTION"))) =
  {0, 1, 2, 3, 4};

(Eigene Sectionen lassen sich auch an eine feste Adresse legen).

Entweder Du beschäftigst Dich mit der entsprechenden ICCAVR-Doku, (wenn
der ICCAVR das denn kann), oder Du übernimmst für das EEPROM die
Speicherverwaltung "zu Fuss": D.h. Du legst für jede Variable die
Adresse fest, wie es hier im AVR-gcc-Tutorial beschrieben ist:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM-Variable_auf_feste_Adressen_legen

Diese Methode wird auch mit dem ICCAVR funktionieren.

Viel Spass, Stefan

von Oerni (Gast)


Lesenswert?

@Jörg
jede EEPROM Variable mit #define festzulegen würde aber wieder
bedeuten, die Variablen nacheinander ohne Lücken abzulegen. Ich möchte
aber nicht hunderte Variablen definieren, wenn ich im fertigen Programm
nur 20 brauche, aber eben über den Speicher verteilt. Ob diese
Speicherung jetzt sinnvoll ist oder nicht, will ich nicht weiter
diskutieren. Ich brauche halt Standartwerte und Lücken für dynamische
Erweiterungen.

@Stefan
die Lösung mit den Sectionen ist mir unter GCC zwischenzeitlich auch
bekannt. Das rutscht dann noch weiter in die Innereien des Prozessors.
Muss ich also doch in Assembler weitermachen, dort geht das scheinbar
auch mit dem ICCAVR.

Tschau Oerni

P.S.: Über den Punkt mit dem "Viel Spass" bin ich schon lange drüber.
Ist leider für die Arbeit.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> jede EEPROM Variable mit #define festzulegen würde aber wieder
> bedeuten, die Variablen nacheinander ohne Lücken abzulegen.

Nein, wieso?

von Oerni (Gast)


Lesenswert?

@Jörg
Mir geht es ja nicht um das EEPROM lesen mit eeprom_read_byte() welches
du mit numerischen Werten benutzen möchtest, sondern um das Anlegen von
EEPROM Werten während des Compilierens. Hierzu kann man das Tutorial
verwenden (Array über den benutzten Bereich. Was wiederum nur als
Workarround angegeben ist, da es den Nachteil hat, nicht verwendete
Speicherzellen mit Dummy Variablen zu belegen.

So wie das dort beschrieben ist, sollen die Adressen fortlaufend
benutzt werden. Meiner Meinung nach würde das nämlich sonst auch nicht
funktionieren. Würde mich mal interessieren, ob das schon mal einer
getestet hat. Den GCC hab ich nicht mehr auf dem Rechner.

Als einzige elegante, aber auch kompliziertere, Möglichkeit bleibt also
nur die direkte Belegung bestimmter Speicherbereiche durch Sektionen wie
von Jörg vorgeschlagen. Hierzu muß ich aber erstmal die ICCAVR
Dokumentation tiefer lesen. Zu solchen speziellen Fragen findet man
eben nicht viele Antworten.

Danke erstmal für die rege Diskussion.
Tschau Oerni

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Mir geht es ja nicht um das EEPROM lesen mit eeprom_read_byte()
> welches du mit numerischen Werten benutzen möchtest, sondern
> um das Anlegen von EEPROM Werten während des Compilierens.

Ach so, auf diese Idee bin ich gar nicht gekommen.

Das muss doch keineswegs dem Compiler überlassen bleiben.  Es
gibt eine Vielzahl von Möglichkeiten, wie man zu dieser Hexdatei
gelangen kann, die dann zum Initialisieren des EEPROM benutzt
wird.  Ich würde mir dafür irgendeinen Script schreiben
(vermutlich in Perl, weil ich das am besten kann).

von Oerni (Gast)


Lesenswert?

Hallo Jörg,
eine Hex Datei erzeuge ich normalerweise mit Delphi mit ner schönen
Bedienoberfläche für alle Werte. Da es sich hierbei aber um
Standartwerte handelt soll der "Produktionsprozess" so einfach wie
möglich gehalten werden. Ich will halt für diesen Fall nicht wieder
extra nen zusätzliches PC Programm schreiben, wo dann jeder ändern kann
wie er will. Das soll im Sourcecode bleiben, da traut sich wenigstens
keiner ran, wenn ich mal im Urlaub sein sollte.
Ich werd mich heut mal schlauer machen.

Tschau oerni

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.