@DerMax:
Ich hatte letztens (fast) das selbe Problem.
Mikrocontroller : ATmega128
Compiler : WinAVR 20060125
Ich wollte die boot.h ausprobieren, indem ich den Speicherbereich von
0x2000 bis 0xEFFF (Wort-Adresse) vom Bootloader (0xF000) aus
beschreiben liess. Dabei stellte sich heraus, dass der Bootloader nur
von 0x2000 bis 0x7FFF schrieb und dann bei 0x0000 weiter machte.
Erst hatte ich mein Programm verdächtigt... aber nach längerem Suchen
kam ich darauf, dass der Fehler wohl in WinAVR liegen muss.
Ein kurzer(?) Auszug aus "boot.h":
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* Normal versions of the macros use 16-bit addresses.
Extended versions of the macros use 32-bit addresses.
Alternate versions of the macros use 16-bit addresses and require
special
instruction sequences after LPM.
FLASHEND is defined in the ioXXXX.h file.
USHRT_MAX is defined in <limits.h>. */
#if defined(_AVR_ATmega161_) || defined(_AVR_ATmega163_) \
|| defined(_AVR_ATmega323_)
/* Alternate: ATmega161/163/323 and 16 bit address */
#define boot_page_fill(address, data)
__boot_page_fill_alternate(address, data)
#define boot_page_erase(address)
__boot_page_erase_alternate(address)
#define boot_page_write(address)
__boot_page_write_alternate(address)
#define boot_rww_enable() __boot_rww_enable_alternate()
#define boot_lock_bits_set(lock_bits)
__boot_lock_bits_set_alternate(lock_bits)
#elif ((FLASHEND > USHRT_MAX) && (__USING_MINT8))
/* Extended: >16 bit address */
#define boot_page_fill(address, data)
__boot_page_fill_extended(address, data)
#define boot_page_erase(address)
__boot_page_erase_extended(address)
#define boot_page_write(address)
__boot_page_write_extended(address)
#define boot_rww_enable() __boot_rww_enable()
#define boot_lock_bits_set(lock_bits) __boot_lock_bits_set(lock_bits)
#else
/* Normal: 16 bit address */
#define boot_page_fill(address, data) __boot_page_fill_normal(address,
data)
#define boot_page_erase(address)
__boot_page_erase_normal(address)
#define boot_page_write(address)
__boot_page_write_normal(address)
#define boot_rww_enable() __boot_rww_enable()
#define boot_lock_bits_set(lock_bits) __boot_lock_bits_set(lock_bits)
#endif
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Das Problem liegt darin, dass "boot.h" für den ATmega128 eigentlich
die "Extended: >16 bit address" (32 Bit) verwenden sollte, statt
dessen aber nur die "Normal: 16 bit address" nutzt.
Dies kommt daher, weil die Abfrage
#elif ((FLASHEND > USHRT_MAX) && (__USING_MINT8))
fehlschlägt, weil "__USING_MINT8" == FALSE ist. Ich war dann einfach
so frech, und habe diese Abfrage bei mir eigenmächtig ergänzt (Sorry
Andreas). In meiner "boot.h" steht nun also:
#elif ((FLASHEND > USHRT_MAX) && (__USING_MINT8)) ||
defined(_AVR_ATmega128_)
Damit habe ich zwar die eigentliche Fehlerursache nicht beseitigt, aber
in meinem Fall kann ich jetzt wenigstens den kompletten Adressbereich
flashen.
@Andreas Schwarz:
Vielleicht könntest Du mal nachforschen, warum beim ATmega128
"__USING_MINT8" == FALSE gesetzt ist.