mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu Assembler-Code zeile (8051)


Autor: Svenk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe hier einen längeren Assembler Code denn ich gerne verstehen und 
dann in C neu schreiben möchte.
Das ganz ist auf nem 8051.

Allerdings verstehe ich eine Zeile von dem Code nicht:

;+++++++OUTCOM+++++++++++++++
OUTCOM:

  PUSH    DPH
  PUSH    DPL
  MOV     DPTR,   #$E000  <-was passiert hier???
  MOVX    @DPTR,  A
  NOP
  POP     DPL
  POP     DPH
  LCALL   WAIT40
  RET

Wenn ich das richtig verstanden habe wird hier A an ein Display 
geschickt, mir ist nur noch nicht klar wie das passiert und was dort das 
$ in der einen Zeile macht?
Kann mir da einer helfen?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ich das richtig verstanden habe wird hier A an ein Display
> geschickt, mir ist nur noch nicht klar wie das passiert
Das Display hängt wohl am AD-Bus, und mit der Adresse E000 wird das Ding 
entweder selektiert oder entsprechende Signale auf dem Bus ausgegeben. 
Für eine genauere Analyse bräuchte man einen Schaltplan...

> was dort das $ in der einen Zeile macht?
Es bedeutet, dass eine Hex-Zahl folgt.

Autor: Axel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Wert in A wird an Adresse (hex=$) E000 geschrieben (wobei an Adresse 
E000 vermutlich Dein Display hängt).

Das muss beim 8051 über den DPTR (Data Pointer) gemacht werden, ist das 
einzige Register, was 16 Bit breit ist.

Gruss
Axel

Autor: commtel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PUSH    DPH ;Das High Byte des DPTR(Datenpointer)wird gesichert
  PUSH    DPL ;Das Low Byte ebenfalls
  MOV     DPTR,   #$E000  <-was passiert hier??? ;Der DPTR wird neu 
eingestellt. Leider hat der 8051 nur ein 16 bit Datenpointer
  MOVX    @DPTR,  A ';Externer Schreibzugriff z.b Ram , Display usw
  NOP ;No Operation
  POP     DPL ;Das gesicherte Low Byte zurückschreiben
  POP     DPH ;High Byte ebenfalls
  LCALL   WAIT40 ;Aufruf einer Subroutine (glaub ich zumindest ist ne 
weile her)
  RET (ende)

c.u
Commtel

Autor: commtel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
;-)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In C dürfte das dann etwa so gehen:
   *(char*)0xE000 = A;

Autor: Fra Nk (korax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>
>   PUSH    DPH
>   PUSH    DPL
>   MOV     DPTR,   #$E000  <-was passiert hier???
>   MOVX    @DPTR,  A
>   NOP
>   POP     DPL
>   POP     DPH

Hallo Svenk,

erst wird der Inhalt des 16bit Datapointer auf den Stack gerettet.
Dann wird die Adresse E000 (hexadezimal) in den Datapointer geschrieben.
Anschließend wird der Inhalt vom Akku an die im Datapointer beschriebene 
Adresse geschickt. Zum Schluss wrid der ursprüngliche Inhalt des 
Datapointer vom Stack zurückgeholt.

Viele Grüße, Frank

Nachtrag: Was in 10 min so alles passiert, so schnell kann ich nicht 
schreiben... ;)

Autor: Svenk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah das erklärt dann einiges.

Hab gerade mal geguckt, das Display hängt über einem 74245 an Port0. 
Past also alles...

Vielen dank für die Antworten.

Autor: commtel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interesant das das Display !NUR! an Port0 ist.
Da hätte ich es anders geschrieben

PUSH    R0
MOV     R0,   #$E0
MOVX    @R0,  A
NOP <--ist die Frage ob dies wirklich gebraucht wird
POP     R0
LCALL   WAIT40
RET

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.