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
> 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"
Jup, hast recht, daran liegt es also nicht:
1 | avr-objdump -h CAN-Bootloader-Life.hex |
2 | |
3 | CAN-Bootloader-Life.hex: file format ihex |
4 | |
5 | Sections: |
6 | Idx Name Size VMA LMA File off Algn |
7 | 0 .sec1 00000808 0001e000 0001e000 00000011 2**0 |
8 | 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
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?
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.
Ups, äußerst peinlicher Denkfehler meinerseits (0x10000 = 16k, wie konnte das denn passieren). ;-) M103C wirklich deaktiviert? Werden Interrupts verwendet?
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:
1 | int main(void){ |
2 | set_bootled_ddr; |
3 | // CAN-Adapter initialisieren
|
4 | while(!can_init(BITRATE_1_MBPS)){ |
5 | |
6 | }
|
7 | // Timer starten
|
8 | TCNT1 = TIMER_PRELOAD; |
9 | TCCR1A = 0; |
10 | TCCR1B = TIMER_PRESCALER; |
11 | TIMER_INTERRUPT_FLAG_REGISTER = (1 << TOV1); |
12 | //### Test-Nachricht versenden ###
|
13 | msg.flags.rtr = 0; |
14 | msg.id = 111; |
15 | msg.length = 0; |
16 | while(can_send_message(&msg)==0){ |
17 | |
18 | }
|
19 | 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...
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.