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?
> 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.
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
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
> > 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... ;)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.