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


von Ronny Schulz (Gast)


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.

von Ronny Schulz (Gast)


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.

von Rolf Magnus (Gast)


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-Tutorial#EEPROM
beschrieben.

von Ronny Schulz (Gast)


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.

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.