Forum: Mikrocontroller und Digitale Elektronik Problem mit mov Befehl


von avusgalaxy (Gast)


Lesenswert?

Hi, habe folgenden Code erstellt, bin aber noch nicht fertig :-) (sieht
man eigentlich).
Ich will in pwm0 den Wert 0x05 laden, in pwm1 den Wert 0x05 mal 2. Wie
kann ich das realisieren? mov pwm1, teil+teil hab ich auch schon
probiert, geht aber nicht. Ist es überhaupt möglich?

Gruß avusgalaxy


.include "2313def.inc"

.def pwm0 = R0
.def pwm1 = R1
.def teil = r19

ldi teil, 0x05

mov pwm0, teil
mov pwm1, teil*2

von Thomas Burkhardt (Gast)


Lesenswert?

wende das mal 2 nach der Zuweisung auf pwm1 an. Was du da schreibst
kann der Assembler freilich nicht verstehen.

von avusgalaxy (Gast)


Lesenswert?

Hi Thomas, wie macht man das?

von Axos (Gast)


Lesenswert?

mov pwm0, teil
mov pwm1, teil*2
mul pwm1, 2

weiss leider nicht ob es den befehl MUL / IMUL auch bei AVRs gibt. beim
x86 heisst er jedenfalls mul/imul.

von avusgalaxy (Gast)


Lesenswert?

mul gibts, aber wie sieht dann der Befehlssatz aus?

von Christian Zietz (Gast)


Lesenswert?

@avusgalaxy: Multiplikation mit zwei macht man sinnvollerweise mit einem
Left-Shift um ein Bit:

mov pwm1, teil
lsl pwm1

Setzt natürlich voraus, dass teil*2 nicht zu groß ist, um in ein Byte
zu passen.

Christian

von avusgalaxy (Gast)


Lesenswert?

Vielen Dank, Avusgalaxy

von ...HanneS... (Gast)


Lesenswert?

Und mul gibts beim 2313 nicht

...

von peter dannegger (Gast)


Lesenswert?

Der Assembler kann nur Konstanten berechnen.
Es geht also nur so:

.def pwm0 = R16
.def pwm1 = R17
.equ teil = 0x05

ldi pwm0, teil
ldi pwm1, teil*2


Peter

von avusgalaxy (Gast)


Lesenswert?

Vielen Dank Peter, genau das habe ich gemeint und gesucht.

von avusgalaxy (Gast)


Lesenswert?

Hab noch ein Problem:

.equ teiler = 0x05

Wenn ich im nachhinein den Wert des Teilers im Programm ändern möchte
(.equ teiler = 0x02), dann sagt er mir, das ich das Symbol schon einmal
defeniert habe.

Gibt es eine andere Möglichkeit, den Wert zu ändern?

von crazy horse (Gast)


Lesenswert?

.equ ergibt eine dauerhafte Zuweisung.
Entweder in der .equ-Anweisung den Wert ändern. Oder, sollen
verschiedene Werte benutzt werden, auch verschiedene Symbole benutzen
.equ teiler1=0x05
.equ teiler2=0x02

Dann gibts es noch die .set-Anweisung (halte ich persönlich aber nicht
allzuviel von, mir sind eindeutige Zuweisungen lieber.

.set teiler=0x05
ldi r16, teiler
.set teiler=0x02
ldi r17, teiler

Wenn du nun teiler mehrfach umdefinierst, musst du höllisch aufpassen,
welcher Wert im Assemblerlauf gerade aktuell ist.

von avusgalaxy (Gast)


Lesenswert?

Genau das brauche ich, danke crazy horse. Dadurch spare ich mir 8
Register.

von avusgalaxy (Gast)


Lesenswert?

Auwe, zu Früh gefreut... dimmen1 und dimmen2 bleiben immer 0x01

led1:
  ldi temp, dimmen1
  add pwm1, temp

  cpi pwm1, dimmende
  brne led11

.set dimmen1 = 0xff
  rjmp led2
led11:
  cpi pwm1, dimmanfang
  brne led2

.set dimmen1 = 0x01



led2:
ldi temp, dimmen2
  add pwm2, temp

  cpi pwm2, dimmende
  brne led22

.set dimmen2 = 0xff
  rjmp led3
led22:
  cpi pwm2, dimmanfang
  brne led3

.set dimmen2 = 0x01

Da ist ja nichts falsch, oder?

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.