mikrocontroller.net

Forum: Compiler & IDEs Problem mit eeprom_write_byte


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits,

ich bin leider zu dämlich die eeprom_write_byte Funktion erfolgreich
anzuwenden!! Folgendes funktioniert tadellos:

eeprom_write_byte((unsigned char *)0x07, 'K');  //im EEporm
abpeichern

wenn ich jetzt aber statt der Speicherstelle 0x07 die Variable
laufindex zum Beispiel nehmen will, bekomme ich eine Warnmeldung und
das Programm funktioniert nicht:

unsigned char laufindex;
eeprom_write_byte((unsigned char *)laufindex, 'K');

Die Warnmeldung lautet "cast to pointer from integer of different
size"
Was soll ich jetzt machen?? Meine Versuche die Warnmeldung wegzubringen
sind an Errormeldungen gescheitert... - hab' leider recht wenig Ahnung
von C :-((

Vielen Dank!!
Christian

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

mit den EEPROM Routinen aus der AVRLibc hatte ich auch meine liebe
Mühe. Kurzentschlossen hab ich dann was eigenes geschrieben:

/**
  Schreibt ein Byte an adr ins EEPROM
*/
void eeprom_write_byte(unsigned int adr, unsigned char dat)
{
  while(EECR & 0x01);
  EEARH = (adr>>8)&0xFF;
  EEARL = adr&0xFF;
  EEDR = dat;
  EECR = BIT2_POS;
  EECR = BIT1_POS;
}

/**
  Ließt ein Byte an adr aus dem EEPROM
*/
unsigned char eeprom_read_byte(unsigned int adr)
{
  while(EECR & 0x01);
  EEARH = (adr>>8)&0xFF;
  EEARL = adr&0xFF;
  EECR = BIT0_POS;
  return EEDR;
}

Sollte für jeden AVR mit 512Byte und mehr EEPROM funktionieren.

Matthias

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> mit den EEPROM Routinen aus der AVRLibc hatte ich auch meine liebe
> Mühe.

Aber nicht, weil sie nicht funktionieren würden, sondern lediglich,
weil Du sie offenbar nicht verstanden hast.

Die in der avr-libc benutzen halt als ersten Parameter das, um was es
sich logisch handelt: eine Adresse, also ein Zeiger, und da die
Funktion ein Byte schreibt ist es ein `char *'.  (Die irrtümliche
Annahme vieler ist dann, daß diese nur 8 bit breit wäre, aber Zeiger
sind im avr-gcc immer 16 bit breit, auch dann, wenn sie auf
8-bit-Objekte zeigen.)

Wenn Du die Adresse in einer Integer-Variablen hochzählen willst,
kannst Du entweder eine Krücke wie Deine schreiben, oder Du kannst die
Funktion der avr-libc benutzen und den ersten Parameter auf (unsigned
char *) casten, oder Du nimmst einfach das, was man in C dafür tun
sollte: eine Laufvariable vom passenden Zeigertyp.

Witzigerweise hat Christian den typecast bei seiner festen Adresse
(0x07) ordentlich angebracht, während er ihn offenbar bei der
Laufvariablen ,,vergessen'' hat.  (Ansonsten dürfte die Warnung in
diesem Falle nur auf einen Schönheitsfehler hinweisen, nicht auf einen
funktionalen.)

> hab' leider recht wenig Ahnung von C :-((

Das ist die absolut ungünstigste Voraussetzung für eine erfolgreiche
Programmierung.  Sein Handwerkszeug sollte man schon verstehen.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Aber nicht, weil sie nicht funktionieren würden, sondern lediglich,
>weil Du sie offenbar nicht verstanden hast.

Genau :-)
Der Compiler hat mir einen Fehler um die Ohren geworfen den ich nicht
näher untersucht habe. Die eigene Routine war da schneller
geschrieben.

Matthias

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.