Forum: Mikrocontroller und Digitale Elektronik eeprom in winavr benutzen


von Sarah Heimbach (Gast)


Lesenswert?

Hallo,

ich bin gerade dabei ein in codevision geschriebenes Programm in winavr
umzusetzen. Ich benötige in meinem Programm den eeprom. Er ist mit 241
Integer-Werten beschrieben, einem Array. In codevision ist das ganz
einfach:

eeprom unsigned int sinarray[241]={ 0, 305, 610, 916, 1221, 1527, 1832,
2137, 2442, 2748, 3053, 3358, ......}

und schon sind alle Werte im eeprom.

Wie muss ich das jetzt in Winavr schreiben? Die Hilfe ist sehr komplex.
Habe es leider noch nicht geschafft.

Vielen Dank
Sarah Heimbach

Wie setze ich das jetzt in

von Werner B. (Gast)


Lesenswert?


von Sarah Heimbach (Gast)


Lesenswert?

danke für den Tipp, leider verstehe ich es nicht genau. Deswegen habe
ich ja ins Forum geschrieben!

von Rahul (Gast)


Lesenswert?

Was verstehst du daran nicht?

von Sarah Heimbach (Gast)


Lesenswert?

1) "uint16_t" ist wohl das selbe wie "unsigned int": kann ich da
auch unsigend int nehmen?

2) eeFooWordArray1[4]: was genau bedeutet das? habe ich damit einen
array mit 4 Einträgen?

3) was genau ist EEMEM???

4) Ich würde gerne weiterhin meinen Arraynamen sinarray behalten. Was
muss ich dafür ändern?

5) In codevision kann ich auf die Werte im eeprom über sinarray[c]
zugreifen, in dem c der Index des Feldelements darstellt. Der Wert c
wird in meinem Programm berechnet und ich muss dann immer genau diesen
Wert aus dem eeprom auslesen, um ihn weiter zu bearbeiten. Wie muss ich
das jetzt hier machen?


Danke Sarah

P.S. Sorry, ist das erste Mal, dass ich mit winavr arbeite. Die
Codevision Demo reicht nur leider nicht aus.

von Werner B. (Gast)


Lesenswert?

Um ganz weit auszuholen und über einen (hoffentlich Interessanten) Umweg
ans Ziel zu kommen...

Die AVR CPU/MCU's basieren auf der Harvard Architektur. Im Gegensatz
dazu haben die "normalen" PC-CPUs eine Von Neumann Architektur.

Von Neumann Architektur:
 Programm(e) und Daten teilen sich einen Adressraum.
 D.h. Wenn auf Adresse 4712 Programmcode steht, kann man dort keine
 Daten ablegen (ohne das Programm an dieser Stelle zu zerstören).

Harvard Architektur:
 Programm(e) und Daten (und eEprom) besitzen jeder für sich einen
eigenen Adressraum.
 D.h. Die Adresse 4712 im Programmspeicher ist eine völlig andere als
die Adresse 4712 im Datenspeicher und wiederum eine andere als 4712 im
eEprom Bereich.
Für die Zugriffe auf die verschieden Adressräume werden verschieden
Maschinenbefehle verwendet.

Da "C" aus der Welt der Von Neumann Architektur stammt, kennt "C"
keine Notation für die unterschiedlichen Adressräume. Unter AVR-GCC
werden die normalen "C" Zeigeroperationen immer in einen Zugriff auf
das RAM übersetzt. Für den Zugriff auf die aderen Addressräume
existieren spezielle Funktionen (inline Assembler-Macros).

Um dem Compiler mitzuteilen, dass er die Daten gefälligst im
Programmspiecher bzw. eEprom abzulegen hat und nicht im RAM, existieren
die "Konstrukte" mit
_attribute_ ((section (".xxx")))


Zugriff auf Byte 4712 im RAM:   char c = *((char *)4712);
Zugriff auf Byte 4712 im Flash: char c = pgm_read_byte(4712);
Zugriff auf Byte 4712 im eEprom: char c = eeprom_read_byte(4712);

Der CV Compiler kaschiert diese Unterschiede intern und führt
(offensichtlich) für jeden Zeiger die Information über dessen
zugehörigen Adressraum (auch zur Laufzeit?) mit. Darum ist es möglich
ganz normale "C" Speicherzugriffe zu verwenden.

unsigned int sinarray[241] _attribute_ ((section (".eeprom"))) ={
0, 305, 610, 916, 1221, 1527, 1832, 2137, 2442, 2748, 3053, 3358,
......};

Zugriff mit: eeprom_read_word(&sinarray[index]);

Wenn man/frau davon ausgeht dass sich die Werte in sintab nicht
verändern, kann man diese auch im FLASH ablegen.

unsigned int sinarray[241] PROGMEM ={ 0, 305, 610, 916, 1221, 1527,
1832,2137, 2442, 2748, 3053, 3358, ......};

Zugriff mit: pgm_read_word(&sinarray[index]);

P.S. Hinter PROGMEM  verbirgt sich auch nur ein _attribute_ ((section
(".progmem")))


Happy new year.

Werner

von Sarah Heimbach (Gast)


Lesenswert?

Hallo Werner,


vielen Dank! Die Antwort hat mir sehr weitergeholfen. Vor allem die
Erklärung war super!

Danke und ebenfalls ein schönes neues Jahr!!!

Sarah

von Sarah Heimbach (Gast)


Lesenswert?

Sorry, dass ich noch einmal eine Frage stellen muss.

Muss ich immer über "eeprom_read_word(&sinarray[index])" zugreifen
oder geht auch einfach sinarray[c]?

Mein compiler meldet keinen Fehler, aber das sagt ja nicht so viel
aus.

Danke

von Werner B. (Gast)


Lesenswert?

eeprom_read_word erwartet die Adresse der zu lesenden Speicherstelle;
und diese erhält man mit &sinarray[c] oder auch mit (sinarry+c).

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.