mikrocontroller.net

Forum: Compiler & IDEs interne EEPROM Daten mit ICCAVR erzeugen


Autor: Oerni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oerni (Gast)
Datum:

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

Tschau Oerni

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oerni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

Diese Methode wird auch mit dem ICCAVR funktionieren.

Viel Spass, Stefan

Autor: Oerni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Nein, wieso?

Autor: Oerni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Oerni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.