Forum: Mikrocontroller und Digitale Elektronik 8051 indirekt, indizierte Addressierung


von MOVC (Gast)


Lesenswert?

Ich möchte den Akkumulator mit dem Inhalt des Programmspeichers 2010 Hex 
laden. Mit dem Inhalt 31 hex. Der DPTR soll als Basisadresse also 
2000hex und Akku als Offsetadresse 10h benutzt werden.

Ich weiss das ich mit MOVC A,A+DPTR bekomme. Aber irgendwie scheint das 
nicht zu laufen.

das ist mein Assembler code:

MOV   A,#10h
    MOV    DPTR,#2000h 16
    MOVC  A,@A+DPTR
    MOV    2010h,#31h

von Thomas E. (thomase)


Lesenswert?

MOVC schrieb:
> MOV   A,#10h
>     MOV    DPTR,#2000h 16
>     MOVC  A,@A+DPTR
>     MOV    2010h,#31h

Wenn ich mich recht entsinne, muss man bei der Immediate Adressierung 
eine '0' davor setzen. Also nicht beispielsweise #77h, sondern #077h.

mfg.

von MOVC (Gast)


Lesenswert?

Nur wenn die Hexadezimalzahl mit einem Buchstaben anfängt. Habe es 
trotzdem mal probiert, hilft leider nicht.

von Mr. Claudius (Gast)


Lesenswert?

Was soll die letzte Codezeile sein?

von MOVC (Gast)


Lesenswert?

Ich möchte im Programmspeicher den WErt 31hex haben:
MOV    2010h,#31h

von TomA (Gast)


Lesenswert?

Hallo MOVC,

in den Programmspeicher kann man nicht schreiben, da geht nur lesen. Es 
sei denn du hast den Speicher umorganisiert nach "von Neumann" und an 
Adresse 2010h befindet sich RAM. Dann wäre der Befehl dafür aber MOVX 
@DPTR,A oder für Page-RAM MOVX @R0, A oder MOVX @R1,A.

Gruß. Tom

von MOVC (Gast)


Lesenswert?

und wie soll der Inhalt in den Programmspeicher kommen? Der Inhalt der 
Speicherzelle 2010h soll 31h sein.
Die letzte Zeile löschen wir dann. Aber wenn ich an dieser Zeile 
ankomme:
MOVC  A,@A+DPTR muss ich ja im Akku 2010 haben, was ich aber nicht 
bekomme.

von Lothar (Gast)


Lesenswert?

MOVC schrieb:
> MOV    2010h,#31h

MOV   DPTR, #2010h
MOV   A, #31h
MOVX  @DPTR, A

Das geht aber nur bei 8051 wo der Programmspeicher nicht ein ROM sondern 
Flash ist.

von Peter D. (peda)


Lesenswert?

MOVC schrieb:
> Der Inhalt der
> Speicherzelle 2010h soll 31h sein.

org 2010h
db 31h

von TomA (Gast)


Lesenswert?

Bei normalen MCS51 kann man den Programmspeicher nicht im laufenden 
Programm beschreiben. Da gibt es keinen Befehl dafür. In MOVX steht das 
X für den externen Datenspeicher, der µC wird dafür das WR-Signal 
aktivieren. Der Programmspeicher wird aber mit PSEN (Program Store 
ENable) angesprochen und dieses Signal wird durch MOVC (C wie Code) 
aktiviert. MOVC gibt es aber nur in Leserichtung MOVC A,@A+DPTR, einen 
MOVC @DPTR,A gibt es nicht.

Möglich, daß ein Derivat existiert, bei dem der interne Programmspeicher 
per Programm beschreibbar ist, der braucht dafür aber einen eigenen 
Befehl.

Üblicherweise kommt das Programm für den Programmspeicher durch ein 
Programmiergerät in diesen. Ausnahmen bilden Systeme mit "von Neumann" 
Architektur.

von Lothar (Gast)


Lesenswert?

TomA schrieb:
> Möglich, daß ein Derivat existiert, bei dem der interne Programmspeicher
> per Programm beschreibbar ist, der braucht dafür aber einen eigenen
> Befehl.

Keineswegs es ist Standard das auf 8051 mit Flash IAP mit MOVX 
ausgeführt wird z.B. C8051, EFM8 etc. Das geht weil solche 8051 bis 64KB 
Flash haben aber nur wenige KB internes XRAM, somit kann man nur wenige 
KB des unteren Flash nicht beschreiben, da ist aber ohnehin nur das 
Programm und keine großen Arrays. Wenn man nun auch noch externes XRAM 
per EMC anschliesst (macht aber niemand wer viel RAM braucht nimmt ARM) 
muss man ein Banking-Register bemühen.

von TomA (Gast)


Lesenswert?

Danke, wieder etwas dazugelernt :)

Das sind wohl die Silabs Chips, bei denen wurde einiges anders gelöst 
als beim Original.

von Lothar (Gast)


Lesenswert?

TomA schrieb:
> bei denen wurde einiges anders gelöst als beim Original

Hast recht z.B. bei den LPC900 geht Flash IAP nicht mit MOVX und DPTR 
sondern nur mit SFR: FMDATA, FMADR

von Soul E. (Gast)


Lesenswert?

MOVC schrieb:

> Die letzte Zeile löschen wir dann. Aber wenn ich an dieser Zeile
> ankomme:
> MOVC  A,@A+DPTR muss ich ja im Akku 2010 haben, was ich aber nicht
> bekomme.

Nein, Du musst den Inhalt der Speicherzelle 2010h im Akku haben.

von MOVC (Gast)


Lesenswert?

soul e. schrieb:
> Nein, Du musst den Inhalt der Speicherzelle 2010h im Akku haben.

Ja, ic hweiss aber immernoch nicht wie ich den Inhalt 31h nach 2010h 
bekomme. Die Speicheradresse bilde ich aus A und dem DPTR. Die letzte 
Zeile ist gegeben, also muss sie stimmen. Es ist zudem gesagt:"Der DPTR 
soll als
(2000hex) und Akku als Offsetadresse (10h) benutzt werden."

Damit ich auf die Adresse 2010h komme und in 2010h muss der Wert 31h 
stehen.


    MOV   A,#10h
    MOV   DPTR,#2000h
    MOVC  A,@A+DPTR

von Peter D. (peda)


Lesenswert?

Wie schon gesagt, Daten im Programmspeicher definiert man mit DB.

http://what-when-how.com/8051-microcontroller/8051-data-types-and-directives/

von Thomas (Gast)


Lesenswert?

>Ja, ic hweiss aber immernoch nicht wie ich den Inhalt 31h nach 2010h
>bekomme
mit MOVC garnicht MOVC ist ein Lesebefehl kein Schreibbefehl

    MOV   A,#10h
    MOV   DPTR,#2000h
    MOVC  A,@A+DPTR         ;nun steht im Akku der Inhalt von Code 
#2010h

so geht's:
    MOV  A,#31h
    MOV  DPTR,#2010h
    MOVX @DPTR,A            ;Bedingung: Code und Data gleich Neumann

Thomas

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.