Hallo, ich schreibe gerade an einem Bootloader für einen mega128. Ich verwende den aktuellen avr-gcc (avr-libc 1.4.3). Leider hab ich ein kleines Problem: Wenn ich eine Page mit boot_page_write(addr) schreibe und addr = 0 ist landet diese nicht am Anfang des Speichers sondern genau bei 64k. Mit boot_page_erase(addr) verhält es sich genauso. Laut mega128 Datenblatt wählt man den gewünschten Speicherbereich mit Hilfe des RAMPZ-Registers. Aber das sollte doch eigentlich der avr-gcc alles von alleine machen, nich umsonst übergibt man ja den Funktionen als Adresse einen 32-Bit Wert. Was mache ich also falsch? mfg DerMax
ähhh ich bin ja der letzte der irgendwo schreit ah da is nen Bug im Compiler und nich in meinem Code, aber ich hab gerade mal den alten avr-gcc (avr-libc 1.2.3) ausprobiert und der tut so wie er soll...
Der Bootloader-support ist ja rein in den boot.h header files, hast Du die mal verglichen zw. den Versionen? /Ernst
@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.
War ein Bug: https://savannah.nongnu.org/bugs/?func=detailitem&item_id=15559 Eigentlich ist das conditional für __USING_MINT8 mittlerweile komplett überflüssig, ich werde das gleich mal rauswerfen.
>> @Andreas Schwarz: >> >> Vielleicht könntest Du mal nachforschen, warum beim ATmega128 >> "__USING_MINT8" == FALSE gesetzt ist. Sorry, sollte nicht an Andreas Schwarz, sondern natürlich an Dich (Jörg) adressiert sein ;) Cool... dann hab ich ja wenigstens die richtige Fehlerquelle gefunden selbstlob *ggg* Schönen Abend noch wink /* Magnetus */
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.