mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik simpler Zugriff auf EEPROM (ATMEGA) gibt immer 0xFFFF zurüc


Autor: Ronny Schulz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie ist das nicht mehr schön. Jede neue Funktionalität, die ich
verwenden will bricht mir immer wieder die Knie. Dabei ist das laut
Beschreibung garnicht so schwer zu verstehen. Ich verstehe deshalb
nicht, warum diese Funktion immer 0xFF ausliest:

#define CONFIG_START_FAN    0
#define CONFIG_SIZE_FAN      1 + FAN_PWM_FAN_NUMS * 2

#define CONFIG_READY      0xAA55

void config_setword(uint16_t address, unsigned short value)
{
  eeprom_busy_wait();
  eeprom_write_word(&address, value);
  return;
}

unsigned short config_getword(uint16_t address)
{
  unsigned short value;

  eeprom_busy_wait();
  value = eeprom_read_word(&address);
  return(value);
}

Und nun der Aufruf:

char conv_buf[10];

config_setword(CONFIG_START_FAN, CONFIG_READY);
uart1_puts("\r\nCFG: ");
itoa(config_getword(CONFIG_START_FAN), conv_buf, 16);
uart1_puts(conv_buf);
uart1_puts("\r\n");

Sollte zumindest in Hex auch die 0xAA55 ausgeben und nicht 0xFFFF.

Wo könnte der Fehler liegen? Evtl. an der Adresse? Laut Datenblatt ist
der EEPROM-Address-Space von 0 - 4096. Also müsste es doch so gehen.

Autor: Ronny Schulz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe noch ein bisschen recherchiert und ein paar Sachen
rausgefunden. Also um auf sas EEPROM zuzugreifen, muss ich das hier
verwenden:

_attribute_ ((section (".eeprom")))

Allerdings weiß ich nicht wieso und wie ich das nun so verwenden kann,
dass ich meine Adressen beliebig schreiben kann. Ich brauche ja nur den
Startpointer zum EEPROM. Den Rest will ich dann manuell suchen. Also:

uint16_t config_address _attribute_ ((section (".eeprom"))) = 0;

Wenn ich jetzt mittels:

eeprom_write_word(&config_address, value);

meinen Wert einschreibe geht das. Aber wie komme ich an die nächste
Adresse? Und vor allem, wie kann ich die Adresse auch an einer Funktion
übergeben. Das geht nämlich auch nicht.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> void config_setword(uint16_t address, unsigned short value)
> {
>  eeprom_busy_wait();
>  eeprom_write_word(&address, value);
>  return;
> }

Warum nimmst du die Adresse von address? Das ist Quatsch. Was du
willst, ist eine Konvertierung in einen Zeiger. Das würde dann eher so
aussehen:

eeprom_write_word((uint16_t*)address, value);

Aber warum so umständlich? Mir scheint es einfacher und
übersichtlicher, das so zu machen wie in
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
beschrieben.

Autor: Ronny Schulz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau das war der Fehler. Vielen Dank! Das es so umständlich aussieht
liegt daran, dass ich verschiedene Konfigurationen speichern möchte und
damit von mehreren Stellen zugreife. Global sollen allerdings die
Speicherbereiche verwaltet werden, die sich aus den einzelnen
Headerfiles errechnen.

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.