www.mikrocontroller.net

Forum: Compiler & IDEs ATmega128 Bootloader Problem


Autor: DerMax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: DerMax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ä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...

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Bootloader-support ist ja rein in den boot.h header files, hast Du
die mal verglichen zw. den Versionen?

/Ernst

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
War ein Bug:

https://savannah.nongnu.org/bugs/?func=detailitem&...

Eigentlich ist das conditional für __USING_MINT8 mittlerweile
komplett überflüssig, ich werde das gleich mal rauswerfen.

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> @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 */

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.