Forum: Mikrocontroller und Digitale Elektronik Resetvektor in den Bootloader


von Rudi D. (rulixa)


Lesenswert?

Ich brauche bitte auch etwas Nachhilfe.
Ich verwende das Lernpaket uC von Franzis mit tiny13 und der Bootloader
der da dabei ist liegt von 0x17e bis 0x1fd ist also sehr winzig.

Bei 0x17E steht ein rjmp auf das Anwenderprogramm bei 0x10 (nach den
Int. Vektors).

Der übliche Verlauf ist nun so, dass man mit dem AVR Assembler ein
Programm schreibt, das am Resetvektor den Rjmp auf das Anwenderprogramm
hat.

Wenn man es mit dem beschriebenen Bootloader lädt, wird der Resetvektor
in der .hex file auf auf 0x180 verbogen und man gelangt über 0x017E dann
endlich ins Anwenderprogramm.

Da dieses Windowsprogramm, das den Restvektor verbiegt nicht als Source
vorliegt, hätte ich gerne gewußt, wenn ich z.B. Ponyprog für den
tiny2313 verwenden will, wie ich am Resetvektor rjmp 0x180 eintrage,
wenn das Anwenderprogramm viel kürzer ist.

Sonst überschreibt es ja den Bootloader. Mir fällt nur ein, diesen Rjmp
als databytes einzutragen.
Oder gibts eine Assembleranweisung, die auch auf außerhalb des
Anwenderprogrammes liegende Adressen springen kann?

LG aRudi

von Peter D. (peda)


Lesenswert?

Rudi D. wrote:

> Sonst überschreibt es ja den Bootloader.

Der SPI-Programmer löscht in jedem Fall den Bootloader, da er kein 
Sektor-Löschen kann.


Du mußt Dich entscheiden.
Entweder Du benutzt einen Bootloader mit dem dazu passendem PC-Programm 
oder Du benutzt einen SPI-Programmer (Ponyprog).

Beides zusammen geht nicht!


Peter

von Rudi D. (rulixa)


Lesenswert?

Ich bin erst neu bei AVR uC's und bisher nur bei tiny13. Ich beziehe 
mich auf die Doc Seite 98 "Self programming the flash" wo auch der 
Bootloader erwähnt wird.
Ich habe Ponyprog noch nicht angewendet und weiss noch nicht, dass 
dieses Programm keinen Bootloader bedienen kann, wie du schreibst.

Mir geht es hauptsächlich um die Frage wie ich den Resetvektor im 
Anwenderprogramm, das ja sehr klein sein kann, z.B. ein Led-Blinker auf 
den Beginn des Bootloaders setzen kann, der ja außerhalb des 
Anwenderprogrammes sitzt.

Mit ISP setze ich den Resetvektor des Anwenderprogrammes auf z.B. .org 
16
Mit Verwendung eines Bootloaders kann ich diesen natürlich auf z.B. bei 
tiny2313 auf .org 0x380 setzen, wenn der Bootloader so klein ist wie bei 
tiny13.
Aber ich verstehe nicht wie der Assembler das übersetzt, ohne dass das 
Anwenderprogramm bis 0x37f reicht.
Das PCprogramm LPmikros, das ich jetzt  für tiny13 werwende, verändert 
den Resetvektor von selbst. D.h. ich programmiere rjmp 16 und wenn ich 
dann nachschaue, dann steht im geladenen Programm rjmp 0x180.

Ein Bootloaderprogramm für den PC und die uC's gibt es ja von Dir.
Nur kenne ich mich damit noch nicht aus, da es sehr sparsam kommentiert 
ist.
Welche Bootloader das Windowsprogramm bedienen kann, oder ob es nur mit 
deinem Bootloader läuft weiss ich auch nicht.

Einen Bootloader der nur minimal Platz im uC braucht
traue ich mir selbst auch zu, da ich z.B. keine autom. 
Baudratenerkennung brauche, aber kein Windows/Linux Programm das den 
Bootloader bedienen kann. Da möchte ich gerne auf bekanntes 
zurückgreifen.

Vielleicht kannst du mir da raushelfen.

LG aRudi

von Peter D. (peda)


Lesenswert?

Rudi D. wrote:

> Mir geht es hauptsächlich um die Frage wie ich den Resetvektor im
> Anwenderprogramm, das ja sehr klein sein kann, z.B. ein Led-Blinker auf
> den Beginn des Bootloaders setzen kann, der ja außerhalb des
> Anwenderprogrammes sitzt.

Der Resetvektor ist immer 0x0000 und den kannst Du nicht ändern.
Wenn Du meinen Bootloader benutzt, muß dort der erste Befehl ein RJMP zu 
Deinem Programm sein, das ist alles.
Wenn Du keine Interrupts benutzt, kann dies z.B. ein RJMP nach 0x0001 
sein.

Der Bootloader packt sich diesen RJMP und ermittelt daraus Dein 
Sprungziel. Danach ersetzt er ihn durch einen RJMP auf sich selber.

Wenn Du aber versuchst, dem Bootloader ins Handwerk zu pfuschen, gehts 
schief und Dein Programm läuft nicht.


Wenn Du wegen dem Bootloader Probleme mit dem Flash erwartest, nimm 
einfach nen ATtiny25 (Reichelt: 1,25€), der ist kaum teuerer als ein 
ATtiny13.


Peter

von Rudi D. (rulixa)


Lesenswert?

Ich glaube meine Terminologie ist nicht gut, oder ich drücke mich 
schlecht aus.
Natürlich steht an 0x0000 der rjmp meinProgramm
Erstmals sagst du und das wollte ich wissen, dass dein PCprogramm zum 
laden des uC Programms diesen rjmp meinProgramm ersetzt durch rjmp 
bootloader  und im Bootloaderbereich steht dann irdendwo rjmp 
meinProgramm.

Das verstehe ich ja.
Also ich muß mein Programm nicht so schreiben, dass ich an der Stelle
0x0000  rjmp bootloader einsetzen muss, wenn ich den Bootloader und 
nicht ISP verwenden will (das war ja meine eigentliche Frage, wie man 
das bewerkstelligen könnte, da der rjmp bootloader ja nach außerhalb des 
Bereiches "meinProgramm" ginge).
Das war ja der Punkt der mir Probleme machte. Dein PC Programm erledigt 
das schon die .hex File anzupassen. Gut!

Eine Frage: Kann dein PCprogramm nur mit deinem uC-Bootloader arbeiten, 
oder kann ich meinen eigenen, kleineren Bootloader ohne autom. 
Baudratenerkennung genauso verwenden.
Was ist die aktuellste Version?
Ich will in Zukunft den tiny2313 verwenden für mehrere Projekte.
Ich habe eine Anzahl VFD's gefunden, die ich gerne als Anzeige verwenden 
möchte und da brauche ich mehr Portpins als der tiny13 bietet.

Übrigens liefert Reichelt nach Österreich nur mit 150Euro 
Mindestbestellwert, leider. Aber bei Pollin bekam ich tiny2313 um 1,40.

LG aRudi

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.