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
Hat denn noch niemand was beim Compilieren im internen EEPROM abgelegt was nicht grad bei Adresse 0 anfing? Tschau Oerni
>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
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
> 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.
> 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
@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.
> jede EEPROM Variable mit #define festzulegen würde aber wieder > bedeuten, die Variablen nacheinander ohne Lücken abzulegen. Nein, wieso?
@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
> 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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.