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


von Svenk (Gast)


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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Axel (Gast)


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

von commtel (Gast)


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

von commtel (Gast)


Lesenswert?

;-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Korax K. (korax)


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... ;)

von Svenk (Gast)


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.

von commtel (Gast)


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

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.