Stefan ⛄ F. schrieb:> Ist die Stromversorgung in Ordnung? Mit Abblock-Kondensator?
an der CPU sind Block-Cs. Es ist diese Platine:
Beitrag "Atmega4809nano"
das Flashen des Bootloaders klappte, das Beispiel Blink auch. Das
selbsterstellte Blink-Programm main.hex mit USART mit WINAVR nun
übersetzt, gelinkt will nicht laden. Ein Problem der Toolkette?
Die blink.ino.hex beginnt an Adresse 0x0200.
Die main.hex beginnt hingegen an Adresse 0x0000.
Aus der Datei boards.txt
(https://github.com/MCUdude/MegaCoreX/blob/master/megaavr/boards.txt)
geht hervor, dass das Programm bei Verwendung des Booatloaders an
Adresse 0x0200 beginnen muss:
> 4809.menu.bootloader.uart0_default.build.text_section_start=.text=0x200
Offenbar belegt der Arduino Bootloader den Teil davor. Da du das
Programm mittels Bootloader installierst, hast du wohl keinen
Schreibzugriff auf den Anfang des Flash Speichers, weswegen der
Vergleich fehlschlägt.
Du musst das Programm entweder mit einem ISP Programmieradapter an
Adresse flashen (und den Bootloader deaktivieren), oder du musst deine
IDE so konfigurieren, dass sie den Platz für den Bootloader frei hält,
so dass das Programm wie bei der Arduno IDE erst ab Adresse 0x0200
beginnt.
Jemand anders kennt sich hier vielleicht mit deiner IDE aus und kann
erklären, wo man das einstellt.
Stefan ⛄ F. schrieb:> Die blink.ino.hex beginnt an Adresse 0x0200.> Die main.hex beginnt hingegen an Adresse 0x0000.
Vielen Dank für die Analyse Stefan ! so wird es klarer !
bisher verwendete ich Atmega328p mit Bootloader und WinAVR. Das klappte
ohne daß es zu so einem Problem kam. Zum Programmieren nahm ich auch ein
normales Makefile.
nun hat sich eigentlich nicht viel verändert, nur verwende ich statt
Atmega328 einen Atmega4809 und habe mittels der Arduino-IDE auf diesen
einen Bootloader gebrannt. Die Arduino IDE scheint das wohl zu erkennen
und lädt dann wohl die Blink-Datei an eine passende Adresse.
das Makefile jedoch weiß nicht daß der Bootloader unten den Platz nun
wegnimmt. So scheint es.
ist die Frage wie sich das Problem am besten lösen lässt. Entweder der
Bootloader muss woanders hin oder das Programm dann.
ich bin weder für das Thema Bootloader noch für die IDE oder den
Compiler ein Fachmann. Ich will das eigentlich nur nutzen.
Danke und Gruss
Matthias
Matthias W. schrieb:> bisher verwendete ich Atmega328p mit Bootloader und WinAVR. Das klappte> ohne daß es zu so einem Problem kam.
Ja, weil bei dieser AVR Serie der Bootloader ganz am Ende des Flash
Speichers liegt. Das Programm beginnt dort immer an Adresse 0x0000 egal
ob mit oder ohne Bootloader.
> ist die Frage wie sich das Problem am besten lösen lässt.
Keine Ahnung. Ich würde mal in der Arduino IDE alle Details einschalten
und mir die Kommandozeilen-Parameter angucken die von der IDE generiert
werden.
Stefan ⛄ F. schrieb:> Ich würde mal in der Arduino IDE alle Details einschalten> und mir die Kommandozeilen-Parameter angucken die von der IDE generiert> werden.
Danke für den Hinweis Stefan !
beim Compiler sah ich das vor längerer Zeit mal genauer an, das war sehr
unübersichtlich und wenig verständlich für mich. Es ging über mehrere
Seiten. Daher wollte ich wieder zu WinAVR.
den Aufruf zu AVRdude habe ich von der Arduino-IDE übernommen. Nur
klappt das eben nicht wenn der Code an die falsche Stelle gelinkt wird.
man müsste also die Linkerkommandos ansehen. Vermutlich kann man dem
Linker sagen wo er das hinpacken soll. Beim Assembler war es früher ja
genauso.
Stefan ⛄ F. schrieb:> Ja, davon gehe ich aus.
hast Du vielleicht einen Link zu einer aktuellen Anleitung des Linkers
dieser AVR-GCC-Umgebung 8.4? Ich bin zwar kein Profi - aber reinschauen
könnte ich mal.
Ich weiß gar nicht, wie man sich so **** anstellen kann.
Offensichtlich existiert eine Arduino IDE und sie kann mit dem Board
umgehen.
Also schaut man sich die Parameter beim Kompilieren an.
Das Argument "das ist aber unübersichtlich" mag stimmen, ist aber nicht
relevant, wenn man seine Ziele erreiche will!
Selbst mir, ohne ein solches Board zu haben ist es problemlos möglich
dafür zu kompilieren und auch in die betreffende platform.txt zu
schauen, denn dort finden sich die Parameter.
Da es dir nicht möglich ist den richtigen Eintrag zu finden, habe ich
mir mal die Arbeit gemacht (ca 1 Minute) und kann ich dir hier den
Arduino Linkeraufruf für Blink.ino zeigen:
Arduino Fanboy D. schrieb:> und auch in die betreffende platform.txt zu> schauen, denn dort finden sich die Parameter.
danke für den Hinweis auf diese Datei !
Arduino Fanboy D. schrieb:> und kann ich dir hier den> Arduino Linkeraufruf für Blink.ino zeigen
Danke. Das -Wl,--section-start=.text=0x200 legt den Text wohl mit dem
nötigen Offset ab. So etwas war zu vermuten.
Stefan ⛄ F. schrieb:> Da sind wohl diese drei Parameter relevant:
danke Stefan ! die Arduino IDE weiß wenn per Bootloader geladen werden
soll und setzt dann im Linker den benötigten Offset. Dann ist klar daß
es so gehen wird. Offset 200h sind die 512byte die der Bootloader wohl
groß ist.
Arduino Fanboy D. schrieb:> Da es dir nicht möglich ist den richtigen Eintrag zu finden
die Suche nach den Einträgen in der Zeile des Linkers stand heute auf
meiner Arbeitsliste. Danke daß Du es vor mir gefunden und gemeldet hast.
Arduino Fanboy D. schrieb:> Mir schien, das hättest du schon probiert
nein - das stand auf der Arbeitsliste für heute unter dem Punkt:
"Anschauen welche Befehle die Arduino IDE nutzt für das Linken"
auch der Punkt: "Mit Linkerkommandos probieren" steht da noch - 6 Zeilen
tiefer.
Danke jedenfalls an Dich. War nett daß Du an mich gedacht hast !
Matthias W. schrieb:> mein Versuch dem Linker über das Makefile den Offset beizubringen> liefert eine Fehlermeldung
Das fehlt ja auch etwas. Es muss
> -Wl,--section-start=.text=0x200
heissen. -Wl, leitet Parameter ein, die gcc an den Linker weiter reichen
soll.
Matthias W. schrieb:>> -Wl,--section-start=.text=0x200> genau diese Zeile habe ich doch oben drin.
Die Fehlermeldung war
> unrecognized command line option '--section-start=.text=0x200'
Das sah für mich so aus, als ob der Teil "-Wl," fehlt.
ich habe das gerade mal mit einem beliebigen meiner Projekte
ausprobiert. Ich habe zum Makefile nur diese eine Zeile hinzugefügt:
> LDFLAGS += -Wl,--section-start=.text=0x200
Und es funktioniert. Hast du vielleicht irgendwo ein Leerzeichen zu
viel?