Forum: Compiler & IDEs Problem mit eeprom_write_byte


von Christian (Gast)


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

von Matthias (Gast)


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

von Joerg Wunsch (Gast)


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.

von Matthias (Gast)


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

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.