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
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
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.