mikrocontroller.net

Forum: Compiler & IDEs section (".eeprom") für externes EEPROM nutzen


Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Umgebung:
WinAVR
Mega128

ist es problemlos möglich Variablen die in der eeprom section angelegt 
sind in einem externen EEPROM abzulegen? Die entsprechenden Funktionen 
zum Beschreiben und Lesen aus dem externen EEPROM sind natürlich 
vorhanden. Mir mach nur der Offset von 0x81000000 ein klein wenig 
Sorgen. Werden die oberen 16 Bit der Adresse vom Linker verworfen?

Hintergrund:
Ich hab zwei Hardwareversionen. Auf der neueren befindet sich ein 
externes EEPROM das anstatt des internen verwendet werden 
(Schreibzyklen, Schreibgeschwindigkeit) soll wobei die identische 
Software zum Einsatz kommen soll. Meine Idee war jetzt für die 
EEPROM-Funktionen Funktionspointer zu verwenden die je nach 
Hardwareversion auf Funktionen zeigen die entweder das interne oder das 
externe EEPROM verwenden.

Schön wäre eben wenn ich dazu die vom Linker vergebenen EEPROM Adressen 
weiterverwenden könnte. Alles andere würde eine größere Umstellung nach 
sich ziehen.

Matthias

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ist es problemlos möglich Variablen die in der eeprom section angelegt
>sind in einem externen EEPROM abzulegen?

Ja klar geht das. Per ISP werden die Daten in das interne
EEPROM abgelegt. Das kopierst du komplett mit eigener Software in
das externe EEPROM. Dann schreibst du deine Software so um
das das externe EEPROM verwendet wird. Ist doch ganz einfach.

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

per ISP wird garnichts kopiert. Das EEPROM wird von der Software beim 
ersten Start initialisiert und kann dann über ein Konfigurationsprogramm 
vom PC aus verändert werden bzw. es werden diverse Zähler 
hineingeschrieben. Ich wollte nur sicher gehen das der Offset keine 
Probleme bereitet bzw. ich irgendwelche Aktionen in meinen EEPROM 
Routinen durchführen muss die von den avrlibc Routinen erledigt werden.

Matthias

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich wollte nur sicher gehen das der Offset keine
>Probleme bereitet bzw. ich irgendwelche Aktionen in meinen EEPROM
>Routinen durchführen muss die von den avrlibc Routinen erledigt werden.

Die avrlibc Routinen sind nur für das interne EEPROM
geschrieben. Die erledigen dir gar nichts für ein externes
EEPROM. Woher sollen die auch wissen was du wo angeschlossen hast ?
I2C EEPROM am TWI, oder SPI EEPROM an SPI, Dataflash an SPI.
Nö, tut avrlibc nicht. Musst du alles selber erledigen.

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

Bewertung
0 lesenswert
nicht lesenswert
Ja, du kannst das problemlos austauschen.  Alles, was die section
.eeprom für dich erledigt ist die Zuweisung des Speichers und das
Platzieren der Initialwerte (üblicherweise dann in einer ihex-Datei
rausgezogen).  Da der Compiler selbst keinerlei Zugriffe auf den
EEPROM einbaut, liegt es rein an dir, wie du dann den Datentransport
selbst organisierst.

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

genau das wollte ich wissen. Danke Jörg.

@Holger
Es geht mir rein um die Organisation der Variablen die ich nicht selber 
erledigen will sondern das soll doch bitte schön der Linker für mich 
erledigen. Das ich das externe EEPROM selber ansprechen muss ist mir 
schon klar.

Matthias

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst auch einfach eine neue section mit eigenem Namen für dein 
externes Flash anlegen:

EEMEM aus der <avr/eeprom.h> ist nur ein define für
__attribute__((section(".eeprom")))

ebenso kannst du auch eine section(".dataflash") benutzen.
Im Linkerscript dafür dann eine eigene Startadresse festlegen, sonst 
landets im Ram.

Ein Hexfile für die Section kann dann avr-objcopy mit "-R .dataflash" 
erzeugen.

/Ernst

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

Bewertung
0 lesenswert
nicht lesenswert
Aber er kann natürlich auch gleich .eeprom benutzen, dann hat er's
einfacher. ;-)

Übrigens, Dataflash != EEPROM.  Erstere kann man in der Regel nur
seitenweise beschreiben, EEPROMs dagegen einzelbyteweise.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias Weißer wrote:
> Hi
>
> genau das wollte ich wissen. Danke Jörg.
>
> @Holger
> Es geht mir rein um die Organisation der Variablen die ich nicht selber
> erledigen will sondern das soll doch bitte schön der Linker für mich
> erledigen. Das ich das externe EEPROM selber ansprechen muss ist mir
> schon klar.
>
> Matthias

Dein Linker kann aber deine Programmvariablen trotzdem nicht in das 
externe EEPROM legen. Der kann nur in Speicherbereiche, die sich über 
den internen Speicherbus ansprechen lassen.

Wenn du Variablen aus einem externen, per SPI oder I2C angeschlossenem 
EEPROM nutzen willst, musst du die Variablen erst mal im RAM 
deklarieren, und in deinem Programm dann die RAM-Variablen mit den Daten 
aus dem ext. EEPROM füllen.

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

Bewertung
0 lesenswert
nicht lesenswert
Christian Richter wrote:

> Dein Linker kann aber deine Programmvariablen trotzdem nicht in das
> externe EEPROM legen.

Das kann er aber auch für den internen EEPROM nicht machen, für den
die section .eeprom normalerweise benutzt wird.

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

richtig. Ich will doch einfach nur die gleichen Addressen die für das 
interne EEPROM per section .eeprom bereits vergeben sind auch für das 
externe EEPROM verwenden da eine Software (HEX-File) zum Einsatz kommen 
soll die anhand eines Pins feststellt welche HW-Version vorliegt. 
Abhängig von dieser HW-Version werden dann Funktionspointer entweder auf 
die avrlibc Funktionen für das interne EEPROM oder aber auf die 
Funktionen die mein externes EEPROM über I2C ansprechen initialisiert. 
Mitlerweile funktioniert das Ganze auch genau so wie ich mir das 
vorgestellt hatte. Intialwerte werden vom Programm selbsständig ins 
EEPROM geschreiben wenn eine bestimmte Signatur/Prüfsumme nicht mit der 
vom Programm erwarteten übereinstimmt.

Matthias

Autor: willy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

doofe Frage:

Wie funktioniert das?
Wenn ich eine Variable mit EEMEM für die section .eeprom verwende, 
entspricht das doch einer Adresse im internen EEPROM. Funktioniert das 
über einen Offset, d.h. dass die erste für den EEPROM deklarierte 
Variable z.B.  Adresse 0x00 bekommt, und daher das Symbol für die 
Variable auch mit dem externen EEPROM verwendet werden kann?

In meinem Fall habe ich nämlich ein zusätzliches, externes I2C EEPROM, 
dass unabhängig von dem internen verwendet werden soll und ich weiss 
nicht, welche Startadresse die neue section erhalten soll/kann.

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.