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
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
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
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
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
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
Hi Charly, bist du weitergekommen mit deinem Bootloader-Problem? Ralf
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.