Hallo, der ATMega48 hat ja keinen Bootloader Bereich implementiert. Gibt es eine Möglichkeit auch für diesen Controller eine Art Bootloader zu machen?
Eine kurze Suche hat ergeben: http://www.mikrocontroller.net/articles/AVR_Bootloader_FastBoot_von_Peter_Dannegger http://www.mikrocontroller.net/articles/AVR_Bootloader_FastBoot_von_Peter_Dannegger/Tutorial_ATtiny13 http://www.mikrocontroller.net/articles/AVR_Bootloader_in_C_-_eine_einfache_Anleitung http://www.mikrocontroller.net/articles/AVR-Bootloader_mit_Verschl%C3%BCsselung_von_Hagen_Re
mhm... in der Tat. Wollte gerade vorschnell Antworten, dass der 48/88/168 doch identisch sind, aber das Datenblatt sagt was anderes: > In ATmega48, there is no Read-While-Write support and no separate Boot > Loader Section. The > SPM instruction can execute from the entire Flash. Würd ich auch interessieren, ob es da eine Möglichkeit gibt!
Ui, okey ging ja schnell hier der entscheidende Hinweis: > Bei AVRs ohne "boot reset vector fuse" (BOOTRST) wie beispielsweise > ATtinys und kleinen ATmegas (ATmega48) muß der erste Befehl ein RJMP sein. > Für C-Programme ist das automatisch sichergestellt (und für Assembler- > Programme leicht selbst sicherzustellen).
Klar kann man, welche Features sollte er denn haben? Als Problem sehe ich die Interrupt-Vektoren, weil der BL diese ja bereits überschreibt bzw. in Beschlag nimmt. Würde mir auch schwer tun, ein C-Programm so zu compilieren/linken, dass es in den noch freien Flash-Bereich passt und den BL nicht überschreibt. Angesichts der Preise für die grösseren atmega würd ich eher nen 88 oder höher kaufen und darauf einen "richtigen" BL einsetzen. :)
Also bis jetzt habe ich immer den ATMega88 mit dem AES-Bootloader von Atmel(AVR231)benutzt und würde diesen auch gerne weiter verwenden. Leider ist für das Projekt der ATMega48 vorgesehen. Wäre es denn möglich den Bootloader Bereich von Hand festzuelegen und dann immer nur den Bereich bis zur Bootloader Adresse neu zu beschreiben? Das Hauptprogramm für den ATMega48 ist nicht sehr groß und würde locker in die 3kB passen.
Tom M. schrieb: > Als Problem sehe ich die Interrupt-Vektoren, weil der BL diese ja > bereits überschreibt bzw. in Beschlag nimmt. Nein tut er nicht. Ein Bootloader hat nur eine einzige Aufgabe, daher braucht er keine Interrupts, er pollt einfach. Der Bootloader tauscht auch nur den RJMP am Resetvektor aus, die anderen Vektoren bleiben original in der Applikation. Peter
Peter Dannegger schrieb: > Tom M. schrieb: >> Als Problem sehe ich die Interrupt-Vektoren, weil der BL diese ja >> bereits überschreibt bzw. in Beschlag nimmt. > > Nein tut er nicht. > Ein Bootloader hat nur eine einzige Aufgabe, daher braucht er keine > Interrupts, er pollt einfach. > Der Bootloader tauscht auch nur den RJMP am Resetvektor aus, die anderen > Vektoren bleiben original in der Applikation. Wir sprechen immer noch über den atmega48, oder? Kannst du ein Binary/Hexfile erzeugen, das nur den Resetvektor tauscht, die übrigen Vektoren unangetastet lässt und dann im höheren Adressbereich den Bootloader ablegt? Oder ähnliches für ein "User-Programm" bewerkstelligen, sodass nur die nötigen Vektoren geflasht werden und das Programm dann in einem freien Speicherbereich abgelegt wird? Ich denke zwar schon, dass es möglich ist, traue es mir aber nicht zu. Oder hab ich was einfache(re)s übersehen?
Lies Dir mal die Beschreibung von Bootloadern durch. Es gibt prinzipiell 2 Wege: 1. Der Bootloader patcht den RJMP selber (so mache ich es). Also auch, wenn Mumpitz gesendet wird, schreibt der Bootloader immer den richtigen RJMP zu sich selber an 0x0000. 2. Ein PC-Programm patcht den RJMP (so macht Hagen es). Potentiell besteht dabei die Gefahr, daß man sich aussperren kann. Der Applikation ist das Schnuppe, sie weiß nix vom Bootloader. Peter
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.