Forum: Mikrocontroller und Digitale Elektronik Indirekte Sprünge mit 8051


von Maxim (Gast)


Lesenswert?

Habe weder mit Google noch in meiner Sammlung etwas Brauchbares zu 
indirekten Sprüngen oder Lookup-Tabellen gefunden.

Kann mir jemand eine Adresse mit Beispielen geben?

Assembler, 8252

von A.K. (Gast)


Lesenswert?

Sprünge: JMP @A+DPTR
Tables: MOVX

von Peter D. (peda)


Lesenswert?

A.K. wrote:

> Tables: MOVX

Nein, das ist MOVC


Peter

von Maxim (Gast)


Lesenswert?

Habe schon soviel rausgefunden:

MOVC A, @A+DPTR

Mit diesem Befehl wird der Wert eines Registers mit der Adresse "DPTR A" 
in den Accu verschoben.

Muss ich für die Angabe des Registers unbedingt den Accu benutzen, oder 
darf ich auch das schreiben:

MOVC A, @R0+DPTR

oder sogar

MOVC R1, @RO+DPTR

?

von Joe (Gast)


Lesenswert?

Ich denke du suchst hiernach !?

mov dptr,#lookup_table
movc a,@a+dptr                  // hier steht H von Hello in a

lookup_table:    DB 'Hello'

Wenn du nun weiter inkrementierst dann kannst du den Ganzen Text 'Hello' 
herauslesen.

von Joe (Gast)


Lesenswert?

a muß natürlich den Wert 0 haben...

Alles klar ?

von Maxim (Gast)


Lesenswert?

Ja, ich muss etwas Ähnlichges machen. Anhand eines Wertes im Register 
ROTATION_SPEED (Bereich vin 10 bis 250) muss der Timer im 16-Bit-Modus 
auf bestimmte werte gesetzt werden. Genauer berechnet sich der Timerwert 
so:

Timer = 1 / (3 * 10^-6 * ROTATION_SPEED)

von Maxim (Gast)


Lesenswert?

Oder wäre es vielleicht einfacher, den Wert in Laufzeit zu berechnen?

von Maxim (maxim) Benutzerseite


Lesenswert?

Joe wrote:
> Ich denke du suchst hiernach !?
>
> mov dptr,#lookup_table
> movc a,@a+dptr                  // hier steht H von Hello in a
>
> lookup_table:    DB 'Hello'
>
> Wenn du nun weiter inkrementierst dann kannst du den Ganzen Text 'Hello'
> herauslesen.

Ich möchte das:

MOV  A, R0
MOV  DPTR, #TABELLE
JMP  @A+DPTR

;------------------------------------------

TABELE:  SJMP  VALUE0
         SJMP  VALUE1
         SJMP  VALUE2
         SJMP  VALUE3
  ...  ...
  ..  ..
  .  .

VALUE0:  MOV  SP_H,  #07h
         MOV  SP_L,  #01h
         SJMP ENDE

VALUE1:  MOV  SP_H,  #10h
         MOV  SP_L,  #02h
         SJMP ENDE

VALUE2:  MOV  SP_H,  #10h
         MOV  SP_L,  #51h
         SJMP ENDE

VALUE3:  MOV  SP_H,  #14h
         MOV  SP_L,  #01h
         SJMP ENDE

...
..
.

Dabei soll bei R0 = 0 nach VALUE0, bei R0 = 1 nach VALUE1 u.s.w 
gesprungen werden.


von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Wenn du an den Sprungzielen sowieso nur Register laden willst, wieso 
verwendest du dann nicht gleich ein normales Array?

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.