Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage Bootloader Fuses


von Bertine Maxe (Gast)


Lesenswert?

Hallo,

ich beschäftige mich mit dem Tutorial zu Bootloadern hier auf dieser 
Seite und versuche mich gerade am Hallo-Welt-Bootloader.

Ich verwende einen Atmega 168-20PU extal 20 Mhz.
Ich habe die Fuses so programmiert:
-U lfuse:w:0xf7:m -U hfuse:w:0xdf:m -U efuse:w:0xf8:m

Ich würde nun vermuten, dass die MCU nun nicht mehr versucht von Adresse 
0 zu starten sondern von einer höheren. Dennoch wenn ich ein Programm 
normal kompiliere und linke wird es gestartet.

Weshalb kann das so sein?
Vielen Dank für jede Hilfe!

von Jens (Gast)


Lesenswert?

Hallo,

die Fuse Bits sind dafür da, dass dein Programm getrennt vom Bootloader 
geflasht werden kann ohne den gesamten Flash löschen zu müssen.

Dein neues Programm muss also ab der Adresse gelinkt werden, wie du den 
Bootloader / Fuse Bits eingestellt hast.

Der Bootloader braucht irgendeine Bedingung um im Bootloader zu bleiben 
oder dein Programm zu starten (zum Beispiel ein gesetzter I/O Pin) und 
wenn die Bedingung zu trifft wird dein Hauptprogramm oder gestartet oder 
der Bootloader bleibt in deinem eigenen Programm.

Als erstes musst du dann den Bootloader flashen und kannst danach dein 
Hauptprogramm über den Bootloader flashen.

Jens

von Axel S. (a-za-z0-9)


Lesenswert?

Bertine Maxe schrieb:
> Ich verwende einen Atmega 168-20PU extal 20 Mhz.
> Ich habe die Fuses so programmiert:
> -U lfuse:w:0xf7:m -U hfuse:w:0xdf:m -U efuse:w:0xf8:m

Ich überprüfe das jetzt nicht, sondern glaube dir einfach, daß du den 
AVR damit dazu gebracht hast, bei einer höheren Adresse als 0x0000 zu 
starten. Für die Zukunft: drösele die Fusebytes auf die einzelnen Fuses 
auf, die du gesetzt haben willst.

> Ich würde nun vermuten, dass die MCU nun nicht mehr versucht von Adresse
> 0 zu starten sondern von einer höheren. Dennoch wenn ich ein Programm
> normal kompiliere und linke wird es gestartet.

Ich nehme an, du meinst damit, daß du noch keinen Bootloader geflasht 
hast, sondern statt dessen per ISP den gesamten Flash gelöscht und dann 
eine Anwendung ab 0x0000 in den Flash geschrieben hast. Korrekt?

> Weshalb kann das so sein?

Der gelöschte Flash enthält 0xFF in jeder Zelle, was den Opcode 0xFFFF 
ergibt. Der AVR behandelt den praktisch [1] wie ein NOP. Unter Annahme, 
daß der Booloader-Bereich im Flash komplett leer ist, läuft der AVR also 
durch alle diese NOPs hindurch, bis der Adreßzähler überläuft und zu 0 
springt. Und dort findet und startet er dein Programm.

[1] http://www.avrfreaks.net/forum/what-opcode-0xffff

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.