Hallo an alle 8051 Spezialisten,
ich schreibe gerade eine Versuchssoftware für den AT89C51RC2 in
Assembler, mit der ich aus der Anwendung heraus ein Byte im Flash
verändern will. Der µC soll also ein Byte seines eigenen Flash
umprogrammieren. Im Datenblatt von Atmel ist beschrieben, daß dies über
eine API-Funktion möglich ist (Program Data Byte). Welche Register mit
welchen Werten beschrieben werden müssen ist soweit klar (R1=02h,
Acc=Data-Byte, DPTR=Adresse im Flash). Doch mit welchem Befehl, bzw.
SFR-Register initiere ich den Schreibprozess? Das Datenblatt spricht
von: "All calls are made through a common interface, PGM_MTP. The
programming functions are selected by setting up the microcontroller’s
registers before making a call to PGM_MTP at FFF0h. Results are returned
in the registers". Das Problem für mich ist, wie führe ich den Call nach
PGM_MTP aus?
Atmel hat zwar Beispielcode in C, aber ich arbeite in ASM und verfüge
über keinen C-Compiler um mir die Beispiele zu kompilieren und den
ASM-Code anzusehen.
Wäre sehr dankbar für einen Tipp.
Grüsse
Hallo Peter,
den Befehl LCALL FFF0h hatte ich schon vor meiner Anfrage getestet
(Diese Adresse steht ja so in dem zitierten Text aus dem Datenblatt).
Mein Assembler (Batronix ProgStudio 6.09) lehnt die Assemblierung dieses
Befehls aber ab, was auch kein Wunder ist, denn diese Adresse gibt es
nicht, da der µC nur 32k Flash hat ;-)
Ich beschäftige mich erst seit zwei Tagen mit dem AT89C51RC2 (habe
vorher mit dem AT89S8253 und dem AT89LP4052 gearbeitet) und bin mit
meinem Latein erstmal am Ende.
Vielleicht wäre es möglich mir kurz ein paar Details zu vermitteln, bzw.
ein paar rudimentäre Zeilen ASM-Code zukommen zu lassen?
Andernfalls hänge ich an diesem Problem erstmal fest.
Grüsse
Schudi schrieb:> Mein Assembler (Batronix ProgStudio 6.09) lehnt die Assemblierung dieses> Befehls aber ab, was auch kein Wunder ist, denn diese Adresse gibt es> nicht, da der µC nur 32k Flash hat ;-)
Abgesehen davon, daß eben doch Code an dieser Adresse steht, Du könntest
ja auch externen Flash angeschlossen haben.
Der Assembler hat also mehrfach unrecht, Dir diesen Zugriff zu
verbieten.
Es kann aber sein, daß Du im AUX-Register den Bootloader erst einblenden
mußt.
Probier erstmal die Funktion zum Lesen der Signaturbytes.
Peter
> Der Assembler hat also mehrfach unrecht, Dir diesen Zugriff zu> verbieten.
Ich denke, er verweigert es deswegen, weil wie Bernd bereits schrieb die
vorlaufende Null der Adresse vergessen wurde, wodurch der Assembler das
erste F korrekterweise als den ersten Buchstaben eines Labels
interpretiert.
> Es kann aber sein, daß Du im AUX-Register den Bootloader erst einblenden> mußt.
Ja, ENBOOT muss gesetzt sein, damit das BootROM eingeblendet wird. Und
sicherheitshalber nach Verwendung wieder ausschalten.
>> Mein Assembler (Batronix ProgStudio 6.09) lehnt die Assemblierung dieses>> Befehls aber ab, was auch kein Wunder ist, denn diese Adresse gibt es>> nicht, da der µC nur 32k Flash hat ;-)> Abgesehen davon, daß eben doch Code an dieser Adresse steht, Du könntest> ja auch externen Flash angeschlossen haben.
Eben. Und ein guter Assembler mault sowas nur dann an, wenn er weiss,
dass da nichts ist, und wenn er es nicht weiss, soll er's dem
Programmierer überlassen, der weiss vielleicht was er tut :)
@Schudi:
Nicht vergessen ins ErrataSheet zu gucken, der Bootloader gehört leider
zu den vielen Sachen von Atmel, die Bugs haben.
Ralf
Hallo,
Problem gelöst.
Mein Ansatz war richtig und alles funktioniert jetzt wie gewünscht.
Das Problem war, daß mein Assembler den Befehl LCALL FFF0h als
fehlerhaft zurückweist. Auch die Form LCALL 0FFF0h brachte nichts.
Die Schreibweise LCALL (FFF0h) führte dann zum Erfolg. Bisher habe ich
den LCALL-Befehl problemlos immer nur mit einem Label ausgeführt, nie
mit einer direkten Adressangabe.
Tja, so muß man sich mit syntaktischen Kleinigkeiten die Nacht um die
Ohren schlagen, statt zu schlafen.
Naja so kann ich wenigstens heute Nachmittag in Ruhe und entspannt
Fußball gucken.
Ich bedanke mich bei allen Hilfswilligen.
Grüße
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.