www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik avrgcc AtMega128 Bootloader Section


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: marco (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo zusammen,
ich habe ein kleines Problem mit meinem Bootloader auf dem Mega128. Der 
Code funktioniert auf Mega32 und Mega64 einwandfrei, nur auf dem Mega128 
wills nicht hinhauen. Schreibe ich ihn direkt an den Anfang vom Flash 
tuts soweit (natürlich kann er sich nicht selbst überschreiben), wenn 
ich ihn dann in den Bootloader-Bereich schreibe funktioniert gar nichts 
:((

Ich habe dem avr-gcc linker mit --section-start=.text=1E000 gesagt, der 
soll den Code bei der Bootloader-Section schreiben (4096 Word 
Bootloader, erstmal so zum testen).
Allerdings scheint in der HEX-Datei der Code nicht auf der richtigen 
Adresse zu landen:

:020000021000EC
:10E000000C9452F00C9471F00C9471F00C9471F02B
:10E010000C9471F00C9471F00C9471F00C9471F0FC
:10E020000C9471F00C9471F00C9471F00C9471F0EC
:10E030000C9471F00C9471F00C9471F00C9471F0DC
:10E040000C9471F00C9471F00C9471F00C9471F0CC
:10E050000C9471F00C9471F00C9471F00C9471F0BC...

Wenn ich das richtig deute startet das bei Adresse E0000 (also noch in 
den unteren 64kB ??) .. nanu??

Weis da jemand eine Lösung zu?

Hier scheint ein ähnliches Problem vorliegen: 
Beitrag "WinAvr 2010 Bootloader Atmega128 Problem"
Allerdings werd ich da nicht wirklich schlau raus, wo soll ich da denn 
was umstellen?
Ich benutze Eclipse mit WinAvr2010, die Fuses BOOTSZ0, BOOTSZ1 und 
BOOTRST sind gesetzt.

Schöne Grüße aus Aachen

Marco

Autor: Krapao (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
> Wenn ich das richtig deute startet das bei Adresse E0000 (also noch in
> den unteren 64kB ??) .. nanu??

Nö, deutest du falsch.
Beitrag "Re: Peter Danneggers Bootloader (fastboot) für AVR-GCC-Toolchain"

Autor: marco (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Jup, hast recht, daran liegt es also nicht:
avr-objdump -h CAN-Bootloader-Life.hex

CAN-Bootloader-Life.hex:     file format ihex

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .sec1         00000808  0001e000  0001e000  00000011  2**0
                  CONTENTS, ALLOC, LOAD

Damit komme ich aber dann auch nicht weiter. Der Code wird zwar 
irgentwie begonnen, aber das ganze CAN-System funktioniert einfach 
nicht. Wie gesagt, wenn ich das Offset raus nehme klappt alles. Da bin 
ich mit meinem Latein am Ende...

Marco

Autor: Stefan Ernst (sternst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
marco schrieb:
> Ich habe dem avr-gcc linker mit --section-start=.text=1E000 gesagt, der
> soll den Code bei der Bootloader-Section schreiben (4096 Word
> Bootloader, erstmal so zum testen).

Und wie soll die Adresse 1E000 zu "4096 Word Bootloader" passen?

Autor: marco (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Datenblatt Table 112: Boot Reset Address (start Boot Loader Section): 
$F000

Die Adressen sind alle in Words angeben, mal zwei macht das also 
0x1E000. Das Offset scheint zu passen.

Autor: Stefan Ernst (sternst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ups, äußerst peinlicher Denkfehler meinerseits (0x10000 = 16k, wie 
konnte das denn passieren). ;-)

M103C wirklich deaktiviert?
Werden Interrupts verwendet?

Autor: marco (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo Stefan,

ja M103 ist definitiv deaktiviert, keine Interruptroutinen. Um die 
Verwirrung komplett zu machen, hier das Resultat eines kleinen 
Experiments:
Ich hab die Hex vom Bootloader hinter die Hex vom Nutzerprogramm kopiert 
(den ersten End-Of-Record Eintrag entsprechend gelöscht) und dann 
geflashed.
Die Boot-LED war ganz brav eine halbe Sekunde lang an, dann ist das 
Nutzerprogramm gestartet worden. Allerdings ist keine CAN-Nachricht 
gekommen - und das obwohl das Programm folgendermaßen aussieht:
int main(void){
  set_bootled_ddr;
  // CAN-Adapter initialisieren
  while(!can_init(BITRATE_1_MBPS)){

  }
  // Timer starten
  TCNT1 = TIMER_PRELOAD;
  TCCR1A = 0;
  TCCR1B = TIMER_PRESCALER;
  TIMER_INTERRUPT_FLAG_REGISTER = (1 << TOV1);
  //### Test-Nachricht versenden ###
  msg.flags.rtr = 0;
  msg.id = 111;
  msg.length = 0;
  while(can_send_message(&msg)==0){

  }
  led_on;

Es wird also so lange in der Schleife gewartet, bis der Adapter 
initialisiert wurde und die Nachricht (angeblich) erfolgreich verschickt 
wird. Erst DANACH geht die LED an. Tja, die Nachricht kommt halt 
trotzdem nie.
Das Nutzerprogramm benutzt die gleich CAN-Lib (die von Creatives-Chaos) 
und da funktionierts einwandfrei. Und wenn ich nun nur den Bootloader 
ohne den Adress-Offset kompiliere und flashe dann wird auch die 
Nachricht ordnungsgemäß abgeschickt.

Nun bin ich absolut ratlos...

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net