mikrocontroller.net

Forum: Compiler & IDEs im EEPROM speichern: Fehlermeldung


Autor: minastaros (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich versuche, Werte im EEPROM (ATmega8) zu speichern, krieg aber immer
Fehlermeldungen. Folgendes:

const uint16_t iEEPROM_ADR = 2;  // EEPROM-Adresse in der Konstante
eeprom_write_word (iEEPROM_ADR, iWert);

Das funktioniert, der Wert wird brav im EEPROM an Adressen 2 und 3
abgelegt, der Compiler motzt jedoch mit:

warning: passing arg 1 of `eeprom_write_word' makes pointer from
integer without a cast


Im Forum fand ich einige Beispiele, die die Adresse anders
deklarieren:

uint16_t iEEPROM_ADR _attribute_ ((section (".eeprom")));

Jetzt meckert der Compiler nicht mehr, das Programm läuft aber auch
nicht. Außerdem kann ich ja so nicht explizit bestimmen, dass der Wert
an Adresse 2 (oder wie auch immer) abgelegt wird. Was ist falsch?

Erweitertes Beispiel: Ich will mehrere Werte im EEPROM ablegen, sieht
so aus:

uint8_t c;
uint16_t iWert;

for (c = 0 ; c < 16 ; c++) {
  iWert = foo();
  eeprom_write_word ((i * 2), iWert);
}

Gleiches Problem wie oben, es funktioniert, die Werte werden schön
abgelegt, aber der Compiler motzt.

Kann mir das jemand korrigieren?

Ich benutze WINAVR mit dem GCC.

Danke und Gruß, min

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der prototyp der funktion ist
<eeprom.h>
...
extern void eeprom_write_word (uint16_t *addr, uint16_t val);
...
</eeprom.h>

der typ des ersten parameters muss also ein zeiger-typ sein
Am einfachsten über eine typecast

const uint8_t * iEEPROM_ADR = (uint8_t *)2;
eeprom_write_word (iEEPROM_ADR, iWert);

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, wenn der Prototyp aber doch einen Pointer auf uint16_t erwartet,
warum sollte man dann einen uint8_t Poitner verwenden?

Nene! Besser gleich beides richtig machen:
#define EEPROM __attribute__ ((section (".eeprom")))

uint16_t iWert;
uint16_t ee_iWert EEPROM;

  eeprom_write_word(&ee_iWert, iWert);

So ausm Kopf, sollte funktionieren...

Autor: minastaros (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Werner,
danke für den Tip, hat fast geklappt; Patrick hat auch recht mit den
16-Bit-Zeigern, allerdings läuft die Sache mit den attribute nicht
bei mir. Den typecast braucht es auch beim Aufruf der Funktion.
Folgendes geht jetzt einwandfrei, ohne Warnungen vom Compiler:

const uint16_t * iEEPROM_ADR = (uint16_t *) 2;  // an Adr. 2 im EEPROM
eeprom_write_word ((uint16_t *) iEEPROM_ADR, iWert);

klappt auch in der For-Schleife, wobei man c in 1-er-Schritten erhöhen
muss, da automatisch um 2 Byte weitergesprungen wird (praktisch):

eeprom_write_word ((uint16_t *) (iEEPROM_ADR + c), iWert);

und als READ:

iWert = eeprom_read_word ((uint16_t *) iEEPROM_ADR);


Gruß und weiter frohes Coden!  minastaros

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
genau dieses 2byte weiterspringen möchte ich nicht, sondern nur 8-bit
weit. Dieses kann ich erreichen, wenn ich den typ von uint16_t auf
uint8_t abändere. Funktioniert super, aber die Fehlermeldung:
 "warning: passing arg 1 of `eeprom_write_word' from incompatible
pointer type"
ist wieder da, da der compiler ja 16-bit erwartet.
Frage: kann man das nicht irgendwie umgehen?
danke

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
vergesst es bitte, nach dem 3 Bier und 1. Halbzeit GER-POL hab ichs
auch gefunden.....
.-)

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.