Hallo, ich versuche seit gestern einen Bootloader auf einen ATmega168 zu bekommen, klappt aber nicht richtig. In den Extended Fuse Bits steht BOOTRST auf 0, also programmed. Jetzt wollte ich versuchshalber nur ein kleines Programm (146 Byte) als Bootloader laden, das lediglich eine LED einschaltet. Seltsamerweise funktioniert das aber nur, wenn ich das Programm ganz ans Ende des Flashs schreibe, nach ISP-Offset 0x1F80 (in Words, also nach 2^16 - 256 in Bytes). Wenn ich dagegen 512, 1024 oder 2048 Bytes Platz lasse, leuchtet die LED nicht. Dabei ist es egal, welche Fuse Bits für BOOTSZ1..0 eingestellt sind, es funktioniert nur, wenn das Programm ganz am Ende liegt (und dann funktioniert es auch unabhängig von den Fuse Bits). Lade ich das Programm ganz an den Anfang des Flashs funktioniert es auch. Jemand eine Idee? MfG.
Alfred Krohmer schrieb: > Jemand eine Idee? Nö. Deine Angaben sind noch ein bisschen dürftig. C oder Assembler? Poste mal deinen Code. mfg.
In C. Schaltet wie gesagt nur eine LED ein...
1 | #include <avr/io.h> |
2 | |
3 | int main () |
4 | {
|
5 | DDRD = PORTD = (1 << 3); |
6 | }
|
welcher bootloader? genaue Fuses-Config? was passiert nach Abarbeitung der main?
Der Code da aus meinem letzten Post soll testweise der "Bootloader" sein. Ich will nicht ein Programm über den Bootloader draufflashen, ich will überhaupt erstmal einen Bootloader drauf bekommen. Die Extended Fuse Bits sind momentan auf 0b11111000, also auf 2048 Byte Bootloader Größe und Bootloader Reset Vector aktiviert und den Code will ich nach nach 0x1C00 (in Words) flashen, was nicht funktioniert. Flashe ich ihn stattdessen nach 0x1F80, dann funktioniert es, dabei reicht dann aber der Platz für einen "richtigen" Bootloader nicht.
Wie flasht du den denn auf die entsprechende Adresse? Linker Offset? mfg.
Nein, ich benutze zum Flashen einen mySmartControl Board, das die Daten per USART kriegt und per SPI an den AVR weitergibt. Bei meinem Script um diesen "Programmer" anzusprechen sage ich ihm dann halt, dass er das Offset zu der Adressangabe hinzuaddieren soll. Die Ausgaben dazu stimmen eigentlich, es sind bei 146 also 2 Pages:
1 | ... |
2 | Writing page to 7168 |
3 | ... |
4 | Writing page to 7232 |
Wenn der Offset 0 ist, läuft die Ausgabe halt entsprechend mit 0, 64, 128 usw. an. Am "Programmer" sollte es aber nicht liegen, alle "normalen Programme" überträgt der einwandfrei und auch das Flashen nach 0x1F80 funktioniert scheinbar.
Also compilierst du das Programm ganz normal mit AVR-Studio? So wie jedes andere auch? Das bedeutet allerdings, daß die Vektortabelle auf Adresse 0x0000 gelegt wird. Nach einem Reset, springt das Programm dann vom Resetvektor auf die Initialisierung. Und zwar mit einem absoluten Sprung. Das heisst, wenn du deinen Code in einen anderen Speicherbereich verschiebst, zeigt der Resetvektor immer noch auf die Adresse, die für den Start auf 0x0000 gültig ist. Du must das ganze Programm auf den Anfang des Bootsektors linken. Dann werden auch die Adressen für die Vektortabelle richtig erzeugt. mfg.
Ahhhh, ok, hat geplappt. Benutze den avr-gcc unter Linux, da legt man das scheinbar mit -Ttext=addr fest (hab ich grad in einem Makefile gesehen). Dankeschön erstmal, jetzt nur noch schauen, ob der richtige Bootloader auch läuft, sonst belästige ich den Thread noch mal ;)
Hey, das liest sich interessant. Ich nutze auch gerade den Atmega168. In Verbindung mit diesem Programmer: http://www.reichelt.de/Programmer-Entwicklungstools/AT-AVR-ISP/index.html?;ACTION=3;LA=444;GROUP=A38;GROUPID=2969;ARTICLE=45040;START=0;SORT=artnr;OFFSET=16;SID=11TZm53X8AAAIAAA5G1O0a84449dde95f1dba7189557beed97bd0 Ich arbeite mit AVR STudio und dem avr-gcc. Ich suche einen handlichen und kleinen Bootloader den ich einmalig mit meinem Programmer in den Controller flashen kann. Wenn dann ein Update des Programmes über RS232 oder USB möglich wäre, hätte ich alles was ich brauche. Habt Ihr einen Tip für eine passende Quelle? M.
ja danke...ich werde mich da mal im nächsten Schritt umsehen. M.
So, funktioniert jetzt alles wunderbar. Danke @Thomas Eckmann und die anderen :) @Maddin: Siehe hier: http://thedenneys.org/pub/robot/avr/ unter AVR Boot Loader, zweiter Link in der Aufzählung: http://www.atmel.com/dyn/resources/prod_documents/avr109.zip Hab den da draufgehauen, ist der "Original" Bootloader von Atmel und funktioniert durch AVR109 Protokoll wunderbar mit avrdude, auch ziemlich schnell (12 KiB in ca. 2 s).
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.