mikrocontroller.net

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


Autor: Schudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

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

LCALL 0FFF0h


Peter

Autor: Schudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd N (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein schneller blick ins Datenblatt.

http://www.atmel.com/dyn/resources/prod_documents/...
 
__API_FLASH_ENTRY_POINT:
PUSHAR2
PUSHAR4
PUSHAR6
LCALL 0FFF0h
POPAR6
POPAR4
POPAR2
Ret

Und einen passenden Assembler:

http://plit.de/asem-51/

Den Rest must du selbst herausfinden.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.