Forum: Mikrocontroller und Digitale Elektronik Bootloader per Software starten


von Charly Meier (Gast)


Lesenswert?

Hallo,

vielleicht hat hier schon jemand Erfahrung mit diesem Controller oder
mit einem anderen AT89C51RX2. Ich schreibe ein Programm bei dem ich
über einen Menüpunkt den ATMEL Bootloader starten möchte um das
Programm neu zu flashen (mittels FLIP). Ich hab schon das Datenblatt
studiert, aber ganz schlau bin ich daraus noch nicht geworden.
Vielleicht kann mir ja von euch jemand einen Tip geben. Danke & Gruß
Charly

von Kai R. (k2r)


Lesenswert?

Hallo, Charly,
den RX2 kenne ich zwar nicht, aber den CC01/CC02, und die haben auch
softwareaktivierbare Bootloader. Wenn Du mit FLIP arbeiten willst,
kannst Du den Controller vermutlich aber auch über irgendwelche
Hardware-Conditions in den Programmiermodus schalten (So mach ich's im
Regelfall, wenn ich nicht Betrieb umflashen will).
Zum aktivieren des Bootloader's muss man beim CC01 das Bit ENBOOT im
AUXR-Register setzen und dann einen LJMP auf die Adresse F800h
ausführen. Danach ist der Controller schon im Bootmode, kann also dann
schon direkt programmiert werden.
Wenn Du aber einen "echten" Loader schreiben willst, damit Du im
Betrieb umflashen kannst (z.B. über ein eigenes Protokoll) musst Du
einige Eigenheiten beachten, wie z.B. verschiedene Flashbereiche, die
Du verwenden kannst/solltest.
Grüssle Kai

von Ralf (Gast)


Lesenswert?

Was genau willst du machen?

Den Bootloader starten, ohne dass du jedesmal den PSEN-Pin auf low
setzen musst?

Auf der Atmel Homepage gibts Beispiel-Routinen, mit denen du genau das
machen kannst.
Ausserdem kannst du auch direkt den Flash ändern, oder das interne
EEPROM. Alles dabei, musst mal suchen.

Wenn du es nicht findest, sag Bescheid, ich hab mir eigene Routinen für
alles geschrieben...

Ralf

von Charly Meier (Gast)


Lesenswert?

Hallo,

vielen Dank für eure Antworten!
@Ralf: Genau, ich will den Bootloader aus meiner Applikation starten
ohne PSEN auf 0 zu ziehen (möchte nicht immer extra das Gehäuse
öffnen). Kannst du mir sagen wo ich die Infos auf der ATMEL Seite
finde, oder ein Beispiel mailen?

@Kai: Wenn ich das Bit ENBOOT setze, so wird doch der Bootloader ab
Adresse F800 im Adressbereich eingeblendet, oder? Angenommen mein
Sprungbefehl auf F800 steht über der Adresse F800 im Flash, bekomm ich
da dann keine Probleme (ein bischen kompliziert :))?!?

Also symbolisch so:

F7FF ENBOOT = 1      // Bootloader "einblenden"
F801 JMP 0xF800      // Bootloader starten

Muss ich irgenwie gewährleisten, dass die Befehle die den
Bootloader starten auf jeden Fall unter F800h liegen?
Oder hab ich da total etwas falsch verstanden?

Gruß
Charly

von Ralf (Gast)


Lesenswert?

Hi Charly,

ich kann dir deine Vermutung bzgl. der Adressen nicht direkt bejahen,
aber so wie ich den Controller bzw. das Datenblatt verstehe, dürftest
du damit richtig liegen, dass alle Befehle/Routinen, die auf die
Bootloader/API-Funktionen zugreifen, unter 0xF800 liegen MÜSSEN!!!

Bezüglich der Beispiele für die API-Funktionen:

http://www.atmel.com/dyn/resources/prod_documents/doc4365.pdf
http://www.atmel.com/dyn/resources/prod_documents/Api_for_standars_C51.zip
http://www.atmel.com/dyn/resources/prod_documents/at89c51rd2-fa-uart-1_0_0.zip

Das sind die selben Dateien, die ich auch verwendet habe, um die API
für mich zu nutzen. Allerdings habe ich mir die Funktionen für mich
etwas umgeschrieben, nicht direkt funktionell, aber lesbarer bzw.
verständlicher :-)

Programmierst du in Assembler oder in C?
Egal wie, falls Fragen sind, melde dich...

Ach ja, nur rein interessehalber, was genau ist denn dein Projekt???

Ralf

von Kai R. (k2r)


Lesenswert?

Hallo, Charly,
korrekt! Das ist auch der Grund, weswegen man die Bootloaderroutinen
nutzen MUSS, da nur die an den gesamten Flash-SPeicher herankommen.
Liegt mit daran, daß die Controller eigentlich 2 Flashbereiche haben,
nämlich einen, an den man via Boootloader heran kommt (FM0) und einen,
den man nur hardwaremässig via eines Paralellprogrammieres (FM1)
programmieren kann.

Ein selbstgeschriebener Bootloader, der den Controller "on the fly",
also im Betrieb umflashen kann, muss deshalb im unteren Bereich liegen.
Ich habe sowas mal gemacht, damit ein "Master" die Peripherie
umprogrammieren kann. Da musste damals der Loader selbst im Bereich
0000h-1FFFh liegen (dieser Bereich wurde dann beim Flash löschen
ausgespart); im Normalbetrieb sprang er dann das Hauptprogramm direkt
auf Adresse 2000h an, beim Flashen hat er via CAN ab Adresse 200h das
(neue) Betriebsprogramm geschrieben.

Grüssle Kai

von Ralf (Gast)


Lesenswert?

Hi Charly,

bist du weitergekommen mit deinem Bootloader-Problem?

Ralf

von Charly Meier (Gast)


Lesenswert?

Hallo,

leider kämpfe ich im Prinzip immer noch mit dem selben Problem.
Momentan "blende" ich den Bootloader von Atmel ein und springe
auf die Adresse F800h. Dann ist es auch möglich mittels Flip (2.4.6)
eine Verbindung zum Controller aufzubauen und ihn neu zu programmieren.
So weit so gut...
Springe ich aber auf Adresse F800h (Bootloader starten) und führe dann 
beim
Controller einen RESET aus (ohne den Controller neu zu programmieren), 
kann ich den
Bootloader nicht mehr durch einen Sprung auf F800h starten. Erst wenn 
ich dann
den Bootloader manuell starte (PSEN/RESET) und neu programmiere oder die 
Taste "Start Application"
(Flip) betätige ist es wieder möglich den Bootloader durch den 
Sprungbefehl zu starten.
Ich vermute beim Start des Bootloaders wird irgend ein Bit oder Byte 
beschrieben. Beende ich
die Verbindung vom Controller zu Flip korrekt (z.B. durch den "Start 
Application" - Button) so wird
dieses Bit/Byte wieder entsprechend beschrieben. Wenn ich allerdings 
einen
RESET am Controller durchführe steht etwas darin, was den Bootloader 
nicht mehr in den
Adressbereich einblendet oder er einfach nicht mehr gestartet wird.
Vielleicht hat ja jemand einen Tip für mich, was für dieses Verhalten 
verantwortlich
sein könnte.

Danke & Gruß
Charly

von Ralf (Gast)


Lesenswert?

Dann poste mal den Code, mit dem du in den Bootloader springst.

Ich könnte mir vorstellen, dass du vergessen hast, das BSB korrekt zu 
programmieren...

Das BSB muss soweit ich weiss != 0x00 (normalerweise 0xFF) sein, damit 
der Bootloader korrekt ausgeführt wird, wenn er nicht durch 
Hardware-Condition gestartet wird.

Zumindest in den Links, die ich dir mal gegeben habe, wird in der 
entsprechenden Routine das BSB auf 0xFF gesetzt, was auch dem Flowchart 
der Bootloader-Aktivierung aus dem Datenblatt entspricht...

Wie gesagt, zeig mal deinen Code...

Ralf

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.