Forum: Mikrocontroller und Digitale Elektronik Konstante und Makro (ASM)


von Axel H. (mf-futzi)


Lesenswert?

Hallo,

in Asm habe ich eine Kontante festgelegt mit

.equ Zeile1 = $80

Wenn ich diese Konstante in einem Macro aufrufe, z.B.
  ldi temp1, Zeile1
steht dann in temp1 ein anderer Wert als $80. (Zufälliger Wert?)

Wenn ich die Konstante in einem Unterprogramm aufrufe, ist der Wert 
korrekt.



Mache ich da mit dem Makro etwas falsch?


Vielen Dank im Voraus

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Normalerweise schreibt man Hex-Konstanten als 0x..
also in diesem Fall

.EQU   Zeile1=0x80

Grüße,

Peter

von Spess53 (Gast)


Lesenswert?

Hi

>Normalerweise schreibt man Hex-Konstanten als 0x..

In AVR-Asm gelten beide Schreibweisen. Ich benutze auch nur $... .

MfG Spess

von Sascha W. (sascha_w)


Lesenswert?

bei mir funkionierts AVR-Studio 4.13SP2 b571

Sascha

von Spess53 (Gast)


Lesenswert?

Hi

>Wenn ich diese Konstante in einem Macro aufrufe, z.B.
>  ldi temp1, Zeile1
>steht dann in temp1 ein anderer Wert als $80. (Zufälliger Wert?)

Schnell mal getestet: Funktioniert bei mir problemlos.

MfG Spess

von Axel H. (mf-futzi)


Lesenswert?

Hallo,

habe mittlerweile eine neue Version des AVR-Studios installiert, mit dem 
selben Ergebnis. :(

In meinem Makro steht derzeit nur

.macro locate
  push temp1
  ldi temp1, Zeile1
  rcall lcd_number    ;Wert von Zeile1 im LCD anzeigen
  pop temp1
.endmacro

Angezeigt wird im LCD der Wert 73.

Wenn ich nun push und pop aus dem Makro entferne, zeigt das LCD den Wert 
72 (?)

Was kann das für ein Wert sein?

von Floh (Gast)


Lesenswert?

Axel Hüser schrieb:
> .macro locate
>   push temp1
>   ldi temp1, Zeile1
>   rcall lcd_number    ;Wert von Zeile1 im LCD anzeigen
>   pop temp1
> .endmacro


lcd_number zeigen,
am besten auch den gesamten Testquellcode.
Debugger schon befragt?

von Spess53 (Gast)


Lesenswert?

Hi

Mit dem Code-Brocken lässt sich nicht viel anfangen.

MfG Spess

von Hc Z. (mizch)


Lesenswert?

Axel Hüser schrieb:
> push temp1
>   ldi temp1, Zeile1
>   rcall lcd_number    ;Wert von Zeile1 im LCD anzeigen
>   pop temp1
[...]
> Angezeigt wird im LCD der Wert 73.
>
> Wenn ich nun push und pop aus dem Makro entferne, zeigt das LCD den Wert
> 72 (?)

Daraus kannst Du getrost schließen, dass das Unterprogramm lcd_number 
nicht das tut, was Du erwartest.  Würde es tatsächlich den Inhalt von 
Register temp1 anzeigen, könnte sich die Anzeige nicht ändern, weil Du 
irgendwas anderes vorher und nachher machst.  Also den gesamten Code, 
bitte.

von Axel H. (mf-futzi)


Lesenswert?

Hallo,

vielen Dank für Eure Mühe. Ich bin auch nicht beratungsresistent und 
werde mein lcd_number nochmals prüfen. Aber mit dem arbeite ich schon 
längere Zeit und es war immer einwandfrei.

Nochmal:

Im Hauptprogramm steht nur:
ldi temp1, Zeile1
rcall lcd_number

...und da werden die 128 ($80) im LCD richtig angezeigt. Also sollte 
lcd_number doch auch korrekt sein.

Und wenn ich im Hauptprogramm nur den Macro aufrufe mit

locate

...dann zeigt das LCD den Wert 72 an (Im Makro stehen dann auch nur 
diese 2 Zeilen drin, wie vorher im Hauptprogramm).


An welcher Stelle im Programm sollte eigentlich der Verweis auf die 
Macrodatei stehen?

.include "macros.inc" steht bei mir ganz oben im Programm direkt unter
.include "m8def.inc"

von Floh (Gast)


Lesenswert?

Glaskugelmodus an:
das Macro steht über der Konstantendefinition.
Glaskugel aus:
Wenn du hier wirklich Hife erwartest, poste deinen Code!

von Spess53 (Gast)


Lesenswert?

Hi

>Glaskugelmodus an:
>das Macro steht über der Konstantendefinition.
>Glaskugel aus:
>Wenn du hier wirklich Hife erwartest, poste deinen Code!

Glaskugelmodus nochmal aus: Funktioniert auch in diesem Fall.

MfG Spess

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Vielleicht ein Stacküberlauf?
Ich mein, weil es davon abhängt, ob man push vorher ausführt oder nicht.

Grüße,

Peter

von Axel H. (mf-futzi)


Lesenswert?

Hallo Peter,

das war der entscheidende Hinweis von Dir.

In meinem Macro stand noch eine Sprungmarke Zeile1:

Darunter standen zwar keine Befehle, ist aber der gleiche Name, wie die 
Konstante.

Ein dummer Fehler von mir!!!

Ich werde jetzt alle meine Sprungmarken mit "_" (_Zeile1:) beginnen, 
damit mir das nicht wieder passiert.



Danke an alle!

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.