Forum: Mikrocontroller und Digitale Elektronik AT89C51RC2, Flash über ASM und User-API modifizieren.


von Schudi (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Schudi schrieb:
> Das Problem für mich ist, wie führe ich den Call nach
> PGM_MTP aus?

LCALL 0FFF0h


Peter

von Schudi (Gast)


Lesenswert?

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

von Bernd N (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

> 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

von Schudi (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.