Hallo, muss man beim Sprung von der bootloader section in die Application section im Code die BOOTRST fuse auf Null setzen? Wenn ja, wie. Ich habe bisher folgendes gemacht. Definition im bootloader: void (*funcptr)(void)=0x00000; Aufruf im bootloader: funcptr(); Damit funktioniert es nicht.
Jsc Jsc schrieb: > void (*funcptr)(void)=0x00000; Flash >64K? Ist ein Bug im Compiler. Beim Atmega 2560 hilft da folgendes: EIND = 0x00; funcptr(); mfg.
Hallo, danke für die Antwort. Es ist ein ATXMEGA128A1 mit 128 KB Flash. Leider scheint es auch mit dem Zusatz "EIND = 0x00;" nicht zu funktionieren. Oder anders: Ein reset scheint ausgeführt zu werden aber es wird wieder der Bootloader gestartet obwohl zu 0x00000 gesprungen werden sollte. Hat das ev. was mit FUSEBYTE2 zu tun? Ich habe wegen des Bootloaders BOOTRST auf 1 gesetzt. Kann dann per seriell empfangenem Command den Sprung zu 0x00000 auslösen. Springt das Programm vielleicht nur kurz zu 0x00000 und dann sofort zum Bootloader zu 0x10000? Muss ich zur Laufzeit des Bootloaders eventuell BOOTRST auf 0 setzen? Habe noch nicht rausgefunden wie...
Jsc Jsc schrieb: > Muss ich zur Laufzeit des Bootloaders eventuell BOOTRST auf 0 setzen? Die Fuses können zur Laufzeit nicht verändert werden. Jsc Jsc schrieb: > Springt das Programm vielleicht nur kurz zu 0x00000 und > dann sofort zum Bootloader zu 0x10000? Ist denn das Program auch tatsächlich drin? Wenn das Beschreiben des Flashs mit dem Bootloader nicht funktioniert, läuft der Controller durch das gelöschte Flash(0xFF) und landet dann wieder beim Bootloader. Ich kenne den Atxmega nicht weiter. Aber beim 2560 beginnt der Bootloader mit 4K Words bei Adresse 0x1FC00. Beginnt der Bootloader bei 0x10000, würde das bedeuten, daß der Bootsektor 64K Words groß ist. Das ist ein bisschen viel. Das ist Applikationssektor. Sollte das beabsichtigt sein, ist das Problem, daß das Beschreiben des Flashs nur aus dem Bootsektor heraus ausgeführt wird. Die entsprechenden Befehle sind im Applikationssektor wirkungslos. Dann wird das Flash nicht beschrieben. Setze einfach nach dem Beschreiben mit dem Bootloader testweise per ISP die Fuses auf Start 0. Dann startet der Controller auch bei 0. Wird dann der Bootloader erreicht, ist das Flash leer. mfg.
Hallo, OK, die Fuses sind's also nicht. Es sind Applikation und Bootloader geflasht, ich habe das mit einem Hex Editor überprüft. Der Bootloader beginnt bei 0x10000 (WORD), also 0x20000 (Byte). Das ist etwas verwirrend gemacht. Der µC hat 128 KByte Flash für Applikation und 8 kByte Flash für den Bootloader (0x10000...0x11000)Byte oder (0x20000...0x22000) WORD. Ich bin noch nicht soweit, dass ich das Beschreiben des Application Sector Flashs aus dem Bootloader heraus getestet habe - wollte erst das Springen zwischen den 2 Sections können. Die Application section habe ich per AVR Studio5 ISP geflasht, genau wie die Bootloader section. Wenn ich nach dem Flashen des Bootloaders per AVR Studio5 die BOOTRST auf 0 setze läuft sofort die Applikation los. Setze ich BOOTRST auf 1 so startet der Bootloader. Ich verstehe den letzten Satz "Wird dann der Bootloader erreicht, ist das Flash leer." leider nicht, was ist damit gemeint? Gruss & Danke
Jsc Jsc schrieb: > Der Bootloader beginnt bei 0x10000 (WORD), also 0x20000 (Byte). Ist OKAY. Jsc Jsc schrieb: > Wenn ich nach dem Flashen des Bootloaders per AVR Studio5 die BOOTRST > auf 0 setze läuft sofort die Applikation los. Setze ich BOOTRST auf 1 so > startet der Bootloader. Ist doch in Ordnung. Wenn Du den Bootloader verlassen willst, führe ein JMP$000000 aus. Das geht zur Not auch mit Inline-Assembler. Jsc Jsc schrieb: > Ich verstehe den letzten Satz "Wird dann der Bootloader erreicht, ist > das Flash leer." leider nicht, was ist damit gemeint? Wenn die Programmsektion leer, also komplett $FFFF, läuft der Programmzähler durch, bis eine verwertbare Instruktion gefunden wird. Im Fall eines vorhandenen Bootloaders startet dieser, unabhängig von der BOOTRST-Fuse.
Manchmal muss man einen Schritt zurück treten, um das ganze Bild zu betrachten... Ich hatte noch einen Fehler in der Bootloader Polling Empfangs-/Senderoutine, die erst die Antwort sendet, um dann in den Bootloader zu springen. Es kam also nicht zu der Ausführung von entweder: EIND = 0x00; funcptr(); // Jump to Reset vector 0x00000 in Application Section. oder: //Eingebundene Assembler routine _asm_ __volatile ( "jmp 0x000000" "\n\t" ); Beide Lösungen funktionieren! An dieser Stelle noch mal Danke für die Antworten!
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.