Forum: Mikrocontroller und Digitale Elektronik WinAVR ATmega und Bootloader


von Ronny Schulz (Gast)


Lesenswert?

Hat mal jemand mit der Bootloader-Funktionalität in C rumprogrammiert?
Ich wollte das ganze mal mit C versuchen. Aber es scheitert ja schon
daran, dass ich nicht weiß, wie ich nur den Bootloader-Bereich mittels
dem MISO/MOSI-Interface programmiere, geschweige denn in diesen
Bootloader-Programm nicht weiß, wie ich auf den Programmspeicher
zugreifen kann, also schreiben z.B.

von Johannes M. Richter (Gast)


Lesenswert?

Schau einmal in diesen Thread -
http://www.mikrocontroller.net/forum/read-4-53146.html - vllt. hilft
Dir da was.
Gruss.

von Ronny Schulz (Gast)


Lesenswert?

Da ich das gern selbst programmieren möchte, wäre mir eine C-Lösung eben
lieber. Ich verstehe nur eben ein paar Techniken nicht. Wie z.B.:

- Startadresse des Programmes im Flash festlegen
- Adressierung und Programmierung des Programm-Flash

Habe mir zwar da ein paar Sachen im Datenblatt durchgelesen, aber in C
ist doch irgendwie komplizierter.

von Tobi (Gast)


Lesenswert?

wenn du winavr o.ä benutzt schau dir mal die datei boot.h an, die wirst
du brauchen

von Ronny Schulz (Gast)


Lesenswert?

Danke! Ich war gerade am suchen und habe ohnehin was gefunden. Aber dein
Tipp war eigentlich genau das richtige. Für den nächsten, der sowas
sucht:

http://www.nongnu.org/avr-libc/user-manual/group__avr__boot.html

.. oder eben lokal auf der Festplatte als Dokumentation.

von Ronny Schulz (Gast)


Lesenswert?

Achja aber wie ich die Startadresse des Bootloader-Programmes in C
festlege, wenn ich nicht von Adresse 0 booten möchte, weiß ich dennoch
nicht.

von Matthias (Gast)


Lesenswert?

Hi

mein USBisp enthält auch einen Bootloader mit STK500 Protokol in C.
Kannst du dir ja mal anschauen www.matwei.de

Matthias

von mthomas (Gast)


Lesenswert?

und noch ein wenig "eigenwerbung":
http://www.siwawi.arubi.uni-kl.de/avr_projects/index.html#avrprog_boot
allerdings in der freien version noch das "olle" AVR109/910 Protokoll

von Ronny Schulz (Gast)


Lesenswert?

2 Bootloader - wie schön. Aber ich habe halt immernoch nicht
rausgefunden, wie ich die Startadresse des Bootloaders festlegen kann.
Das muss ja irgendwie beim linken passieren. Zumindest habe ich bei der
Version von mthomas die Definition der Funktion zum Einsprung ins
Hauptprogramm nach dem programmieren gefunden:

void (*jump_to_app)(void) = 0x0000;

Aber wo der Start des Bootloaders steht, habe ich noch immer nicht
herausgefunden. Vielleicht könnt ihr mir ja einen kleinen Fingerzeig
geben? Der Bootloader soll in den Bootloaderbreich geflasht werden und
der ATmega (zum Test der ATmega 16) soll auch von da booten, wobei ich
letzteres ja in den FuseBits einstellen kann.

von Matthias (Gast)


Lesenswert?

Hi

geht über den Linker. Schau mal in mein makefile rein.

--section-start=.text=$(ROM_START) ist der entscheidende Parameter.

Matthias

von Ronny Schulz (Gast)


Lesenswert?

Danke! Nach langem suchen, habe ich das gerade eben gefunden ... Hätte
ich vorher ins Forum geschaut, hätte ich mir ne halbe Stunde Zeit
gespart. ;) Aber dafür weiß ich jetzt auch noch, wie ich binäre Dateien
erzeuge. grins

von Ronny Schulz (Gast)


Angehängte Dateien:

Lesenswert?

Lange ist her ... genau den Parameter habe ich angegeben. ROM_START habe
ich eingestellt im makefile:

# Bootloader address (1F800 = FC00 * 2 = 1024 words)
ROM_START = 0x1F800

Die FUSE-Bits habe ich auch gesetzt. Allerdings startet das Programm im
Bootloader_Bereich nicht, was etwas blöd ist. Ist eine simple Augabe von
einem String an die serielle.

Laut Ponyprog liegt das Programm aber im richtigen Speicher. Woran
könnte es liegen?

von Ronny Schulz (Gast)


Lesenswert?

Selbst mit AVR-Studio und dem ELF-File wird der richtige Einsprung nicht
gefunden, obwohl Boot-Reset und entsprechende Adresse ausgewählt wurde.
Hier mal ein kurzer Ausschnitt aus dem Hex-File. Vielleicht hat ja
jemand einen Tipp und sieht gleich, warum es nicht gehen kann:

:020000021000EC
:10F800000C9446FC0C9463FC0C9463FC0C9463FC19
:10F810000C9463FC0C9463FC0C9463FC0C9463FCEC
:10F820000C9463FC0C9463FC0C9463FC0C9463FCDC

Oder was benötigt man noch zur besseren Analyse des Fehlers?

von Werner B. (Gast)


Lesenswert?

Das sieht eigentlich gut aus, bei meinem bootloader auf 0x1FC00 sieht
das so aus

:020000021000EC
:10FC000011241FBE0C9414FE982F80919B0085FF39
:10FC1000FCCF90939C00089580919B008823E4F78B

Also tippe ich mal auf ein anderes problem.

wie sieht denn das .map file aus?

Zeile ca. 113 sieht hier so aus

.text           0x0001fc00      0x226
 *(.vectors)
 .vectors       0x0001fc00        0x8 gcrt1.o
                0x0001fc00                __vectors
                0x0001fc08                __ctors_start = .

von Ronny Schulz (Gast)


Lesenswert?

So bei mir ab Zeile 116:

.text           0x0001f800      0x3f0
 *(.vectors)
 .vectors       0x0001f800       0x8c
C:/Programme/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/lib/avr5/cr 
tm128.o
                0x0001f800                __vectors
                0x0001f800                __vector_default
                0x0001f88c                __ctors_start = .
 *(.ctors)
                0x0001f88c                __ctors_end = .
                0x0001f88c                __dtors_start = .
 *(.dtors)
                0x0001f88c                __dtors_end = .

Und hier auch aus dem map-file:

Memory Configuration

Name             Origin             Length             Attributes
text             0x00000000         0x00020000         xr
data             0x00800060         0x0000ffa0         rw !x
eeprom           0x00810000         0x00010000         rw !x
default        0x00000000         0xffffffff

von Werner B. (Gast)


Lesenswert?

Im .map steht die startadresse auch auf 0x1F800.

Fuses:BOOTSZ1=unprogrammiert=1, BOOTSZ0=programmiert=0 => 0xFC00
BOOTRST=programmiert=0=Booten von Bootloader-section

Dann kann's nur noch am programm liegen :(

von Ronny Schulz (Gast)


Lesenswert?

Ja aber selbst mit AVR-Studio klappts nicht. Also der springt nicht an
der richtigen Stelle ein. Wenn es unter AVR-Studio gehen sollte, dann
wäre das Thema klar. Und das Programm läuft ja auch, wenn es nicht im
Bootloader-Bereich ausgeführt wird.

Also heisst es weiter suchen und hoffen, dass ich mal was finde. Ich
hab einzwischen schon eine kleine Menge Fehler, die ich einfach nicht
lokalisieren kann, obwohl ich sämtliche Dokus gewälzt und gelesen habe.

von Ronny Schulz (Gast)


Lesenswert?

So nochmal ich. Ich habe jetzt nochmal ein kleines Programm geschrieben,
was in den kleinen Bootbereich (FE00, 512 words) passt. Dabei wird ein
Beeper angeschaltet und nach ein paar ms wieder per Timer abgeschaltet.
Das ist mein Quasi-Testprogramm, ob überhaupt der Controller startet.
Ist eben wie beim PC, das piepen.

Um zu analysieren, habe ich folgende Kombinationen probiert (die
FUSE-bits sind natürlich invertiert):

Adresse im Makefile = 0, BOOTRST = 1, BOOTZ0 = 1, BOOTZ1 = 1:

Programm startet ohne Probleme. Beeper geht an und wieder aus. Schalte
ich nun BOOTRST auf 0, wird der Bootloader aktiviert und nichts sollte
funktionieren, da der Bereich ja mit FF gelöscht war. Der Beeper piept
dennoch, was ich nicht verstehen kann. Als hätte ich nichts verstellt.
WARUM ist das so?

Die zweite Idee ist natürlich gleich im Makefile auf 1FC00 umzustellen
und den Flash zu löschen und dann neu zu programmieren. Hier geht der
Beeper nur an, aber nicht wieder aus. Auch das verstehe ich nicht. Ich
habe nur den Adressbereich verschoben. Die Startadresse sollte ja die
Einsprungadresse sein.

Irgendwas muss ich doch falsch machen oder einfach nur denken ...

von Ronny Schulz (Gast)


Lesenswert?

Ich habe jetzt nochmal 2 Versionen ins Netz gestellt. Einmal mit Adresse
0 und einmal mit 1FC00. Prinzipiell kann man das ja auch neu
kompilieren. Wenn kein Beeper dranhängt geht es ja auch mit einer LED.
Allerdings ist mein Beeper Low-aktiv gesteuert.... VIel Programm ist es
ja nicht. Deshalb leicht durchschaubar.

http://mitglied.lycos.de/projectsilence/syscontrol/source/boot_00000.zip
http://mitglied.lycos.de/projectsilence/syscontrol/source/boot_1FC00.zip

Aber wäre nett, wenn mal jemand rüberschaut. Ich kann mir nicht
vorstellen, dass da was an der Hardware defekt ist.

von Barti (Gast)


Lesenswert?

Hm wenn Du auf einen Speicherbereich zeigst, der leer ist, dann dürfte
der Programm-Counter weiterzählen, bist er in einen Bereich kommt wo
wieder ausführbarer Code steht. Wenn ich Dich richtig verstanden hab
müßte er also wieder am Anfang ankommen und Dein "Piep-Programm"
ausführen.

Habe mit AVR-GCC auch schon nen Bootloader geschrieben, aber wenn ich
ihn flashe ist nicht der komplette Code an der Bootloader-Startadresse.
Ein Teil wird immer bei 0x0000 geschrieben. Das ist der Code, den der
Compiler immer erzeugt. Weiß aber nicht für was dieser gut ist. Egal
wie groß ein Programm(z.B. nur einen Port umschalten->rel. kleines
Programm) ist, GCC erzeugt am Anfang immer eine relativ lange Sequenz
und ich weiß nciht wofür sie steht.

von Ronny Schulz (Gast)


Lesenswert?

@bBarti:
Also bei mir wird in 0x0000 nichts geschrieben. Das sollte ja
eigentlich auch nicht wirklich so sein.

Ich vermute es liegt irgendwie an der ROM_START-adresse. Ich fummel
hier schon Stunden rum und habe noch immer keine endgültige Lösung
gefunden. Mit Hilfe von AVRStudio (was nicht unbedingt das
zuverlässigste ist) habe ich mir einfach auch die Disassembler-Daten
angeschaut.

Im Vergleich habe ich einfach mal ein paar Sachen mit dem Atmega8
ausprobiert, da mich ja nur interessiert, ob er an der richtige Stelle
einspringt. Der Code an sich war gleich. Was allerdings verwunderlich
war, dass NUR beim Atmega128 die Debuginformationen nicht im
Disassembler zu sehen waren. Also sonst steht da drin, wo welches File
an welcher Adresse beginnt. Das stimmt beim atmega8. Aber beim
Atmega128 fehlten diese Informationen.

Unterm Strich läuft das immernoch nicht. Und ich weiß nicht, wo ich
noch suchen sollte. Wenn jemand real mal wirklich ein kleines
Porttestprogramm im Bootloaderbereich des Atmega128 hat laufen lassen,
wäre das eine große Hilfe. Da könnte ich dann ansetzen.

von Ronny Schulz (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe mich heute schon wieder ewig mit der Fehlersuche beschäftigt.
Diesmal mit MAP-File, Disassembler, Assembler usw.

Meine Diagnose lautet:

Ein bootloader läuft durchaus auf meinem Atmega128. In Assembler lief
mein Testprogramm. In C läuft es auch, solange ich die IRQs in Ruhe
lasse. Da mein Beep-Programm zum testen mittels IRQ-Routine
abgeschaltet wird, liegt da das Problem. Nutze ich den compare match
von Timer0, dann wird das Programm bei erreichen des compare match
einfach neu gestartet. Warum dem so ist, weiss ich aber auch nicht. Ich
denke sämtliche IRQ-Sachen enden im Neustart. Deshalb ging bisher auch
nichts.

Aber woran kann das liegen. Ab Adresse 0 läuft es doch auch und im
Disassembler ist auch erstmal kein Fehler ersichtlich.

Hat irgendjemand eine Idee, was das sein kann? Ich raste echt bald aus
und komme kein Stück weiter.

Im angehängten File sind die Timer-Sachen drin.

von Werner B. (Gast)


Lesenswert?

AhhhhhhhJa... Interrupts davon wusste natürlich niemand etwas!

Dann musst Du aber auch die Interruptvektoren in den bootloader Bereich
verlegen.
Stichwort IVSEL im MCUCRgister, Datenblatt Seite 57ff.

von Ronny Schulz (Gast)


Lesenswert?

Ja ich habe es gefunden. Aber toll. Ich wusste, dass wieder mal
irgendwas war, was ich nicht wusste. Ich meine das komplette Datenblatt
lesen, geht einfach nicht.

Aber da ich sowieso keine IRQs mehr beim Bootloader nutze, sollte das
jetzt egal sein. Der Bootloader ist jetzt eigentlich auch fertig. Ziel
war es mittels Programm einfach binär die Daten zu schicken und das
sieht schon ganz funktionell aus. Fehlt nur noch das Programm auf der
PC-Seite.

von Werner B. (Gast)


Lesenswert?

<zitat>
"Ich meine das komplette Datenblatt lesen, geht einfach nicht."
</zitat>

Dann verschwendest Du Deine Zeit (und die Zeit Anderer) lieber damit
unnötig nach Lösungen für Probleme zu suchen die eigentlich keine sind?

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
Noch kein Account? Hier anmelden.