mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik eeprom in winavr benutzen


Autor: Sarah Heimbach (Gast)
Datum:

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

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Sarah Heimbach (Gast)
Datum:

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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was verstehst du daran nicht?

Autor: Sarah Heimbach (Gast)
Datum:

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

Autor: Werner B. (Gast)
Datum:

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

Autor: Sarah Heimbach (Gast)
Datum:

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

Autor: Sarah Heimbach (Gast)
Datum:

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

Autor: Werner B. (Gast)
Datum:

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

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.