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
Schudi schrieb: > Das Problem für mich ist, wie führe ich den Call nach > PGM_MTP aus? LCALL 0FFF0h Peter
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
Ein schneller blick ins Datenblatt. http://www.atmel.com/dyn/resources/prod_documents/doc4365.pdf
1 | |
2 | __API_FLASH_ENTRY_POINT: |
3 | PUSHAR2 |
4 | PUSHAR4 |
5 | PUSHAR6 |
6 | LCALL 0FFF0h |
7 | POPAR6 |
8 | POPAR4 |
9 | POPAR2 |
10 | Ret |
Und einen passenden Assembler: http://plit.de/asem-51/ Den Rest must du selbst herausfinden.
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
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.