Forum: Mikrocontroller und Digitale Elektronik AVR ATmega1284P Bootloader startet nicht!


von Ole J. (ojepsen)


Lesenswert?

Hallo liebe Leute,

ich habe einen kleinen Bootloader für meinen ATmega1284P (nach den 
Tutorial von mikrocontroller.net) geschrieben. Als ersten Test toggelt 
das Programm nur eine LED. Ich verwende zum programmieren das 
AtmelStudio 7 und einen JTAGICE mkII
Nun zum Problem:
Wenn ich das Programm mit Startaddr = 0x0000 kompiliere und dann flashe, 
startet es ganz normal und die LED blinkt.
Sobald ich allerdings das "offset" auf .text=0xF000 ändere
(Toolchain/AVR/GNU Linker/Memory Settings/FLASH segment).
Die BOOTSZ auf $F000 und die BOOTRST programmiere und anschließend 
flashe, passiert NIX!

Auch das Debuggen funktioniert nicht mehr :(

Was mache ich falsch? Das flashen mache ich sowohl über das Atmel Studio 
als auch via *.bat mit ATPROGRAM

Vielleicht hat jemand von euch eine Idee ?!

Gruß

: Bearbeitet durch User
von Georg G. (df2au)


Lesenswert?

Der Code Speicher wird bei Atmel mal in Bytes und mal in Words gezählt. 
Da landet der Code dann schon mal an der falschen Stelle.

von Ole J. (ojepsen)


Lesenswert?

Hi,

ich habe soeben das Problem gelöst :)
Immer das gleiche, sobald man das "Problem" aufschreibt und nochmal 
"anders" drüber nach denkt, bekommt man einen Geistesblitz und zack 
schon behoben!
Das "einfache" toggeln der LED (zum testen) habe ich nicht dirket über 
die Register gemacht, sondern von einem Timer / Interrupt regeln lassen.
Normalerweise funktioniert das auch wunderbar, nur habe ich beim 
Bootloder vergessen, die Interrupt Vektoren zu "verbiegen"...

Nun läuft alles wie gehofft!
1
unsigned char interruptTemp;    /* Variable */
2
/* Interrupt Vektoren verbiegen */
3
interruptTemp = MCUCR;
4
MCUCR = interruptTemp | (1<<IVCE);
5
MCUCR = interruptTemp | (1<<IVSEL);

von Georg G. (df2au)


Lesenswert?

Ole J. schrieb:
> die Interrupt Vektoren zu "verbiegen"

Bist du dir da sicher? Die Fuse "Bootlader benutzen" legt automatisch 
die Interrupt Tabelle an die richtige Stelle.

von Ole J. (ojepsen)


Lesenswert?

Ich habe mir das nicht ausgedacht, sondern aus dem Tutorial übernommen 
bzw. kurzzeitig vergessen :(

Hier der Link:
https://www.mikrocontroller.net/articles/AVR_Bootloader_in_C_-_eine_einfache_Anleitung
Zufinden unter Schritt 3 - Programmieren des Bootloaders

von S. Landolt (Gast)


Angehängte Dateien:

Lesenswert?

MCUCR.IVSEL muss gesetzt werden.

von Ole J. (ojepsen)


Lesenswert?

S. Landolt schrieb:
> MCUCR.IVSEL muss gesetzt werden.

Genau dies passiert ja durch das "verbiegen" :) Vielleicht nicht die 
richtige beschreibung dafür, aber in Summe das gleiche Ergebnis ;)
1
MCUCR = interruptTemp | (1<<IVCE);
2
MCUCR = interruptTemp | (1<<IVSEL);

von S. Landolt (Gast)


Lesenswert?

Es sollte ja auch eine Antwort für Georg G. sein, pardon.

von Ole J. (ojepsen)


Lesenswert?

S. Landolt schrieb:
> Es sollte ja auch eine Antwort für Georg G. sein, pardon.

OKAY ;) Danke euch!

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.